refactor(platform): improve UI and optimize convex performance#65
Conversation
📝 WalkthroughWalkthroughThis pull request introduces a comprehensive set of UI and functionality updates across authentication, dashboard layouts, and conversation components. Key changes include: replacing FormSkeleton with a new AuthFormSkeleton component in authentication pages; modifying Microsoft Entra ID authentication requirements to depend on SECRET and TENANT_ID instead of three environment variables; standardizing skeleton placeholder heights from h-10 to h-9 across multiple dashboard pages; removing Suspense boundaries from conversation pages and adding dedicated skeleton loaders; adjusting layout padding and max-height constraints; restructuring conversation loading states with comprehensive skeleton UIs; adding a new navigation sub-items structure for conversation statuses; and changing error handling in the dashboard layout to throw errors instead of redirecting when organization data is missing. Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Comment |
There was a problem hiding this comment.
Actionable comments posted: 10
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (7)
services/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsx (2)
64-67: Consider removing the empty callback function.Since Convex automatically refetches queries via real-time updates, this empty
handleStepCreatedfunction serves no purpose. Consider either removing theonStepCreatedprop from theAutomationStepscomponent (line 79) if it's optional, or passingundefinedexplicitly.🔎 Proposed refactor
- // Handle step creation to refresh the steps - const handleStepCreated = () => { - // The useQuery hook will automatically refetch when the data changes - // due to Convex's real-time updates, so we don't need to do anything here - }; - return ( <AutomationSteps status={ (automation?.status as 'draft' | 'active' | 'inactive' | 'archived') ?? 'draft' } className="flex-1" steps={steps || []} organizationId={organizationId} automationId={amId} - onStepCreated={handleStepCreated} /> );
52-53: Replace type assertions with proper validation.The type assertions on lines 52-53 and 72-73 violate the coding guideline: "DO NOT use type casting." These assertions are unsafe because URL params might not match the expected types, potentially causing runtime errors.
As per coding guidelines, implement proper type guards or validation to ensure type safety.
🔎 Proposed validation approach
+import { isId } from '@/convex/_generated/dataModel'; + export default function AutomationStepsPage() { const params = useParams(); - const organizationId = params?.id as string; - const amId = params?.amId as Id<'wfDefinitions'>; + + const organizationId = typeof params?.id === 'string' ? params.id : ''; + const amId = + typeof params?.amId === 'string' && isId('wfDefinitions', params.amId) + ? (params.amId as Id<'wfDefinitions'>) + : undefined; + const steps = useQuery( api.wf_step_defs.getWorkflowStepsPublic, amId ? { wfDefinitionId: amId } : 'skip', ); const automation = useQuery( api.wf_definitions.getWorkflowPublic, amId ? { wfDefinitionId: amId } : 'skip', ); // ... rest of component return ( <AutomationSteps status={ - (automation?.status as 'draft' | 'active' | 'inactive' | 'archived') ?? - 'draft' + ['draft', 'active', 'inactive', 'archived'].includes(automation?.status || '') + ? (automation?.status as 'draft' | 'active' | 'inactive' | 'archived') + : 'draft' } className="flex-1" steps={steps || []} organizationId={organizationId} automationId={amId} onStepCreated={handleStepCreated} /> ); }Also applies to: 72-73
services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx (3)
151-159: Remove unreachable code after early return.Lines 153-159 are unreachable due to the
return;statement on line 151. Since the save functionality is intentionally disabled (per the comment), either remove these lines or wrap them in a conditional block that will execute when the public mutation becomes available.🔎 Proposed fix
return; - - toast({ - title: tToast('success.saved'), - variant: 'success', - }); - - setHasChanges(false); - router.refresh(); } catch (error) {
84-84: Add error handling for JSON.parse in change tracking effect.The
JSON.parse(variables)call on line 84 lacks error handling. If a user types invalid JSON, this will throw an exception and crash the component. While the save handler (line 121) properly validates JSON, the change tracking effect should also handle parsing errors gracefully.🔎 Proposed fix
useEffect(() => { if (!workflow) return; const config = workflow.config as WorkflowConfig; - const currentVariables = variables.trim() ? JSON.parse(variables) : {}; + let currentVariables = {}; + try { + currentVariables = variables.trim() ? JSON.parse(variables) : {}; + } catch { + // Invalid JSON - skip change detection for variables + return; + } const changed =
172-191: Consider removing unused cancel handler.The
_handleCancelfunction is fully implemented but never invoked. If cancel functionality isn't needed, remove this function. Otherwise, consider adding a Cancel button to the UI to utilize this logic.services/platform/components/layout/content-wrapper.tsx (1)
11-11: Update the component documentation to reflect removal of default padding.The comment states "Provides consistent padding and flex behavior" but padding classes were removed from the component. This documentation is now inconsistent with the implementation.
🔎 Suggested fix
/** * Standard content wrapper for page layouts. - * Provides consistent padding and flex behavior across all pages. + * Provides consistent flex behavior across all pages. + * Consumers should apply padding via the className prop as needed. * Uses min-h-0 to allow children to control their own overflow. */services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsx (1)
109-115: Type mismatch:conversationsshould allowundefined.The
conversationsprop is typed asConversation[](line 110) but the code treats it as potentiallyundefined(line 200). This creates a type safety gap where TypeScript won't catch cases whereundefinedis incorrectly passed.🔎 Proposed fix
interface ConversationsListProps { - conversations: Conversation[]; + conversations: Conversation[] | undefined; selectedConversationId?: string | null; onConversationSelect?: (conversation: Conversation) => void; onConversationCheck?: (conversationId: string, checked: boolean) => void; isConversationSelected?: (conversationId: string) => boolean; }Also applies to: 198-202
📜 Review details
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro (Legacy)
📒 Files selected for processing (30)
services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsxservices/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsxservices/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsxservices/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/message.tsxservices/platform/app/(app)/dashboard/[id]/layout.tsxservices/platform/app/(app)/dashboard/[id]/settings/organization/page.tsxservices/platform/components/auth/log-in-form.tsxservices/platform/components/layout/content-wrapper.tsxservices/platform/components/skeletons/auth-skeleton.tsxservices/platform/components/skeletons/form-skeleton.tsxservices/platform/components/skeletons/list-skeleton.tsxservices/platform/components/ui/data-table/data-table-skeleton.tsxservices/platform/components/ui/data-table/data-table.tsxservices/platform/components/ui/dialog/dialog.tsxservices/platform/hooks/use-navigation-items.ts
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx}: USE implicit typing whenever possible in TypeScript
DO NOT use type casting. Avoidanyandunknowntypes whenever possible in TypeScript
ALWAYS put imports at the top and exports at the bottom. Keep them sorted correctly in TypeScript
PREFER named exports. AVOID default exports in TypeScript (only use if needed)
Files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/components/skeletons/list-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/settings/organization/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsxservices/platform/components/layout/content-wrapper.tsxservices/platform/components/ui/dialog/dialog.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/message.tsxservices/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsxservices/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsxservices/platform/app/(app)/dashboard/[id]/layout.tsxservices/platform/components/ui/data-table/data-table-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsxservices/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/page.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsxservices/platform/components/skeletons/form-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsxservices/platform/components/skeletons/auth-skeleton.tsxservices/platform/hooks/use-navigation-items.tsservices/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsxservices/platform/components/ui/data-table/data-table.tsxservices/platform/components/auth/log-in-form.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
**/*.{tsx,jsx}
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.{tsx,jsx}: Do NOT hardcode text in React; use translation hooks/functions instead for user-facing UI
CONSIDER ALWAYS TO add optimistic updates withwithOptimisticUpdateforuseMutation. If you decide to NOT add an optimistic update, you need to provide a good reason why and comment the hook in React
USEuseMemo,useCallbackandmemoat the right moments in React
DO NOT overuseuseEffectin React
USEcvaif a component has multiple variants in React
CONSIDER TO preload queries withpreloadQueryandusePreloadedQueryin React with Convex
Files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/components/skeletons/list-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/settings/organization/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsxservices/platform/components/layout/content-wrapper.tsxservices/platform/components/ui/dialog/dialog.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/message.tsxservices/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsxservices/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsxservices/platform/app/(app)/dashboard/[id]/layout.tsxservices/platform/components/ui/data-table/data-table-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsxservices/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/page.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsxservices/platform/components/skeletons/form-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsxservices/platform/components/skeletons/auth-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsxservices/platform/components/ui/data-table/data-table.tsxservices/platform/components/auth/log-in-form.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
🧠 Learnings (48)
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace m-[8px] with m-2
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/page.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace p-[8px] with p-2
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-12-26T02:23:20.245Z
Learnt from: larryro
Repo: tale-project/tale PR: 35
File: services/platform/app/(app)/dashboard/[id]/chat/components/integration-approval-card.tsx:58-90
Timestamp: 2025-12-26T02:23:20.245Z
Learning: In services/platform/app/(app)/dashboard/[id]/chat/components/integration-approval-card.tsx, prefer reading the approving user from the authenticated session context rather than passing a userId from the frontend. The hardcoded 'user' string can be acceptable only as a temporary placeholder during the initial implementation until a user profile feature is added; plan to replace with proper user identity via session context or user service once backend supports it.
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/components/skeletons/list-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/settings/organization/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsxservices/platform/components/layout/content-wrapper.tsxservices/platform/components/ui/dialog/dialog.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/message.tsxservices/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsxservices/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsxservices/platform/app/(app)/dashboard/[id]/layout.tsxservices/platform/components/ui/data-table/data-table-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsxservices/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsxservices/platform/app/(app)/dashboard/[id]/chat/page.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsxservices/platform/components/skeletons/form-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsxservices/platform/components/skeletons/auth-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsxservices/platform/components/ui/data-table/data-table.tsxservices/platform/components/auth/log-in-form.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[14px] with text-sm
Applied to files:
services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace m-[4px] with m-1
Applied to files:
services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2024-10-31T07:10:23.361Z
Learnt from: Israeltheminer
Repo: talecorp/tale PR: 1536
File: apps/app/app/[locale]/(protected)/merchant/(dashboard)/(settings)/(organization-settings)/business-details/page.tsx:21-21
Timestamp: 2024-10-31T07:10:23.361Z
Learning: In `apps/app/app/[locale]/(protected)/merchant/(dashboard)/(settings)/(organization-settings)/business-details/page.tsx`, the `numberOfEmployees` field in `BusinessDetailsForm` is not a required form entry.
Applied to files:
services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsx
📚 Learning: 2025-11-25T04:37:44.394Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-11-25T04:37:44.394Z
Learning: Applies to **/*.{tsx,jsx} : Use semantic spacing classes when available: `p-1` for 4px, `p-2` for 8px, `m-1` for 4px, `m-2` for 8px
Applied to files:
services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsxservices/platform/components/layout/content-wrapper.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx
📚 Learning: 2025-11-25T04:37:44.394Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-11-25T04:37:44.394Z
Learning: Applies to **/*.{tsx,jsx} : Use standard font size classes instead of arbitrary values: `text-xs` for 12px, `text-sm` for 14px, `text-base` for 16px, `text-lg` for 18px, `text-xl` for 20px, `text-2xl` for 24px
Applied to files:
services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to **/*.{tsx,jsx} : Use Suspense for loading states in components
Applied to files:
services/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Use bg-background for main backgrounds instead of bg-white
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/message.tsx
📚 Learning: 2026-01-01T12:35:37.946Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-01T12:35:37.946Z
Learning: Applies to **/*.{tsx,jsx} : CONSIDER TO preload queries with `preloadQuery` and `usePreloadedQuery` in React with Convex
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to app/**/*.tsx : Use server components for data fetching, database queries, and server-side logic
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsxservices/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
📚 Learning: 2025-08-21T14:59:36.874Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursorrules:0-0
Timestamp: 2025-08-21T14:59:36.874Z
Learning: Applies to app/**/page.tsx : Next.js App Router pages (page.tsx) are server components by default
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx
📚 Learning: 2025-08-21T14:59:36.874Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursorrules:0-0
Timestamp: 2025-08-21T14:59:36.874Z
Learning: Applies to {app,components}/**/*.{tsx,jsx} : Use 'use client' only when needed for interactions/state (client components)
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-10-11T11:46:02.452Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursorrules:0-0
Timestamp: 2025-10-11T11:46:02.452Z
Learning: Applies to **/*.{tsx,jsx} : Use 'use client' only for components that need interactions or state
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to app/**/*.tsx : Use client components only for user interactions, browser APIs, and state management
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-10-11T11:46:02.452Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursorrules:0-0
Timestamp: 2025-10-11T11:46:02.452Z
Learning: Applies to **/*.tsx : Follow the required client component structure: imports, Props interface, hooks, effects, handlers, and render order; include 'use client' only when needed
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-11-30T12:29:39.745Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/workspace_rules.mdc:0-0
Timestamp: 2025-11-30T12:29:39.745Z
Learning: Applies to **/*.{tsx,jsx} : Use `'use client'` directive only for components that require interactions or state management
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-08-21T15:01:09.405Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursor/rules/core-rules.mdc:0-0
Timestamp: 2025-08-21T15:01:09.405Z
Learning: Applies to **/*.{tsx,jsx} : 'use client' directive only when needed at the top of client components
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-07-19T15:30:00.886Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/core-rules.mdc:0-0
Timestamp: 2025-07-19T15:30:00.886Z
Learning: Applies to **/*.{tsx,jsx} : Follow the required React component structure: 'use client' (when needed), imports, Props interface, function definition, hooks, effects, event handlers, and render in order
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
📚 Learning: 2025-11-30T03:53:00.316Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-11-30T03:53:00.316Z
Learning: Applies to convex/**/*.ts : Use the `api` object from `convex/_generated/api.ts` to call public functions registered with `query`, `mutation`, or `action`
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsxservices/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
📚 Learning: 2025-11-25T04:37:44.394Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-11-25T04:37:44.394Z
Learning: Applies to **/*.{tsx,jsx} : ALWAYS use the Table component (`Table`, `TableHeader`, `TableBody`, `TableRow`, `TableHead`, `TableCell`) instead of custom flex layouts; apply proper column widths using rem units and use semantic colors for all text and backgrounds
Applied to files:
services/platform/components/ui/data-table/data-table-skeleton.tsxservices/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsxservices/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsxservices/platform/components/ui/data-table/data-table.tsxservices/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Always use the Table component instead of custom flex layouts for tabular data
Applied to files:
services/platform/components/ui/data-table/data-table-skeleton.tsxservices/platform/components/ui/data-table/data-table.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Use Table, TableHeader, TableBody, TableRow, TableHead, and TableCell components for tables
Applied to files:
services/platform/components/ui/data-table/data-table-skeleton.tsxservices/platform/components/ui/data-table/data-table.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace p-[4px] with p-1
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to **/*.{tsx,jsx} : Implement error boundaries for error handling in components
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx
📚 Learning: 2025-10-03T11:34:20.628Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-10-03T11:34:20.628Z
Learning: Applies to convex/**/*.{ts,js} : Register internal functions with internalQuery, internalMutation, and internalAction (imported from ./_generated/server)
Applied to files:
services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
📚 Learning: 2025-10-03T11:34:20.628Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-10-03T11:34:20.628Z
Learning: Applies to convex/schema.ts : Import schema helpers (defineSchema, defineTable) from convex/server
Applied to files:
services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
📚 Learning: 2025-12-30T06:20:39.422Z
Learnt from: larryro
Repo: tale-project/tale PR: 37
File: services/platform/convex/model/conversations/validators.ts:106-139
Timestamp: 2025-12-30T06:20:39.422Z
Learning: In services/platform/convex/model/conversations/validators.ts, conversationItemValidator and conversationWithMessagesValidator are intentionally kept as separate validators despite having identical structures. This separation serves different semantic purposes: conversationItemValidator is for list responses while conversationWithMessagesValidator is for single conversation detail views. The duplication allows future divergence when list views might need different fields than detail views for performance or feature reasons.
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsxservices/platform/hooks/use-navigation-items.ts
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to **/*.{tsx,jsx} : Consistent component structure: hooks, effects, event handlers, render
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsxservices/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx
📚 Learning: 2025-11-30T03:53:00.316Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/convex_rules.mdc:0-0
Timestamp: 2025-11-30T03:53:00.316Z
Learning: Applies to convex/**/*.ts : Try to use as few calls from actions to queries and mutations as possible to avoid race conditions, since queries and mutations are transactions
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
📚 Learning: 2025-11-30T12:29:39.745Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/workspace_rules.mdc:0-0
Timestamp: 2025-11-30T12:29:39.745Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Use descriptive message as toast `title` (never generic 'Error'), with optional `description` only for additional context
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
📚 Learning: 2025-12-30T06:21:13.183Z
Learnt from: larryro
Repo: tale-project/tale PR: 37
File: services/platform/convex/model/documents/validators.ts:89-102
Timestamp: 2025-12-30T06:21:13.183Z
Learning: Do not flag a missing trailing newline for TypeScript files in code reviews. POSIX text files should end with a trailing newline and Prettier (or your formatter) will enforce this. Treat the trailing newline as a non-issue in reviews for all TS files.
Applied to files:
services/platform/hooks/use-navigation-items.ts
📚 Learning: 2025-07-19T15:30:00.886Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/core-rules.mdc:0-0
Timestamp: 2025-07-19T15:30:00.886Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Extract reusable functions, add comprehensive error handling, improve naming and documentation, and remove temporary debug code during optimization
Applied to files:
services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx
📚 Learning: 2025-08-21T14:59:36.874Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursorrules:0-0
Timestamp: 2025-08-21T14:59:36.874Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Use useCallback for stable function references passed to children
Applied to files:
services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to **/*.{tsx,jsx} : Use dynamic imports for code splitting
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx
📚 Learning: 2025-10-11T11:46:02.452Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursorrules:0-0
Timestamp: 2025-10-11T11:46:02.452Z
Learning: Applies to **/*.{tsx,jsx} : Use dynamic imports for code splitting where appropriate
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx
📚 Learning: 2025-08-21T14:59:36.874Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursorrules:0-0
Timestamp: 2025-08-21T14:59:36.874Z
Learning: Applies to app/**/*.{tsx,jsx} : Use dynamic imports for code splitting where appropriate
Applied to files:
services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Apply column widths in tables using rem units
Applied to files:
services/platform/components/ui/data-table/data-table.tsx
📚 Learning: 2025-07-19T15:29:09.401Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursorrules:0-0
Timestamp: 2025-07-19T15:29:09.401Z
Learning: Applies to **/*.{js,jsx,ts,tsx,md,mdx,json} : All user-facing content must be in English only, including UI components, labels, buttons, dialogs, forms, toast messages, error messages, success messages, comments, documentation, README files, variable names, function names, and type names. Only use other languages when explicitly requested for translation content.
Applied to files:
services/platform/components/auth/log-in-form.tsx
📚 Learning: 2026-01-01T12:35:37.946Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-01T12:35:37.946Z
Learning: Applies to **/*.{tsx,jsx} : Do NOT hardcode text in React; use translation hooks/functions instead for user-facing UI
Applied to files:
services/platform/components/auth/log-in-form.tsx
📚 Learning: 2025-10-11T11:46:02.452Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursorrules:0-0
Timestamp: 2025-10-11T11:46:02.452Z
Learning: Applies to **/*.{tsx,jsx} : Toast, error, and success messages must be English only
Applied to files:
services/platform/components/auth/log-in-form.tsx
📚 Learning: 2024-10-08T22:12:08.924Z
Learnt from: yannickmonney
Repo: talecorp/tale PR: 1304
File: apps/app/app/[locale]/(protected)/merchant/(dashboard)/subscription-plans/addons-form.tsx:45-49
Timestamp: 2024-10-08T22:12:08.924Z
Learning: In `addons-form.tsx`, nesting forms is acceptable because there is a parent form and a child form managing different parts of the total form submission using React Hook Form.
Applied to files:
services/platform/components/auth/log-in-form.tsx
📚 Learning: 2025-12-19T04:29:09.246Z
Learnt from: larryro
Repo: tale-project/tale PR: 26
File: services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx:82-92
Timestamp: 2025-12-19T04:29:09.246Z
Learning: In services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx, the team prefers using router.refresh() for polling in-progress RAG statuses over targeted status fetching, prioritizing simplicity and state consistency given the expected low number of concurrent indexing jobs (1-3 documents).
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[20px] with text-xl
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[12px] with text-xs
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[24px] with text-2xl
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[18px] with text-lg
Applied to files:
services/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
🧬 Code graph analysis (10)
services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsx (1)
services/platform/components/ui/layout.tsx (2)
Stack(242-242)HStack(242-242)
services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx (3)
services/platform/lib/convex-next-server.ts (1)
fetchQuery(53-72)services/platform/convex/conversations.ts (1)
hasConversations(405-419)services/platform/app/(app)/dashboard/[id]/conversations/components/activate-conversations-empty-state.tsx (1)
ActivateConversationsEmptyState(11-35)
services/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsx (1)
services/platform/components/skeletons/auth-skeleton.tsx (1)
AuthFormSkeleton(52-84)
services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx (1)
services/platform/components/layout/content-wrapper.tsx (1)
ContentWrapper(14-20)
services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx (2)
services/platform/components/async-boundary.tsx (1)
Suspense(144-144)services/platform/components/skeletons/auth-skeleton.tsx (1)
AuthFormSkeleton(52-84)
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx (1)
services/platform/convex/model/conversations/types.ts (1)
ConversationItem(28-28)
services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx (1)
services/platform/components/ui/layout.tsx (2)
Stack(242-242)Grid(242-242)
services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx (1)
services/platform/hooks/use-url-state.ts (1)
useUrlState(79-223)
services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx (2)
services/platform/app/(app)/dashboard/[id]/conversations/components/message-editor.tsx (1)
MessageEditor(660-666)services/platform/components/ui/layout.tsx (1)
Stack(242-242)
services/platform/components/auth/log-in-form.tsx (1)
services/platform/components/ui/form.tsx (1)
Form(43-43)
🔇 Additional comments (32)
services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsx (1)
48-49: Standardized skeleton heights align with PR objectives.The height change from h-10 to h-9 is properly applied to both Skeleton components in the customHeader, maintaining responsive width handling (w-full sm:w-[300px] and w-40). This change contributes to consistent button and input sizing across the dashboard as stated in the PR objectives.
services/platform/app/(app)/dashboard/[id]/chat/page.tsx (1)
50-50: LGTM! Skeleton height standardization.This height adjustment (h-10 → h-9) aligns with the PR's design consistency effort to standardize skeleton and component heights across the UI.
services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx (1)
67-67: LGTM! Consistent skeleton height adjustment.This change (h-10 → h-9) maintains visual consistency with the standardized skeleton heights being applied across the chat UI components.
services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsx (1)
50-51: LGTM! Skeleton height standardization improves visual consistency.The reduction from
h-10toh-9aligns these skeleton placeholders with the rest of the page (lines 62-63) and matches the standardized button and input heights mentioned in the PR objectives. This creates better visual consistency across the UI with no functional impact.services/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx (1)
43-43: LGTM! Skeleton height standardization aligns with design system consistency.The height adjustments from
h-10toh-9for the skeleton placeholders are consistent with the broader UI standardization effort described in the PR objectives. These changes ensure that button skeletons match the actual button heights across the application.Also applies to: 66-67
services/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsx (2)
18-18: Verify that the max-height change doesn't break layout constraints.The change from
max-h-[calc(100%-6rem)]tomax-h-fullremoves the 6rem spacing buffer. Ensure that the parent container properly constrains the height or that this spacing is no longer needed in the updated layout hierarchy.
42-42: LGTM! Skeleton height standardization.This change aligns with the PR objective to standardize skeleton heights from h-10 to h-9 for consistent button sizing across the application.
services/platform/app/(app)/dashboard/[id]/layout.tsx (1)
55-61: Improved error handling for data inconsistency — error boundary confirmed.The change from redirecting to throwing an error is semantically correct. When organization data is missing despite valid membership, this indicates a backend data inconsistency that should surface as an error rather than redirecting to the org creation page. The comments clearly explain the scenario.
Error boundary is in place:
app/(app)/dashboard/[id]/error.tsxis properly configured as a client-side boundary that usesDashboardErrorBoundaryto handle thrown errors and will catch this error appropriately.services/platform/components/ui/dialog/dialog.tsx (1)
116-120: Clean refactoring with correct asChild pattern implementation.The separation of styling (wrapper div) from functionality (Close primitive) improves code organization. The
asChildpattern is correctly implemented:IconButtonproperly usesReact.forwardRef, spreads incoming props to the underlyingButtoncomponent, which in turn usesSlotto support the pattern. The ref chain is unbroken and the close functionality will work as expected.services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx (1)
201-201: LGTM: Skeleton height standardization improves layout consistency.The skeleton height changes from h-10 to h-9 correctly align with the actual Input and Button component heights, reducing Cumulative Layout Shift during loading states.
Also applies to: 212-212, 217-217, 224-224, 235-235
services/platform/components/ui/data-table/data-table-skeleton.tsx (1)
130-136: LGTM! Skeleton layout improved to match actual header structure.The restructured skeleton layout now accurately mirrors the responsive DataTableFilters + actionMenu layout from the actual DataTable component (line 166 of data-table.tsx), and the height standardization from h-10 to h-9 aligns with the PR's UI consistency objectives.
services/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsx (2)
40-41: LGTM! Skeleton heights standardized.The height changes from h-10 to h-9 align with the PR objectives to standardize component heights across the application for visual consistency.
1-104: No action required — Next.js 16.0.10 is a stable, security-patch release.Next.js 16.0.10 is a confirmed stable release published December 11, 2025, addressing DoS and source-code-exposure vulnerabilities in the 16.x LTS line. The version is legitimate and current for this codebase.
services/platform/hooks/use-navigation-items.ts (2)
24-24: LGTM! Translation scope addition follows existing patterns.The addition of the
tConversationsscope is consistent with the existingtNavandtKnowledgepatterns.
36-53: LGTM! Translation keys and routes verified.The subItems structure follows the established pattern from the Knowledge section and correctly implements the NavItem interface. All conversation status translation keys (
status.open,status.closed,status.spam,status.archived) exist in the messages/en.json file, and the dynamic route file atconversations/[status]/page.tsxproperly supports each status variant.services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx (1)
31-31: Explicit padding applied correctly, but note the vertical spacing reduction.The explicit
p-4padding aligns well with the ContentWrapper refactoring. However, this changes the vertical padding frompy-6(24px) top-4(16px), reducing vertical spacing by 8px. Please confirm this reduction is intentional for the Knowledge layout.Based on learnings, the use of semantic spacing class
p-4is appropriate.services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx (2)
268-270: Verify button size consistency across retry actions.The
not_indexedbutton usessize-6 rounded-smwhile thefailedretry button (line 211-213) usessize-5 rounded-full. Both trigger the samehandleRetryaction but have different visual treatments.Confirm this size/shape difference is intentional design (e.g., giving
not_indexedmore visual prominence as the primary indexing action vsfailedas a corrective action), or standardize both buttons to use consistent sizing.
276-278: LGTM! Icon change better represents the action.Changing from the
Databaseicon toRotateCwfor the action button is a good improvement—it more clearly communicates the indexing action to users and aligns with the retry button pattern used infailedandstalestates. The dual-icon approach (Database for status display, RotateCw for action) provides good visual separation between state and action.services/platform/components/skeletons/form-skeleton.tsx (1)
21-21: LGTM! Consistent skeleton height standardization.The height reduction from
h-10toh-9aligns with the PR's goal of standardizing skeleton and component heights across the UI for better visual consistency.Also applies to: 74-75
services/platform/components/skeletons/list-skeleton.tsx (1)
32-32: LGTM! Avatar skeleton height aligns with UI standardization.The height adjustment to
h-9is consistent with the broader skeleton standardization effort across the codebase.services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsx (2)
153-188: LGTM! Improved layout spacing and typography.The addition of
space-y-1andleading-nonestyling enhances the visual hierarchy of the header, making the title and metadata more readable and properly spaced.
224-226: LGTM! Better code readability with multi-line formatting.The multi-line ternary expressions improve readability while preserving the loading state behavior.
Also applies to: 238-240, 252-254
services/platform/components/auth/log-in-form.tsx (2)
44-50: LGTM! Proper translation integration and dependency tracking.The validation messages now correctly use translated field names, and the dependency array properly includes both
tandtCommon. This ensures the schema regenerates when translations change, maintaining i18n consistency.
124-124: LGTM! Cleaner form tag formatting.The single-line format for the Form tag with attributes improves readability without changing behavior.
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx (1)
21-27: Verify removal of Suspense boundary against coding guidelines.The Suspense wrapper has been removed, and
Conversationsis now rendered directly without a loading fallback. This conflicts with the coding guideline: "Use Suspense for loading states in components."Please confirm whether:
- The
Conversationscomponent now handles its own loading states internally- This change is part of an intentional architectural shift away from Suspense-based loading
- The coding guideline should be updated to reflect the new pattern
As per coding guidelines: "Use Suspense for loading states in components"
Based on learnings: Multiple learnings emphasize using Suspense for loading states in React components.
services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsx (1)
147-186: LGTM: Well-structured skeleton component.The
ConversationsListSkeletonprovides a clear loading state with appropriate styling and animation. The variation in badge rendering (usingi % 3andi % 2) adds visual interest to the skeleton.services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx (1)
377-377: LGTM: Layout adjustment improves flexibility.Changing from
max-h-[calc(100%-6rem)]tomax-h-fullsimplifies the height constraint and aligns with the PR's UI consistency improvements.services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx (1)
130-133: Loading states are properly handled without Suspense.Verification confirms all concerns are addressed:
ConversationsListSkeletonis rendered when data is undefined (shows 8 animated skeleton items)- Preloaded queries provide seamless SSR + real-time reactivity
- Two-phase server-side loading prevents empty state flashes
- Skeleton structure matches conversation items, preventing layout shifts
- Navigation remounting via key ensures clean state transitions between statuses
services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx (4)
88-104: LGTM: Improved formatting for readability.The multi-line formatting for
urlStateDefinitionsand theuseUrlStatedestructuring enhances code readability. The dependency array[isDraft]is correctly specified since the panel's default value depends on the draft status.
201-218: LGTM: Callback formatting improvements.The simplified single-line formatting for
handleAddStepandhandleDeleteEdgemaintains identical logic while improving readability. Both callbacks correctly useuseCallbackfor stable function references.
1062-1161: LGTM: Excellent UI consolidation and accessibility improvements.The consolidated rendering of Background, empty state, banners, and toolbar panel improves component organization. Notable improvements include:
- Proper use of
Panelcomponents for consistent positioning- Preserved empty state hint text for better user guidance
- Added accessibility
titleattributes on toolbar buttons (lines 1129, 1144, 1153)- All user-facing text correctly uses the translation function
t()The changes maintain all functionality while improving code structure and accessibility.
972-972: No changes needed—the container height adjustment follows Flexbox best practices.The change from
max-h-[calc(100%-6rem)]tomax-h-fullis correct. The layout properly constrains the container through the parent flex hierarchy: the DashboardLayout provides the height viasize-full, PageHeader usesflex-shrink-0to remain fixed, and the inner ReactFlow container correctly usesflex-[1_1_0] min-h-0to enable proper flex overflow handling. The banners are positioned absolutely (out of document flow), so they don't affect the height calculation. No layout regression risk.
07e9b35 to
3a859b5
Compare
41b2046 to
448ded4
Compare
Summary
This PR includes UI improvements and Convex performance optimizations:
UI Improvements
FormSkeletonwith specializedAuthFormSkeletonfor better loading states in login and signup pagesConvex Performance Optimizations
getScheduledWorkflowsby batch loading trigger steps upfront instead of querying in a loopgetLastExecutionTimesto prevent 16MB read limit errors when checking multiple workflowshasAnyUsersquery in login page using Next.jsunstable_cachehasAnyUsersto allow proper error propagationThese changes resolve critical timeout errors in:
workflow/scheduler:scanAndTriggerworkflow/scheduler:getScheduledWorkflows(was taking 926ms, now <100ms)workflow/scheduler:getLastExecutionTimeusers:hasAnyUsersDesign & Code Quality
Test plan
🤖 Generated with Claude Code