"use client"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { DoorOpen, Loader2, Trash2 } from "lucide-react"; import { toast } from "sonner"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { leaveWorkspaceAction, removeMemberAction, updateMemberRoleAction, } from "@/lib/appwrite/team-actions"; type Member = { id: string; userId: string; name: string; email: string; role: string; joined: string; invited: string; confirm: boolean; }; const ROLE_LABEL: Record = { owner: "Sahip", admin: "Yönetici", member: "Üye", }; export function MembersTable({ members, currentUserId, isOwner, canManage, }: { members: Member[]; currentUserId: string; isOwner: boolean; canManage: boolean; }) { const router = useRouter(); const [busy, setBusy] = useState(null); const [, startTransition] = useTransition(); const [removing, setRemoving] = useState(null); const [leaving, setLeaving] = useState(false); const setRole = (membershipId: string, role: string) => { setBusy(membershipId); startTransition(async () => { const result = await updateMemberRoleAction({ ok: false }, formDataFor({ membershipId, role, })); if (result.ok) toast.success("Rol güncellendi."); else toast.error(result.error ?? "Rol güncellenemedi."); setBusy(null); }); }; const handleRemove = () => { if (!removing) return; setBusy(removing.id); startTransition(async () => { const result = await removeMemberAction({ ok: false }, formDataFor({ membershipId: removing.id, })); if (result.ok) { toast.success(`${removing.name} ekipten çıkarıldı.`); setRemoving(null); } else { toast.error(result.error ?? "İşlem başarısız."); } setBusy(null); }); }; const handleLeave = () => { setBusy("leave"); startTransition(async () => { const result = await leaveWorkspaceAction(); if (result.ok) { toast.success("Çalışma alanından ayrıldınız."); setLeaving(false); router.push("/dashboard"); } else { toast.error(result.error ?? "Ayrılma başarısız."); } setBusy(null); }); }; return ( <> Üyeler ({members.length}) İsim Email Rol İşlem {members.map((m) => { const isSelf = m.userId === currentUserId; const isMemberOwner = m.role === "owner"; return ( {m.name} {isSelf && ( Siz )} {m.email} {isOwner && !isMemberOwner && !isSelf ? ( ) : ( {ROLE_LABEL[m.role] ?? m.role} )} {isSelf ? ( ) : canManage && !isMemberOwner ? ( ) : null} ); })}
!v && busy === null && setRemoving(null)} > Üyeyi ekipten çıkar {removing && ( <> {removing.name} ({removing.email}) ekipten çıkarılacak. Verileri silinmez ama bu çalışma alanına erişimi kalkar. )} !v && busy === null && setLeaving(false)}> Çalışma alanından ayrıl Bu çalışma alanındaki tüm verilere erişiminiz kalkar. Tekrar davet edilmedikçe giremezsiniz. Devam etmek istediğinize emin misiniz? ); } function formDataFor(fields: Record): FormData { const fd = new FormData(); for (const [k, v] of Object.entries(fields)) fd.set(k, v); return fd; }