import { redirect } from 'next/navigation'; import { getCurrentUser, toPublicUser } from '@/lib/auth/getCurrentUser'; import { createProjectService } from '@/lib/api/services'; import { Header } from '@/components/layout/Header'; import { ProjectNav } from '@/components/layout/ProjectNav'; import { AddMemberForm } from '@/components/project/AddMemberForm'; import { RemoveMemberButton } from '@/components/project/RemoveMemberButton'; import { ForbiddenError, NotFoundError } from '@/lib/errors'; export const dynamic = 'force-dynamic'; const ROLE_LABEL = { admin: '管理者', member: 'メンバー', guest: 'ゲスト' }; export default async function ProjectMembersPage({ params, }: { params: Promise<{ projectId: string }>; }) { const user = await getCurrentUser(); if (!user) { redirect('/login'); } const { projectId } = await params; const service = createProjectService(); let project: Awaited>; let members: Awaited>; let canManage: boolean; try { project = service.getProject(user.id, Number(projectId)); members = service.getMembers(user.id, Number(projectId)); canManage = service.getMemberRole(user.id, Number(projectId)) === 'admin'; } catch (error) { if (error instanceof ForbiddenError || error instanceof NotFoundError) { redirect('/dashboard'); } throw error; } return (

メンバー管理

{canManage && }
    {members.map((member) => (
  • {member.user.name} {member.userId === user.id && ( (あなた) )}

    {member.user.email}

    {ROLE_LABEL[member.role] ?? member.role} {canManage && member.userId !== user.id && ( )}
  • ))}
); }