'use client'; import { signIn } from '@/app/actions/user'; import { toast } from '@/hooks/use-toast'; import { currentUserAtom, usersAtom } from '@/lib/atoms'; import { SafeUser, User } from '@/lib/types'; import { cn } from '@/lib/utils'; import { Description } from '@radix-ui/react-dialog'; import { useAtom } from 'jotai'; import { Crown, Plus, User as UserIcon, UserRoundPen } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { useState } from 'react'; import PasswordEntryForm from './PasswordEntryForm'; import UserForm from './UserForm'; import { Avatar, AvatarFallback, AvatarImage } from './ui/avatar'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from './ui/dialog'; function UserCard({ user, onSelect, onEdit, showEdit, isCurrentUser, }: { user: User, onSelect: () => void, onEdit: () => void, showEdit: boolean, isCurrentUser: boolean, }) { const t = useTranslations('UserSelectModal'); return (
{showEdit && (
{showEdit && ( )}
)}
); } function AddUserButton({ onClick }: { onClick: () => void }) { const t = useTranslations('UserSelectModal'); return ( ); } function UserSelectionView({ users, currentUserFromHook, // Renamed to avoid confusion with map variable onUserSelect, onEditUser, onCreateUser, }: { users: User[], currentUserFromHook?: SafeUser, onUserSelect: (userId: string) => void, onEditUser: (userId: string) => void, onCreateUser: () => void, }) { return (
{users .filter(user => user.id !== currentUserFromHook?.id) // Show other users .map((user) => ( onUserSelect(user.id)} onEdit={() => onEditUser(user.id)} showEdit={!!currentUserFromHook?.isAdmin} isCurrentUser={false} // This card isn't the currently logged-in user for switching TO /> ))} {currentUserFromHook?.isAdmin && }
); } export default function UserSelectModal({ onClose }: { onClose: () => void }) { const t = useTranslations('UserSelectModal'); const [selectedUser, setSelectedUser] = useState(); const [isCreating, setIsCreating] = useState(false); const [isEditing, setIsEditing] = useState(false); const [error, setError] = useState(''); const [usersData, setUsersData] = useAtom(usersAtom); const users = usersData.users; const [currentUser] = useAtom(currentUserAtom); const handleUserSelect = (userId: string) => { setSelectedUser(userId); setError(''); }; const handleEditUser = (userId: string) => { setSelectedUser(userId); setIsEditing(true); }; const handleCreateUser = () => { setIsCreating(true); }; const handleFormSuccess = () => { setSelectedUser(undefined); setIsCreating(false); setIsEditing(false); onClose(); }; const handleFormCancel = () => { setSelectedUser(undefined); setIsCreating(false); setIsEditing(false); setError(''); }; return ( {isCreating ? t('createNewUserTitle') : t('selectUserTitle')}
{!selectedUser && !isCreating && !isEditing ? ( ) : isCreating || isEditing ? ( ) : ( u.id === selectedUser)!} onCancel={() => setSelectedUser(undefined)} onSubmit={async (password) => { try { setError(''); const user = users.find(u => u.id === selectedUser); if (!user) throw new Error("User not found"); await signIn(user.username, password); setError(''); onClose(); toast({ title: t('signInSuccessTitle'), description: t('signInSuccessDescription', { username: user.username }), variant: "default" }); setTimeout(() => window.location.reload(), 300); } catch (err) { setError(t('errorInvalidPassword')); throw err; } }} error={error} /> )}
); }