100 lines
3.2 KiB
TypeScript
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,
|
|
};
|
|
} |