import { useQuery } from '@tanstack/react-query'; import { SKATE_COACH_KIND, SKATE_FILMER_KIND, SKATE_EDITOR_KIND, SKATE_PHOTOGRAPHER_KIND, SKATE_BUILDER_KIND, parseSkateCoach, parseSkateFilmer, parseSkateEditor, parseSkatePhotographer, parseSkateBuilder, isFeaturedActive, type SkateCoach, type SkateFilmer, type SkateEditor, type SkatePhotographer, type SkateBuilder } from '@/lib/types'; import { useSkateRelays } from '@/hooks/useSkateRelays'; export type LabProfile = (SkateCoach | SkateFilmer | SkateEditor | SkatePhotographer | SkateBuilder) & { profileType: 'coach' | 'filmer' | 'editor' | 'photographer' | 'builder'; }; export function useLabProfiles(limit = 100) { const { querySkateContent, getQueryKeySuffix } = useSkateRelays(); return useQuery({ queryKey: ['lab-profiles', limit, getQueryKeySuffix()], queryFn: async () => { const signal = AbortSignal.timeout(15000); console.log('[useLabProfiles] Querying for coaches and filmers...'); const events = await querySkateContent( [ { kinds: [SKATE_COACH_KIND, SKATE_FILMER_KIND, SKATE_EDITOR_KIND, SKATE_PHOTOGRAPHER_KIND, SKATE_BUILDER_KIND], '#t': ['skatecoach', 'skatefilmer', 'skateeditor', 'skatephotographer', 'skatebuilder'], limit: limit * 2, }, ], { signal } ); console.log(`[useLabProfiles] Received ${events.length} events`); const profiles: LabProfile[] = []; for (const event of events) { if (event.kind === SKATE_COACH_KIND) { const coach = parseSkateCoach(event); if (coach) { profiles.push({ ...coach, profileType: 'coach' }); } } else if (event.kind === SKATE_FILMER_KIND) { const filmer = parseSkateFilmer(event); if (filmer) { profiles.push({ ...filmer, profileType: 'filmer' }); } } else if (event.kind === SKATE_EDITOR_KIND) { const editor = parseSkateEditor(event); if (editor) { profiles.push({ ...editor, profileType: 'editor' }); } } else if (event.kind === SKATE_PHOTOGRAPHER_KIND) { const photographer = parseSkatePhotographer(event); if (photographer) { profiles.push({ ...photographer, profileType: 'photographer' }); } } else if (event.kind === SKATE_BUILDER_KIND) { const builder = parseSkateBuilder(event); if (builder) { profiles.push({ ...builder, profileType: 'builder' }); } } } console.log(`[useLabProfiles] Parsed profiles: ${profiles.length} (coaches + filmers + editors + photographers)`); // Featured (Pro) profiles first, then newest. return profiles.sort((a, b) => { const aPro = isFeaturedActive(a.featuredUntil) ? 1 : 0; const bPro = isFeaturedActive(b.featuredUntil) ? 1 : 0; if (aPro !== bPro) return bPro - aPro; return b.createdAt - a.createdAt; }); }, staleTime: 30000, refetchOnMount: 'always', }); } export function useLabProfile(identifier: string, pubkey?: string) { const { querySkateContent, getQueryKeySuffix } = useSkateRelays(); return useQuery({ queryKey: ['lab-profile', identifier, pubkey, getQueryKeySuffix()], queryFn: async () => { const signal = AbortSignal.timeout(10000); const filter: { kinds: number[]; '#d': string[]; authors?: string[]; limit: number; } = { kinds: [SKATE_COACH_KIND, SKATE_FILMER_KIND, SKATE_EDITOR_KIND, SKATE_PHOTOGRAPHER_KIND, SKATE_BUILDER_KIND], '#d': [identifier], limit: 1, }; if (pubkey) filter.authors = [pubkey]; console.log(`[useLabProfile] Querying for profile: ${identifier}`); const events = await querySkateContent([filter], { signal }); console.log(`[useLabProfile] Received ${events.length} events`); if (events.length === 0) { console.warn(`[useLabProfile] No events found for identifier: ${identifier}`); return null; } const event = events[0]; if (event.kind === SKATE_COACH_KIND) { const coach = parseSkateCoach(event); return coach ? { ...coach, profileType: 'coach' as const } : null; } else if (event.kind === SKATE_FILMER_KIND) { const filmer = parseSkateFilmer(event); return filmer ? { ...filmer, profileType: 'filmer' as const } : null; } else if (event.kind === SKATE_EDITOR_KIND) { const editor = parseSkateEditor(event); return editor ? { ...editor, profileType: 'editor' as const } : null; } else if (event.kind === SKATE_PHOTOGRAPHER_KIND) { const photographer = parseSkatePhotographer(event); return photographer ? { ...photographer, profileType: 'photographer' as const } : null; } else if (event.kind === SKATE_BUILDER_KIND) { const builder = parseSkateBuilder(event); return builder ? { ...builder, profileType: 'builder' as const } : null; } return null; }, enabled: !!identifier, staleTime: 30000, refetchOnMount: 'always', }); }