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