From 20d47ec8bc8f8f3897a3f4cd3a4bcc7fe5b1c715 Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Fri, 16 Jan 2026 15:30:05 +0000 Subject: [PATCH] Generated by Spark: Add a quick save indicator showing when project was last saved --- src/App.tsx | 22 ++++++++++++++++ src/components/SaveIndicator.tsx | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/components/SaveIndicator.tsx diff --git a/src/App.tsx b/src/App.tsx index 8a99447..808035c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -38,6 +38,7 @@ import { FeatureIdeaCloud } from '@/components/FeatureIdeaCloud' import { GlobalSearch } from '@/components/GlobalSearch' import { NavigationMenu } from '@/components/NavigationMenu' import { PageHeader } from '@/components/PageHeader' +import { SaveIndicator } from '@/components/SaveIndicator' import { useKeyboardShortcuts } from '@/hooks/use-keyboard-shortcuts' import { generateNextJSProject, generatePrismaSchema, generateMUITheme, generatePlaywrightTests, generateStorybookStories, generateUnitTests, generateFlaskApp } from '@/lib/generators' import { AIService } from '@/lib/ai-service' @@ -200,6 +201,7 @@ function App() { const [shortcutsDialogOpen, setShortcutsDialogOpen] = useState(false) const [searchDialogOpen, setSearchDialogOpen] = useState(false) const [generatedCode, setGeneratedCode] = useState>({}) + const [lastSaved, setLastSaved] = useState(Date.now()) const safeFiles = files || [] const safeModels = models || [] @@ -236,6 +238,25 @@ function App() { } }, [featureToggles, setFeatureToggles]) + useEffect(() => { + setLastSaved(Date.now()) + }, [ + files, + models, + components, + componentTrees, + workflows, + lambdas, + theme, + playwrightTests, + storybookStories, + unitTests, + flaskConfig, + nextjsConfig, + npmSettings, + featureToggles, + ]) + const { errors: autoDetectedErrors } = useAutoRepair(safeFiles, false) useKeyboardShortcuts([ @@ -549,6 +570,7 @@ Navigate to the backend directory and follow the setup instructions. Low-Code Next.js App Builder

+
diff --git a/src/components/SaveIndicator.tsx b/src/components/SaveIndicator.tsx new file mode 100644 index 0000000..999f7ff --- /dev/null +++ b/src/components/SaveIndicator.tsx @@ -0,0 +1,45 @@ +import { useEffect, useState } from 'react' +import { CheckCircle, CloudCheck } from '@phosphor-icons/react' +import { formatDistanceToNow } from 'date-fns' + +interface SaveIndicatorProps { + lastSaved: number | null +} + +export function SaveIndicator({ lastSaved }: SaveIndicatorProps) { + const [timeAgo, setTimeAgo] = useState('') + + useEffect(() => { + if (!lastSaved) return + + const updateTimeAgo = () => { + const distance = formatDistanceToNow(lastSaved, { addSuffix: true }) + setTimeAgo(distance) + } + + updateTimeAgo() + const interval = setInterval(updateTimeAgo, 10000) + + return () => clearInterval(interval) + }, [lastSaved]) + + if (!lastSaved) return null + + const isRecent = Date.now() - lastSaved < 3000 + + return ( +
+ {isRecent ? ( + <> + + Saved + + ) : ( + <> + + {timeAgo} + + )} +
+ ) +}