import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; import { api, ApiError, type ApiResponse } from '../lib/api'; import type { NationalHoliday } from '../types'; /** * تقویم تعطیلات رسمی از دید **مدیر سیستم** — تنها جایی که ساخته و حذف می‌شود. * * ⚠️ با `useHolidays` اشتباه نشود: آن مالِ یک محیط است و فقط «این روز برای ما باز * است» را ثبت می‌کند (`holiday-overrides`). خودِ تعطیلی سراسری است و محیط ندارد. */ export function useNationalHolidays(year: number) { const qc = useQueryClient(); const key = ['national-holidays', year]; const invalidate = () => { qc.invalidateQueries({ queryKey: key }); // کارت تعطیلات در تب پزشک و منبع هم از همین سال می‌خواند. qc.invalidateQueries({ queryKey: ['national-holidays'] }); }; const fail = (e: unknown, fallback: string) => toast.error(e instanceof ApiError ? e.message : fallback); const query = useQuery({ queryKey: key, queryFn: () => api.get>( `/api/v1/national-holidays?year=${year}`, ), }); const create = useMutation({ mutationFn: (d: { jalali_date: string; title: string }) => api.post>('/api/v1/admin/national-holidays', d), // سرور upsert می‌کند: همان روز دوباره یعنی تغییر عنوان، نه ردیف دوم. onSuccess: () => { toast.success('تعطیلی ثبت شد'); invalidate(); }, onError: (e) => fail(e, 'ثبت تعطیلی ناموفق بود'), }); const update = useMutation({ mutationFn: ({ uuid, title }: { uuid: string; title: string }) => api.patch>(`/api/v1/admin/national-holiday/${uuid}`, { title }), onSuccess: () => { toast.success('عنوان به‌روزرسانی شد'); invalidate(); }, onError: (e) => fail(e, 'به‌روزرسانی ناموفق بود'), }); const remove = useMutation({ mutationFn: (uuid: string) => api.delete>(`/api/v1/admin/national-holiday/${uuid}`), onSuccess: () => { toast.success('تعطیلی حذف شد'); invalidate(); }, onError: (e) => fail(e, 'حذف تعطیلی ناموفق بود'), }); return { holidays: query.data?.data?.holidays ?? [], loading: query.isLoading, create, update, remove, }; }