import { useQuery } from '@tanstack/react-query'; import { SKATE_CREW_KIND, parseSkateCrew, type SkateCrew } from '@/lib/types'; import { useSkateRelays } from '@/hooks/useSkateRelays'; export function useCrews(limit = 200) { const { querySkateContent, getQueryKeySuffix } = useSkateRelays(); return useQuery({ queryKey: ['skate-crews', limit, getQueryKeySuffix()], queryFn: async () => { const signal = AbortSignal.timeout(10000); const events = await querySkateContent( [ { kinds: [SKATE_CREW_KIND], '#t': ['skatecrew'], limit, }, ], { signal } ); const crews: SkateCrew[] = []; for (const event of events) { const crew = parseSkateCrew(event); if (crew) crews.push(crew); } return crews.sort((a, b) => b.createdAt - a.createdAt); }, staleTime: 5 * 60 * 1000, gcTime: 30 * 60 * 1000, refetchOnMount: true, }); } export function useCrew(identifier: string, pubkey?: string) { const { querySkateContent, getQueryKeySuffix } = useSkateRelays(); return useQuery({ queryKey: ['skate-crew', identifier, pubkey, getQueryKeySuffix()], queryFn: async () => { const signal = AbortSignal.timeout(10000); const filter: { kinds: number[]; '#d': string[]; authors?: string[]; limit: number; } = { kinds: [SKATE_CREW_KIND], '#d': [identifier], limit: 1, }; if (pubkey) filter.authors = [pubkey]; const events = await querySkateContent([filter], { signal }); if (events.length === 0) return null; const mostRecent = events.reduce((latest, current) => current.created_at > latest.created_at ? current : latest ); return parseSkateCrew(mostRecent); }, enabled: !!identifier, staleTime: 5 * 60 * 1000, gcTime: 30 * 60 * 1000, refetchOnMount: true, }); }