Files
waooplus/src/lib/query/mutations/asset-hub-update-mutations.ts

219 lines
6.4 KiB
TypeScript

import { useMutation, useQueryClient } from '@tanstack/react-query'
import { resolveTaskResponse } from '@/lib/task/client'
import {
requestJsonWithError,
requestTaskResponseWithError,
} from './mutation-shared'
import {
invalidateGlobalCharacters,
invalidateGlobalLocations,
} from './asset-hub-mutations-shared'
import type { LocationAvailableSlot } from '@/lib/location-available-slots'
export function useUpdateCharacterName() {
const queryClient = useQueryClient()
const invalidateCharacters = () => invalidateGlobalCharacters(queryClient)
return useMutation({
mutationFn: async ({ characterId, name }: { characterId: string; name: string }) => {
return await requestJsonWithError(`/api/assets/${characterId}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
scope: 'global',
kind: 'character',
name,
}),
}, 'Failed to update character name')
},
onSuccess: invalidateCharacters,
})
}
export function useUpdateLocationName() {
const queryClient = useQueryClient()
const invalidateLocations = () => invalidateGlobalLocations(queryClient)
return useMutation({
mutationFn: async ({ locationId, name }: { locationId: string; name: string }) => {
return await requestJsonWithError(`/api/assets/${locationId}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
scope: 'global',
kind: 'location',
name,
}),
}, 'Failed to update location name')
},
onSuccess: invalidateLocations,
})
}
export function useUpdateCharacterAppearanceDescription() {
const queryClient = useQueryClient()
const invalidateCharacters = () => invalidateGlobalCharacters(queryClient)
return useMutation({
mutationFn: async ({
characterId,
appearanceIndex,
description,
}: {
characterId: string
appearanceIndex: number
description: string
}) => {
const assetQuery = new URLSearchParams({
scope: 'global',
kind: 'character',
})
const assets = await requestJsonWithError<{ assets?: Array<{ id: string; variants?: Array<{ index: number; id: string }> }> }>(
`/api/assets?${assetQuery.toString()}`,
{ method: 'GET' },
'Failed to resolve appearance variant',
)
const asset = (assets.assets ?? []).find((item) => item.id === characterId)
const variantId = asset?.variants?.find((variant) => variant.index === appearanceIndex)?.id
if (!variantId) {
throw new Error('Failed to resolve appearance variant')
}
return await requestJsonWithError(`/api/assets/${characterId}/variants/${variantId}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
scope: 'global',
kind: 'character',
description,
}),
}, 'Failed to update appearance description')
},
onSuccess: invalidateCharacters,
})
}
export function useUpdateLocationSummary() {
const queryClient = useQueryClient()
const invalidateLocations = () => invalidateGlobalLocations(queryClient)
return useMutation({
mutationFn: async ({
locationId,
summary,
availableSlots,
}: {
locationId: string
summary: string
availableSlots?: LocationAvailableSlot[]
}) => {
return await requestJsonWithError(`/api/assets/${locationId}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
scope: 'global',
kind: 'location',
summary,
...(availableSlots ? { availableSlots } : {}),
}),
}, 'Failed to update location summary')
},
onSuccess: invalidateLocations,
})
}
export function useAiModifyCharacterDescription() {
return useMutation({
mutationFn: async ({
characterId,
appearanceIndex,
currentDescription,
modifyInstruction,
}: {
characterId: string
appearanceIndex: number
currentDescription: string
modifyInstruction: string
}) => {
const response = await requestTaskResponseWithError(
'/api/asset-hub/ai-modify-character',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
characterId,
appearanceIndex,
currentDescription,
modifyInstruction,
}),
},
'Failed to modify character description',
)
return resolveTaskResponse<{ modifiedDescription?: string; availableSlots?: LocationAvailableSlot[] }>(response)
},
})
}
export function useAiModifyLocationDescription() {
return useMutation({
mutationFn: async ({
locationId,
imageIndex,
currentDescription,
modifyInstruction,
}: {
locationId: string
imageIndex: number
currentDescription: string
modifyInstruction: string
}) => {
const response = await requestTaskResponseWithError(
'/api/asset-hub/ai-modify-location',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
locationId,
imageIndex,
currentDescription,
modifyInstruction,
}),
},
'Failed to modify location description',
)
return resolveTaskResponse<{ modifiedDescription?: string; availableSlots?: LocationAvailableSlot[] }>(response)
},
})
}
export function useAiModifyPropDescription() {
return useMutation({
mutationFn: async ({
propId,
variantId,
currentDescription,
modifyInstruction,
}: {
propId: string
variantId?: string
currentDescription: string
modifyInstruction: string
}) => {
const response = await requestTaskResponseWithError(
'/api/asset-hub/ai-modify-prop',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
propId,
variantId,
currentDescription,
modifyInstruction,
}),
},
'Failed to modify prop description',
)
return resolveTaskResponse<{ modifiedDescription?: string }>(response)
},
})
}