feat: add dashboard modules — conversations, billing, settings, files… - #7
Conversation
…, integrations, plugins, customization
|
Warning Review limit reached
Next review available in: 58 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Free Run ID: ⛔ Files ignored due to path filters (8)
📒 Files selected for processing (50)
Note 🎁 Summarized by CodeRabbit FreeYour organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login. Comment |
There was a problem hiding this comment.
Pull request overview
This PR introduces a set of new dashboard modules and supporting UI for the apps/web Next.js app, covering conversations/inbox, files (knowledge base), integrations (embed snippets), customization, plugins (Vapi), billing, and settings—plus associated assets and utilities.
Changes:
- Added multiple dashboard views/layouts (sidebar navigation, conversations UI with status filtering, contact panel).
- Implemented new feature areas: Settings (profile/notifications/appearance), Files (upload/delete), Integrations (script snippet generator), Customization (widget settings + optional Vapi configuration), Billing (Clerk pricing table), Plugins (Vapi connect/manage).
- Updated web app dependencies and dev port; added public icon assets for integrations.
Reviewed changes
Copilot reviewed 50 out of 58 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/web/public/logo.svg | Adds app logo asset used in UI. |
| apps/web/public/languages/react.svg | Adds React icon asset for integrations UI. |
| apps/web/public/languages/nextjs.svg | Adds Next.js icon asset for integrations UI. |
| apps/web/public/languages/javascript.svg | Adds JavaScript icon asset for integrations UI. |
| apps/web/public/languages/html5.svg | Adds HTML5 icon asset for integrations UI. |
| apps/web/package.json | Changes dev port + adds dependencies for new dashboard features. |
| apps/web/modules/settings/ui/views/settings-view.tsx | Adds settings page view container. |
| apps/web/modules/settings/ui/components/settings-form.tsx | Adds settings forms (profile, appearance, notifications, account). |
| apps/web/modules/plugins/ui/views/vapi-view.tsx | Adds Vapi plugin connect/disconnect view. |
| apps/web/modules/plugins/ui/components/vapi-phone-numbers-tab.tsx | Adds Vapi phone numbers table tab. |
| apps/web/modules/plugins/ui/components/vapi-connected-view.tsx | Adds connected-state UI for Vapi plugin. |
| apps/web/modules/plugins/ui/components/vapi-assistants-tab.tsx | Adds Vapi assistants table tab. |
| apps/web/modules/plugins/ui/components/plugin-card.tsx | Adds generic plugin connection card UI. |
| apps/web/modules/plugins/hooks/use-vapi-data.ts | Adds hooks to fetch Vapi data via Convex actions. |
| apps/web/modules/integrations/utils.ts | Adds snippet generation helper (createScript). |
| apps/web/modules/integrations/ui/views/integrations-view.tsx | Adds integrations UI + copy-to-clipboard flows. |
| apps/web/modules/integrations/constants.ts | Defines integrations list + embed snippet templates. |
| apps/web/modules/files/ui/views/files-view.tsx | Adds knowledge-base files table + pagination. |
| apps/web/modules/files/ui/components/upload-dialog.tsx | Adds file upload dialog using Dropzone + Convex mutation. |
| apps/web/modules/files/ui/components/delete-file-dialog.tsx | Adds file deletion confirmation dialog. |
| apps/web/modules/dashboard/ui/views/conversations-view.tsx | Adds conversations landing view. |
| apps/web/modules/dashboard/ui/views/conversation-id-view.tsx | Adds conversation thread view + operator response input + status toggling. |
| apps/web/modules/dashboard/ui/layouts/dashboard-layout.tsx | Adds shared dashboard layout with guards + sidebar provider. |
| apps/web/modules/dashboard/ui/layouts/conversations-layout.tsx | Adds resizable split layout for conversations list/detail. |
| apps/web/modules/dashboard/ui/layouts/conversation-id-layout.tsx | Adds resizable layout including contact side panel. |
| apps/web/modules/dashboard/ui/components/dashboard-sidebar.tsx | Adds dashboard navigation sidebar. |
| apps/web/modules/dashboard/ui/components/conversations-panel.tsx | Adds conversations list panel with status filter + infinite scroll. |
| apps/web/modules/dashboard/ui/components/conversation-status-button.tsx | Adds status button (unresolved/escalated/resolved) with hint. |
| apps/web/modules/dashboard/ui/components/contact-panel.tsx | Adds contact/session metadata panel (device/location/time). |
| apps/web/modules/dashboard/constants.ts | Adds storage key constant for status filter. |
| apps/web/modules/dashboard/atoms.ts | Adds jotai atom (persisted) for status filtering. |
| apps/web/modules/customization/ui/views/customization-view.tsx | Adds customization page view with loading state. |
| apps/web/modules/customization/ui/components/vapi-form-fields.tsx | Adds Vapi-related widget settings form fields. |
| apps/web/modules/customization/ui/components/customization-form.tsx | Adds widget settings form + Convex upsert mutation. |
| apps/web/modules/customization/types.ts | Adds form schema type inference. |
| apps/web/modules/customization/schemas.ts | Adds Zod schema for widget customization form. |
| apps/web/modules/billing/ui/views/billing-view.tsx | Adds billing page view. |
| apps/web/modules/billing/ui/components/pricing-table.tsx | Wraps Clerk pricing table component. |
| apps/web/modules/billing/ui/components/premium-feature-overlay.tsx | Adds overlay component prompting upgrade for premium features. |
| apps/web/lib/country-utils.ts | Adds timezone → country resolution + flag URL helper. |
| apps/web/app/sentry-example-page/page.tsx | Adds/updates Sentry example page UI. |
| apps/web/app/page.tsx | Adds/updates marketing landing page and widget script include. |
| apps/web/app/api/sentry-example-api/route.ts | Adds/updates Sentry test API route that throws. |
| apps/web/app/(dashboard)/settings/page.tsx | Wires settings route to SettingsView. |
| apps/web/app/(dashboard)/plugins/vapi/page.tsx | Wires Vapi plugin route to VapiView. |
| apps/web/app/(dashboard)/layout.tsx | Switches dashboard route group to shared DashboardLayout. |
| apps/web/app/(dashboard)/integrations/page.tsx | Wires integrations route to IntegrationsView. |
| apps/web/app/(dashboard)/files/page.tsx | Wires files route to FilesView. |
| apps/web/app/(dashboard)/dashboard/page.tsx | Adds placeholder dashboard home page. |
| apps/web/app/(dashboard)/customization/page.tsx | Wires customization route to CustomizationView. |
| apps/web/app/(dashboard)/conversations/page.tsx | Wires conversations route to ConversationsView. |
| apps/web/app/(dashboard)/conversations/layout.tsx | Adds conversations route-group layout. |
| apps/web/app/(dashboard)/conversations/[conversationId]/page.tsx | Wires conversation detail route to ConversationIdView. |
| apps/web/app/(dashboard)/conversations/[conversationId]/layout.tsx | Adds conversation detail layout with contact panel. |
| apps/web/app/(dashboard)/billing/page.tsx | Wires billing route to BillingView. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <SelectTrigger> | ||
| <SelectValue | ||
| placeholder={ | ||
| assistantsLoading |
| export const HTML_SCRIPT = `<script src="localhost:3000/widget.js" data-organization-id="{{ORGANIZATION_ID}}"></script>`; | ||
| export const REACT_SCRIPT = `<script src="localhost:3000/widget.js" data-organization-id="{{ORGANIZATION_ID}}"></script>`; | ||
| export const NEXTJS_SCRIPT = `<script src="localhost:3000/widget.js" data-organization-id="{{ORGANIZATION_ID}}"></script>`; | ||
| export const JAVASCRIPT_SCRIPT = `<script src="localhost:3000/widget.js" data-organization-id="{{ORGANIZATION_ID}}"></script>`; |
| import Link from "next/link" | ||
| import Script from "next/script" | ||
| import Image from "next/image" | ||
| import { useEffect, useRef, useState } from "react" |
| import { | ||
| MessageSquareText, Bot, BarChart3, Shield, Globe, Zap, Network, | ||
| Headphones, ArrowRight, Sparkles, ChevronRight, Check, | ||
| ArrowUpRight, Server, Database, Users, Clock, Activity, X, Menu | ||
| } from "lucide-react" |
| </div> | ||
| </footer> | ||
|
|
||
| <Script src="/widget.js" data-organization-id="org_31QtvqJKwhtvop04esLJMkmFouB" strategy="afterInteractive" /> |
| @@ -0,0 +1,14 @@ | |||
| import { NextResponse } from "next/server"; | |||
| export function GET() { | ||
| throw new SentryExampleAPIError("This error is raised on the backend called by the example page."); | ||
| return NextResponse.json({ data: "Testing Sentry Error..." }); | ||
| } |
| const form = useForm<z.infer<typeof formSchema>>({ | ||
| resolver: zodResolver(formSchema), | ||
| defaultValues: { | ||
| message: "", | ||
| }, | ||
| }); |
| try { | ||
| const response = await enhanceResponse({ prompt: currentValue }); | ||
|
|
||
| form.setValue("message", response); |
| try { | ||
| await user?.update({ firstName: values.name.split(" ")[0], lastName: values.name.split(" ").slice(1).join(" ") }); | ||
| toast.success("Profile updated"); |
…, integrations, plugins, customization