import React, { useState, useEffect } from 'react'; import { toast } from 'sonner'; import { api } from '@/api'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Label } from '@/components/ui/label'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from '@/components/ui/select'; import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, } from '@/components/ui/alert-dialog'; import { LogIn, UserCheck, ShieldCheck } from 'lucide-react'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; export default function LoginModeCard({ users, onModeChange }) { const [modeData, setModeData] = useState(null); const [loading, setLoading] = useState(true); const [loadError, setLoadError] = useState(''); const [saving, setSaving] = useState(false); const [selected, setSelected] = useState('multi'); // local UI selection const [selectedUser, setSelectedUser] = useState(''); const [confirmSingle, setConfirmSingle] = useState(false); useEffect(() => { api.authModeConfig() .then(d => { setModeData(d); const mode = d.auth_mode === 'single' ? 'single' : 'multi'; setSelected(mode); setSelectedUser(d.default_user_id?.toString() || ''); onModeChange?.(mode); }) .catch(err => setLoadError(err.message || 'Failed to load login mode config')) .finally(() => setLoading(false)); }, []); // eslint-disable-line const doSetMode = async (mode, userId) => { setSaving(true); try { await api.setAuthMode({ auth_mode: mode, default_user_id: mode === 'single' ? parseInt(userId, 10) : null, }); const d = await api.authModeConfig(); setModeData(d); const resolved = d.auth_mode === 'single' ? 'single' : 'multi'; setSelected(resolved); setSelectedUser(d.default_user_id?.toString() || ''); onModeChange?.(resolved); toast.success(mode === 'single' ? 'No Login mode enabled.' : 'Login requirement restored.'); } catch (err) { toast.error(err.message || 'Failed to update login mode.'); // revert UI selection on error setSelected(modeData?.auth_mode === 'single' ? 'single' : 'multi'); } finally { setSaving(false); } }; const handleSave = () => { if (selected === 'single') { if (!selectedUser) { toast.error('Select a user account first.'); return; } setConfirmSingle(true); } else { doSetMode('multi', null); } }; if (loading) return Loading…; if (loadError) return {loadError}; const currentMode = modeData?.auth_mode === 'single' ? 'single' : 'multi'; const isDirty = selected !== currentMode || (selected === 'single' && selectedUser !== (modeData?.default_user_id?.toString() || '')); const activeUser = users?.find(u => u.id === modeData?.default_user_id); const pendingUsername = users?.find(u => u.id.toString() === selectedUser)?.username ?? selectedUser; const regularUsers = (users || []).filter(u => u.role === 'user'); return ( <>
Login Mode

Choose how users access this app.

{currentMode === 'single' ? 'No Login' : 'Require Login'} {currentMode === 'single' ? 'Anyone who opens the app is automatically signed in' : 'Users must authenticate to access the app'}
{/* Option: Require Login */} {/* Option: No Login */} {/* User selector — shown only when No Login is selected */} {selected === 'single' && (
{regularUsers.length === 0 && (

No regular user accounts found. Create a user account first.

)}
)} {/* Security note for single mode */} {selected === 'single' && (

Only use this on trusted private networks. Anyone with access to the URL is signed in automatically.

)} {isDirty && ( )}
Enable No Login Mode? Anyone who opens the app will be automatically signed in as{' '} {pendingUsername}. The admin login still requires a password. Cancel { setConfirmSingle(false); doSetMode('single', selectedUser); }}> Enable No Login Mode ); }