"use client"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { toast } from "sonner"; import { Plus } from "lucide-react"; import { beautyBusinessApi } from "@/modules/beauty/services/beauty-business-api"; import { useTenantId } from "@/hooks/useTenantId"; import { PageHeader, Button, Dialog, Input, DataTable, EmptyState, LoadingState, ErrorState, Badge, FormField, Select, } from "@/components/ds"; const createSchema = z.object({ organization_id: z.string().min(1, "سازمان الزامی است"), branch_id: z.string().optional(), code: z.string().min(1, "کد الزامی است"), display_name: z.string().min(1, "نام الزامی است"), kind: z.enum(["stylist", "therapist", "receptionist", "manager", "other"]).optional(), mobile: z.string().optional(), email: z.string().optional(), }); const kindLabel: Record = { stylist: "آرایشگر", therapist: "درمانگر", receptionist: "پذیرش", manager: "مدیر", other: "سایر", }; export default function StaffPage() { const { tenantId } = useTenantId(); const qc = useQueryClient(); const [createOpen, setCreateOpen] = useState(false); const orgsQ = useQuery({ queryKey: ["beauty", tenantId, "organizations"], queryFn: () => beautyBusinessApi.organizations.list(tenantId!), enabled: !!tenantId, }); const branchesQ = useQuery({ queryKey: ["beauty", tenantId, "branches"], queryFn: () => beautyBusinessApi.branches.list(tenantId!), enabled: !!tenantId, }); const listQ = useQuery({ queryKey: ["beauty", tenantId, "staff"], queryFn: () => beautyBusinessApi.staff.list(tenantId!), enabled: !!tenantId, }); const createForm = useForm>({ resolver: zodResolver(createSchema), defaultValues: { organization_id: "", branch_id: "", code: "", display_name: "", kind: "stylist", mobile: "", email: "", }, }); const selectedOrg = createForm.watch("organization_id"); const filteredBranches = (branchesQ.data ?? []).filter( (b) => !selectedOrg || b.organization_id === selectedOrg ); const invalidate = () => qc.invalidateQueries({ queryKey: ["beauty", tenantId, "staff"] }); const createM = useMutation({ mutationFn: (d: z.infer) => beautyBusinessApi.staff.create(tenantId!, { organization_id: d.organization_id, branch_id: d.branch_id || undefined, code: d.code, display_name: d.display_name, kind: d.kind, mobile: d.mobile || undefined, email: d.email || undefined, }), onSuccess: async () => { toast.success("پرسنل ایجاد شد"); setCreateOpen(false); createForm.reset(); await invalidate(); }, onError: (e: Error) => toast.error(e.message), }); if (!tenantId || listQ.isLoading) return ; if (listQ.error) { return listQ.refetch()} />; } return (
setCreateOpen(true)}> پرسنل جدید } /> kindLabel[String(r.kind)] ?? String(r.kind), }, { key: "mobile", header: "موبایل" }, { key: "status", header: "وضعیت", render: (r) => {String(r.status)}, }, ]} rows={(listQ.data ?? []) as unknown as Record[]} empty={ setCreateOpen(true)}>ایجاد پرسنل} />} /> setCreateOpen(false)} title="پرسنل جدید">
createM.mutate(d))}>
); }