mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-12 04:29:51 +08:00
- busyReason had no reader: the chat engine sets isBusy through the store's generic set, like every other flag. - The isSameDocument comment says the two "same document" rules disagree in both directions, so neither is a subset of the other. - The import boundary test bundles minified with one pako (the MCP core resolves its own copy) and caps the canvas core at 160 KB (134 KB now).
50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
import { create } from "zustand"
|
|
|
|
export interface SelectedCell {
|
|
id: string
|
|
label: string
|
|
isEdge: boolean
|
|
}
|
|
|
|
/** Rectangle relative to the draw.io iframe's top-left corner */
|
|
interface CanvasRect {
|
|
x: number
|
|
y: number
|
|
width: number
|
|
height: number
|
|
}
|
|
|
|
interface CanvasPage {
|
|
id: string
|
|
name: string
|
|
}
|
|
|
|
interface CanvasState {
|
|
/** The page can call the draw.io editor directly (same-origin iframe) */
|
|
hasEditor: boolean
|
|
pages: CanvasPage[]
|
|
currentPageId: string | null
|
|
selection: SelectedCell[]
|
|
selectionRect: CanvasRect | null
|
|
/** Freehand drawing is on */
|
|
isFreehand: boolean
|
|
/** One of draw.io's menus or dialogs is open over the canvas */
|
|
isDrawioPopupOpen: boolean
|
|
/** Something is changing the canvas (an answer streams in, a sync
|
|
* runs): version actions and "ask AI" wait */
|
|
isBusy: boolean
|
|
set: (partial: Partial<Omit<CanvasState, "set">>) => void
|
|
}
|
|
|
|
export const useCanvasStore = create<CanvasState>((set) => ({
|
|
hasEditor: false,
|
|
pages: [],
|
|
currentPageId: null,
|
|
selection: [],
|
|
selectionRect: null,
|
|
isFreehand: false,
|
|
isDrawioPopupOpen: false,
|
|
isBusy: false,
|
|
set: (partial) => set(partial),
|
|
}))
|