All files / web/src/hooks useStudentStakeholders.ts

0% Statements 0/70
0% Branches 0/1
0% Functions 0/1
0% Lines 0/70

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71                                                                                                                                             
'use client'

import { useQuery } from '@tanstack/react-query'
import type { StudentStakeholders, ViewerRelationshipSummary } from '@/types/student'

/**
 * Response from the stakeholders API
 */
interface StakeholdersResponse {
  stakeholders: StudentStakeholders
  viewerRelationship: ViewerRelationshipSummary
}

/**
 * Query key factory for stakeholders queries
 */
export const stakeholdersKeys = {
  all: ['stakeholders'] as const,
  player: (playerId: string) => [...stakeholdersKeys.all, playerId] as const,
}

/**
 * Fetch stakeholders data for a player
 */
async function fetchStakeholders(playerId: string): Promise<StakeholdersResponse> {
  const response = await fetch(`/api/players/${playerId}/stakeholders`)
  if (!response.ok) {
    throw new Error('Failed to fetch stakeholders')
  }
  return response.json()
}

/**
 * Hook to get complete stakeholder information for a student
 *
 * Returns:
 * - stakeholders: All parents, classrooms, pending requests, presence
 * - viewerRelationship: Summary of the current user's relationship to this student
 *
 * @param playerId - The player/student ID
 * @param options - React Query options
 */
export function useStudentStakeholders(
  playerId: string | null | undefined,
  options?: {
    enabled?: boolean
    staleTime?: number
    refetchInterval?: number | false
  }
) {
  return useQuery({
    queryKey: stakeholdersKeys.player(playerId ?? ''),
    queryFn: () => fetchStakeholders(playerId!),
    enabled: !!playerId && options?.enabled !== false,
    staleTime: options?.staleTime ?? 30_000, // 30 seconds
    refetchInterval: options?.refetchInterval,
  })
}

/**
 * Simplified hook that only returns stakeholders (without loading/error states)
 * Useful for components that only need the data when available
 */
export function useStakeholdersData(playerId: string | null | undefined) {
  const { data } = useStudentStakeholders(playerId)
  return {
    stakeholders: data?.stakeholders ?? null,
    viewerRelationship: data?.viewerRelationship ?? null,
  }
}