Skip to content

refactor(platform): improve UI and optimize convex performance#65

Merged
Israeltheminer merged 8 commits into
mainfrom
update-ui
Jan 2, 2026
Merged

refactor(platform): improve UI and optimize convex performance#65
Israeltheminer merged 8 commits into
mainfrom
update-ui

Conversation

@Israeltheminer

@Israeltheminer Israeltheminer commented Jan 1, 2026

Copy link
Copy Markdown
Collaborator

Summary

This PR includes UI improvements and Convex performance optimizations:

UI Improvements

  • Replaced generic FormSkeleton with specialized AuthFormSkeleton for better loading states in login and signup pages
  • Improved skeleton component height consistency across the dashboard (adjusted from h-10 to h-9 for buttons and inputs)
  • Enhanced loading states and layout adjustments in conversations
  • Refined RAG status badge UI with icon-only retry button
  • Improved automation steps layout and ReactFlow canvas sizing
  • Added padding to knowledge layout content wrapper

Convex Performance Optimizations

  • Fixed N+1 query pattern in getScheduledWorkflows by batch loading trigger steps upfront instead of querying in a loop
  • Added batch function getLastExecutionTimes to prevent 16MB read limit errors when checking multiple workflows
  • Optimized workflow scheduler to use batch queries, reducing total queries from ~100+ to ~2-3 per scan
  • Added 1-hour cache to hasAnyUsers query in login page using Next.js unstable_cache
  • Removed unnecessary try-catch in hasAnyUsers to allow proper error propagation
  • Added 100-workflow pagination limit to prevent timeouts with large workflow datasets

These changes resolve critical timeout errors in:

  • workflow/scheduler:scanAndTrigger
  • workflow/scheduler:getScheduledWorkflows (was taking 926ms, now <100ms)
  • workflow/scheduler:getLastExecutionTime
  • users:hasAnyUsers

Design & Code Quality

  • Consistent button sizing (h-9 across forms and UI elements)
  • Better component organization with specialized skeletons
  • Improved accessibility with proper button titles/labels

Test plan

  • Verify login and signup pages show proper skeleton states
  • Test document upload and RAG indexing UI
  • Verify automation steps canvas layout works correctly
  • Confirm workflow scheduler no longer times out
  • Verify hasAnyUsers query is cached on login page

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Jan 1, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This 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

  • tale-project/poc2#325: Both modify authentication pages (log-in/sign-up) and introduce or update AuthFormSkeleton component usage with Suspense-based fallbacks.
  • talecorp/poc#204: Both modify the same conversation components (conversation-header.tsx, conversation-panel.tsx, message.tsx) with presentational and structural updates.
  • tale-project/poc2#346: Both modify the dashboard knowledge layout file, adjusting padding and layout configuration in the same code area.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 handleStepCreated function serves no purpose. Consider either removing the onStepCreated prop from the AutomationSteps component (line 79) if it's optional, or passing undefined explicitly.

🔎 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 _handleCancel function 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: conversations should allow undefined.

The conversations prop is typed as Conversation[] (line 110) but the code treats it as potentially undefined (line 200). This creates a type safety gap where TypeScript won't catch cases where undefined is 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)

📥 Commits

Reviewing files that changed from the base of the PR and between 5c7186e and cf9f3bb.

📒 Files selected for processing (30)
  • services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
  • services/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/tone-of-voice/page.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/message.tsx
  • services/platform/app/(app)/dashboard/[id]/layout.tsx
  • services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsx
  • services/platform/components/auth/log-in-form.tsx
  • services/platform/components/layout/content-wrapper.tsx
  • services/platform/components/skeletons/auth-skeleton.tsx
  • services/platform/components/skeletons/form-skeleton.tsx
  • services/platform/components/skeletons/list-skeleton.tsx
  • services/platform/components/ui/data-table/data-table-skeleton.tsx
  • services/platform/components/ui/data-table/data-table.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/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. Avoid any and unknown types 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.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/skeletons/list-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsx
  • services/platform/components/layout/content-wrapper.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/message.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
  • services/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/layout.tsx
  • services/platform/components/ui/data-table/data-table-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx
  • services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
  • services/platform/components/skeletons/form-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx
  • services/platform/components/skeletons/auth-skeleton.tsx
  • services/platform/hooks/use-navigation-items.ts
  • services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx
  • services/platform/components/ui/data-table/data-table.tsx
  • services/platform/components/auth/log-in-form.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx
  • services/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 with withOptimisticUpdate for useMutation. If you decide to NOT add an optimistic update, you need to provide a good reason why and comment the hook in React
USE useMemo, useCallback and memo at the right moments in React
DO NOT overuse useEffect in React
USE cva if a component has multiple variants in React
CONSIDER TO preload queries with preloadQuery and usePreloadedQuery in React with Convex

Files:

  • services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/skeletons/list-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsx
  • services/platform/components/layout/content-wrapper.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/message.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
  • services/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/layout.tsx
  • services/platform/components/ui/data-table/data-table-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx
  • services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
  • services/platform/components/skeletons/form-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx
  • services/platform/components/skeletons/auth-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx
  • services/platform/components/ui/data-table/data-table.tsx
  • services/platform/components/auth/log-in-form.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx
  • services/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.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • 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 p-[8px] with p-2

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/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.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/skeletons/list-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/settings/organization/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/page.tsx
  • services/platform/components/layout/content-wrapper.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/message.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
  • services/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/layout.tsx
  • services/platform/components/ui/data-table/data-table-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx
  • services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/executions/page.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
  • services/platform/components/skeletons/form-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx
  • services/platform/components/skeletons/auth-skeleton.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/components/automation-steps.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-panel.tsx
  • services/platform/components/ui/data-table/data-table.tsx
  • services/platform/components/auth/log-in-form.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-list.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/documents/components/rag-status-badge.tsx
  • 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-[14px] with text-sm

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • 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 m-[4px] with m-1

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/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.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversation-header.tsx
  • services/platform/components/layout/content-wrapper.tsx
  • services/platform/app/(app)/dashboard/[id]/(knowledge)/layout.tsx
  • services/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.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/[status]/page.tsx
  • services/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.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations-wrapper.tsx
  • services/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.tsx
  • services/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.tsx
  • services/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.tsx
  • services/platform/app/(app)/dashboard/[id]/conversations/components/conversations.tsx
  • services/platform/app/(app)/dashboard/[id]/automations/[amId]/configuration/page.tsx
  • services/platform/components/ui/data-table/data-table.tsx
  • 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 : 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.tsx
  • services/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.tsx
  • services/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.tsx
  • services/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.tsx
  • services/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-10 to h-9 aligns 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-10 to h-9 for 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)] to max-h-full removes 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.tsx is properly configured as a client-side boundary that uses DashboardErrorBoundary to 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 asChild pattern is correctly implemented: IconButton properly uses React.forwardRef, spreads incoming props to the underlying Button component, which in turn uses Slot to 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 tConversations scope is consistent with the existing tNav and tKnowledge patterns.


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 at conversations/[status]/page.tsx properly 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-4 padding aligns well with the ContentWrapper refactoring. However, this changes the vertical padding from py-6 (24px) to p-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-4 is 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_indexed button uses size-6 rounded-sm while the failed retry button (line 211-213) uses size-5 rounded-full. Both trigger the same handleRetry action but have different visual treatments.

Confirm this size/shape difference is intentional design (e.g., giving not_indexed more visual prominence as the primary indexing action vs failed as a corrective action), or standardize both buttons to use consistent sizing.


276-278: LGTM! Icon change better represents the action.

Changing from the Database icon to RotateCw for the action button is a good improvement—it more clearly communicates the indexing action to users and aligns with the retry button pattern used in failed and stale states. 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-10 to h-9 aligns 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-9 is 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-1 and leading-none styling 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 t and tCommon. 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 Conversations is now rendered directly without a loading fallback. This conflicts with the coding guideline: "Use Suspense for loading states in components."

Please confirm whether:

  1. The Conversations component now handles its own loading states internally
  2. This change is part of an intentional architectural shift away from Suspense-based loading
  3. 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 ConversationsListSkeleton provides a clear loading state with appropriate styling and animation. The variation in badge rendering (using i % 3 and i % 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)] to max-h-full simplifies 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:

  • ConversationsListSkeleton is 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 urlStateDefinitions and the useUrlState destructuring 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 handleAddStep and handleDeleteEdge maintains identical logic while improving readability. Both callbacks correctly use useCallback for 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 Panel components for consistent positioning
  • Preserved empty state hint text for better user guidance
  • Added accessibility title attributes 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)] to max-h-full is correct. The layout properly constrains the container through the parent flex hierarchy: the DashboardLayout provides the height via size-full, PageHeader uses flex-shrink-0 to remain fixed, and the inner ReactFlow container correctly uses flex-[1_1_0] min-h-0 to 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.

Comment thread services/platform/app/(app)/(auth)/log-in/[[...log-in]]/page.tsx
Comment thread services/platform/app/(app)/(auth)/sign-up/[[...sign-up]]/page.tsx
Comment thread services/platform/components/layout/content-wrapper.tsx
Comment thread services/platform/components/skeletons/auth-skeleton.tsx Outdated
Comment thread services/platform/components/ui/data-table/data-table.tsx
@Israeltheminer Israeltheminer changed the title UI improvements and infrastructure fixes refactor(platform): improve UI and optimize convex performance Jan 2, 2026
@Israeltheminer Israeltheminer merged commit 626fa2a into main Jan 2, 2026
2 checks passed
@Israeltheminer Israeltheminer deleted the update-ui branch January 2, 2026 16:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant