import { createContext, useContext, useState, type ReactNode } from "react"; import { BrainCircuitIcon } from "lucide-react"; import { ActivityDisclosure, BodyNote } from "./shared"; import { useOpenGeniText } from "../messages/runtime"; export type KnowledgeActivityActions = { onInspect?: ((entryId: string) => void) | undefined; onRetryFile?: ((fileId: string) => Promise) | undefined; retryDisabled?: boolean | undefined; }; const KnowledgeActions = createContext({}); export function KnowledgeActivityProvider({ children, ...actions }: KnowledgeActivityActions & { children: ReactNode }) { return {children}; } /** A saved/pending result never opens or blocks the human-input surface. */ export function KnowledgeReceiptRow(props: { outcome: "published" | "pending" | "rejected" | "archived" | "failed"; entryId?: string | undefined; fileId?: string | undefined; title?: string | undefined; source?: boolean | undefined; }) { const t = useOpenGeniText(); const actions = useContext(KnowledgeActions); const [retrying, setRetrying] = useState(false); const [retrySent, setRetrySent] = useState(false); const [error, setError] = useState(null); const label = props.outcome === "pending" ? t("timeline.knowledgeReceipt.knowledgeSavedForReview") : props.outcome === "failed" ? t("timeline.knowledgeReceipt.sourcePreparationFailed") : props.outcome === "rejected" ? t("timeline.knowledgeReceipt.sourceRemainsRejected") : props.outcome === "archived" ? t("timeline.knowledgeReceipt.knowledgeArchived") : props.source ? t("timeline.knowledgeReceipt.sourceSavedToKnowledge") : t("timeline.knowledgeReceipt.savedToKnowledge"); const actionClass = "rounded-og-sm px-1 py-0.5 text-og-sm text-og-fg-muted hover:text-og-fg focus-visible:outline-2 focus-visible:outline-og-accent disabled:opacity-50"; return ( } iconTone="muted" title={label} preview={props.title} > {props.outcome === "pending" ? ( {t("timeline.knowledgeReceipt.savedInNeedsReviewThis")} ) : null} {props.outcome === "failed" ? ( {t("timeline.knowledgeReceipt.theOriginalFileRemainsAttached")} ) : null} {props.outcome === "rejected" ? ( {t("timeline.knowledgeReceipt.processingTheFileAgainLeaves")} ) : null} {props.entryId && actions.onInspect ? ( ) : null} {props.outcome === "failed" && props.fileId && actions.onRetryFile ? ( ) : null} {error ? (

{error}

) : null}
); }