"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, FormField, Select, Card, CardContent, Badge, } from "@/components/ds"; const upsertSchema = z.object({ organization_id: z.string().optional(), key: z.string().min(1, "کلید الزامی است"), valueJson: z.string().optional(), description: z.string().optional(), }); export default function BeautySettingsPage() { const { tenantId } = useTenantId(); const qc = useQueryClient(); const [open, setOpen] = useState(false); const orgsQ = useQuery({ queryKey: ["beauty", tenantId, "organizations"], queryFn: () => beautyBusinessApi.organizations.list(tenantId!), enabled: !!tenantId, }); const settingsQ = useQuery({ queryKey: ["beauty", tenantId, "settings"], queryFn: () => beautyBusinessApi.settings.list(tenantId!), enabled: !!tenantId, }); const permissionsQ = useQuery({ queryKey: ["beauty", tenantId, "permissions-catalog"], queryFn: () => beautyBusinessApi.permissions.catalog(tenantId!), enabled: !!tenantId, }); const form = useForm>({ resolver: zodResolver(upsertSchema), defaultValues: { organization_id: "", key: "", valueJson: "{}", description: "" }, }); const invalidate = () => qc.invalidateQueries({ queryKey: ["beauty", tenantId, "settings"] }); const upsertM = useMutation({ mutationFn: (d: z.infer) => { let value: Record | undefined; try { value = d.valueJson ? (JSON.parse(d.valueJson) as Record) : undefined; } catch { throw new Error("JSON مقدار نامعتبر است"); } return beautyBusinessApi.settings.upsert(tenantId!, { organization_id: d.organization_id || undefined, key: d.key, value, description: d.description || undefined, }); }, onSuccess: async () => { toast.success("تنظیم ذخیره شد"); setOpen(false); form.reset(); await invalidate(); }, onError: (e: Error) => toast.error(e.message), }); if (!tenantId || settingsQ.isLoading) return ; if (settingsQ.error) { return settingsQ.refetch()} />; } return (
setOpen(true)}> تنظیم جدید } /> ( {r.value ? JSON.stringify(r.value).slice(0, 60) : "—"} ), }, ]} rows={(settingsQ.data ?? []) as unknown as Record[]} empty={ setOpen(true)}>افزودن تنظیم} />} /> {permissionsQ.data ? (

کاتالوگ مجوزها

{permissionsQ.data.count} مجوز
) : null} setOpen(false)} title="تنظیم جدید">
upsertM.mutate(d))}>
); }