"use client"; import { useState } from "react"; import Link from "next/link"; import { useParams } from "next/navigation"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { Button, Card, CardContent, ConfirmDialog, Dialog, Input, PageHeader, Select, Textarea } from "@/components/ds"; import { useTenantId } from "@/hooks/useTenantId"; import { workspaceApi } from "@/modules/workspace/services/workspace-api"; import { ACTIVITY_ACTION, TEAM_ROLE, displayPerson, formatWhen, labelOf } from "@/modules/workspace/labels"; import { IdentityUserSelect } from "@/modules/workspace/components/IdentityUserSelect"; import { CommentThread } from "@/modules/workspace/components/CommentThread"; import { StatusChip } from "@/modules/workspace/components/StatusChip"; import { WorkspacePageError, WorkspacePageLoader } from "@/modules/workspace/pages/shared"; import { useTenantMembers } from "@/modules/workspace/hooks/useTenantMembers"; export const WorkspaceTeamDetail = function WorkspaceTeamDetailPage() { const params = useParams<{ id: string }>(); const { tenantId } = useTenantId(); const queryClient = useQueryClient(); const directory = useTenantMembers(); const names = Object.fromEntries((directory.data ?? []).map((person) => [person.id, person.label])); const [userId, setUserId] = useState(""); const [role, setRole] = useState("member"); const [editOpen, setEditOpen] = useState(false); const [archiveOpen, setArchiveOpen] = useState(false); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const team = useQuery({ queryKey: ["workspace", tenantId, "team", params.id], queryFn: () => workspaceApi.teams.get(tenantId!, params.id), enabled: !!tenantId && !!params.id, }); const hubId = team.data?.work_hub_id ? String(team.data.work_hub_id) : ""; const projects = useQuery({ queryKey: ["workspace", tenantId, "projects", hubId, params.id], queryFn: () => workspaceApi.projects.list(tenantId!, { work_hub_id: hubId, team_id: params.id }), enabled: !!tenantId && !!hubId, }); const tasks = useQuery({ queryKey: ["workspace", tenantId, "tasks", hubId], queryFn: () => workspaceApi.tasks.list(tenantId!, { work_hub_id: hubId }), enabled: !!tenantId && !!hubId, }); const content = useQuery({ queryKey: ["workspace", tenantId, "content", hubId], queryFn: () => workspaceApi.content.list(tenantId!, { work_hub_id: hubId }), enabled: !!tenantId && !!hubId, }); const activity = useQuery({ queryKey: ["workspace", tenantId, "activity", hubId], queryFn: () => workspaceApi.activity.list(tenantId!, hubId), enabled: !!tenantId && !!hubId, }); const invalidate = () => void queryClient.invalidateQueries({ queryKey: ["workspace", tenantId, "team", params.id] }); const addMember = useMutation({ mutationFn: () => workspaceApi.members.add(tenantId!, { team_id: params.id, user_id: userId, role }), onSuccess: () => { toast.success("عضو اضافه شد"); setUserId(""); invalidate(); }, onError: (err) => toast.error(err instanceof Error ? err.message : "افزودن عضو ناموفق بود"), }); const updateMember = useMutation({ mutationFn: ({ id, body }: { id: string; body: Record }) => workspaceApi.members.update(tenantId!, id, body), onSuccess: () => { toast.success("عضو به‌روز شد"); invalidate(); }, onError: (err) => toast.error(err instanceof Error ? err.message : "به‌روزرسانی عضو ناموفق بود"), }); const saveTeam = useMutation({ mutationFn: () => workspaceApi.teams.update(tenantId!, params.id, { name, description }), onSuccess: () => { toast.success("تیم به‌روز شد"); setEditOpen(false); invalidate(); }, }); const archive = useMutation({ mutationFn: () => workspaceApi.teams.update(tenantId!, params.id, { status: "archived" }), onSuccess: () => { toast.success("تیم بایگانی شد"); setArchiveOpen(false); invalidate(); }, }); if (!tenantId || team.isLoading) return ; if (team.error) return team.refetch()} />; const members = (team.data?.members as Record[]) || []; const teamTasks = (tasks.data ?? []).filter((task) => String(task.team_id || "") === params.id); const teamContent = (content.data ?? []).filter((item) => String(item.team_id || "") === params.id); return (
} />

اعضای تیم

{members.map((member) => (

{names[String(member.user_id || "")] || displayPerson(String(member.user_id || ""))}

{labelOf(TEAM_ROLE, String(member.role || ""))}

))}

پروژه‌های تیم

{(projects.data ?? []).length === 0 ? (

پروژه‌ای به این تیم وصل نیست.

) : ( (projects.data ?? []).map((project) => ( {String(project.name)} )) )}

وظایف و محتوا

{teamTasks.length} وظیفه · {teamContent.length} محتوا

فعالیت تیم

{(activity.data ?? []).slice(0, 12).map((item) => (

{labelOf(ACTIVITY_ACTION, String(item.action || ""), "رویداد")} · {names[String(item.actor_user_id || "")] || displayPerson(String(item.actor_user_id || ""))} · {formatWhen(String(item.created_at || ""))}

))}
{hubId ? ( ) : null} setEditOpen(false)} title="ویرایش تیم">
setName(event.target.value)} placeholder="نام تیم" />