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}
+ >
+ )}
+
+ )
+}