Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/code/src/renderer/api/posthogClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export interface SignalSourceConfig {
config: Record<string, unknown>;
created_at: string;
updated_at: string;
status: "running" | "completed" | "failed" | null;
}

export interface ExternalDataSourceSchema {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
ArrowSquareOutIcon,
BrainIcon,
BugIcon,
CircleNotchIcon,
GithubLogoIcon,
KanbanIcon,
TicketIcon,
Expand All @@ -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 {
Expand All @@ -37,6 +41,7 @@ interface SignalSourceToggleCardProps {
requiresSetup?: boolean;
onSetup?: () => void;
loading?: boolean;
statusSection?: React.ReactNode;
}

const SignalSourceToggleCard = memo(function SignalSourceToggleCard({
Expand All @@ -49,6 +54,7 @@ const SignalSourceToggleCard = memo(function SignalSourceToggleCard({
requiresSetup,
onSetup,
loading,
statusSection,
}: SignalSourceToggleCardProps) {
return (
<Box
Expand Down Expand Up @@ -101,6 +107,7 @@ const SignalSourceToggleCard = memo(function SignalSourceToggleCard({
/>
)}
</Flex>
{statusSection && <Box style={{ marginLeft: 32 }}>{statusSection}</Box>}
</Box>
);
});
Expand Down Expand Up @@ -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 (
<Flex align="center" gap="2" mt="2">
<CircleNotchIcon
size={14}
className="animate-spin"
style={{ color: "var(--accent-11)" }}
/>
<Text size="1" style={{ color: "var(--accent-11)" }}>
{message}
</Text>
</Flex>
);
}

interface SignalSourceTogglesProps {
value: SignalSourceValues;
onToggle: (source: keyof SignalSourceValues, enabled: boolean) => void;
Expand All @@ -220,6 +251,7 @@ interface SignalSourceTogglesProps {
{ requiresSetup: boolean; loading: boolean }
>
>;
sessionAnalysisStatus?: SignalSourceConfig["status"];
onSetup?: (source: keyof SignalSourceValues) => void;
evaluations?: Evaluation[];
evaluationsUrl?: string;
Expand All @@ -231,6 +263,7 @@ export function SignalSourceToggles({
onToggle,
disabled,
sourceStates,
sessionAnalysisStatus,
onSetup,
evaluations,
evaluationsUrl,
Expand Down Expand Up @@ -269,6 +302,14 @@ export function SignalSourceToggles({
checked={value.session_replay}
onCheckedChange={toggleSessionReplay}
disabled={disabled}
statusSection={
value.session_replay ? (
<SourceRunningIndicator
status={sessionAnalysisStatus ?? null}
message="Session analysis run in progress now…"
/>
) : undefined
}
/>
<SignalSourceToggleCard
icon={<BugIcon size={20} />}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<SignalSourceValues>(() => {
if (Object.keys(optimistic).length === 0) return serverValues;
Expand Down Expand Up @@ -396,6 +405,7 @@ export function useSignalSourceManager() {
return {
displayValues,
sourceStates,
sessionAnalysisStatus,
setupSource,
isLoading,
handleToggle,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export function SignalSourcesSettings() {
const {
displayValues,
sourceStates,
sessionAnalysisStatus,
setupSource,
isLoading,
handleToggle,
Expand Down Expand Up @@ -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}
Expand Down
Loading