import { useQuery } from '@tanstack/react-query'; import { useNostr } from '@nostrify/react'; import { SKATE_COACH_KIND, SKATE_FILMER_KIND, SKATE_SPOT_KIND, parseSkateCoach, parseSkateFilmer, type SkateCoach, type SkateFilmer, SKATE_RELAY, } from '@/lib/types'; interface SpotServices { coaches: SkateCoach[]; filmers: SkateFilmer[]; } /** * Hook to fetch coaches and filmers available at a specific spot */ export function useSpotServices(spotPubkey?: string, spotIdentifier?: string) { const { nostr } = useNostr(); return useQuery({ queryKey: ['spot-services', spotPubkey, spotIdentifier], queryFn: async (c): Promise => { if (!spotPubkey || !spotIdentifier) { return { coaches: [], filmers: [] }; } const signal = AbortSignal.any([c.signal, AbortSignal.timeout(8000)]); const relay = nostr.relay(SKATE_RELAY); // The spot reference format: "30818:pubkey:identifier" const spotRef = `${SKATE_SPOT_KIND}:${spotPubkey}:${spotIdentifier}`; // Query for coaches and filmers that reference this spot const events = await relay.query([ { kinds: [SKATE_COACH_KIND, SKATE_FILMER_KIND], '#a': [spotRef], limit: 50, } ], { signal }); const coaches: SkateCoach[] = []; const filmers: SkateFilmer[] = []; for (const event of events) { if (event.kind === SKATE_COACH_KIND) { const coach = parseSkateCoach(event); if (coach) coaches.push(coach); } else if (event.kind === SKATE_FILMER_KIND) { const filmer = parseSkateFilmer(event); if (filmer) filmers.push(filmer); } } // Sort by creation date (newest first) coaches.sort((a, b) => b.createdAt - a.createdAt); filmers.sort((a, b) => b.createdAt - a.createdAt); return { coaches, filmers }; }, enabled: !!spotPubkey && !!spotIdentifier, staleTime: 60000, }); }