import { useRef, useEffect, useCallback } from 'react'; import { useMutation } from '@tanstack/react-query'; import api from '@/lib/api'; import type { EventLockInfo } from '@/types'; export function useEventLock(eventId: number | null) { const lockHeldRef = useRef(false); const activeEventIdRef = useRef(null); const acquireMutation = useMutation({ mutationFn: async (id: number) => { const { data } = await api.post( `/shared-calendars/events/${id}/lock` ); return data; }, onSuccess: (_data, lockedId) => { lockHeldRef.current = true; activeEventIdRef.current = lockedId; }, }); const releaseMutation = useMutation({ mutationFn: async (id: number) => { await api.delete(`/shared-calendars/events/${id}/lock`); }, onSuccess: () => { lockHeldRef.current = false; activeEventIdRef.current = null; }, }); const acquire = useCallback(async () => { if (!eventId) return null; const data = await acquireMutation.mutateAsync(eventId); return data; }, [eventId]); const release = useCallback(async () => { const id = activeEventIdRef.current; if (!id || !lockHeldRef.current) return; try { await releaseMutation.mutateAsync(id); } catch { // Fire-and-forget on release errors } }, []); // Auto-release on unmount or eventId change useEffect(() => { return () => { const id = activeEventIdRef.current; if (id && lockHeldRef.current) { // Fire-and-forget cleanup api.delete(`/shared-calendars/events/${id}/lock`).catch(() => {}); lockHeldRef.current = false; activeEventIdRef.current = null; } }; }, [eventId]); return { acquire, release, isAcquiring: acquireMutation.isPending, acquireError: acquireMutation.error, }; }