import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useStore } from '../store/useStore'; import { authApi, familyApi, inviteLinkApi } from '../api/client'; import { Users, LogOut, Settings, Plus, Loader2, Eye, EyeOff } from 'lucide-react'; export default function NoFamily() { const { t } = useTranslation(); const navigate = useNavigate(); const { user, logout, setUser } = useStore(); const [familyName, setFamilyName] = useState(''); const [password, setPassword] = useState(''); const [showPassword, setShowPassword] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [joiningFamily, setJoiningFamily] = useState(false); useEffect(() => { checkPendingInvite(); }, []); const checkPendingInvite = async () => { const pendingToken = localStorage.getItem('pendingInviteToken'); if (!pendingToken) return; localStorage.removeItem('pendingInviteToken'); try { setJoiningFamily(true); const response = await inviteLinkApi.join(pendingToken); if (response.data.success) { const meResponse = await authApi.me(); setUser(meResponse.data); navigate(`/family/${response.data.family_id}`); } else { setError(response.data.message); } } catch (err: any) { if (err.response?.status === 400) { setError(t('noFamily.invalidInvite')); } else { setError(t('noFamily.joinError')); } } finally { setJoiningFamily(false); } }; const handleLogout = async () => { try { await authApi.logout(); logout(); } catch (err) { console.error(err); logout(); } }; const handleGoToAdmin = () => { navigate('/adminpanel'); }; const handleCreateFamily = async (e: React.FormEvent) => { e.preventDefault(); if (!familyName.trim()) { setError(t('noFamily.enterFamilyName')); return; } try { setLoading(true); setError(''); const response = await familyApi.createMyFamily({ name: familyName.trim(), password: password || undefined, }); setUser({ ...user!, family_id: response.data.family_id, }); navigate(`/family/${response.data.family_id}`); } catch (err: unknown) { if (err && typeof err === 'object' && 'response' in err) { const axiosError = err as { response?: { status?: number } }; if (axiosError.response?.status === 409) { setError(t('noFamily.alreadyInFamily')); } else { setError(t('noFamily.createError')); } } else { setError(t('noFamily.createError')); } console.error(err); } finally { setLoading(false); } }; if (joiningFamily) { return (
{t('noFamily.joiningFamily')}
); } return (

{t('noFamily.welcome')}

{user?.email || user?.username}

{t('noFamily.createFamily')}

{error && (
{error}
)}
setFamilyName(e.target.value)} placeholder={t('noFamily.familyNamePlaceholder')} className="w-full px-4 py-3 border-2 border-gray-300 rounded-xl focus:border-purple-500 focus:outline-none transition-colors" disabled={loading} />
setPassword(e.target.value)} placeholder={t('noFamily.passwordPlaceholder')} className="w-full px-4 py-3 pr-12 border-2 border-gray-300 rounded-xl focus:border-purple-500 focus:outline-none transition-colors" disabled={loading} />

{t('noFamily.passwordHint')}

{user?.is_admin && ( )}
); }