import React, { useState, useEffect } from 'react' import { Info, Github, Shield, Key, Users, Database, Upload, Clock, Puzzle, CalendarDays, Globe, ArrowRightLeft, Map, Briefcase, ListChecks, Wallet, FileText, Plane } from 'lucide-react' import { useTranslation } from '../../i18n' interface DemoTexts { titleBefore: string titleAfter: string title: string description: string resetIn: string minutes: string uploadNote: string fullVersionTitle: string features: string[] addonsTitle: string addons: [string, string][] whatIs: string whatIsDesc: string selfHost: string selfHostLink: string close: string } const texts: Record = { de: { titleBefore: 'Willkommen bei ', titleAfter: '', title: 'Willkommen zur TREK 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:', features: [ 'Datei-Uploads (Fotos, Dokumente, Cover)', 'API-Schluessel (Google Maps, Wetter)', 'Benutzer- & Rechteverwaltung', 'Automatische Backups', 'Addon-Verwaltung (aktivieren/deaktivieren)', 'OIDC / SSO Single Sign-On', ], addonsTitle: 'Modulare Addons (in der Vollversion deaktivierbar)', addons: [ ['Vacay', 'Urlaubsplaner mit Kalender, Feiertagen & Fusion'], ['Atlas', 'Weltkarte mit besuchten Laendern & Reisestatistiken'], ['Packliste', 'Checklisten pro Reise'], ['Budget', 'Kostenplanung mit Splitting'], ['Dokumente', 'Dateien an Reisen anhaengen'], ['Widgets', 'Waehrungsrechner & Zeitzonen'], ], whatIs: 'Was ist TREK?', whatIsDesc: 'Ein selbst-gehosteter Reiseplaner mit Echtzeit-Kollaboration, interaktiver Karte, OIDC Login und Dark Mode.', selfHost: 'Open Source — ', selfHostLink: 'selbst hosten', close: 'Verstanden', }, en: { titleBefore: 'Welcome to ', titleAfter: '', title: 'Welcome to the TREK 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 in the full version:', features: [ 'File uploads (photos, documents, covers)', 'API key management (Google Maps, Weather)', 'User & permission management', 'Automatic backups', 'Addon management (enable/disable)', 'OIDC / SSO single sign-on', ], addonsTitle: 'Modular Addons (can be deactivated in full version)', addons: [ ['Vacay', 'Vacation planner with calendar, holidays & user fusion'], ['Atlas', 'World map with visited countries & travel stats'], ['Packing', 'Checklists per trip'], ['Budget', 'Expense tracking with splitting'], ['Documents', 'Attach files to trips'], ['Widgets', 'Currency converter & timezones'], ], whatIs: 'What is TREK?', whatIsDesc: 'A self-hosted travel planner with real-time collaboration, interactive maps, OIDC login and dark mode.', selfHost: 'Open source — ', selfHostLink: 'self-host it', close: 'Got it', }, es: { titleBefore: 'Bienvenido a ', titleAfter: '', title: 'Bienvenido a la demo de TREK', description: 'Puedes ver, editar y crear viajes. Todos los cambios se restablecen automáticamente cada hora.', resetIn: 'Próximo reinicio en', minutes: 'minutos', uploadNote: 'Las subidas de archivos (fotos, documentos, portadas) están desactivadas en el modo demo.', fullVersionTitle: 'Además, en la versión completa:', features: [ 'Subida de archivos (fotos, documentos, portadas)', 'Gestión de claves API (Google Maps, tiempo)', 'Gestión de usuarios y permisos', 'Copias de seguridad automáticas', 'Gestión de addons (activar/desactivar)', 'Inicio de sesión único OIDC / SSO', ], addonsTitle: 'Complementos modulares (se pueden desactivar en la versión completa)', addons: [ ['Vacaciones', 'Planificador de vacaciones con calendario, festivos y fusión de usuarios'], ['Atlas', 'Mapa del mundo con países visitados y estadísticas de viaje'], ['Equipaje', 'Listas de comprobación para cada viaje'], ['Presupuesto', 'Control de gastos con reparto'], ['Documentos', 'Adjunta archivos a los viajes'], ['Widgets', 'Conversor de divisas y zonas horarias'], ], whatIs: '¿Qué es TREK?', whatIsDesc: 'Un planificador de viajes autohospedado con colaboración en tiempo real, mapas interactivos, inicio de sesión OIDC y modo oscuro.', selfHost: 'Código abierto — ', selfHostLink: 'alójalo tú mismo', close: 'Entendido', }, zh: { titleBefore: '欢迎来到 ', titleAfter: '', title: '欢迎来到 TREK 演示版', description: '你可以查看、编辑和创建旅行。所有更改都会在每小时自动重置。', resetIn: '下次重置将在', minutes: '分钟后', uploadNote: '演示模式下已禁用文件上传(照片、文档、封面)。', fullVersionTitle: '完整版本还包括:', features: [ '文件上传(照片、文档、封面)', 'API 密钥管理(Google Maps、天气)', '用户和权限管理', '自动备份', '附加组件管理(启用/禁用)', 'OIDC / SSO 单点登录', ], addonsTitle: '模块化附加组件(完整版本可禁用)', addons: [ ['Vacay', '带日历、节假日和用户融合的假期规划器'], ['Atlas', '带已访问国家和旅行统计的世界地图'], ['Packing', '按旅行管理清单'], ['Budget', '支持分摊的费用追踪'], ['Documents', '将文件附加到旅行'], ['Widgets', '货币换算和时区工具'], ], whatIs: '什么是 TREK?', whatIsDesc: '一个支持实时协作、交互式地图、OIDC 登录和深色模式的自托管旅行规划器。', selfHost: '开源项目 - ', selfHostLink: '自行部署', close: '知道了', }, 'zh-TW': { titleBefore: '歡迎來到 ', titleAfter: '', title: '歡迎來到 TREK 展示版', description: '你可以檢視、編輯和建立行程。所有變更都會在每小時自動重設。', resetIn: '下次重設將在', minutes: '分鐘後', uploadNote: '展示模式下已停用檔案上傳(照片、文件、封面)。', fullVersionTitle: '完整版本還包含:', features: [ '檔案上傳(照片、文件、封面)', 'API 金鑰管理(Google Maps、天氣)', '使用者與權限管理', '自動備份', '附加元件管理(啟用/停用)', 'OIDC / SSO 單一登入', ], addonsTitle: '模組化附加元件(完整版本可停用)', addons: [ ['Vacay', '具備日曆、假日與使用者融合的假期規劃器'], ['Atlas', '顯示已造訪國家與旅行統計的世界地圖'], ['Packing', '依行程管理的檢查清單'], ['Budget', '支援分攤的費用追蹤'], ['Documents', '將檔案附加到行程'], ['Widgets', '貨幣換算與時區工具'], ], whatIs: 'TREK 是什麼?', whatIsDesc: '一個支援即時協作、互動式地圖、OIDC 登入和深色模式的自架旅行規劃器。', selfHost: '開源專案 - ', selfHostLink: '自行架設', close: '知道了', }, ar: { titleBefore: 'مرحبًا بك في ', titleAfter: '', title: 'مرحبًا بك في النسخة التجريبية من TREK', description: 'يمكنك عرض الرحلات وتعديلها وإنشاء رحلات جديدة. تتم إعادة ضبط جميع التغييرات تلقائيًا كل ساعة.', resetIn: 'إعادة الضبط التالية خلال', minutes: 'دقيقة', uploadNote: 'رفع الملفات (الصور والمستندات وصور الغلاف) معطّل في وضع العرض التجريبي.', fullVersionTitle: 'وفي النسخة الكاملة أيضًا:', features: [ 'رفع الملفات (الصور والمستندات وصور الغلاف)', 'إدارة مفاتيح API (خرائط Google والطقس)', 'إدارة المستخدمين والصلاحيات', 'نسخ احتياطية تلقائية', 'إدارة الإضافات (تفعيل/تعطيل)', 'تسجيل دخول موحد OIDC / SSO', ], addonsTitle: 'إضافات مرنة (يمكن تعطيلها في النسخة الكاملة)', addons: [ ['Vacay', 'مخطط إجازات مع تقويم وعطل ودمج مستخدمين'], ['Atlas', 'خريطة عالمية مع الدول التي تمت زيارتها وإحصاءات السفر'], ['Packing', 'قوائم تجهيز لكل رحلة'], ['Budget', 'تتبع المصروفات مع التقسيم'], ['Documents', 'إرفاق الملفات بالرحلات'], ['Widgets', 'محول عملات ومناطق زمنية'], ], whatIs: 'ما هو TREK؟', whatIsDesc: 'مخطط رحلات مستضاف ذاتيًا مع تعاون لحظي وخرائط تفاعلية وتسجيل دخول OIDC ووضع داكن.', selfHost: 'مفتوح المصدر — ', selfHostLink: 'استضفه بنفسك', close: 'فهمت', }, } const featureIcons = [Upload, Key, Users, Database, Puzzle, Shield] const addonIcons = [CalendarDays, Globe, ListChecks, Wallet, FileText, ArrowRightLeft] export default function DemoBanner(): React.ReactElement | null { 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 (
setDismissed(true)}>
) => e.stopPropagation()}> {/* Header */}

{t.titleBefore}TREK{t.titleAfter}

{t.description}

{/* Timer + Upload note */}
{t.resetIn} {minutesLeft} {t.minutes}
{t.uploadNote}
{/* What is TREK */}
{t.whatIs}

{t.whatIsDesc}

{/* Addons */}

{t.addonsTitle}

{t.addons.map(([name, desc], i) => { const Icon = addonIcons[i] return (
{name}

{desc}

) })}
{/* Full version features */}

{t.fullVersionTitle}

{t.features.map((text, i) => { const Icon = featureIcons[i] return (
{text}
) })}
{/* Footer */}
{t.selfHost} {t.selfHostLink}
) }