import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { api, ApiError, type ApiResponse } from '../lib/api'; import type { Branch, BranchWorkingHours, Room, RoomPayload, WorkingHoursPayload } from '../types'; /** * «شعبه» یک جدول تازه نیست — همان آدرس محل نوبت‌دهی است (`doctor_addresses`). * ساخت/ویرایش نام و آدرس همان‌جایی انجام می‌شود که همیشه (جزئیات کلینیک/پزشک)؛ * این هوک فقط چیزهای شعبه‌ای را می‌دهد: فعال/غیرفعال، منطقهٔ زمانی، ساعت کاری، اتاق. */ const BRANCHES_KEY = ['branches']; function fail(e: unknown, fallback: string) { toast.error(e instanceof ApiError ? e.message : fallback); } export function useBranches() { const qc = useQueryClient(); const query = useQuery({ queryKey: BRANCHES_KEY, queryFn: () => api.get>('/api/v1/branches'), }); const update = useMutation({ mutationFn: ({ uuid, d }: { uuid: string; d: { active?: boolean; timezone?: string } }) => api.patch>(`/api/v1/branch/${uuid}`, d), onSuccess: () => { toast.success('شعبه به‌روزرسانی شد'); qc.invalidateQueries({ queryKey: BRANCHES_KEY }); }, onError: (e) => fail(e, 'به‌روزرسانی شعبه ناموفق بود'), }); // پاسخِ غیرآرایه (خطای سرور، شکل دیگر) نباید صفحه را با «map is not a function» // بترکاند؛ فهرست خالی رفتار درست است. const branches = Array.isArray(query.data?.data) ? query.data.data : []; return { branches, loading: query.isLoading, update }; } export function useBranchWorkingHours(branchUuid: string | undefined) { const qc = useQueryClient(); const key = ['branch-working-hours', branchUuid]; const query = useQuery({ queryKey: key, queryFn: () => api.get>(`/api/v1/branch/${branchUuid}/working-hours`), enabled: !!branchUuid, }); /** PUT قرارداد جایگزینی کامل دارد: آرایهٔ خالی یعنی شعبه بسته، نه «تغییری نده». */ const save = useMutation({ mutationFn: (days: WorkingHoursPayload) => api.put>(`/api/v1/branch/${branchUuid}/working-hours`, { days }), onSuccess: () => { toast.success('ساعت کاری ذخیره شد'); qc.invalidateQueries({ queryKey: key }); qc.invalidateQueries({ queryKey: BRANCHES_KEY }); }, onError: (e) => fail(e, 'ذخیرهٔ ساعت کاری ناموفق بود'), }); return { workingHours: query.data?.data, loading: query.isLoading, save }; } export function useBranchRooms(branchUuid: string | undefined) { const qc = useQueryClient(); const key = ['branch-rooms', branchUuid]; const invalidate = () => { qc.invalidateQueries({ queryKey: key }); qc.invalidateQueries({ queryKey: BRANCHES_KEY }); }; const query = useQuery({ queryKey: key, queryFn: () => api.get>(`/api/v1/branch/${branchUuid}/rooms`), enabled: !!branchUuid, }); const create = useMutation({ mutationFn: (d: RoomPayload) => api.post>('/api/v1/room', { ...d, address_uuid: branchUuid }), onSuccess: () => { toast.success('اتاق افزوده شد'); invalidate(); }, onError: (e) => fail(e, 'افزودن اتاق ناموفق بود'), }); const update = useMutation({ mutationFn: ({ uuid, d }: { uuid: string; d: RoomPayload }) => api.patch>(`/api/v1/room/${uuid}`, d), onSuccess: () => { toast.success('اتاق به‌روزرسانی شد'); invalidate(); }, onError: (e) => fail(e, 'به‌روزرسانی اتاق ناموفق بود'), }); const remove = useMutation({ mutationFn: (uuid: string) => api.delete>(`/api/v1/room/${uuid}`), onSuccess: () => { toast.success('اتاق حذف شد'); invalidate(); }, onError: (e) => fail(e, 'حذف اتاق ناموفق بود'), }); return { rooms: query.data?.data ?? [], loading: query.isLoading, create, update, remove }; }