Files
flxn-app/src/features/players/queries.ts
2026-03-02 09:43:46 -06:00

91 lines
3.2 KiB
TypeScript

import { useServerSuspenseQuery } from "@/lib/tanstack-query/hooks";
import { listPlayers, getPlayer, getUnassociatedPlayers, fetchMe, getPlayerStats, getAllPlayerStats, getPlayerMatches, getUnenrolledPlayers, getPlayersActivity } from "./server";
export const playerKeys = {
auth: ['auth'],
list: ['players', 'list'],
details: (id: string) => ['players', 'details', id],
unassociated: ['players','unassociated'],
unenrolled: (tournamentId: string) => ['players', 'unenrolled', tournamentId],
stats: (id: string, viewType?: 'all' | 'mainline' | 'regional') => ['players', 'stats', id, viewType ?? 'all'],
allStats: (viewType?: 'all' | 'mainline' | 'regional') => ['players', 'stats', 'all', viewType ?? 'all'],
matches: (id: string) => ['players', 'matches', id],
activity: ['players', 'activity'],
};
export const playerQueries = {
auth: () => ({
queryKey: playerKeys.auth,
queryFn: async () => await fetchMe()
}),
list: () => ({
queryKey: playerKeys.list,
queryFn: async () => await listPlayers()
}),
details: (id: string) => ({
queryKey: playerKeys.details(id),
queryFn: async () => await getPlayer({ data: id })
}),
unassociated: () => ({
queryKey: playerKeys.unassociated,
queryFn: async () => await getUnassociatedPlayers()
}),
unenrolled: (tournamentId: string) => ({
queryKey: playerKeys.unenrolled(tournamentId),
queryFn: async () => await getUnenrolledPlayers({ data: tournamentId })
}),
stats: (id: string, viewType?: 'all' | 'mainline' | 'regional') => ({
queryKey: playerKeys.stats(id, viewType),
queryFn: async () => await getPlayerStats({ data: { playerId: id, viewType } })
}),
allStats: (viewType?: 'all' | 'mainline' | 'regional') => ({
queryKey: playerKeys.allStats(viewType),
queryFn: async () => await getAllPlayerStats({ data: viewType })
}),
matches: (id: string) => ({
queryKey: playerKeys.matches(id),
queryFn: async () => await getPlayerMatches({ data: id })
}),
activity: () => ({
queryKey: playerKeys.activity,
queryFn: async () => await getPlayersActivity()
}),
};
export const useMe = () => {
const { queryKey, queryFn } = playerQueries.auth();
return useServerSuspenseQuery({
queryKey,
queryFn,
options: {
staleTime: 30 * 1000,
refetchOnMount: false,
refetchOnWindowFocus: true,
retry: 3,
},
});
};
export const usePlayer = (id: string) =>
useServerSuspenseQuery(playerQueries.details(id));
export const usePlayers = () =>
useServerSuspenseQuery(playerQueries.list());
export const useUnassociatedPlayers = () =>
useServerSuspenseQuery(playerQueries.unassociated());
export const usePlayerStats = (id: string, viewType?: 'all' | 'mainline' | 'regional') =>
useServerSuspenseQuery(playerQueries.stats(id, viewType));
export const useAllPlayerStats = (viewType?: 'all' | 'mainline' | 'regional') =>
useServerSuspenseQuery(playerQueries.allStats(viewType));
export const usePlayerMatches = (id: string) =>
useServerSuspenseQuery(playerQueries.matches(id));
export const useUnenrolledPlayers = (tournamentId: string) =>
useServerSuspenseQuery(playerQueries.unenrolled(tournamentId));
export const usePlayersActivity = () =>
useServerSuspenseQuery(playerQueries.activity());