import { redirect } from 'next/navigation'; import { getCurrentUser, toPublicUser } from '@/lib/auth/getCurrentUser'; import { createBoardService, createProjectService } from '@/lib/api/services'; import { Header } from '@/components/layout/Header'; import { ProjectNav } from '@/components/layout/ProjectNav'; import { ThreadForm } from '@/components/board/ThreadForm'; import { ForbiddenError, NotFoundError } from '@/lib/errors'; export const dynamic = 'force-dynamic'; export default async function BoardPage({ params, searchParams, }: { params: Promise<{ projectId: string }>; searchParams: Promise<{ q?: string; page?: string }>; }) { const user = await getCurrentUser(); if (!user) redirect('/login'); const { projectId } = await params; const { q, page } = await searchParams; const projectService = createProjectService(); let project: Awaited>; try { project = projectService.getProject(user.id, Number(projectId)); } catch (error) { if (error instanceof ForbiddenError || error instanceof NotFoundError) { redirect('/dashboard'); } throw error; } const boardService = createBoardService(); const { items } = boardService.listThreads(user.id, project.id, { page: Number(page ?? '1') || 1, search: q, }); return (

掲示板

{items.length === 0 ? (

スレッドはありません。

) : ( items.map((thread) => (

{thread.isPinned === 1 && '📌 '} {thread.isImportant === 1 && '❗ '} {thread.title}

{thread.category && ( {thread.category} )}

{thread.createdAt}

)) )}
); }