|
|
|
|
@@ -23,12 +23,7 @@ import type {
|
|
|
|
|
|
|
|
|
|
// --- Queries ---
|
|
|
|
|
|
|
|
|
|
export function usePokemonList(
|
|
|
|
|
search?: string,
|
|
|
|
|
limit = 50,
|
|
|
|
|
offset = 0,
|
|
|
|
|
type?: string
|
|
|
|
|
) {
|
|
|
|
|
export function usePokemonList(search?: string, limit = 50, offset = 0, type?: string) {
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: ['pokemon', { search, limit, offset, type }],
|
|
|
|
|
queryFn: () => adminApi.listPokemon(search, limit, offset, type),
|
|
|
|
|
@@ -92,13 +87,8 @@ export function useCreateRoute(gameId: number) {
|
|
|
|
|
export function useUpdateRoute(gameId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: ({
|
|
|
|
|
routeId,
|
|
|
|
|
data,
|
|
|
|
|
}: {
|
|
|
|
|
routeId: number
|
|
|
|
|
data: UpdateRouteInput
|
|
|
|
|
}) => adminApi.updateRoute(gameId, routeId, data),
|
|
|
|
|
mutationFn: ({ routeId, data }: { routeId: number; data: UpdateRouteInput }) =>
|
|
|
|
|
adminApi.updateRoute(gameId, routeId, data),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId] })
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'routes'] })
|
|
|
|
|
@@ -124,8 +114,7 @@ export function useDeleteRoute(gameId: number) {
|
|
|
|
|
export function useReorderRoutes(gameId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (routes: RouteReorderItem[]) =>
|
|
|
|
|
adminApi.reorderRoutes(gameId, routes),
|
|
|
|
|
mutationFn: (routes: RouteReorderItem[]) => adminApi.reorderRoutes(gameId, routes),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId] })
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'routes'] })
|
|
|
|
|
@@ -188,9 +177,7 @@ export function useBulkImportPokemon() {
|
|
|
|
|
) => adminApi.bulkImportPokemon(items),
|
|
|
|
|
onSuccess: (result) => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['pokemon'] })
|
|
|
|
|
toast.success(
|
|
|
|
|
`Import complete: ${result.created} created, ${result.updated} updated`
|
|
|
|
|
)
|
|
|
|
|
toast.success(`Import complete: ${result.created} created, ${result.updated} updated`)
|
|
|
|
|
},
|
|
|
|
|
onError: (err) => toast.error(`Import failed: ${err.message}`),
|
|
|
|
|
})
|
|
|
|
|
@@ -202,9 +189,7 @@ export function useBulkImportEvolutions() {
|
|
|
|
|
mutationFn: (items: unknown[]) => adminApi.bulkImportEvolutions(items),
|
|
|
|
|
onSuccess: (result) => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['evolutions'] })
|
|
|
|
|
toast.success(
|
|
|
|
|
`Import complete: ${result.created} created, ${result.updated} updated`
|
|
|
|
|
)
|
|
|
|
|
toast.success(`Import complete: ${result.created} created, ${result.updated} updated`)
|
|
|
|
|
},
|
|
|
|
|
onError: (err) => toast.error(`Import failed: ${err.message}`),
|
|
|
|
|
})
|
|
|
|
|
@@ -217,9 +202,7 @@ export function useBulkImportRoutes(gameId: number) {
|
|
|
|
|
onSuccess: (result) => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId] })
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'routes'] })
|
|
|
|
|
toast.success(
|
|
|
|
|
`Import complete: ${result.created} routes, ${result.updated} encounters`
|
|
|
|
|
)
|
|
|
|
|
toast.success(`Import complete: ${result.created} routes, ${result.updated} encounters`)
|
|
|
|
|
},
|
|
|
|
|
onError: (err) => toast.error(`Import failed: ${err.message}`),
|
|
|
|
|
})
|
|
|
|
|
@@ -239,12 +222,7 @@ export function useBulkImportBosses(gameId: number) {
|
|
|
|
|
|
|
|
|
|
// --- Evolution Queries & Mutations ---
|
|
|
|
|
|
|
|
|
|
export function useEvolutionList(
|
|
|
|
|
search?: string,
|
|
|
|
|
limit = 50,
|
|
|
|
|
offset = 0,
|
|
|
|
|
trigger?: string
|
|
|
|
|
) {
|
|
|
|
|
export function useEvolutionList(search?: string, limit = 50, offset = 0, trigger?: string) {
|
|
|
|
|
return useQuery({
|
|
|
|
|
queryKey: ['evolutions', { search, limit, offset, trigger }],
|
|
|
|
|
queryFn: () => adminApi.listEvolutions(search, limit, offset, trigger),
|
|
|
|
|
@@ -293,8 +271,7 @@ export function useDeleteEvolution() {
|
|
|
|
|
export function useAddRouteEncounter(routeId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (data: CreateRouteEncounterInput) =>
|
|
|
|
|
adminApi.addRouteEncounter(routeId, data),
|
|
|
|
|
mutationFn: (data: CreateRouteEncounterInput) => adminApi.addRouteEncounter(routeId, data),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['routes', routeId, 'pokemon'] })
|
|
|
|
|
toast.success('Encounter added')
|
|
|
|
|
@@ -306,13 +283,8 @@ export function useAddRouteEncounter(routeId: number) {
|
|
|
|
|
export function useUpdateRouteEncounter(routeId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: ({
|
|
|
|
|
encounterId,
|
|
|
|
|
data,
|
|
|
|
|
}: {
|
|
|
|
|
encounterId: number
|
|
|
|
|
data: UpdateRouteEncounterInput
|
|
|
|
|
}) => adminApi.updateRouteEncounter(routeId, encounterId, data),
|
|
|
|
|
mutationFn: ({ encounterId, data }: { encounterId: number; data: UpdateRouteEncounterInput }) =>
|
|
|
|
|
adminApi.updateRouteEncounter(routeId, encounterId, data),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['routes', routeId, 'pokemon'] })
|
|
|
|
|
toast.success('Encounter updated')
|
|
|
|
|
@@ -324,8 +296,7 @@ export function useUpdateRouteEncounter(routeId: number) {
|
|
|
|
|
export function useRemoveRouteEncounter(routeId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (encounterId: number) =>
|
|
|
|
|
adminApi.removeRouteEncounter(routeId, encounterId),
|
|
|
|
|
mutationFn: (encounterId: number) => adminApi.removeRouteEncounter(routeId, encounterId),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['routes', routeId, 'pokemon'] })
|
|
|
|
|
toast.success('Encounter removed')
|
|
|
|
|
@@ -339,41 +310,32 @@ export function useRemoveRouteEncounter(routeId: number) {
|
|
|
|
|
export function useCreateBossBattle(gameId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (data: CreateBossBattleInput) =>
|
|
|
|
|
adminApi.createBossBattle(gameId, data),
|
|
|
|
|
mutationFn: (data: CreateBossBattleInput) => adminApi.createBossBattle(gameId, data),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'bosses'] })
|
|
|
|
|
toast.success('Boss battle created')
|
|
|
|
|
},
|
|
|
|
|
onError: (err) =>
|
|
|
|
|
toast.error(`Failed to create boss battle: ${err.message}`),
|
|
|
|
|
onError: (err) => toast.error(`Failed to create boss battle: ${err.message}`),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useUpdateBossBattle(gameId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: ({
|
|
|
|
|
bossId,
|
|
|
|
|
data,
|
|
|
|
|
}: {
|
|
|
|
|
bossId: number
|
|
|
|
|
data: UpdateBossBattleInput
|
|
|
|
|
}) => adminApi.updateBossBattle(gameId, bossId, data),
|
|
|
|
|
mutationFn: ({ bossId, data }: { bossId: number; data: UpdateBossBattleInput }) =>
|
|
|
|
|
adminApi.updateBossBattle(gameId, bossId, data),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'bosses'] })
|
|
|
|
|
toast.success('Boss battle updated')
|
|
|
|
|
},
|
|
|
|
|
onError: (err) =>
|
|
|
|
|
toast.error(`Failed to update boss battle: ${err.message}`),
|
|
|
|
|
onError: (err) => toast.error(`Failed to update boss battle: ${err.message}`),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useReorderBosses(gameId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (bosses: BossReorderItem[]) =>
|
|
|
|
|
adminApi.reorderBosses(gameId, bosses),
|
|
|
|
|
mutationFn: (bosses: BossReorderItem[]) => adminApi.reorderBosses(gameId, bosses),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'bosses'] })
|
|
|
|
|
toast.success('Bosses reordered')
|
|
|
|
|
@@ -390,16 +352,14 @@ export function useDeleteBossBattle(gameId: number) {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'bosses'] })
|
|
|
|
|
toast.success('Boss battle deleted')
|
|
|
|
|
},
|
|
|
|
|
onError: (err) =>
|
|
|
|
|
toast.error(`Failed to delete boss battle: ${err.message}`),
|
|
|
|
|
onError: (err) => toast.error(`Failed to delete boss battle: ${err.message}`),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function useSetBossTeam(gameId: number, bossId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (team: BossPokemonInput[]) =>
|
|
|
|
|
adminApi.setBossTeam(gameId, bossId, team),
|
|
|
|
|
mutationFn: (team: BossPokemonInput[]) => adminApi.setBossTeam(gameId, bossId, team),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['games', gameId, 'bosses'] })
|
|
|
|
|
toast.success('Boss team updated')
|
|
|
|
|
@@ -438,8 +398,7 @@ export function useDeleteGenlocke() {
|
|
|
|
|
export function useAddGenlockeLeg(genlockeId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (data: AddGenlockeLegInput) =>
|
|
|
|
|
adminApi.addGenlockeLeg(genlockeId, data),
|
|
|
|
|
mutationFn: (data: AddGenlockeLegInput) => adminApi.addGenlockeLeg(genlockeId, data),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['genlockes'] })
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['genlockes', genlockeId] })
|
|
|
|
|
@@ -452,8 +411,7 @@ export function useAddGenlockeLeg(genlockeId: number) {
|
|
|
|
|
export function useDeleteGenlockeLeg(genlockeId: number) {
|
|
|
|
|
const qc = useQueryClient()
|
|
|
|
|
return useMutation({
|
|
|
|
|
mutationFn: (legId: number) =>
|
|
|
|
|
adminApi.deleteGenlockeLeg(genlockeId, legId),
|
|
|
|
|
mutationFn: (legId: number) => adminApi.deleteGenlockeLeg(genlockeId, legId),
|
|
|
|
|
onSuccess: () => {
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['genlockes'] })
|
|
|
|
|
qc.invalidateQueries({ queryKey: ['genlockes', genlockeId] })
|
|
|
|
|
|