/** * Version History Panel Component * Displays document snapshots and allows restoration */ import { Component, createSignal, createEffect, For, onMount } from 'solid-js'; import { ChangeTracker, Snapshot } from '../../lib/collaboration/change-tracker'; export interface VersionHistoryPanelProps { changeTracker: ChangeTracker; onRestore?: (snapshot: Snapshot) => void; onClose?: () => void; } export const VersionHistoryPanel: Component = (props) => { const [snapshots, setSnapshots] = createSignal([]); const [selectedSnapshot, setSelectedSnapshot] = createSignal(null); const [isLoading, setIsLoading] = createSignal(true); const [isExpanded, setIsExpanded] = createSignal(true); onMount(() => { refreshSnapshots(); }); const refreshSnapshots = () => { setIsLoading(true); const allSnapshots = props.changeTracker.getSnapshots(); setSnapshots(allSnapshots.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())); setIsLoading(false); }; const handleSelectSnapshot = (snapshot: Snapshot) => { setSelectedSnapshot(snapshot); }; const handleRestore = () => { const snapshot = selectedSnapshot(); if (snapshot) { props.changeTracker.restoreSnapshot(snapshot); if (props.onRestore) { props.onRestore(snapshot); } } }; const handleCreateSnapshot = () => { const description = prompt('Snapshot description (optional):') || undefined; props.changeTracker.createSnapshot(description); refreshSnapshots(); }; const formatTimestamp = (date: Date): string => { return new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }).format(date); }; const formatRelativeTime = (date: Date): string => { const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); const diffDays = Math.floor(diffMs / 86400000); if (diffMins < 1) return 'Just now'; if (diffMins < 60) return `${diffMins}m ago`; if (diffHours < 24) return `${diffHours}h ago`; return `${diffDays}d ago`; }; return (

Version History

{isExpanded() && (
{isLoading() ? (
Loading...
) : snapshots().length === 0 ? (

No snapshots yet

Click 📸 to create your first snapshot

) : (
{(snapshot) => (
handleSelectSnapshot(snapshot)} >
{snapshot.description || 'Untitled snapshot'}
by {snapshot.userName}
{snapshot.changes.length} changes
)}
)} {selectedSnapshot() && (

Preview

Created: {formatTimestamp(selectedSnapshot()!.timestamp)}

Author: {selectedSnapshot()!.userName}

Changes: {selectedSnapshot()!.changes.length}

{selectedSnapshot()!.description && (

Description: {selectedSnapshot()!.description}

)}
)}
)}
); }; export default VersionHistoryPanel;