import { useState } from 'react' import { createFileRoute, useRouter } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' import { Route as RootRoute } from './__root' import { formatApiError, makeApi } from '../lib/api' import { type CardStatus, STATUSES, prettyStatus, relativeTime } from '../lib/kanban' export const Route = createFileRoute('/board')({ component: BoardPage, }) function BoardPage() { const { t } = useTranslation() const router = useRouter() const { cards, error } = RootRoute.useLoaderData() const [title, setTitle] = useState('') const [status, setStatus] = useState('todo') const [pending, setPending] = useState(false) const [createError, setCreateError] = useState(null) const columns = STATUSES.map((columnStatus) => ({ key: columnStatus, title: prettyStatus(columnStatus), cards: cards.filter((card) => card.status === columnStatus), })) const handleSubmit = async (event: React.FormEvent) => { event.preventDefault() if (!title.trim()) return setPending(true) setCreateError(null) try { await makeApi().invoke('createCard', { title: title.trim(), status }) setTitle('') await router.invalidate() } catch (err) { setCreateError(await formatApiError(err)) } finally { setPending(false) } } return (

{t('board.heading')}

{t('board.sub')}

{error ? (
{t('board.loadFailed', { error })}
) : (
{columns.map((column) => (

{column.title}

{column.cards.length}
{column.cards.length === 0 ? (
{t('board.columnEmpty')}
) : ( column.cards.map((card) => (
{card.title}
#{card.position} {relativeTime(card.createdAt)}
)) )}
))}
)}

{t('board.createHeading')}

{t('board.createSub')}

{createError && (
{t('board.createFailed', { error: createError })}
)}
) }