128 lines
3.8 KiB
TypeScript
128 lines
3.8 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 useAiDesignLocation() {
|
|
return useMutation({
|
|
mutationFn: async (userInstruction: string) => {
|
|
const response = await requestTaskResponseWithError(
|
|
'/api/asset-hub/ai-design-location',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ userInstruction }),
|
|
},
|
|
'Failed to design location',
|
|
)
|
|
return resolveTaskResponse<{ prompt?: string; availableSlots?: LocationAvailableSlot[] }>(response)
|
|
},
|
|
})
|
|
}
|
|
|
|
export function useCreateAssetHubLocation() {
|
|
const queryClient = useQueryClient()
|
|
const invalidateLocations = () => invalidateGlobalLocations(queryClient)
|
|
|
|
return useMutation({
|
|
mutationFn: async (payload: {
|
|
name: string
|
|
summary: string
|
|
folderId: string | null
|
|
artStyle: string
|
|
count?: number
|
|
availableSlots?: LocationAvailableSlot[]
|
|
}) => {
|
|
return await requestJsonWithError('/api/asset-hub/locations', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
}, '创建失败')
|
|
},
|
|
onSuccess: invalidateLocations,
|
|
})
|
|
}
|
|
|
|
export function useUploadAssetHubTempMedia() {
|
|
return useMutation({
|
|
mutationFn: async (payload: { imageBase64?: string; base64?: string; extension?: string; type?: string }) =>
|
|
await requestJsonWithError<{ success: boolean; url?: string; key?: string }>(
|
|
'/api/asset-hub/upload-temp',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
},
|
|
'上传失败',
|
|
),
|
|
})
|
|
}
|
|
|
|
export function useAiDesignCharacter() {
|
|
return useMutation({
|
|
mutationFn: async (userInstruction: string) => {
|
|
const response = await requestTaskResponseWithError(
|
|
'/api/asset-hub/ai-design-character',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ userInstruction }),
|
|
},
|
|
'Failed to design character',
|
|
)
|
|
return resolveTaskResponse<{ prompt?: string }>(response)
|
|
},
|
|
})
|
|
}
|
|
|
|
export function useExtractAssetHubReferenceCharacterDescription() {
|
|
return useMutation({
|
|
mutationFn: async (referenceImageUrls: string[]) => {
|
|
const response = await requestTaskResponseWithError(
|
|
'/api/asset-hub/reference-to-character',
|
|
{
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
referenceImageUrls,
|
|
extractOnly: true,
|
|
}),
|
|
},
|
|
'Failed to extract character description',
|
|
)
|
|
return resolveTaskResponse<{ description?: string }>(response)
|
|
},
|
|
})
|
|
}
|
|
|
|
export function useCreateAssetHubCharacter() {
|
|
const queryClient = useQueryClient()
|
|
const invalidateCharacters = () => invalidateGlobalCharacters(queryClient)
|
|
|
|
return useMutation({
|
|
mutationFn: async (payload: {
|
|
name: string
|
|
description: string
|
|
folderId?: string | null
|
|
artStyle: string
|
|
generateFromReference?: boolean
|
|
referenceImageUrls?: string[]
|
|
customDescription?: string
|
|
count?: number
|
|
}) =>
|
|
await requestJsonWithError('/api/asset-hub/characters', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload),
|
|
}, '创建角色失败'),
|
|
onSuccess: invalidateCharacters,
|
|
})
|
|
}
|