| |
| |
| |
| |
| |
| |
|
|
| import type { Whiteboard } from '@/lib/types/stage'; |
| import type { PPTElement } from '@/lib/types/slides'; |
| import type { StageStore, APIResult } from './stage-api-types'; |
| import { generateId } from './stage-api-defaults'; |
|
|
| |
| |
| |
| |
| |
| |
| export function createWhiteboardAPI(store: StageStore) { |
| const whiteboardAPI = { |
| |
| |
| |
| |
| |
| create(): APIResult<Whiteboard> { |
| try { |
| const state = store.getState(); |
| const whiteboard: Whiteboard = { |
| id: generateId('whiteboard'), |
| viewportSize: 1000, |
| viewportRatio: 16 / 9, |
| elements: [], |
| background: { |
| type: 'solid', |
| color: '#ffffff', |
| }, |
| animations: [], |
| }; |
| const whiteboardList = state.stage?.whiteboard |
| ? [...state.stage.whiteboard, whiteboard] |
| : [whiteboard]; |
| store.setState({ |
| stage: { ...state.stage, whiteboard: whiteboardList }, |
| }); |
| return { success: true, data: whiteboard }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| get(): APIResult<Whiteboard> { |
| try { |
| const state = store.getState(); |
| if (!state.stage?.whiteboard || state.stage.whiteboard.length === 0) { |
| return whiteboardAPI.create(); |
| } |
| return { success: true, data: state.stage.whiteboard.at(-1) }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| |
| update(updates: Partial<Whiteboard>, whiteboardId: string): APIResult<boolean> { |
| try { |
| const state = store.getState(); |
| const whiteboard = state.stage?.whiteboard?.find((wb) => wb.id === whiteboardId); |
| if (!whiteboard) return { success: false, error: 'Whiteboard not found' }; |
| const newWhiteboard = { ...whiteboard, ...updates }; |
| const whiteboardList = state.stage!.whiteboard!.map((wb) => |
| wb.id === whiteboardId ? newWhiteboard : wb, |
| ); |
| store.setState({ |
| stage: { ...state.stage, whiteboard: whiteboardList }, |
| }); |
| return { success: true, data: true }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| delete(whiteboardId: string): APIResult<boolean> { |
| try { |
| const state = store.getState(); |
| const whiteboardList = state.stage!.whiteboard!.filter((wb) => wb.id !== whiteboardId); |
| store.setState({ |
| stage: { ...state.stage, whiteboard: whiteboardList }, |
| }); |
| return { success: true, data: true }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| list(): APIResult<Whiteboard[]> { |
| try { |
| const state = store.getState(); |
| return { success: true, data: state.stage!.whiteboard! }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| |
| getElement(elementId: string, whiteboardId: string): APIResult<PPTElement> { |
| try { |
| const state = store.getState(); |
| const whiteboard = state.stage!.whiteboard!.find((wb) => wb.id === whiteboardId); |
| if (!whiteboard) return { success: false, error: 'Whiteboard not found' }; |
| return { |
| success: true, |
| data: whiteboard.elements.find((el) => el.id === elementId), |
| }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| |
| addElement(element: PPTElement, whiteboardId: string): APIResult<boolean> { |
| try { |
| const state = store.getState(); |
| const whiteboard = state.stage!.whiteboard!.find((wb) => wb.id === whiteboardId); |
| if (!whiteboard) return { success: false, error: 'Whiteboard not found' }; |
| const newElement = { |
| ...element, |
| id: element.id || generateId(element.type), |
| }; |
| const newWhiteboard = { |
| ...whiteboard, |
| elements: [...whiteboard.elements, newElement], |
| }; |
| const whiteboardList = state.stage!.whiteboard!.map((wb) => |
| wb.id === whiteboardId ? newWhiteboard : wb, |
| ); |
| store.setState({ |
| stage: { ...state.stage, whiteboard: whiteboardList }, |
| }); |
| return { success: true, data: true }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| |
| deleteElement(elementId: string, whiteboardId: string): APIResult<boolean> { |
| try { |
| const state = store.getState(); |
| const whiteboard = state.stage!.whiteboard!.find((wb) => wb.id === whiteboardId); |
| if (!whiteboard) return { success: false, error: 'Whiteboard not found' }; |
| const newWhiteboard = { |
| ...whiteboard, |
| elements: whiteboard.elements.filter((el) => el.id !== elementId), |
| }; |
| const whiteboardList = state.stage!.whiteboard!.map((wb) => |
| wb.id === whiteboardId ? newWhiteboard : wb, |
| ); |
| store.setState({ |
| stage: { ...state.stage, whiteboard: whiteboardList }, |
| }); |
| return { success: true, data: true }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| |
| updateElement(element: PPTElement, whiteboardId: string): APIResult<boolean> { |
| try { |
| const state = store.getState(); |
| const whiteboard = state.stage!.whiteboard!.find((wb) => wb.id === whiteboardId); |
| if (!whiteboard) return { success: false, error: 'Whiteboard not found' }; |
| const newWhiteboard = { |
| ...whiteboard, |
| elements: whiteboard.elements.map((el) => (el.id === element.id ? element : el)), |
| }; |
| const whiteboardList = state.stage!.whiteboard!.map((wb) => |
| wb.id === whiteboardId ? newWhiteboard : wb, |
| ); |
| store.setState({ |
| stage: { ...state.stage, whiteboard: whiteboardList }, |
| }); |
| return { success: true, data: true }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
|
|
| |
| |
| |
| |
| |
| |
| listElements(whiteboardId: string): APIResult<PPTElement[]> { |
| try { |
| const state = store.getState(); |
| const whiteboard = state.stage!.whiteboard!.find((wb) => wb.id === whiteboardId); |
| if (!whiteboard) return { success: false, error: 'Whiteboard not found' }; |
| return { success: true, data: whiteboard.elements }; |
| } catch (error) { |
| return { success: false, error: String(error) }; |
| } |
| }, |
| }; |
|
|
| return whiteboardAPI; |
| } |
|
|