diff --git a/app/w/components/control-bar/components/history-dropdown-item.tsx b/app/w/components/control-bar/components/history-dropdown-item.tsx new file mode 100644 index 0000000000..fcf325d5c4 --- /dev/null +++ b/app/w/components/control-bar/components/history-dropdown-item.tsx @@ -0,0 +1,33 @@ +import { formatDistanceToNow } from 'date-fns' +import { Clock } from 'lucide-react' +import { DropdownMenuItem } from '@/components/ui/dropdown-menu' +import { cn } from '@/lib/utils' + +interface HistoryDropdownItemProps { + action: string + timestamp: number + onClick?: () => void +} + +export function HistoryDropdownItem({ + action, + timestamp, + onClick, +}: HistoryDropdownItemProps) { + const timeAgo = formatDistanceToNow(timestamp, { addSuffix: true }) + + return ( + + +
+
+ {timeAgo} +
+

{action}

+
+
+ ) +} diff --git a/app/w/components/control-bar/control-bar.tsx b/app/w/components/control-bar/control-bar.tsx index 3429d8fbcf..c4805bab86 100644 --- a/app/w/components/control-bar/control-bar.tsx +++ b/app/w/components/control-bar/control-bar.tsx @@ -10,9 +10,12 @@ import { import { History, Bell, Play } from 'lucide-react' import { useNotificationStore } from '@/stores/notifications/notifications-store' import { NotificationDropdownItem } from './components/notification-dropdown-item' +import { useWorkflowStore } from '@/stores/workflow/workflow-store' +import { HistoryDropdownItem } from './components/history-dropdown-item' export function ControlBar() { const { notifications } = useNotificationStore() + const { history, undo, redo } = useWorkflowStore() return (
@@ -34,10 +37,25 @@ export function ControlBar() { Version History - - View History - Compare Versions - + + {history.past.length === 0 ? ( + + + No history available + + + ) : ( + + {[...history.past].reverse().map((entry) => ( + + ))} + + )} diff --git a/stores/workflow/history-middleware.ts b/stores/workflow/history-middleware.ts index 414dfb479e..8ecc91e631 100644 --- a/stores/workflow/history-middleware.ts +++ b/stores/workflow/history-middleware.ts @@ -19,6 +19,7 @@ export const withHistory = ( edges: initialState.edges, }, timestamp: Date.now(), + action: 'Initial state', } return { @@ -71,12 +72,16 @@ export const withHistory = ( } } -export const createHistoryEntry = (state: WorkflowState): HistoryEntry => ({ +export const createHistoryEntry = ( + state: WorkflowState, + action: string +): HistoryEntry => ({ state: { blocks: { ...state.blocks }, - edges: [...state.edges], + edges: [...state.edges ], }, timestamp: Date.now(), + action, }) export const pushHistory = ( @@ -89,10 +94,11 @@ export const pushHistory = ( replace?: boolean ) => void, get: () => WorkflowStoreWithHistory, - newState: WorkflowState + newState: WorkflowState, + action: string ) => { const { history } = get() - const newEntry = createHistoryEntry(newState) + const newEntry = createHistoryEntry(newState, action) set({ history: { diff --git a/stores/workflow/history-types.ts b/stores/workflow/history-types.ts index 5b951bbdc5..94d292d33f 100644 --- a/stores/workflow/history-types.ts +++ b/stores/workflow/history-types.ts @@ -3,6 +3,7 @@ import { WorkflowState } from './types' export interface HistoryEntry { state: WorkflowState timestamp: number + action: string } export interface WorkflowHistory { diff --git a/stores/workflow/workflow-store.ts b/stores/workflow/workflow-store.ts index f89fb1682d..7b133abc79 100644 --- a/stores/workflow/workflow-store.ts +++ b/stores/workflow/workflow-store.ts @@ -13,6 +13,7 @@ const initialState = { present: { state: { blocks: {}, edges: [] }, timestamp: Date.now(), + action: 'Initial state', }, future: [], }, @@ -76,7 +77,7 @@ export const useWorkflowStore = create()( } set(newState) - pushHistory(set, get, newState) + pushHistory(set, get, newState, `Add ${type} block`) }, updateBlockPosition: (id: string, position: Position) => { @@ -102,7 +103,7 @@ export const useWorkflowStore = create()( delete newState.blocks[id] set(newState) - pushHistory(set, get, newState) + pushHistory(set, get, newState, 'Remove block') }, addEdge: (edge: Edge) => { @@ -119,7 +120,7 @@ export const useWorkflowStore = create()( } set(newState) - pushHistory(set, get, newState) + pushHistory(set, get, newState, 'Add connection') }, removeEdge: (edgeId: string) => { @@ -129,13 +130,13 @@ export const useWorkflowStore = create()( } set(newState) - pushHistory(set, get, newState) + pushHistory(set, get, newState, 'Remove connection') }, clear: () => { const newState = initialState set(newState) - pushHistory(set, get, newState) + pushHistory(set, get, newState, 'Clear workflow') }, })), { name: 'workflow-store' }