| |
| |
| |
| |
| |
|
|
| import type { Scene, SceneContent } from '@/lib/types/stage'; |
| import type { StageStore, APIResult, CreateSceneParams } from './stage-api-types'; |
| import { generateId, validateSceneId, getScene, createDefaultContent } from './stage-api-defaults'; |
|
|
| |
| |
| |
| |
| |
| |
| export function createSceneAPI(store: StageStore) { |
| return { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| create(params: CreateSceneParams): APIResult<string> { |
| try { |
| const state = store.getState(); |
|
|
| if (!state.stage) { |
| return { |
| success: false, |
| error: 'No stage set - cannot create scene without a stage', |
| }; |
| } |
|
|
| const sceneId = generateId('scene'); |
|
|
| |
| const order = params.order ?? state.scenes.length; |
|
|
| |
| let content: SceneContent; |
| if (params.content) { |
| content = { |
| ...createDefaultContent(params.type), |
| ...params.content, |
| } as SceneContent; |
| } else { |
| content = createDefaultContent(params.type); |
| } |
|
|
| const newScene: Scene = { |
| id: sceneId, |
| stageId: state.stage.id, |
| type: params.type, |
| title: params.title, |
| order, |
| content, |
| actions: params.actions, |
| createdAt: Date.now(), |
| updatedAt: Date.now(), |
| }; |
|
|
| const newScenes = [...state.scenes, newScene].sort((a, b) => a.order - b.order); |
|
|
| store.setState({ scenes: newScenes }); |
|
|
| return { success: true, data: sceneId }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| delete(sceneId: string): APIResult<boolean> { |
| try { |
| const state = store.getState(); |
|
|
| if (!validateSceneId(state.scenes, sceneId)) { |
| return { success: false, error: `Scene not found: ${sceneId}` }; |
| } |
|
|
| const newScenes = state.scenes.filter((s) => s.id !== sceneId); |
|
|
| |
| let newCurrentSceneId = state.currentSceneId; |
| if (state.currentSceneId === sceneId) { |
| newCurrentSceneId = newScenes.length > 0 ? newScenes[0].id : null; |
| } |
|
|
| store.setState({ |
| scenes: newScenes, |
| currentSceneId: newCurrentSceneId, |
| }); |
|
|
| return { success: true, data: true }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| |
| update(sceneId: string, updates: Partial<Scene>): APIResult<boolean> { |
| try { |
| const state = store.getState(); |
|
|
| if (!validateSceneId(state.scenes, sceneId)) { |
| return { success: false, error: `Scene not found: ${sceneId}` }; |
| } |
|
|
| const newScenes = state.scenes.map((scene) => |
| scene.id === sceneId ? { ...scene, ...updates, updatedAt: Date.now() } : scene, |
| ); |
|
|
| store.setState({ scenes: newScenes }); |
|
|
| return { success: true, data: true }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| list(): APIResult<Scene[]> { |
| try { |
| const state = store.getState(); |
| return { success: true, data: [...state.scenes] }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| get(sceneId: string): APIResult<Scene> { |
| try { |
| const state = store.getState(); |
| const scene = getScene(state.scenes, sceneId); |
|
|
| if (!scene) { |
| return { success: false, error: `Scene not found: ${sceneId}` }; |
| } |
|
|
| return { success: true, data: scene }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
| }; |
| } |
|
|