import { useEffect, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' import useAuthStore from '../store/authStore' import useShiftStore from '../store/shiftStore' import useThemeStore from '../store/themeStore' import client from '../api/client' function formatTime(iso) { if (!iso) return '' return new Date(iso).toLocaleTimeString('el-GR', { hour: '2-digit', minute: '2-digit' }) } function formatDuration(iso) { if (!iso) return '' const mins = Math.floor((Date.now() - new Date(iso).getTime()) / 60000) if (mins < 60) return `${mins}λ` const h = Math.floor(mins / 60) const m = mins % 60 return m === 0 ? `${h}ω` : `${h}ω ${m}λ` } export default function UserMenu() { const [open, setOpen] = useState(false) const [busy, setBusy] = useState(false) const ref = useRef(null) const navigate = useNavigate() const { user, logout } = useAuthStore() const { dark, toggle } = useThemeStore() const { shift, selfEndAllowed, setShift, clearShift, } = useShiftStore() useEffect(() => { function onClick(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false) } document.addEventListener('mousedown', onClick) return () => document.removeEventListener('mousedown', onClick) }, []) function handleLogout() { setOpen(false) logout() navigate('/login') } const activeBreak = shift?.breaks?.find(b => !b.ended_at) const isWaiter = user?.role === 'waiter' async function handleEndShift() { if (!window.confirm('Να τελειώσει η βάρδια σου;')) return setBusy(true) try { await client.post('/api/shifts/end', {}) clearShift() setOpen(false) } catch { // ignore — gate will re-check } finally { setBusy(false) } } async function handleBreak() { setBusy(true) try { if (activeBreak) { await client.post(`/api/shifts/${shift.id}/break/end`) } else { await client.post(`/api/shifts/${shift.id}/break/start`) } const res = await client.get('/api/shifts/my') setShift(res.data) } catch { // ignore } finally { setBusy(false) } } return (