Files
gen2d/frontend/src/stores/generation.ts
T

75 lines
1.7 KiB
TypeScript
Raw Normal View History

import { create } from 'zustand'
import type { Asset, GenerateRequest, GenerateResponse } from '../api/types'
import { submitGenerate } from '../api/generate'
type Status = 'idle' | 'submitting' | 'running' | 'completed' | 'failed'
interface GenerationState {
taskId: string | null
projectId: string | null
progress: number
status: Status
assets: Asset[]
error: string | null
submit: (req: GenerateRequest) => Promise<void>
reset: () => void
}
export const useGenerationStore = create<GenerationState>((set) => ({
taskId: null,
projectId: null,
progress: 0,
status: 'idle',
assets: [],
error: null,
submit: async (req) => {
set({ status: 'submitting', error: null })
try {
set({ status: 'running', progress: 30 })
const result = await submitGenerate(req)
set({ progress: 80 })
const assets = mapAssets(result)
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 })
}
},
reset: () => {
set({
taskId: null,
projectId: null,
progress: 0,
status: 'idle',
assets: [],
error: null,
})
},
}))
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,
},
}))
}