From 53b1c8617e9ebd5ed7b4589fe30fcdb9625b1586 Mon Sep 17 00:00:00 2001 From: Maurice Date: Thu, 19 Mar 2026 15:42:22 +0100 Subject: [PATCH] Add reset countdown timer to demo popup (v2.2.6) --- client/src/components/Layout/DemoBanner.jsx | 24 +++++++++++++++++++-- server/package.json | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/client/src/components/Layout/DemoBanner.jsx b/client/src/components/Layout/DemoBanner.jsx index 8a41f58..d892f36 100644 --- a/client/src/components/Layout/DemoBanner.jsx +++ b/client/src/components/Layout/DemoBanner.jsx @@ -1,11 +1,13 @@ -import React, { useState } from 'react' -import { Info, Github, Shield, Key, Users, Database, Upload } from 'lucide-react' +import React, { useState, useEffect } from 'react' +import { Info, Github, Shield, Key, Users, Database, Upload, Clock } from 'lucide-react' import { useTranslation } from '../../i18n' const texts = { de: { title: 'Willkommen zur NOMAD Demo', description: 'Du kannst Reisen ansehen, bearbeiten und eigene erstellen. Alle Aenderungen werden jede Stunde automatisch zurueckgesetzt.', + resetIn: 'Naechster Reset in', + minutes: 'Minuten', uploadNote: 'Datei-Uploads (Fotos, Dokumente, Cover) sind in der Demo deaktiviert.', fullVersionTitle: 'In der Vollversion zusaetzlich verfuegbar:', features: [ @@ -21,6 +23,8 @@ const texts = { en: { title: 'Welcome to the NOMAD Demo', description: 'You can view, edit and create trips. All changes are automatically reset every hour.', + resetIn: 'Next reset in', + minutes: 'minutes', uploadNote: 'File uploads (photos, documents, covers) are disabled in demo mode.', fullVersionTitle: 'Additionally available in the full version:', features: [ @@ -39,9 +43,15 @@ const featureIcons = [Upload, Key, Users, Database] export default function DemoBanner() { const [dismissed, setDismissed] = useState(false) + const [minutesLeft, setMinutesLeft] = useState(59 - new Date().getMinutes()) const { language } = useTranslation() const t = texts[language] || texts.en + useEffect(() => { + const interval = setInterval(() => setMinutesLeft(59 - new Date().getMinutes()), 10000) + return () => clearInterval(interval) + }, []) + if (dismissed) return null return ( @@ -75,6 +85,16 @@ export default function DemoBanner() { {t.description}

+
+ + + {t.resetIn} {minutesLeft} {t.minutes} + +
+