import { redirect } from 'next/navigation'; import { getCurrentUser, toPublicUser } from '@/lib/auth/getCurrentUser'; import { createScheduleService, createProjectService, } from '@/lib/api/services'; import { Header } from '@/components/layout/Header'; import { ProjectNav } from '@/components/layout/ProjectNav'; import { MilestoneForm } from '@/components/calendar/MilestoneForm'; import { ForbiddenError, NotFoundError } from '@/lib/errors'; export const dynamic = 'force-dynamic'; function progressColor(progress: number): string { if (progress >= 67) return 'bg-green-500'; if (progress >= 34) return 'bg-yellow-500'; return 'bg-red-500'; } export default async function MilestonesPage({ params, }: { params: Promise<{ projectId: string }>; }) { const user = await getCurrentUser(); if (!user) redirect('/login'); const { projectId } = await params; 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 scheduleService = createScheduleService(); const milestones = scheduleService.getMilestones(user.id, project.id); return (

マイルストーン

{milestones.length === 0 ? (

マイルストーンはありません。

) : ( milestones.map((m) => (

{m.title}

{m.status} {m.dueDate ? ` / 期限: ${m.dueDate}` : ''}
{m.description && (

{m.description}

)}
進捗 {m.progress}%
)) )}
); }