diff --git a/apps/code/src/renderer/api/posthogClient.ts b/apps/code/src/renderer/api/posthogClient.ts index b356638b7..999c515f7 100644 --- a/apps/code/src/renderer/api/posthogClient.ts +++ b/apps/code/src/renderer/api/posthogClient.ts @@ -53,6 +53,7 @@ export interface SignalSourceConfig { config: Record; created_at: string; updated_at: string; + status: "running" | "completed" | "failed" | null; } export interface ExternalDataSourceSchema { diff --git a/apps/code/src/renderer/features/inbox/components/SignalSourceToggles.tsx b/apps/code/src/renderer/features/inbox/components/SignalSourceToggles.tsx index 07738a965..8c9bc349b 100644 --- a/apps/code/src/renderer/features/inbox/components/SignalSourceToggles.tsx +++ b/apps/code/src/renderer/features/inbox/components/SignalSourceToggles.tsx @@ -2,6 +2,7 @@ import { ArrowSquareOutIcon, BrainIcon, BugIcon, + CircleNotchIcon, GithubLogoIcon, KanbanIcon, TicketIcon, @@ -16,7 +17,10 @@ import { Switch, Text, } from "@radix-ui/themes"; -import type { Evaluation } from "@renderer/api/posthogClient"; +import type { + Evaluation, + SignalSourceConfig, +} from "@renderer/api/posthogClient"; import { memo, useCallback } from "react"; export interface SignalSourceValues { @@ -37,6 +41,7 @@ interface SignalSourceToggleCardProps { requiresSetup?: boolean; onSetup?: () => void; loading?: boolean; + statusSection?: React.ReactNode; } const SignalSourceToggleCard = memo(function SignalSourceToggleCard({ @@ -49,6 +54,7 @@ const SignalSourceToggleCard = memo(function SignalSourceToggleCard({ requiresSetup, onSetup, loading, + statusSection, }: SignalSourceToggleCardProps) { return ( )} + {statusSection && {statusSection}} ); }); @@ -210,6 +217,30 @@ export const EvaluationsSection = memo(function EvaluationsSection({ ); }); +function SourceRunningIndicator({ + status, + message, +}: { + status: SignalSourceConfig["status"]; + message: string; +}) { + if (status !== "running") { + return null; + } + return ( + + + + {message} + + + ); +} + interface SignalSourceTogglesProps { value: SignalSourceValues; onToggle: (source: keyof SignalSourceValues, enabled: boolean) => void; @@ -220,6 +251,7 @@ interface SignalSourceTogglesProps { { requiresSetup: boolean; loading: boolean } > >; + sessionAnalysisStatus?: SignalSourceConfig["status"]; onSetup?: (source: keyof SignalSourceValues) => void; evaluations?: Evaluation[]; evaluationsUrl?: string; @@ -231,6 +263,7 @@ export function SignalSourceToggles({ onToggle, disabled, sourceStates, + sessionAnalysisStatus, onSetup, evaluations, evaluationsUrl, @@ -269,6 +302,14 @@ export function SignalSourceToggles({ checked={value.session_replay} onCheckedChange={toggleSessionReplay} disabled={disabled} + statusSection={ + value.session_replay ? ( + + ) : undefined + } /> } diff --git a/apps/code/src/renderer/features/inbox/hooks/useSignalSourceManager.ts b/apps/code/src/renderer/features/inbox/hooks/useSignalSourceManager.ts index b4e532911..3b45bcfb7 100644 --- a/apps/code/src/renderer/features/inbox/hooks/useSignalSourceManager.ts +++ b/apps/code/src/renderer/features/inbox/hooks/useSignalSourceManager.ts @@ -130,6 +130,15 @@ export function useSignalSourceManager() { [configs], ); + const sessionAnalysisStatus = useMemo(() => { + const config = configs?.find( + (c) => + c.source_product === "session_replay" && + c.source_type === "session_analysis_cluster", + ); + return config?.status ?? null; + }, [configs]); + // Merge: optimistic overrides take precedence over server values. const displayValues = useMemo(() => { if (Object.keys(optimistic).length === 0) return serverValues; @@ -396,6 +405,7 @@ export function useSignalSourceManager() { return { displayValues, sourceStates, + sessionAnalysisStatus, setupSource, isLoading, handleToggle, diff --git a/apps/code/src/renderer/features/settings/components/sections/SignalSourcesSettings.tsx b/apps/code/src/renderer/features/settings/components/sections/SignalSourcesSettings.tsx index 83187bb02..1c16a70d4 100644 --- a/apps/code/src/renderer/features/settings/components/sections/SignalSourcesSettings.tsx +++ b/apps/code/src/renderer/features/settings/components/sections/SignalSourcesSettings.tsx @@ -7,6 +7,7 @@ export function SignalSourcesSettings() { const { displayValues, sourceStates, + sessionAnalysisStatus, setupSource, isLoading, handleToggle, @@ -44,6 +45,7 @@ export function SignalSourcesSettings() { value={displayValues} onToggle={(source, enabled) => void handleToggle(source, enabled)} sourceStates={sourceStates} + sessionAnalysisStatus={sessionAnalysisStatus} onSetup={handleSetup} evaluations={evaluations} evaluationsUrl={evaluationsUrl}