Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
WalkthroughThis PR introduces comprehensive authentication error handling improvements, Convex test infrastructure reorganization, UI/UX enhancements across dashboard and navigation components, and new features including a meeting summary page. The changes span authentication configuration, deployment documentation, component refactoring, type definitions, and test directory migration. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant App as App<br/>(ConvexClientProvider)
participant Convex as Convex<br/>(auth.config.ts)
participant WorkOS as WorkOS
User->>App: Load app / Auth token update
App->>Convex: Send token for validation
Convex->>Convex: Check WORKOS_CLIENT_ID
alt WORKOS_CLIENT_ID Missing
Convex->>Convex: Log config error
Convex->>App: Return Server Error
App->>App: Detect "WORKOS_CLIENT_ID" error
App->>App: Show config guidance (once)
Note over App: hasShownConfigError prevents<br/>repeated warnings
else WORKOS_CLIENT_ID Present
Convex->>WorkOS: Validate JWT
WorkOS->>Convex: Validate response
Convex->>App: Success / User data
App->>App: Log success checkmark
App->>App: Reset error state
end
alt Transient Error
App->>App: Schedule retry with<br/>exponential backoff
else Max Retries Exceeded
App->>App: Log final failure<br/>(suggest refresh)
end
sequenceDiagram
participant User
participant VideocallPage as Video Call<br/>Page
participant SessionStorage as Session<br/>Storage
participant MeetingSummaryPage as Meeting<br/>Summary Page
User->>VideocallPage: View video call
VideocallPage->>VideocallPage: Build meetingSummary<br/>(messages, prompts,<br/>participants, duration)
User->>VideocallPage: End call
VideocallPage->>VideoCallPage: isCallEnded = true
VideocallPage->>SessionStorage: Store meetingSummary<br/>with LAST_MEETING_SUMMARY_KEY
alt hasRedirectedToSummary = false
VideocallPage->>MeetingSummaryPage: Redirect to<br/>/app/meeting-summary
VideoCallPage->>VideoCallPage: Set hasRedirectedToSummary = true
else Already Redirected
Note over VideocallPage: Guard prevents<br/>duplicate redirects
end
User->>MeetingSummaryPage: View summary page
MeetingSummaryPage->>SessionStorage: Read meetingSummary
MeetingSummaryPage->>MeetingSummaryPage: Render summary UI<br/>(highlights, notes,<br/>participants)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Areas requiring extra attention:
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
convex/embeddings/actions.ts (1)
374-380: I found a critical issue with the updated query reference. Let me verify the function signatures to confirm:Now let me verify the actual code that's calling this function and check if there are signature differences:
Incorrect query reference – use internal query instead of public query.
The
internalobject should reference functions registered withinternalQuery, but the code callsinternal.transcripts.queries.getTranscriptSegments, which is a public query (line 23 ofconvex/transcripts/queries.ts), not an internal query.The codebase has both:
getTranscriptSegments(public query, line 23)getTranscriptSegmentsInternal(internal query, line 107)Change line 375 in
convex/embeddings/actions.tsfrom:internal.transcripts.queries.getTranscriptSegmentsto:
internal.transcripts.queries.getTranscriptSegmentsInternalconvex/users/mutations.ts (1)
84-218: Tighten authentication and remove PII from upsertUser logs.Two confirmed security and privacy issues:
Authentication is effectively optional (security).
The current implementation wraps
ctx.auth.getUserIdentity()in a try/catch and proceeds when it fails. This allows unauthenticated (or misconfigured) callers to create/update arbitrary users, violating the stated security contract.Other mutations in the codebase consistently use
const identity = await requireIdentity(ctx), which throws if no valid identity exists. TherequireIdentityhelper inconvex/auth/guards.tssupportsallowBootstrap=trueto permit authenticated but unprovisioned users—which aligns with the bootstrap test atconvex/auth/guards.test.ts:117.Replace the try/catch pattern with:
- let authIdentity: any = null; - try { - authIdentity = await ctx.auth.getUserIdentity(); - console.log("[upsertUser] Auth identity retrieved successfully"); - } catch (error) { - console.warn("[upsertUser] Auth identity not available..."); - } - if (authIdentity) { - const authenticatedWorkosId = authIdentity.subject; - if (authenticatedWorkosId && authenticatedWorkosId !== args.workosUserId) { - throw createError.forbidden("Cannot create user for different WorkOS ID"); - } - } + const identity = await requireIdentity(ctx, true); + if (identity.workosUserId !== args.workosUserId) { + throw createError.forbidden("Cannot create user for different WorkOS ID"); + }Logs include PII (email, user IDs).
Lines 94–214 log
workosUserId, and database IDs in multiple places. Email and persistent identifiers are personally identifiable information; logging them creates avoidable privacy and compliance obligations.Minimize: drop email from logs, truncate or hash user IDs (e.g., first 6–8 characters), or gate verbose logging behind a dev-only flag.
src/app/app/profile/page.tsx (1)
62-84: Remove or gate PII-heavy debug loggingThis effect logs user IDs, emails, and profile data on every state change. In production this is a PII/compliance risk and can clutter logs.
Consider either removing the logging or gating it to development:
- useEffect(() => { - console.log('[ProfilePage] State:', { - // detailed state logging - }); - }, [user, isAuthenticated, authLoading, convexUser, profile, formInitialized]); + useEffect(() => { + if (process.env.NODE_ENV !== "development") return; + console.log("[ProfilePage] State:", { + // detailed state logging + }); + }, [user, isAuthenticated, authLoading, convexUser, profile, formInitialized]);
🧹 Nitpick comments (21)
src/proxy.ts (1)
14-17: LGTM! Simplified middleware implementation.The function correctly calls
handleAuthand provides a sensible fallback withNextResponse.next(). The removal of the unusedNextFetchEventparameter simplifies the API.Consider adding an explicit return type for improved type safety:
-export default function proxy(request: NextRequest) { +export default function proxy(request: NextRequest): Response { const response = handleAuth(request); return response ?? NextResponse.next(); }convex/test/helpers.ts (1)
13-14: Simplify the schema import path.The import path
../../convex/schema.jsis redundant since this file is already in theconvex/test/directory. Going up two levels and then back intoconvexis unnecessary.Apply this diff to simplify:
-import schema from "../../convex/schema.js"; +import schema from "../schema.js";Additionally, note the inconsistency in extension usage: the schema import includes
.jswhile other local imports (line 14, 398, 399) omit the extension. Consider standardizing the extension usage across all relative imports.PRE_DEPLOYMENT_CHECKLIST.md (1)
264-267: Fix placeholder formatting syntax.The sign-off placeholders use an unusual formatting syntax with multiple asterisks that may not render as intended in Markdown.
Apply this diff for cleaner placeholder formatting:
-**Deployed by:** ______ -**Date:** ______ -**Deployment verified by:** ______ -**Notes:** ______________________ +**Deployed by:** _______________ +**Date:** _______________ +**Deployment verified by:** _______________ +**Notes:** _______________CONVEX_DEPLOYMENT_SETUP.md (1)
11-14: Tighten markdown to satisfy markdownlint (code fences, headings, bare URL).The content is solid; a few small formatting tweaks will avoid MD lint noise and improve structure:
- Add explicit languages to the log and architecture code blocks.
- Avoid the bare URL by wrapping it as a proper Markdown link.
- Convert the bold “Option A/B” lines into headings instead of emphasis.
Example diffs:
-``` +```text [CONVEX Q(users/queries:getCurrentUser)] [Request ID: ...] Server Error [CONVEX M(users/mutations:upsertUser)] [Request ID: ...] Server Error -``` +``` -1. Go to https://dashboard.convex.dev +1. Go to <https://dashboard.convex.dev> -**Option A: Via CLI (Recommended)** +### Option A: Via CLI (recommended) -**Option B: Via Dashboard** +### Option B: Via dashboard -``` +```text User Browser ↓ (1) Signs in ... Database Operations -``` +```Also applies to: 35-35, 48-55, 163-174
src/app/auth/callback/route.ts (1)
1-1: Minor: Import quote style changed.The import quotes have been changed from double to single quotes. While this is a minor style change, ensure this aligns with your project's ESLint/Prettier configuration for consistency.
docs/AUTHKIT_CONFIGURATION.md (1)
1-396: Outstanding comprehensive configuration guide.This documentation is exceptionally thorough and well-structured:
- Clear distinction between hosted and direct provider authentication
- Concrete code examples showing both correct and incorrect patterns
- Complete environment variable configuration guidance
- Manual and automated testing procedures
- Extensive troubleshooting section
- Advanced configuration scenarios (custom redirects, pre-filled email, org-specific sign-in)
- Security considerations and best practices
- Helpful references and support resources
This will be an invaluable resource for developers implementing or debugging WorkOS AuthKit integration.
Optional: Add language specifiers to code blocks.
For better syntax highlighting and markdown linting compliance, consider adding language specifiers to the URL pattern code blocks at lines 30, 41, 50, and 261:
-``` +```text https://auth.workos.com/authorize?client_id=...&response_type=code&...This is a minor markdown formatting improvement and not critical. </blockquote></details> <details> <summary>src/components/ui/card.tsx (1)</summary><blockquote> `10-10`: **Consider maintainability of complex styling.** The new glassy, layered styling with pseudo-elements and multiple gradients is visually sophisticated but significantly more complex than the previous implementation. This utility-heavy approach may be harder to maintain and customize. Consider extracting the common glassy styling pattern into a CSS class or design token if this pattern is reused across multiple components (e.g., GlassPanel). This would improve maintainability and consistency. ```tsx // Example: Extract to a reusable utility const glassyCardStyles = "relative flex flex-col gap-2.5 overflow-hidden rounded-sm border border-surface bg-white/60 backdrop-blur-lg ...";docs/AUTHKIT_FIX_SUMMARY.md (1)
105-110: Minor wording polish in success criteriaFor Line 108, consider “WorkOS‑hosted AuthKit sign‑in screen” to read a bit more clearly (“WorkOS‑hosted” as a compound adjective). This is purely editorial; the rest of the doc is clear and actionable.
src/providers/ConvexClientProvider.tsx (1)
97-205: Tighten config‑error detection and simplify retry branchesThe overall structure (single upsert with exponential backoff and a one‑time config error banner) looks good, but two details are worth adjusting:
Config error heuristic is broad
Treating any error message containing"Server Error"as a configuration problem (Lines 165–166) risks misclassifying transient or unrelated Convex failures as config issues and skipping retries. The"WORKOS_CLIENT_ID"substring is a much stronger signal. Consider restrictingisConfigErrorto the specific configuration message (e.g., matching the known text emitted byconvex/auth.config.ts) and leaving generic “server error” cases to the retry path.
else if (isConfigError)branch is effectively redundant
WhenisConfigError && !hasShownConfigError.current, youreturnearly after logging the big configuration block (Lines 168–191), so the laterelse if (isConfigError)block (Lines 202–205) will only run ifisConfigErroris true and the earlier branch didn’t trigger (i.e.,hasShownConfigError.currentwas alreadytrue). In practice, that means you’ll only ever see the longer banner once per token, and subsequent config errors won’t hit the retry path anyway. You could simplify this by either:
- Removing the later
else if (isConfigError)branch entirely, or- Consolidating config‑error logging into a single place that checks and sets
hasShownConfigError.current.This keeps retries focused on genuinely transient issues and makes the control flow easier to reason about.
src/app/app/layout.tsx (1)
36-39: Avoid duplicating border/rounded styles on GlassPanel header
GlassPanelalready appliesrounded-sm border border-surfaceon its outer div, so repeating these in the headerclassNameis redundant and makes future tweaks harder. You can keep this wrapper focused on spacing/responsiveness only:- <GlassPanel - padding={false} - className="rounded-sm border border-surface px-3 py-1.5 sm:px-3.5" - > + <GlassPanel padding={false} className="px-3 py-1.5 sm:px-3.5">src/app/app/meeting-summary/page.tsx (1)
21-33: De-duplicate meeting summary shape between pages
StoredMeetingSummaryhere mirrorsMeetingSummaryPayloadinsrc/app/videocall/[id]/page.tsx. Keeping two separate structural types invites subtle drift (e.g., adding a field in one place but not the other).Consider extracting a shared type (e.g.,
MeetingSummaryinsrc/types/meeting.tsorsrc/constants/meeting.ts) and importing it in both places so persistence and rendering stay in lockstep.src/app/videocall/[id]/page.tsx (2)
70-77: Reuse LS_KEYS constant instead of hardcoding the timeRemaining keyYou centralize storage keys in
LS_KEYS, buthandleTimeRequeststill hardcodes"connvo:call:timeRemaining":persist("connvo:call:timeRemaining", newRemaining);For consistency and to avoid drift if the key changes later, it’s safer to reuse the constant:
- setTimeRemaining(newRemaining); - persist("connvo:call:timeRemaining", newRemaining); + setTimeRemaining(newRemaining); + persist(LS_KEYS.TIME_REMAINING, newRemaining);Also applies to: 451-451
79-91: Centralize meeting summary type and validate queue typeThe
MeetingSummaryPayloadshape here is effectively the same as theStoredMeetingSummarytype used insrc/app/app/meeting-summary/page.tsx. To prevent subtle mismatches over time, it would be cleaner to:
- Extract this shape into a shared type (e.g.,
MeetingSummaryinsrc/types/meeting.ts), and- Use that type both for the payload here and for the parsed value on the summary page.
Also,
queueTypeis derived via:const queueType = (searchParams?.get("type") as "casual" | "professional") || "casual";If an unexpected
typevalue is ever passed, it will be stored as-is but typed as the union. You might want a small runtime guard, e.g.:const rawType = searchParams?.get("type"); const queueType: "casual" | "professional" = rawType === "professional" ? "professional" : "casual";to ensure persisted data always matches the declared union.
Also applies to: 330-359
src/app/app/settings/page.tsx (1)
64-80: Make optimistic rollback more robust for settings toggles
handleToggledoes an optimistic update and, on error, rolls back by inverting the attempted value:setLocalSettings((prev) => ({ ...prev, [key]: value })); // ... setLocalSettings((prev) => ({ ...prev, [key]: !value }));This works for a single simple toggle, but if a user flips a switch rapidly (or if the mutation is ever reused for non-binary fields), the rollback can drift from the last known-good state.
Consider instead:
- Capturing the previous value once before the optimistic update, and
- On error, restoring that captured value, or re-syncing from
settingsafter the Convex mutation/queries settle.That will keep UI state aligned with the backend even under repeated toggles or transient failures.
src/app/app/dashboard/page.tsx (2)
6-20: Dashboard metrics card and derived counts look goodUsing
mockUsers.lengthandslice(0, 8)fortotalConnectionsand featured data is clear and keeps the DashboardMetrics API simple. Once real data wiring lands, you can swapmockUsersfor live stats without changing this layout.Also applies to: 30-53
55-115: Connections overview card is well-structured; consider small future refinementsThe connections grid, avatar color fallback, and status badge rendering are clean and easy to follow. Two optional ideas:
- When this moves off mock data, consider a graceful empty-state message if there are 0 connections.
- You might switch the inline
<img>to the design system’sAvatarImagefor consistency with other avatar usage.These are polish-only; current implementation is fine as-is.
src/types/auth.ts (1)
129-155: Tighten theisAuthenticatedtype guard to also fixisAuthenticated: trueThe current guard correctly narrows
userandaccessToken. You can also encode thatisAuthenticatedis literallytruein the happy path:-export function isAuthenticated( - state: WorkOSAuthState -): state is WorkOSAuthState & { user: WorkOSUser; accessToken: string } { - return state.isAuthenticated && state.user !== null && state.accessToken !== null; -} +export function isAuthenticated( + state: WorkOSAuthState +): state is WorkOSAuthState & { + isAuthenticated: true; + user: WorkOSUser; + accessToken: string; +} { + return ( + state.isAuthenticated && + state.user !== null && + state.accessToken !== null + ); +}This is optional, but can make downstream checks a bit more precise.
src/app/app/profile/page.tsx (2)
136-182: Simplifyform.resetusage after successful save
form.reset(data, { keepValues: true })is a bit unusual; passing both new values andkeepValuescan be confusing.If the goal is simply “mark the form pristine with the just-saved values”,
form.reset(data)should suffice and keeps intent clearer:- // Mark form as pristine after successful save - form.reset(data, { keepValues: true }); + // Mark form as pristine after successful save + form.reset(data);Please double-check this against your
react-hook-formversion semantics.
217-222: Harden initials computation against edge cases
displayName.split(" ").map(n => n[0])can hitundefinedif there are extra spaces. A slightly more defensive version is safer:- const initials = displayName.split(" ").map(n => n[0]).join("").toUpperCase().slice(0, 2); + const initials = displayName + .split(" ") + .filter(Boolean) + .map((n) => n[0]) + .join("") + .toUpperCase() + .slice(0, 2);Not critical, but it avoids surprises with odd names.
src/components/mvp/dashboard/MyConnections.tsx (2)
246-347: Chat layout updates are solid; consider modernizing the Enter key handlerThe card/header/footer styling for the chat area is cohesive and matches the overall dashboard visual language. One small improvement:
onKeyPresson the message<Input>is deprecated in recent React versions; usingonKeyDownis the recommended pattern:- <Input + <Input value={newMessage} onChange={(e) => setNewMessage(e.target.value)} placeholder="Type your message..." className="flex-1 rounded-full border-zinc-200 bg-zinc-50 focus-visible:ring-emerald-500 dark:border-zinc-700 dark:bg-zinc-800" - onKeyPress={(e) => e.key === "Enter" && handleSend()} + onKeyDown={(e) => e.key === "Enter" && handleSend()} />Also applies to: 432-445
213-214: messagesContainerRef-based scrolling is a nice improvement; minor typing tweak possibleUsing
messagesContainerRefto scroll just the messages container (and only animating when there’s overflow) is a good UX win over scrolling the whole page. You could slightly simplify the prop typing to match theuseRefdeclaration:-interface ChatAppProps { +interface ChatAppProps { // ... - messagesContainerRef: React.RefObject<HTMLDivElement | null>; + messagesContainerRef: React.RefObject<HTMLDivElement>; // ... }Not required, but it makes the intent a bit clearer since
RefObjectalready encodescurrent | null.Also applies to: 344-347, 465-479, 540-561
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
convex/_generated/api.d.tsis excluded by!**/_generated/**
📒 Files selected for processing (58)
AUTHENTICATION_FIX_README.md(1 hunks)CONVEX_DEPLOYMENT_SETUP.md(1 hunks)PRE_DEPLOYMENT_CHECKLIST.md(1 hunks)TESTING_AFTER_FIX.md(1 hunks)convex.json(1 hunks)convex/auth.config.ts(1 hunks)convex/embeddings/actions.ts(2 hunks)convex/insights/generation.ts(1 hunks)convex/settings/queries.ts(1 hunks)convex/test/README.md(2 hunks)convex/test/docstringHelpers.ts(6 hunks)convex/test/helpers.ts(2 hunks)convex/test/openapiExamples.ts(0 hunks)convex/test/setup.ts(1 hunks)convex/users/mutations.ts(1 hunks)convex/users/queries.ts(1 hunks)debug/PROFILE_FIX_SUMMARY.md(2 hunks)docs/AUTHKIT_CONFIGURATION.md(1 hunks)docs/AUTHKIT_FIX_SUMMARY.md(1 hunks)docs/AUTH_REDIRECT_FIX.md(1 hunks)openspec/changes/update-openapi-docs/tasks.md(1 hunks)scripts/README.md(2 hunks)scripts/docstringParser.ts(0 hunks)src/app/app/dashboard/page.tsx(2 hunks)src/app/app/layout.tsx(2 hunks)src/app/app/meeting-summary/page.tsx(1 hunks)src/app/app/page.tsx(2 hunks)src/app/app/professional/page.tsx(1 hunks)src/app/app/profile/page.tsx(6 hunks)src/app/app/settings/page.tsx(3 hunks)src/app/app/smart-connection/page.tsx(1 hunks)src/app/auth/callback/route.ts(1 hunks)src/app/auth/sign-in/route.ts(1 hunks)src/app/auth/sign-up/route.ts(1 hunks)src/app/globals.css(3 hunks)src/app/page.tsx(5 hunks)src/app/videocall/[id]/page.tsx(16 hunks)src/components/Loader.tsx(3 hunks)src/components/mvp/DesktopNavigation.tsx(1 hunks)src/components/mvp/MobileNavigation.tsx(1 hunks)src/components/mvp/dashboard/DashboardMetrics.tsx(2 hunks)src/components/mvp/dashboard/MyConnections.tsx(14 hunks)src/components/mvp/navigation.config.ts(1 hunks)src/components/mvp/user-card/index.tsx(4 hunks)src/components/mvp/user-card/user-card-details.tsx(3 hunks)src/components/mvp/user-card/user-card-header.tsx(4 hunks)src/components/queue/MatchNotification.tsx(1 hunks)src/components/queue/MatchQueueLobby.tsx(2 hunks)src/components/queue/QueueStatus.tsx(2 hunks)src/components/queue/SmartConnectionEngine.tsx(4 hunks)src/components/ui/card.tsx(4 hunks)src/components/ui/glass-panel.tsx(1 hunks)src/constants/meeting.ts(1 hunks)src/providers/ConvexClientProvider.tsx(4 hunks)src/proxy.ts(1 hunks)src/types/auth.ts(1 hunks)src/types/meeting.ts(2 hunks)vitest.config.ts(1 hunks)
💤 Files with no reviewable changes (2)
- scripts/docstringParser.ts
- convex/test/openapiExamples.ts
🧰 Additional context used
🧬 Code graph analysis (20)
src/components/queue/MatchQueueLobby.tsx (3)
src/components/ui/glass-panel.tsx (1)
GlassPanel(13-31)src/components/queue/QueueStatus.tsx (1)
QueueStatus(10-40)src/components/queue/MatchNotification.tsx (1)
MatchNotification(30-78)
src/app/auth/sign-in/route.ts (2)
src/app/auth/callback/route.ts (1)
GET(25-28)src/app/auth/sign-up/route.ts (1)
GET(23-29)
src/app/auth/callback/route.ts (4)
src/app/auth/sign-in/route.ts (1)
GET(23-29)src/app/auth/sign-up/route.ts (1)
GET(23-29)src/app/api/auth/signout/route.ts (1)
GET(4-9)src/app/auth/signout/route.ts (1)
GET(3-3)
convex/users/mutations.ts (1)
convex/lib/errors.ts (1)
createError(69-167)
src/components/queue/MatchNotification.tsx (1)
src/components/mvp/user-card/index.tsx (1)
UserCard(29-158)
src/app/app/meeting-summary/page.tsx (1)
src/constants/meeting.ts (1)
LAST_MEETING_SUMMARY_KEY(1-1)
src/app/auth/sign-up/route.ts (2)
src/app/auth/callback/route.ts (1)
GET(25-28)src/app/auth/sign-in/route.ts (1)
GET(23-29)
src/components/mvp/user-card/user-card-header.tsx (3)
src/components/mvp/user-card/message-modal.tsx (1)
MessageModal(21-135)src/components/mvp/user-card/schedule-modal.tsx (1)
ScheduleModal(20-296)src/components/mvp/user-card/user-card-actions.tsx (1)
UserCardActions(30-67)
src/components/mvp/MobileNavigation.tsx (3)
src/components/mvp/navigation.config.ts (1)
navSections(19-71)src/components/ui/glass-panel.tsx (1)
GlassPanel(13-31)src/utils/TransitionLink.tsx (1)
TransitionLink(38-56)
src/app/app/profile/page.tsx (9)
src/components/ui/skeleton.tsx (1)
Skeleton(15-15)src/types/auth.ts (1)
isAuthenticated(152-156)src/components/ui/card.tsx (5)
Card(88-88)CardContent(94-94)CardHeader(89-89)CardTitle(91-91)CardDescription(93-93)src/components/ui/form.tsx (7)
Form(172-172)FormField(178-178)FormItem(173-173)FormLabel(174-174)FormControl(175-175)FormDescription(176-176)FormMessage(177-177)src/components/ui/avatar.tsx (3)
Avatar(53-53)AvatarImage(53-53)AvatarFallback(53-53)src/components/ui/label.tsx (1)
Label(24-24)src/components/ui/input.tsx (1)
Input(21-21)src/components/ui/textarea.tsx (1)
Textarea(18-18)src/components/ui/button.tsx (1)
Button(59-59)
convex/settings/queries.ts (1)
convex/auth/guards.ts (1)
requireIdentity(42-109)
convex/insights/generation.ts (3)
convex/types/entities/transcript.ts (1)
TranscriptSegment(49-60)convex/_generated/api.js (2)
internal(22-22)internal(22-22)convex/types/entities/note.ts (1)
MeetingNote(49-57)
src/components/mvp/DesktopNavigation.tsx (2)
src/components/mvp/navigation.config.ts (1)
navSections(19-71)src/utils/TransitionLink.tsx (1)
TransitionLink(38-56)
src/app/app/professional/page.tsx (5)
src/components/ui/card.tsx (5)
Card(88-88)CardHeader(89-89)CardTitle(91-91)CardDescription(93-93)CardContent(94-94)src/components/ui/label.tsx (1)
Label(24-24)src/components/ui/input.tsx (1)
Input(21-21)src/components/ui/textarea.tsx (1)
Textarea(18-18)src/components/ui/button.tsx (1)
Button(59-59)
src/app/app/dashboard/page.tsx (1)
src/data/mock-users.ts (1)
mockUsers(3-92)
src/app/app/layout.tsx (4)
src/components/ui/glass-panel.tsx (1)
GlassPanel(13-31)src/components/mvp/dashboard/ModeToggle.tsx (1)
ModeToggle(12-37)src/components/mvp/DesktopNavigation.tsx (1)
DesktopNavigation(12-85)src/components/mvp/MobileNavigation.tsx (1)
MobileNavigation(12-56)
src/components/queue/SmartConnectionEngine.tsx (1)
src/components/queue/QueueStatus.tsx (1)
QueueStatus(10-40)
src/app/videocall/[id]/page.tsx (2)
src/types/meeting.ts (1)
MOCK_USERS(50-89)src/constants/meeting.ts (1)
LAST_MEETING_SUMMARY_KEY(1-1)
src/app/page.tsx (1)
src/utils/TransitionLink.tsx (1)
handleTransition(16-36)
src/app/app/settings/page.tsx (8)
src/types/auth.ts (1)
isAuthenticated(152-156)src/components/ui/skeleton.tsx (1)
Skeleton(15-15)src/components/ui/card.tsx (5)
Card(88-88)CardContent(94-94)CardHeader(89-89)CardTitle(91-91)CardDescription(93-93)src/components/ui/label.tsx (1)
Label(24-24)src/components/ui/switch.tsx (1)
Switch(31-31)src/components/ui/button.tsx (1)
Button(59-59)src/lib/hooks/use-toast.ts (1)
toast(191-191)src/components/ui/alert-dialog.tsx (9)
AlertDialog(130-130)AlertDialogTrigger(133-133)AlertDialogContent(134-134)AlertDialogHeader(135-135)AlertDialogTitle(137-137)AlertDialogDescription(138-138)AlertDialogFooter(136-136)AlertDialogCancel(140-140)AlertDialogAction(139-139)
🪛 LanguageTool
TESTING_AFTER_FIX.md
[grammar] ~287-~287: Ensure spelling is correct
Context: ...
getCurrentUserquery should be < 100ms averageupsertUsermutation should...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
[grammar] ~287-~287: Ensure spelling is correct
Context: ...entUser` query should be < 100ms average
upsertUsermutation should be < 200ms average- No queries...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
[style] ~376-~376: Consider using a different verb for a more formal wording.
Context: ...back
### Re-deployment
After fixing issues:
```bash
pnpm convex deploy ...
(FIX_RESOLVE)
</details>
<details>
<summary>docs/AUTHKIT_CONFIGURATION.md</summary>
[style] ~250-~250: To form a complete sentence, be sure to include a subject.
Context: ... @workos-inc/authkit-nextjs
```
Should be `^2.10.0` or higher
### Problem: ...
(MISSING_IT_THERE)
</details>
<details>
<summary>AUTHENTICATION_FIX_README.md</summary>
[style] ~311-~311: Consider using a different verb for a more formal wording.
Context: ...tart](#quick-start---fix-in-3-steps) to fix the issue
2. **Before Next Deployment:...
(FIX_RESOLVE)
</details>
<details>
<summary>docs/AUTH_REDIRECT_FIX.md</summary>
[grammar] ~49-~49: Use a hyphen to join words.
Context: ...ge
- Complete registration on WorkOS hosted page
- **Expected:** Redirect...
(QB_NEW_EN_HYPHEN)
</details>
<details>
<summary>docs/AUTHKIT_FIX_SUMMARY.md</summary>
[grammar] ~108-~108: Use a hyphen to join words.
Context: ...ot allowed" errors
✅ Users see WorkOS hosted AuthKit sign-in screen
✅ All a...
(QB_NEW_EN_HYPHEN)
</details>
</details>
<details>
<summary>🪛 markdownlint-cli2 (0.18.1)</summary>
<details>
<summary>docs/AUTHKIT_CONFIGURATION.md</summary>
30-30: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
---
41-41: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
---
50-50: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
---
261-261: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
</details>
<details>
<summary>CONVEX_DEPLOYMENT_SETUP.md</summary>
11-11: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
---
35-35: Bare URL used
(MD034, no-bare-urls)
---
48-48: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
---
55-55: Emphasis used instead of a heading
(MD036, no-emphasis-as-heading)
---
163-163: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
</details>
</details>
</details>
<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)</summary>
* GitHub Check: Cross-Platform Type Compatibility (upnpmtu-latest, 20)
</details>
<details>
<summary>🔇 Additional comments (59)</summary><blockquote>
<details>
<summary>src/app/page.tsx (3)</summary><blockquote>
`310-310`: **LGTM!**
Adding `min-h-screen` ensures the page container spans the full viewport height, which is appropriate for a landing page layout.
---
`468-468`: **Verify intentional removal of MacbookScroll component.**
The `MacbookScroll` component has been commented out, removing a significant visual feature from the landing page. Please confirm this is an intentional design change and not a temporary development comment.
If this removal is temporary, consider using a feature flag instead of commenting out code. If permanent, consider removing the unused `MacbookScroll` component definition (lines 68-100) to keep the codebase clean.
---
`711-712`: **LGTM! Consistent visual refinement.**
The styling changes from `rounded-full` to `rounded-2xl` across CTAs, badges, and decorative elements create a cohesive, modern aesthetic. The consistent application of this design pattern improves visual harmony throughout the landing page.
Also applies to: 715-715, 728-728, 744-744
</blockquote></details>
<details>
<summary>convex/embeddings/actions.ts (1)</summary><blockquote>
`383-388`: **LGTM! Variable naming is consistent.**
The variable name in the map function has been updated from `segment` to `t`, which is consistently used to access the `text` property. The logic remains correct.
</blockquote></details>
<details>
<summary>convex/insights/generation.ts (1)</summary><blockquote>
`309-312`: **LGTM! Consistent with changes in embeddings/actions.ts.**
The internal query reference has been updated to use the same path as in `convex/embeddings/actions.ts`. This maintains consistency across the codebase. Refer to the verification script in the previous file review to confirm the query path exists.
</blockquote></details>
<details>
<summary>convex/test/docstringHelpers.ts (5)</summary><blockquote>
`34-91`: **LGTM! Type inference cleanup.**
Removing the unnecessary cast on line 58 is an improvement. TypeScript can properly infer the type from the spread operation since `actual` is already typed as `T extends Record<string, any>`.
---
`448-565`: **Type change is correct and no callsite updates required.**
The function `createTestContext` at line 448 has been correctly updated to use the `TestConvex` parameter type. A comprehensive search of the codebase reveals no internal callsites—this exported function is not called elsewhere in the repository, so there are no callsite updates needed.
---
`213-315`: **All callsites verified and type compatible.**
The parameter type change from `DocstringTestConvex` to `TestConvex` has been properly implemented. The sole internal callsite at line 520 passes `t` from `createTestContext(t: TestConvex)`, which matches the updated signature. No external callers exist, and no breaking changes detected.
---
`110-208`: **No issues found.** The type parameter change from `DocstringTestConvex` to `TestConvex` is complete and consistent across the codebase:
- Both `validateExampleAlignment` (line 111) and `validateErrorExample` (line 214) use `TestConvex`
- The wrapper functions in `createTestContext` (line 448) receive and pass `TestConvex` to all three internal callsites
- No external callers of `validateExampleAlignment` exist outside this file
- `DocstringTestConvex` has been fully removed with no remaining references
---
`320-326`: **Type constraint relaxation is valid but unused—verify intent.**
The generic constraint has been relaxed from `<T extends TableNames | SystemTableNames>` to `<T extends string>`. This allows any string as input but violates the Convex library's `Id<T>` type contract, which requires valid table names. The `as Id<T>` cast masks this type violation.
However, the function is currently unused in the codebase (only exported and assigned to an object property), and this is test-only code where loosened typing for flexibility may be intentional. **Verify with the developer:** Is this relaxation intentional for test flexibility, or should the constraint be preserved? If intentional, document the reasoning to clarify the tradeoff.
</blockquote></details>
<details>
<summary>src/proxy.ts (2)</summary><blockquote>
`1-2`: **LGTM! Import updates align with API changes.**
The removal of `NextFetchEvent` and addition of `NextResponse` correctly reflect the simplified middleware signature and the new fallback pattern.
---
`5-12`: **Verify if `/api/convex` proxy route exists and is intentionally public.**
The WorkOS AuthKit v2.10.0 fully supports the `publicRoutes` API (available since v1.0.0), so that part is correct. However, based on Convex architecture, Convex HTTP routes are served at your Convex deployment domain, not as Next.js `/api` routes. If a `/api/convex` proxy route exists in this codebase, it would need to be a manually created catch-all Next.js route that forwards requests to Convex.
The search found no route handlers in `src/app/api/`, so the `/api/convex/:path*` entry in `publicRoutes` (line 10) either:
- References a route handler that doesn't exist yet (false configuration)
- Exists elsewhere in the codebase or is created dynamically
- Should be removed if Convex integration uses only client-side helpers instead of HTTP proxying
Please confirm whether this route is actually implemented and whether all its endpoints should bypass authentication.
</blockquote></details>
<details>
<summary>debug/PROFILE_FIX_SUMMARY.md (1)</summary><blockquote>
`28-28`: **LGTM! Documentation path updates are consistent.**
The path references have been correctly updated to reflect the test directory reorganization from `test/convex` to `convex/test`.
Also applies to: 90-90
</blockquote></details>
<details>
<summary>src/components/Loader.tsx (2)</summary><blockquote>
`61-63`: **LGTM! Color scheme updated to emerald.**
The primary color mapping has been updated from blue shades to emerald, providing better visual consistency.
---
`88-88`: **Verify layout behavior with `min-h-screen` in nested contexts.**
The container height constraint was changed from `h-full` to `min-h-screen`. While `h-full` respects the parent container's height, `min-h-screen` enforces a minimum of 100vh regardless of parent constraints. This could cause layout issues if the Loader is used within:
- Modal dialogs
- Smaller containers or cards
- Nested layouts where viewport-based sizing is inappropriate
Please verify that all current and intended use cases of this Loader component are compatible with viewport-based minimum height constraints.
Also applies to: 117-117
</blockquote></details>
<details>
<summary>convex/test/setup.ts (1)</summary><blockquote>
`22-22`: **LGTM! Glob pattern correctly updated for new file location.**
The pattern change from `../../convex/**/*` to `../**/*` correctly reflects the file relocation from `test/convex/setup.ts` to `convex/test/setup.ts`. The new pattern now properly searches from the `convex` directory root.
</blockquote></details>
<details>
<summary>vitest.config.ts (1)</summary><blockquote>
`27-27`: **LGTM! Test configuration correctly updated for new directory structure.**
The test include patterns and setup file path have been properly updated to reflect the migration from `test/convex` to `convex/test`. The new pattern `convex/**/*.{test,spec}.ts` correctly targets all test files under the convex directory.
Also applies to: 29-29
</blockquote></details>
<details>
<summary>src/app/globals.css (1)</summary><blockquote>
`352-374`: **LGTM! Border utilities provide good surface theming support.**
The new `.border-surface*` utilities provide standardized border styling with proper dark mode variants, which will help maintain visual consistency across the UI.
</blockquote></details>
<details>
<summary>PRE_DEPLOYMENT_CHECKLIST.md (1)</summary><blockquote>
`1-296`: **LGTM! Comprehensive deployment checklist.**
This is a well-structured and thorough pre-deployment checklist that covers all critical aspects:
- Environment variable validation
- Deployment procedures
- Verification steps
- Testing scenarios
- Security checks
- Rollback procedures
The concrete examples and commands make this highly actionable.
</blockquote></details>
<details>
<summary>src/app/app/professional/page.tsx (1)</summary><blockquote>
`35-104`: **Professional connection layout refactor looks solid.**
The new centered flex layout, scrollable `CardContent`, and consistent button styling integrate cleanly without changing the routing or auth gate logic. Inputs remain controlled, and the call‑to‑action grid is more responsive while preserving existing behavior.
</blockquote></details>
<details>
<summary>src/components/mvp/navigation.config.ts (2)</summary><blockquote>
`1-17`: **LGTM! Clean type definition.**
The `NavItem` type is well-structured with appropriate typing for the icon component.
---
`19-71`: **All navigation routes verified and properly implemented.**
All routes defined in the navigation configuration have corresponding page files and are correctly implemented:
- `/app`, `/app/dashboard`, `/app/profile`, `/app/settings` → dedicated page files found
- `/app/smart-connection` → page file correctly extracts and validates the `type` query parameter using `useSearchParams()`, handling both `casual` and `professional` values
</blockquote></details>
<details>
<summary>openspec/changes/update-openapi-docs/tasks.md (1)</summary><blockquote>
`3-3`: **LGTM! Path update aligns with test directory reorganization.**
The path update from `test/convex` to `convex/test` is consistent with the broader test infrastructure reorganization in this PR.
</blockquote></details>
<details>
<summary>src/constants/meeting.ts (1)</summary><blockquote>
`1-1`: **LGTM! Good practice to centralize storage keys.**
Defining the sessionStorage key as a constant ensures consistency across the application and makes it easier to maintain.
</blockquote></details>
<details>
<summary>convex/test/README.md (2)</summary><blockquote>
`201-201`: **LGTM! Test path updated correctly.**
The test run command now correctly references the new `convex/test` directory structure.
---
`261-261`: **LGTM! Documentation path updated correctly.**
The file reference now correctly points to the new `convex/test` directory structure.
</blockquote></details>
<details>
<summary>scripts/README.md (2)</summary><blockquote>
`408-408`: **LGTM! Test command updated correctly.**
The test run command now correctly references the new `convex/test` directory structure.
---
`424-424`: **LGTM! Documentation link updated correctly.**
The reference link now correctly points to the new `convex/test/README.md` location.
</blockquote></details>
<details>
<summary>src/types/meeting.ts (2)</summary><blockquote>
`72-72`: **LGTM! Mock data consistency update.**
The mock user name has been updated for consistency with other mock data in the codebase.
---
`92-92`: **LGTM! Mock data consistency update.**
The mock message sender has been updated to align with the partner name change in `MOCK_USERS`.
</blockquote></details>
<details>
<summary>src/app/app/smart-connection/page.tsx (1)</summary><blockquote>
`10-12`: **LGTM! Good defensive programming.**
The runtime check with a default value is a solid improvement over type casting. This ensures invalid or missing `type` query parameters safely default to "casual" instead of potentially causing runtime errors.
</blockquote></details>
<details>
<summary>src/app/auth/callback/route.ts (2)</summary><blockquote>
`3-24`: **LGTM! Excellent documentation.**
The comprehensive JSDoc comment clearly explains the callback handler's purpose, behavior, error handling, and provides a reference link. This significantly improves code maintainability.
---
`25-28`: **LGTM! Explicit redirect configuration.**
Making the `returnPathname` explicit improves code clarity and makes the post-authentication redirect behavior immediately visible to developers.
</blockquote></details>
<details>
<summary>convex/users/queries.ts (1)</summary><blockquote>
`161-183`: **LGTM! Excellent authentication error handling improvements.**
The changes significantly improve the robustness of the authentication flow:
- Moving identity retrieval inside the try block properly catches configuration errors (e.g., missing `WORKOS_CLIENT_ID`)
- Explicit null checks for `identity` and `identity.subject` prevent unexpected failures
- The enhanced error logging with deployment hints will help developers quickly diagnose issues
- Returning `null` on errors allows the UI to gracefully show a logged-out state instead of crashing
This aligns well with the broader authentication fixes documented in the PR.
</blockquote></details>
<details>
<summary>src/app/auth/sign-in/route.ts (1)</summary><blockquote>
`4-29`: **Excellent documentation improvements.**
The comprehensive JSDoc-style documentation clearly explains:
- The correct hosted AuthKit usage pattern
- Why the provider parameter should not be passed
- Available configuration options
- Links to official documentation
This will prevent common misconfiguration errors and aligns well with the authentication fixes across the PR.
</blockquote></details>
<details>
<summary>src/components/mvp/user-card/index.tsx (2)</summary><blockquote>
`26-26`: **LGTM! Clean prop addition.**
The new `showContactActions` prop provides a clean way to control contact action visibility. The default value of `true` ensures backward compatibility.
---
`37-37`: **Proper prop propagation.**
The `showContactActions` prop is correctly propagated to child components:
- As `showActions` to `UserCardHeader`
- As `showContactActions` to `UserCardDetails`
This follows the component's existing patterns and maintains consistency.
Also applies to: 119-119, 152-152
</blockquote></details>
<details>
<summary>src/app/auth/sign-up/route.ts (1)</summary><blockquote>
`4-29`: **Excellent documentation consistency.**
The documentation mirrors the sign-in route's guidance, providing clear instructions on:
- Hosted AuthKit usage without provider parameters
- Available configuration options
- Common pitfalls to avoid
This consistency across authentication routes will help prevent configuration errors and improve developer experience.
</blockquote></details>
<details>
<summary>src/components/queue/MatchQueueLobby.tsx (1)</summary><blockquote>
`83-126`: **Clean UI refactor with GlassPanel integration.**
The changes improve the visual consistency by:
- Wrapping lobby content in a centered `GlassPanel` container
- Adjusting from full-screen to a constrained, centered layout
- Updating animation parameters for better visual alignment
All functional logic (matching, event handlers, state management) remains unchanged. The new layout provides a more polished, consistent user experience.
</blockquote></details>
<details>
<summary>docs/AUTH_REDIRECT_FIX.md (1)</summary><blockquote>
`1-135`: **Excellent comprehensive documentation.**
This documentation provides:
- Clear problem statement and root cause analysis
- Concrete code examples of the fix
- Detailed testing instructions with verification checklist
- Visual flow diagrams showing before/after authentication flows
- Rollback instructions for safety
The structure and detail level will be very helpful for developers understanding and verifying the authentication fix.
</blockquote></details>
<details>
<summary>src/components/queue/QueueStatus.tsx (1)</summary><blockquote>
`15-38`: **Clean emerald theming updates.**
The styling changes create a more cohesive visual design:
- Consistent emerald color palette across light/dark modes
- Improved typography hierarchy with adjusted text sizes
- Enhanced wait time emphasis with uppercase and letter-spacing
All functional logic remains unchanged. The new theming aligns well with the GlassPanel integration in MatchQueueLobby.
</blockquote></details>
<details>
<summary>src/components/mvp/dashboard/DashboardMetrics.tsx (1)</summary><blockquote>
`25-31`: **LGTM! Clean refactor to dynamic data.**
The addition of the `totalConnections` prop and its integration into the component is well-implemented. The interface is properly typed, and the prop is correctly destructured and used throughout.
</blockquote></details>
<details>
<summary>TESTING_AFTER_FIX.md (1)</summary><blockquote>
`1-407`: **Comprehensive testing documentation.**
This is well-structured post-deployment testing documentation with clear step-by-step instructions, expected outputs, and troubleshooting guidance. The command examples and success criteria will be valuable for validation.
</blockquote></details>
<details>
<summary>convex/settings/queries.ts (1)</summary><blockquote>
`36-45`: **Excellent refactor to use centralized identity guard.**
The simplified implementation using `requireIdentity(ctx)` is cleaner and more maintainable. This centralizes authentication logic and reduces code duplication while maintaining the same functionality.
</blockquote></details>
<details>
<summary>src/components/mvp/user-card/user-card-header.tsx (2)</summary><blockquote>
`19-19`: **Good addition of optional visibility control.**
The `showActions` prop with a default value of `true` maintains backward compatibility while enabling flexible action control. Well done.
Also applies to: 29-29
---
`53-71`: **Clean conditional rendering implementation.**
The modals and actions are properly gated by `showActions`. The modal state management remains intact, ensuring no side effects when actions are hidden.
Also applies to: 111-117
</blockquote></details>
<details>
<summary>src/components/mvp/user-card/user-card-details.tsx (1)</summary><blockquote>
`29-29`: **Consistent visibility control for contact actions.**
The `showContactActions` prop follows the same pattern as the header component, with proper defaults and clean conditional rendering. This provides good control over the user card's action surface.
Also applies to: 41-41, 129-145
</blockquote></details>
<details>
<summary>src/app/app/page.tsx (2)</summary><blockquote>
`27-33`: **Simplified routing logic is more maintainable.**
Removing the state management and directly passing `queueType` as a parameter makes the navigation flow clearer and more predictable.
---
`36-110`: **Clean UI simplification.**
The new two-option layout (Casual/Professional) is more straightforward than the previous tabs-based approach. The emerald theming and responsive grid provide good UX.
</blockquote></details>
<details>
<summary>src/components/queue/MatchNotification.tsx (1)</summary><blockquote>
`55-75`: **Good UI update and proper use of action control.**
The centered layout is cleaner for match notifications, and using `showContactActions={false}` appropriately hides actions that don't make sense in this context. The new button styling is consistent with the emerald theme throughout the PR.
</blockquote></details>
<details>
<summary>src/components/ui/card.tsx (1)</summary><blockquote>
`23-23`: **Padding and spacing adjustments look reasonable.**
The reduced padding (px-6 → px-5, pb-6 → pb-4, etc.) and z-index layering maintain visual hierarchy while tightening the overall card layout.
Also applies to: 68-68, 78-81
</blockquote></details>
<details>
<summary>AUTHENTICATION_FIX_README.md (1)</summary><blockquote>
`40-68`: **Auth fix documentation is clear and actionable**
The configuration and deployment steps here line up well with the Convex/WorkOS error handling you’ve added (especially the explicit `WORKOS_CLIENT_ID` guidance). This should be very helpful for future debugging and onboarding.
</blockquote></details>
<details>
<summary>src/components/queue/SmartConnectionEngine.tsx (1)</summary><blockquote>
`31-81`: **Queue simulation timers and info messaging look solid**
The refactor to gate all timers on `queueStatus === "searching"`, reset state when re‑entering the queue, and clean up every interval/timeout on effect cleanup is sound. The staged `infoMessage` updates and animated rendering block integrate cleanly with the existing `QueueStatus` and “Leave Queue” controls.
Also applies to: 108-141
</blockquote></details>
<details>
<summary>src/components/ui/glass-panel.tsx (1)</summary><blockquote>
`5-31`: **GlassPanel abstraction looks solid**
The `GlassPanel` API (HTML div props + `padding` flag) and the two-layer structure with the pseudo-element on the outer div are clean and reusable. This should make it easy to standardize surfaces across the app without leaking layout details into consumers.
</blockquote></details>
<details>
<summary>src/types/auth.ts (1)</summary><blockquote>
`17-75`: **Hosted vs direct auth option types are clear and helpful**
The `WorkOSAuthUrlOptions` / `WorkOSDirectAuthOptions` split and the “DO NOT USE with hosted AuthKit” comments make it much harder to accidentally pass `provider`/`connection` in the wrong flow. This will pay off in both DX and support.
</blockquote></details>
<details>
<summary>src/app/app/profile/page.tsx (3)</summary><blockquote>
`98-135`: **Form initialization logic is solid and avoids flicker**
Waiting for `profile !== undefined` and using `formInitialized` to guard `reset` avoids double-inits and keeps the form stable whether a profile exists or not. The fallback chain (profile → convexUser → WorkOS user → email local-part) is sensible.
---
`187-215`: **Loading and unauthenticated states look good**
The updated skeleton layout and the unauthenticated “Please log in to view your profile” card both match the new max‑width container pattern and keep the UX consistent with the rest of the app.
---
`224-407`: **Profile layout/cards refactor is clean and cohesive**
The new two-column scrollable layout, split Personal vs Professional cards, and bottom-aligned save button work well together. Keeping email read-only and wiring all fields through `FormField` gives a consistent editing experience.
</blockquote></details>
<details>
<summary>src/components/mvp/dashboard/MyConnections.tsx (1)</summary><blockquote>
`86-113`: **Profile sidebar styling and behavior look good**
The responsive width toggle (`lg:w-[96px]` vs `lg:w-[300px]`), updated header colors, and profession text styling read cleanly and make the collapsed state intuitive while preserving tooltips for full details.
Also applies to: 168-200
</blockquote></details>
</blockquote></details>
</details>
<!-- This is an auto-generated comment by CodeRabbit for review status -->
| "authInfo": [ | ||
| { | ||
| "applicationID": "convex", | ||
| "domain": "https://api.workos.com" | ||
| } | ||
| ] |
There was a problem hiding this comment.
🧩 Analysis chain
Verify the applicationID value.
The applicationID is set to the literal string "convex", but based on the WorkOS domain and the authentication setup described in the PR, this should likely be your actual WorkOS Client ID (format: client_...) or reference an environment variable.
Please confirm whether:
- This is the correct literal value for your Convex + WorkOS setup, or
- This should be replaced with your actual WorkOS Client ID
You can verify the correct configuration in the Convex authentication documentation.
🌐 Web query:
What is the correct format for authInfo applicationID in convex.json for WorkOS authentication?
💡 Result:
Use your WorkOS Client ID (the client_01... string). Put the Client ID as the applicationID value (e.g. "client_01XXXXXXXXXXXXXXXXXXXXXXXX"). [1][2]
Sources:
[1] Convex docs — Convex & WorkOS AuthKit (shows applicationID = WorkOS Client ID).
[2] WorkOS docs — API / examples (shows Client ID format client_01...).
Replace applicationID with your WorkOS Client ID.
The applicationID value "convex" is incorrect. Per Convex and WorkOS documentation, the applicationID must be your actual WorkOS Client ID in the format client_01XXXXXXXXXXXXXXXXXXXXXXXX.
Update line 7 to use your WorkOS Client ID instead of the placeholder:
"applicationID": "client_01XXXXXXXXXXXXXXXXXXXXXXXX"🤖 Prompt for AI Agents
In convex.json around lines 5 to 10, the authInfo.applicationID is set to the
placeholder "convex"; replace that value with your actual WorkOS Client ID in
the format client_01XXXXXXXXXXXXXXXXXXXXXXXX (i.e., update the applicationID
string to the real WorkOS Client ID).
| if (!clientId) { | ||
| throw new Error( | ||
| "WORKOS_CLIENT_ID environment variable is required. " + | ||
| "Set it in your Convex Dashboard (Settings → Environment Variables) before running Convex.", | ||
| ); | ||
| const errorMessage = [ | ||
| "❌ WORKOS_CLIENT_ID environment variable is required but not set.", | ||
| "", | ||
| "🔧 TO FIX THIS ERROR:", | ||
| "1. Go to https://dashboard.convex.dev", | ||
| "2. Select your project and deployment", | ||
| "3. Navigate to: Settings → Environment Variables", | ||
| "4. Add: WORKOS_CLIENT_ID = client_your_client_id_here", | ||
| "5. Save and redeploy: pnpm convex deploy --prod", | ||
| "", | ||
| "📖 For detailed instructions, see: CONVEX_DEPLOYMENT_SETUP.md", | ||
| "", | ||
| "⚠️ Without this variable, ALL authenticated requests will fail with 'Server Error'", | ||
| ].join("\n"); | ||
|
|
||
| console.error(errorMessage); | ||
| throw new Error(errorMessage); |
There was a problem hiding this comment.
🧩 Analysis chain
Keep authConfig typed and double‑check WorkOS issuer/JWKS values.
The env check and detailed error message are great, and the success log with a truncated client ID is helpful. Two follow‑ups worth doing:
-
Re‑add an explicit type for
authConfig(e.g., whateverAuthConfigtype you previously used) so that any future provider misconfigurations are caught at compile time rather than in production. -
Verify the
issuerandjwksURLs against the current WorkOS docs for both tokens (base WorkOS JWTs and user management JWTs). Hard‑coding these is fine as long as they exactly match the expectedissand JWKS endpoints.
For example:
const authConfig: AuthConfig = {
providers: [
{
type: "customJwt" as const,
issuer: "https://api.workos.com/",
jwks: `https://api.workos.com/sso/jwks/${clientId}`,
// ...
},
// ...
],
};Also applies to: 38-39, 41-56
🌐 Web query:
In WorkOS + Convex integrations using custom JWT providers, what are the correct issuer and JWKS URLs for AuthKit JWTs (including user management tokens) that should be configured in Convex's auth.config?
💡 Result:
Use these values in convex/auth.config.ts (replace with your WorkOS client ID):
-
Access tokens (AuthKit login): issuer = https://api.workos.com/
jwks = https://api.workos.com/sso/jwks/{WORKOS_CLIENT_ID}. [1][2] -
User Management tokens: issuer = https://api.workos.com/user_management/{WORKOS_CLIENT_ID}
jwks = https://api.workos.com/sso/jwks/{WORKOS_CLIENT_ID}. [1][3]
References: Convex AuthKit guide (examples). [1] WorkOS AuthKit token verification / JWKS docs. [2][3]
---
🏁 Script executed:
```shell
#!/bin/bash
# Retrieve the full auth.config.ts file to examine the authConfig definition
cat convex/auth.config.ts | head -80
Length of output: 1975
Add explicit type annotation to authConfig.
The issuer and JWKS URLs are correctly configured per WorkOS documentation and match the expected endpoints for both AuthKit and User Management tokens. The only remaining concern is that authConfig lacks an explicit type annotation, which would catch misconfigurations at compile time.
Update line 41 (or wherever authConfig is declared) to include an explicit type, such as:
const authConfig: AuthConfig = {
providers: [
// ...
],
};This ensures any future changes to the provider configuration are validated against your auth config schema at build time.
🤖 Prompt for AI Agents
In convex/auth.config.ts around lines 18 to 35, authConfig is missing an
explicit type annotation; add a typed declaration (e.g., import the AuthConfig
type and declare authConfig: AuthConfig = { ... }) so the compiler validates the
provider shape, adjust any provider fields to match the AuthConfig interface if
errors appear, and run the TypeScript build to verify the fix.
| const meetingNotes: MeetingNote | null = await ctx.runQuery( | ||
| internal.notes.queries.getMeetingNotes, | ||
| { meetingId }, | ||
| ); |
There was a problem hiding this comment.
🧩 Analysis chain
Verify the updated notes query path exists.
The internal query reference has been updated from getMeetingNotesInternal to internal.notes.queries.getMeetingNotes. Ensure this new path is valid and the function exists with a compatible signature.
Run the following script to verify the query path exists:
🏁 Script executed:
#!/bin/bash
# Description: Verify internal.notes.queries.getMeetingNotes exists
# Search for the function definition in the notes queries module
rg -n "getMeetingNotes" --type=ts -g '**/notes/queries.ts' -C3
# Also check for any exports of this function
ast-grep --pattern 'export $_ getMeetingNotes'Length of output: 636
🏁 Script executed:
#!/bin/bash
# Check the function signatures and return types of both queries
# Get full getMeetingNotes definition (public query)
rg -n "export const getMeetingNotes = query" -A 20 --type=ts convex/notes/queries.ts
# Get full getMeetingNotesInternal definition (internal query)
rg -n "export const getMeetingNotesInternal = internalQuery" -A 20 --type=ts convex/notes/queries.ts
# Check the context function analyzeContentForInsights
rg -n "analyzeContentForInsights" --type=ts -B5 -A10 convex/insights/generation.tsLength of output: 2022
Replace getMeetingNotes with getMeetingNotesInternal at line 316.
The code currently references internal.notes.queries.getMeetingNotes, which is a public query with an auth check. Internal calls should use internal.notes.queries.getMeetingNotesInternal instead, which is designed for internal usage without authentication checks.
Line 316 should be:
internal.notes.queries.getMeetingNotesInternal,
🤖 Prompt for AI Agents
In convex/insights/generation.ts around lines 315 to 318, the code calls the
public query internal.notes.queries.getMeetingNotes which enforces auth; replace
that reference with internal.notes.queries.getMeetingNotesInternal so the
internal call uses the non-authenticated internal query. Update the argument
passed to ctx.runQuery to use getMeetingNotesInternal and save the result to
meetingNotes as before.
| html { | ||
| height: 100%; | ||
| overflow-x: hidden; | ||
| overflow-y: auto; | ||
| } | ||
| body { | ||
| background-color: var(--background); | ||
| color: var(--foreground); | ||
| min-height: 100%; | ||
| overflow-x: hidden; | ||
| overflow-y: auto; | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major
Remove duplicate @layer base declarations.
The html and body overflow/height styles are declared twice in separate @layer base blocks (lines 232-243 and lines 322-338). This duplication is unnecessary and could lead to maintenance issues.
Consider consolidating into a single @layer base block. The second block (lines 322-338) includes additional body font styling that should be preserved:
@layer base {
* {
border-color: var(--border);
+ outline: 2px solid rgba(var(--ring), 0.5);
}
html {
height: 100%;
overflow-x: hidden;
overflow-y: auto;
}
body {
background-color: var(--background);
color: var(--foreground);
+ font-family: var(--font-body), system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
+ font-weight: 300;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
min-height: 100%;
overflow-x: hidden;
overflow-y: auto;
}
+ h1, h2, h3, h4, h5, h6 {
+ font-family: var(--font-heading), system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
+ font-weight: 500;
+ letter-spacing: -0.01em;
+ }
}Then remove the duplicate blocks at lines 228-244 and 317-350.
Also applies to: 322-338
🤖 Prompt for AI Agents
In src/app/globals.css around lines 232-243 and 322-338 (also duplicates at
228-244 and 317-350), consolidate the duplicate @layer base blocks into a single
@layer base: keep the html height/overflow and body min-height/overflow rules
but preserve the additional body font styling from the second block; merge the
rules so html/body are declared once and remove the duplicate @layer base blocks
(delete the older/extra blocks at the ranges mentioned).
| <motion.a | ||
| href="/auth/sign-in" | ||
| onClick={(e) => handleTransition(e, "/auth/sign-in", router)} | ||
| className="group relative sm:w-auto" | ||
| whileHover={{ scale: 1.05 }} | ||
| whileTap={{ scale: 0.95 }} | ||
| > | ||
| <GlassCard className="px-8 py-4 transition-all duration-300 hover:bg-white/20 dark:hover:bg-white/10"> | ||
| <span className="flex items-center gap-2 font-medium text-slate-700 dark:text-slate-200"> | ||
| See How It Works | ||
| <ChevronRight className="h-5 w-5 transition-transform group-hover:translate-x-1" /> | ||
| </span> | ||
| </GlassCard> | ||
| </button> | ||
| </motion.a> |
There was a problem hiding this comment.
Misleading CTA label and destination.
The button label "See How It Works" suggests a demo, tutorial, or product walkthrough, but the hardcoded href="/auth/sign-in" forces users to authenticate instead. This creates a confusing user experience where expectations don't match the action.
Consider one of these solutions:
- Solution 1 (Recommended): Change the label to match the action, e.g., "Get Started" or "Sign In to Start"
- Solution 2: Change the destination to show a demo or product tour before requiring sign-in
Solution 1: Update the label
<motion.a
href="/auth/sign-in"
onClick={(e) => handleTransition(e, "/auth/sign-in", router)}
className="group relative sm:w-auto"
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
>
<GlassCard className="px-8 py-4 transition-all duration-300 hover:bg-white/20 dark:hover:bg-white/10">
<span className="flex items-center gap-2 font-medium text-slate-700 dark:text-slate-200">
- See How It Works
+ Get Started
<ChevronRight className="h-5 w-5 transition-transform group-hover:translate-x-1" />
</span>
</GlassCard>
</motion.a>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <motion.a | |
| href="/auth/sign-in" | |
| onClick={(e) => handleTransition(e, "/auth/sign-in", router)} | |
| className="group relative sm:w-auto" | |
| whileHover={{ scale: 1.05 }} | |
| whileTap={{ scale: 0.95 }} | |
| > | |
| <GlassCard className="px-8 py-4 transition-all duration-300 hover:bg-white/20 dark:hover:bg-white/10"> | |
| <span className="flex items-center gap-2 font-medium text-slate-700 dark:text-slate-200"> | |
| See How It Works | |
| <ChevronRight className="h-5 w-5 transition-transform group-hover:translate-x-1" /> | |
| </span> | |
| </GlassCard> | |
| </button> | |
| </motion.a> | |
| <motion.a | |
| href="/auth/sign-in" | |
| onClick={(e) => handleTransition(e, "/auth/sign-in", router)} | |
| className="group relative sm:w-auto" | |
| whileHover={{ scale: 1.05 }} | |
| whileTap={{ scale: 0.95 }} | |
| > | |
| <GlassCard className="px-8 py-4 transition-all duration-300 hover:bg-white/20 dark:hover:bg-white/10"> | |
| <span className="flex items-center gap-2 font-medium text-slate-700 dark:text-slate-200"> | |
| Get Started | |
| <ChevronRight className="h-5 w-5 transition-transform group-hover:translate-x-1" /> | |
| </span> | |
| </GlassCard> | |
| </motion.a> |
🤖 Prompt for AI Agents
In src/app/page.tsx around lines 448 to 461, the CTA text "See How It Works"
conflicts with the href="/auth/sign-in" which forces authentication; update the
label to match the action (e.g., "Get Started" or "Sign In to Start") so the
button copy reflects that it leads to the sign-in page, leaving the href and
onClick/router behavior unchanged.
| {navSections.map((section) => ( | ||
| <div key={section.title} className="space-y-2"> | ||
| <p className="px-3 text-[11px] font-medium uppercase tracking-[0.2em] text-emerald-900/60 dark:text-emerald-100/60"> | ||
| {section.title} | ||
| </p> | ||
| <div className="space-y-1"> | ||
| {section.items.map((item) => { | ||
| const isActive = | ||
| pathname === item.href || | ||
| (item.href !== "/app" && | ||
| pathname.startsWith(`${item.href}/`)); | ||
|
|
There was a problem hiding this comment.
🧩 Analysis chain
Fix active nav detection for querystring routes and pt-104 spacing typo
Two small but user-visible issues here:
-
Active-state check won’t work for links with querystrings
usePathname()returns only the path (e.g./app/smart-connection), while someitem.hrefvalues fromnavSectionsinclude query parameters (e.g./app/smart-connection?type=casual). In those cases, both:pathname === item.hrefpathname.startsWith(\${item.href}/`)`
will always be false, so those items never appear active. A simple fix is to compare only the pathname portion of
item.href:- {section.items.map((item) => { - const isActive = - pathname === item.href || - (item.href !== "/app" && - pathname.startsWith(`${item.href}/`));
-
{section.items.map((item) => { -
const itemPath = item.href.split("?")[0]; -
const isActive = -
pathname === itemPath || -
(itemPath !== "/app" && pathname.startsWith(`${itemPath}/`));
-
pt-104is likely an invalid/accidental spacing class
pt-104(Line 71) doesn’t exist in the default Tailwind spacing scale and looks like a typo for something much smaller (e.g.pt-4orpt-10). Adjusting it to a valid spacing token will make the logout section layout more predictable:- <div className="mt-auto px-3 pt-104"> + <div className="mt-auto px-3 pt-4">
(Swap
pt-4for whatever spacing matches your design system.)
Also applies to: 71-79
I'll verify the review comment by examining the actual code in the repository.
🏁 Script executed:
#!/bin/bash
# Examine the DesktopNavigation.tsx file
cat "src/components/mvp/DesktopNavigation.tsx"Length of output: 3792
🏁 Script executed:
#!/bin/bash
# Search for navSections definition or import
rg -n "navSections" --type ts --type tsx -C 5Length of output: 27
🏁 Script executed:
#!/bin/bash
# Check for pt-104 spacing class usage across the codebase
rg -n "pt-104" --type ts --type tsxLength of output: 27
🏁 Script executed:
#!/bin/bash
# Search for any custom Tailwind spacing config that might define pt-104
fd -e "tailwind.config" -o -e "tailwind.js" | head -5Length of output: 116
🏁 Script executed:
#!/bin/bash
# Check for usePathname import
rg -n "usePathname" "src/components/mvp/DesktopNavigation.tsx" -C 3Length of output: 474
I need to inspect the navigation config file to verify whether querystrings are actually present in the href values.
---
🏁 Script executed:
```shell
#!/bin/bash
# Find navigation.config file
fd "navigation.config" -type f
Length of output: 170
🏁 Script executed:
#!/bin/bash
# Search for navSections with corrected rg syntax
rg "navSections" -C 10Length of output: 5243
🏁 Script executed:
#!/bin/bash
# Check for custom Tailwind spacing configuration
fd "tailwind" -type f | head -20Length of output: 170
🏁 Script executed:
#!/bin/bash
# Search for pt-104 directly without type filter
rg "pt-104" -C 3Length of output: 455
🏁 Script executed:
#!/bin/bash
# View full navigation.config.ts file
cat "src/components/mvp/navigation.config.ts"Length of output: 1383
🏁 Script executed:
#!/bin/bash
# Check for any custom Tailwind config (correct fd syntax)
find . -name "tailwind.config.*" -o -name "tailwind.js"Length of output: 0
Fix active nav detection for querystring routes and invalid pt-104 spacing class
Two confirmed issues:
-
Active-state check won't work for links with querystrings
usePathname()returns only the path (e.g./app/smart-connection), while items innavSectionswith query parameters (e.g./app/smart-connection?type=casualfor "Casual" and `/app/smart-connection?type=professional" for "Professional") will never be marked active. Both comparison checks fail since the query string is stripped. Compare only the pathname portion:- {section.items.map((item) => { - const isActive = - pathname === item.href || - (item.href !== "/app" && - pathname.startsWith(`${item.href}/`)); + {section.items.map((item) => { + const itemPath = item.href.split("?")[0]; + const isActive = + pathname === itemPath || + (itemPath !== "/app" && pathname.startsWith(`${itemPath}/`));
-
pt-104is not a valid Tailwind spacing class
The default Tailwind scale does not includept-104(maximum ispt-96), so this class produces no styling. Change to a valid spacing value:- <div className="mt-auto px-3 pt-104"> + <div className="mt-auto px-3 pt-4">
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| {navSections.map((section) => ( | |
| <div key={section.title} className="space-y-2"> | |
| <p className="px-3 text-[11px] font-medium uppercase tracking-[0.2em] text-emerald-900/60 dark:text-emerald-100/60"> | |
| {section.title} | |
| </p> | |
| <div className="space-y-1"> | |
| {section.items.map((item) => { | |
| const isActive = | |
| pathname === item.href || | |
| (item.href !== "/app" && | |
| pathname.startsWith(`${item.href}/`)); | |
| {navSections.map((section) => ( | |
| <div key={section.title} className="space-y-2"> | |
| <p className="px-3 text-[11px] font-medium uppercase tracking-[0.2em] text-emerald-900/60 dark:text-emerald-100/60"> | |
| {section.title} | |
| </p> | |
| <div className="space-y-1"> | |
| {section.items.map((item) => { | |
| const itemPath = item.href.split("?")[0]; | |
| const isActive = | |
| pathname === itemPath || | |
| (itemPath !== "/app" && | |
| pathname.startsWith(`${itemPath}/`)); |
🤖 Prompt for AI Agents
In src/components/mvp/DesktopNavigation.tsx around lines 18 to 29, the
active-state logic and a spacing class are wrong: derive a pathname-only version
of each item.href (e.g., split on '?' or use new URL(item.href,
location.origin).pathname) and use that when comparing to usePathname() so links
with querystrings can be detected as active; and replace the invalid Tailwind
class pt-104 with a valid spacing token (e.g., pt-24 or another appropriate
value from the Tailwind scale) to restore the intended top padding.
| const MOBILE_ITEM_ORDER = ["Home", "Smart Match", "Match Queue", "Profile"]; | ||
|
|
||
| export function MobileNavigation() { | ||
| const pathname = usePathname(); | ||
| const navItems = navSections | ||
| .flatMap((section) => section.items) | ||
| .filter((item) => MOBILE_ITEM_ORDER.includes(item.name)) | ||
| .sort( | ||
| (a, b) => | ||
| MOBILE_ITEM_ORDER.indexOf(a.name) - | ||
| MOBILE_ITEM_ORDER.indexOf(b.name), | ||
| ); |
There was a problem hiding this comment.
🧩 Analysis chain
Keep MOBILE_ITEM_ORDER in sync with navSections and normalize href for active state.
The data‑driven mobile nav is nice, but two things are easy to miss:
-
MOBILE_ITEM_ORDERfilters byitem.name. Any navSections item whosenamedoesn’t exactly match these strings just disappears from mobile nav. Make sure navSections actually defines"Smart Match"and"Match Queue"(or adjust the order array to existing names) so items don’t silently vanish. -
usePathname()returns the path without the query string. If anyitem.hrefincludes query params (e.g./app/smart-connection?type=casual), this condition:
pathname === item.href || pathname.startsWith(`${item.href}/`)will never be true. Consider comparing against the base path instead:
const itemPath = item.href.split("?")[0];
const isActive =
pathname === itemPath || pathname.startsWith(`${itemPath}/`);This will keep active highlighting working even when hrefs carry query strings.
Also applies to: 35-50
🌐 Web query:
In the Next.js App Router, does `usePathname()` include the query string, or does it return only the pathname portion of the URL?
💡 Result:
usePathname() returns only the pathname (it does NOT include the query string). Use useSearchParams() to read query parameters. [1][2]
Sources:
[1] Next.js docs — usePathname (returns current URL's pathname; example: /dashboard?v=2 → '/dashboard').
[2] Next.js docs — useRouter / migration notes (useSearchParams for query params).
I'll verify the codebase context to confirm both concerns in the review comment.
Now I need to inspect the actual codebase to verify whether the concerns are real issues.
Let me search for the file in the repository:
Once you provide the file content and full code context from lines 10-50, I can verify:
- NavSections sync: Whether navSections items actually have names like "Smart Match" and "Match Queue"
- Query parameters in hrefs: Whether any item.href values use query strings (e.g.,
/app/smart-connection?type=casual) - Active state logic: The implementation at lines 35-50 to see the full context
Please share the complete file or at minimum lines 1-60 of src/components/mvp/MobileNavigation.tsx so I can finalize the verification.
🏁 Script executed:
#!/bin/bash
# Find and examine the MobileNavigation.tsx file
find . -name "MobileNavigation.tsx" -type f 2>/dev/null | head -1Length of output: 41
🏁 Script executed:
#!/bin/bash
# Search for the MobileNavigation file
fd "MobileNavigation" --type fLength of output: 39
---
🏁 Script executed:
```shell
#!/bin/bash
# Read the full MobileNavigation.tsx file
cat src/components/mvp/MobileNavigation.tsx
Length of output: 2334
---
🏁 Script executed:
```shell
#!/bin/bash
# Find and read the navigation.config file
fd "navigation.config" --type f
Length of output: 39
---
🏁 Script executed:
```shell
#!/bin/bash
# Read the navigation.config file
cat src/components/mvp/navigation.config.ts
Length of output: 1383
Fix MOBILE_ITEM_ORDER to match actual item names in navSections, and normalize href for active state checks.
The mobile nav has two critical issues:
-
Name mismatch:
MOBILE_ITEM_ORDERreferences"Smart Match"and"Match Queue", butnavSectionsactually defines"Dashboard","Settings","Casual", and"Professional". The filter will only match"Home"and"Profile", silently dropping the others. UpdateMOBILE_ITEM_ORDERto match the actual item names you want to display. -
Query string breaks active state: Items in
navSectionshave query parameters (e.g.,"Casual"useshref="/app/smart-connection?type=casual"). SinceusePathname()returns only the pathname without the query string, the active state check:
pathname === item.href || pathname.startsWith(`${item.href}/`)will fail for these items. Apply the fix to strip query params:
const itemPath = item.href.split("?")[0];
const isActive = pathname === itemPath || pathname.startsWith(`${itemPath}/`);🤖 Prompt for AI Agents
In src/components/mvp/MobileNavigation.tsx around lines 10 to 21,
MOBILE_ITEM_ORDER contains names that don't match navSections (e.g., "Smart
Match", "Match Queue") causing items to be filtered out; update
MOBILE_ITEM_ORDER to the actual nav item names you want shown (e.g., include
"Casual" and "Professional" or whatever exact names navSections uses) and, when
computing active state, normalize item.href by stripping query parameters before
comparing to pathname (e.g., derive itemPath = item.href.split("?")[0] and use
itemPath for equality and startsWith checks).
Summary by CodeRabbit
Release Notes
New Features
Bug Fixes
UI/UX Improvements
Documentation