import type { BodyElement } from "../../lib/api"; interface UpdateNotificationProps { updatedBy: "user" | "llm" | "system"; localBody: BodyElement[]; remoteBody: BodyElement[]; onRefresh: () => void; onDismiss: () => void; } // Get text content from a body element for comparison function getElementText(element: BodyElement): string { switch (element.type) { case "heading": case "paragraph": return element.text; case "chart": return `[Chart: ${element.title || element.chartType}]`; case "image": return `[Image: ${element.alt || element.src}]`; default: return "[Unknown element]"; } } // Get element type label function getElementTypeLabel(element: BodyElement): string { switch (element.type) { case "heading": return `H${element.level}`; case "paragraph": return "P"; case "chart": return "Chart"; case "image": return "Image"; default: return "?"; } } interface DiffItem { type: "added" | "removed" | "modified" | "unchanged"; localElement?: BodyElement; remoteElement?: BodyElement; localIndex?: number; remoteIndex?: number; } // Simple diff algorithm - compares elements by their text content function computeDiff(localBody: BodyElement[], remoteBody: BodyElement[]): DiffItem[] { const diffs: DiffItem[] = []; const maxLen = Math.max(localBody.length, remoteBody.length); for (let i = 0; i < maxLen; i++) { const local = localBody[i]; const remote = remoteBody[i]; if (!local && remote) { // Element added remotely diffs.push({ type: "added", remoteElement: remote, remoteIndex: i }); } else if (local && !remote) { // Element removed remotely (exists locally but not remotely) diffs.push({ type: "removed", localElement: local, localIndex: i }); } else if (local && remote) { const localText = getElementText(local); const remoteText = getElementText(remote); if (localText !== remoteText || local.type !== remote.type) { // Element modified diffs.push({ type: "modified", localElement: local, remoteElement: remote, localIndex: i, remoteIndex: i, }); } // Skip unchanged elements } } return diffs; } export function UpdateNotification({ updatedBy, localBody, remoteBody, onRefresh, onDismiss, }: UpdateNotificationProps) { const source = updatedBy === "llm" ? "AI assistant" : "another session"; const diffs = computeDiff(localBody, remoteBody); const hasChanges = diffs.length > 0; return (
This file was updated by {source}. {hasChanges ? ` ${diffs.length} change${diffs.length > 1 ? "s" : ""} found.` : " No content changes detected."}