import { FormEvent, useEffect, useRef, useState } from 'react' import TaskBoard from './TaskBoard' type User = { id: string name: string createdAt: string } type ApiError = { code?: string message?: string } const ACTIVE_USER_KEY = 'hemhub.activeUserId' function App() { const [users, setUsers] = useState([]) const [activeUser, setActiveUser] = useState(null) const [loadState, setLoadState] = useState<'loading' | 'ready' | 'error'>('loading') const [showCreateUser, setShowCreateUser] = useState(false) const loadUsers = async () => { setLoadState('loading') try { const response = await fetch('/api/users') if (!response.ok) { throw new Error('Kunde inte hämta användare') } const loadedUsers = (await response.json()) as User[] const storedUserId = window.localStorage.getItem(ACTIVE_USER_KEY) const storedUser = loadedUsers.find((user) => user.id === storedUserId) ?? null if (storedUserId && !storedUser) { window.localStorage.removeItem(ACTIVE_USER_KEY) } setUsers(loadedUsers) setActiveUser(storedUser) setShowCreateUser(loadedUsers.length === 0) setLoadState('ready') } catch { setLoadState('error') } } useEffect(() => { void loadUsers() }, []) const selectUser = (user: User) => { window.localStorage.setItem(ACTIVE_USER_KEY, user.id) setActiveUser(user) } const logOut = () => { window.localStorage.removeItem(ACTIVE_USER_KEY) setActiveUser(null) setShowCreateUser(false) } if (loadState === 'loading') { return
Laddar HemHub…
} if (loadState === 'error') { return (

HemHub

Kunde inte ansluta till HemHub.

) } if (activeUser) { return } if (showCreateUser) { return ( 0} onCancel={() => setShowCreateUser(false)} onCreated={(user) => { setUsers((currentUsers) => [...currentUsers, user]) selectUser(user) }} /> ) } return (

HemHub

Vem är du?

{users.map((user) => ( ))}
) } type CreateUserFormProps = { hasExistingUsers: boolean onCancel: () => void onCreated: (user: User) => void } function CreateUserForm({ hasExistingUsers, onCancel, onCreated }: CreateUserFormProps) { const [name, setName] = useState('') const [error, setError] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) const isSubmittingRef = useRef(false) const submit = async (event: FormEvent) => { event.preventDefault() if (isSubmittingRef.current) { return } const trimmedName = name.trim() if (!trimmedName || [...trimmedName].length > 50) { setError('Namnet måste innehålla mellan 1 och 50 tecken.') return } setError('') isSubmittingRef.current = true setIsSubmitting(true) try { const response = await fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: trimmedName }), }) if (!response.ok) { const apiError = (await response.json().catch(() => ({}))) as ApiError if ( apiError.code === 'INVALID_USER_NAME' || apiError.code === 'USER_NAME_ALREADY_EXISTS' ) { setError(apiError.message ?? 'Det gick inte att skapa användaren.') } else { setError('Det gick inte att skapa användaren. Försök igen.') } return } const createdUser = (await response.json()) as User onCreated(createdUser) } catch { setError('Det gick inte att skapa användaren. Försök igen.') } finally { isSubmittingRef.current = false setIsSubmitting(false) } } return (

HemHub

Skapa användare

void submit(event)}> setName(event.target.value)} /> {error && (

{error}

)} {hasExistingUsers && ( )}
) } export default App