import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { api } from '../lib/api'; import type { ApiResponse } from '../lib/api'; /** tour id => بالاترین نسخه‌ای که کاربر دیده است */ type SeenMap = Record; export const TOURS_QUERY_KEY = ['my-tours'] as const; /** * وضعیت «دیده‌شده» روی حساب کاربر ذخیره می‌شود نه روی مرورگر، تا با عوض کردن * دستگاه یا مرورگر تورها دوباره از سر اجرا نشوند. */ export function useTourProgress() { const queryClient = useQueryClient(); const query = useQuery({ queryKey: TOURS_QUERY_KEY, queryFn: () => api.get>('/api/v1/my/tours'), // در طول یک نشست عوض نمی‌شود مگر با همین mutation، پس refetch بی‌فایده است. staleTime: Infinity, }); const seen: SeenMap = query.data?.data?.seen ?? {}; const markSeen = useMutation({ mutationFn: ({ tourId, version }: { tourId: string; version: number }) => api.post>(`/api/v1/my/tours/${tourId}/seen`, { version }), // کش را بدون رفت‌وبرگشت اضافه به‌روز می‌کند؛ سرور همین مقدار را برمی‌گرداند. onSuccess: (_data, { tourId, version }) => { queryClient.setQueryData>(TOURS_QUERY_KEY, (prev) => { const previous = prev?.data?.seen ?? {}; return { ...(prev ?? { success: true, errors: [] as never[] }), data: { seen: { ...previous, [tourId]: Math.max(previous[tourId] ?? 0, version) } }, } as ApiResponse<{ seen: SeenMap }>; }); }, }); return { seen, /** تا وقتی پاسخ سرور نیامده، هیچ توری خودکار اجرا نمی‌شود */ isReady: query.isSuccess, isSeen: (tourId: string, version: number) => (seen[tourId] ?? 0) >= version, markSeen: (tourId: string, version: number) => markSeen.mutate({ tourId, version }), }; }