2026-05-24 14:18:39 +08:00
|
|
|
import { create } from 'zustand'
|
2026-05-25 12:27:07 +08:00
|
|
|
import type { Asset, GenerateRequest, GenerateResponse } from '../api/types'
|
2026-05-24 14:18:39 +08:00
|
|
|
import { submitGenerate } from '../api/generate'
|
|
|
|
|
|
|
|
|
|
type Status = 'idle' | 'submitting' | 'running' | 'completed' | 'failed'
|
|
|
|
|
|
|
|
|
|
interface GenerationState {
|
|
|
|
|
taskId: string | null
|
2026-05-25 12:27:07 +08:00
|
|
|
projectId: string | null
|
2026-05-24 14:18:39 +08:00
|
|
|
progress: number
|
|
|
|
|
status: Status
|
|
|
|
|
assets: Asset[]
|
|
|
|
|
error: string | null
|
2026-05-25 12:27:07 +08:00
|
|
|
submit: (req: GenerateRequest) => Promise<void>
|
2026-05-24 14:18:39 +08:00
|
|
|
reset: () => void
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-25 12:27:07 +08:00
|
|
|
export const useGenerationStore = create<GenerationState>((set) => ({
|
2026-05-24 14:18:39 +08:00
|
|
|
taskId: null,
|
2026-05-25 12:27:07 +08:00
|
|
|
projectId: null,
|
2026-05-24 14:18:39 +08:00
|
|
|
progress: 0,
|
|
|
|
|
status: 'idle',
|
|
|
|
|
assets: [],
|
|
|
|
|
error: null,
|
|
|
|
|
|
2026-05-25 12:27:07 +08:00
|
|
|
submit: async (req) => {
|
2026-05-24 14:18:39 +08:00
|
|
|
set({ status: 'submitting', error: null })
|
|
|
|
|
try {
|
2026-05-25 12:27:07 +08:00
|
|
|
set({ status: 'running', progress: 30 })
|
|
|
|
|
const result = await submitGenerate(req)
|
2026-05-24 14:18:39 +08:00
|
|
|
|
2026-05-25 12:27:07 +08:00
|
|
|
set({ progress: 80 })
|
|
|
|
|
const assets = mapAssets(result)
|
2026-05-24 14:18:39 +08:00
|
|
|
|
2026-05-25 12:27:07 +08:00
|
|
|
set({
|
|
|
|
|
taskId: result.taskId,
|
|
|
|
|
projectId: req.projectId,
|
|
|
|
|
status: 'completed',
|
|
|
|
|
progress: 100,
|
|
|
|
|
assets,
|
|
|
|
|
})
|
|
|
|
|
} catch (err) {
|
|
|
|
|
const errMsg = (err as Error).message
|
|
|
|
|
set({ status: 'failed', error: errMsg })
|
2026-05-24 14:18:39 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
reset: () => {
|
|
|
|
|
set({
|
|
|
|
|
taskId: null,
|
2026-05-25 12:27:07 +08:00
|
|
|
projectId: null,
|
2026-05-24 14:18:39 +08:00
|
|
|
progress: 0,
|
|
|
|
|
status: 'idle',
|
|
|
|
|
assets: [],
|
|
|
|
|
error: null,
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
}))
|
2026-05-25 12:27:07 +08:00
|
|
|
|
|
|
|
|
function mapAssets(resp: GenerateResponse): Asset[] {
|
|
|
|
|
return resp.assets.map((a, i) => ({
|
|
|
|
|
id: `asset-${i}`,
|
|
|
|
|
url: a.url,
|
|
|
|
|
format: a.format,
|
|
|
|
|
width: resp.metadata.frameWidth,
|
|
|
|
|
height: resp.metadata.frameHeight,
|
|
|
|
|
metadata: {
|
|
|
|
|
frameWidth: resp.metadata.frameWidth,
|
|
|
|
|
frameHeight: resp.metadata.frameHeight,
|
|
|
|
|
frameCount: resp.metadata.frameCount,
|
|
|
|
|
directions: resp.metadata.directions,
|
|
|
|
|
},
|
|
|
|
|
}))
|
|
|
|
|
}
|