219 lines
6.4 KiB
TypeScript
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)
|
|
},
|
|
})
|
|
}
|