import { useState, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { cycleAppLanguage, getNextLanguage } from '../utils/i18nLanguages.js' import LogbookVesselPicker from './LogbookVesselPicker.tsx' import LogbookCrewPicker from './LogbookCrewPicker.tsx' import type { LogbookCrewSelectionData } from '../types/person.js' import { personToSnapshot } from '../utils/personSnapshots.js' import LogEntriesList from './LogEntriesList.tsx' import { Ship, Users, FileText, Lock, Globe, ChevronLeft, UserPlus } from 'lucide-react' import { buildPublicDemoFixture, type PublicDemoFixture } from '../services/demoLogbookData.js' import type { VesselData } from '../types/vessel.js' import type { LogbookVesselSelectionData } from '../types/vessel.js' import { useAppTour, type AppTab } from '../context/AppTourContext.tsx' import { PlausibleEvents, trackPlausibleEvent } from '../services/analytics.js' interface DemoViewerProps { onExit: () => void } export default function DemoViewer({ onExit }: DemoViewerProps) { const { t, i18n } = useTranslation() const { registerNavigation, registerDemoTourContext, startTour } = useAppTour() const [activeTab, setActiveTab] = useState('logs') const [tourSelectedEntryId, setTourSelectedEntryId] = useState(null) const [fixture, setFixture] = useState(() => buildPublicDemoFixture()) useEffect(() => { trackPlausibleEvent(PlausibleEvents.DEMO_OPENED) }, []) useEffect(() => { setFixture(buildPublicDemoFixture()) }, [i18n.language]) useEffect(() => { registerNavigation({ setActiveTab, setSelectedEntryId: setTourSelectedEntryId, setFeedbackOpen: () => {}, setLogbookActive: () => {}, setProfileOpen: () => {} }) registerDemoTourContext({ firstEntryId: fixture.firstEntryId }) const timer = window.setTimeout(() => { startTour({ force: true, demoMode: true }) }, 400) return () => { window.clearTimeout(timer) registerDemoTourContext(null) } }, [registerNavigation, registerDemoTourContext, startTour, fixture.firstEntryId]) const toggleLanguage = () => { cycleAppLanguage(i18n) } const { title, yacht, vesselPool, logbookVesselSelection, personPool, logbookCrewSelection, entries, gpsTracks, photos, firstEntryId } = fixture const demoSelection: LogbookCrewSelectionData = { activeSkipperId: logbookCrewSelection.activeSkipperId, activeCrewIds: logbookCrewSelection.activeCrewIds, snapshotsById: Object.fromEntries( Object.entries(logbookCrewSelection.snapshotsById).map(([id, snap]) => [ id, personToSnapshot(id, snap) ]) ) } return (

{title}

{t('demo.badge')}

{t('demo.public_banner')}

{activeTab === 'logs' && ( )} {activeTab === 'vessel' && ( ({ payloadId: v.payloadId, data: v.data as VesselData }))} preloadedSelection={logbookVesselSelection as LogbookVesselSelectionData} /> )} {activeTab === 'crew' && ( )}
) }