Files
gridpilot.gg/apps/website/lib/hooks/useLeagueStewarding.ts
2026-01-06 19:36:03 +01:00

100 lines
3.2 KiB
TypeScript

'use client';
import { useQuery } from '@tanstack/react-query';
import { useInject } from '@/lib/di/hooks/useInject';
import { LEAGUE_STEWARDING_SERVICE_TOKEN, LEAGUE_MEMBERSHIP_SERVICE_TOKEN } from '@/lib/di/tokens';
import { LeagueRoleUtility } from '@/lib/utilities/LeagueRoleUtility';
import { useCurrentDriver } from '@/hooks/driver/useCurrentDriver';
/**
* Hook for league stewarding data with admin check
*/
export function useLeagueStewarding(leagueId: string) {
const leagueStewardingService = useInject(LEAGUE_STEWARDING_SERVICE_TOKEN);
const leagueMembershipService = useInject(LEAGUE_MEMBERSHIP_SERVICE_TOKEN);
const { data: currentDriver } = useCurrentDriver();
const currentDriverId = currentDriver?.id;
// Check admin status
const adminQuery = useQuery({
queryKey: ['leagueMembership', leagueId, currentDriverId],
queryFn: async () => {
if (!currentDriverId) return false;
const membership = await leagueMembershipService.getMembership(leagueId, currentDriverId);
return membership ? LeagueRoleUtility.isLeagueAdminOrHigherRole(membership.role) : false;
},
staleTime: 5 * 60 * 1000, // 5 minutes
gcTime: 10 * 60 * 1000, // 10 minutes
enabled: !!leagueId && !!currentDriverId,
});
// Load stewarding data (only if admin)
const stewardingQuery = useQuery({
queryKey: ['leagueStewarding', leagueId],
queryFn: async () => {
return await leagueStewardingService.getLeagueStewardingData(leagueId);
},
staleTime: 2 * 60 * 1000, // 2 minutes
gcTime: 5 * 60 * 1000, // 5 minutes
enabled: !!leagueId && adminQuery.data === true,
});
return {
isAdmin: adminQuery.data,
adminLoading: adminQuery.isLoading,
adminError: adminQuery.error,
stewardingData: stewardingQuery.data,
stewardingLoading: stewardingQuery.isLoading,
stewardingError: stewardingQuery.error,
refetchStewarding: stewardingQuery.refetch,
refetchAdmin: adminQuery.refetch,
};
}
/**
* Hook for league stewarding mutations
*/
export function useLeagueStewardingMutations(leagueId: string) {
const leagueStewardingService = useInject(LEAGUE_STEWARDING_SERVICE_TOKEN);
const { data: currentDriver } = useCurrentDriver();
const currentDriverId = currentDriver?.id;
const reviewProtest = async (input: { protestId: string; decision: string; decisionNotes: string }) => {
if (!currentDriverId) throw new Error('No current driver');
return await leagueStewardingService.reviewProtest({
protestId: input.protestId,
stewardId: currentDriverId,
decision: input.decision,
decisionNotes: input.decisionNotes,
});
};
const applyPenalty = async (input: {
raceId: string;
driverId: string;
type: string;
value: number;
reason: string;
protestId: string;
notes: string;
}) => {
if (!currentDriverId) throw new Error('No current driver');
return await leagueStewardingService.applyPenalty({
raceId: input.raceId,
driverId: input.driverId,
stewardId: currentDriverId,
type: input.type,
value: input.value,
reason: input.reason,
protestId: input.protestId,
notes: input.notes,
});
};
return {
reviewProtest,
applyPenalty,
};
}