rita-workspace 0.5.17 → 0.5.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -50,11 +50,16 @@ interface RitaWorkspaceDB extends DBSchema {
50
50
  };
51
51
  }
52
52
  declare function getDB(): Promise<IDBPDatabase<RitaWorkspaceDB>>;
53
+ /** Pre-warm the DB connection so it's ready when first query runs */
54
+ declare function warmDB(): void;
53
55
  declare function closeDB(): Promise<void>;
54
56
 
55
57
  declare function createDrawing(name?: string, elements?: unknown[], appState?: Record<string, unknown>, folderId?: string | null): Promise<Drawing>;
56
58
  declare function getDrawing(id: string): Promise<Drawing | undefined>;
57
59
  declare function getAllDrawings(): Promise<Drawing[]>;
60
+ /** Lightweight metadata-only fetch — skips elements/appState/files for fast listing */
61
+ type DrawingMeta = Pick<Drawing, 'id' | 'name' | 'folderId' | 'createdAt' | 'updatedAt'>;
62
+ declare function getAllDrawingsMeta(): Promise<DrawingMeta[]>;
58
63
  declare function updateDrawing(id: string, updates: Partial<Omit<Drawing, 'id' | 'createdAt'>>): Promise<Drawing | undefined>;
59
64
  declare function deleteDrawing(id: string): Promise<boolean>;
60
65
  declare function duplicateDrawing(id: string, newName?: string): Promise<Drawing | undefined>;
@@ -168,6 +173,11 @@ interface WorkspaceProviderProps {
168
173
  */
169
174
  lang?: string;
170
175
  }
176
+ /**
177
+ * Check if another tab opened the same drawing BEFORE this tab.
178
+ * Only the tab that opened the drawing later is considered in conflict.
179
+ */
180
+ declare function isDrawingOpenedEarlierInOtherTab(drawingId: string): boolean;
171
181
  declare function WorkspaceProvider({ children, lang }: WorkspaceProviderProps): react_jsx_runtime.JSX.Element;
172
182
 
173
183
  interface SidebarProps {
@@ -377,4 +387,4 @@ interface WorkspacePluginProps {
377
387
  */
378
388
  declare function WorkspacePlugin(props: WorkspacePluginProps): react_jsx_runtime.JSX.Element;
379
389
 
380
- export { type Drawing, DrawingList, DrawingListItem, DrawingsDialog, type DrawingsDialogProps, type ExcalidrawImperativeAPI, type Folder, Sidebar, type SupportedLanguage, type Translations, type Workspace, WorkspaceBridge, type WorkspaceBridgeProps, type WorkspaceContextValue, WorkspaceMenuItems, type WorkspaceMenuItemsProps, WorkspacePlugin, WorkspaceProvider, addDrawingToWorkspace, closeDB, createDrawing, createFolder, deleteDrawing, deleteFolder, duplicateDrawing, getAllDrawings, getAllFolders, getDB, getDrawing, getFolder, getOrCreateDefaultWorkspace, getTranslations, getWorkspace, isLanguageSupported, moveDrawingToFolder, removeDrawingFromWorkspace, renameFolder, setActiveDrawing, updateDrawing, updateWorkspace, useExcalidrawBridge, useWorkspace, useWorkspaceLang };
390
+ export { type Drawing, DrawingList, DrawingListItem, type DrawingMeta, DrawingsDialog, type DrawingsDialogProps, type ExcalidrawImperativeAPI, type Folder, Sidebar, type SupportedLanguage, type Translations, type Workspace, WorkspaceBridge, type WorkspaceBridgeProps, type WorkspaceContextValue, WorkspaceMenuItems, type WorkspaceMenuItemsProps, WorkspacePlugin, WorkspaceProvider, addDrawingToWorkspace, closeDB, createDrawing, createFolder, deleteDrawing, deleteFolder, duplicateDrawing, getAllDrawings, getAllDrawingsMeta, getAllFolders, getDB, getDrawing, getFolder, getOrCreateDefaultWorkspace, getTranslations, getWorkspace, isDrawingOpenedEarlierInOtherTab, isLanguageSupported, moveDrawingToFolder, removeDrawingFromWorkspace, renameFolder, setActiveDrawing, updateDrawing, updateWorkspace, useExcalidrawBridge, useWorkspace, useWorkspaceLang, warmDB };
package/dist/index.d.ts CHANGED
@@ -50,11 +50,16 @@ interface RitaWorkspaceDB extends DBSchema {
50
50
  };
51
51
  }
52
52
  declare function getDB(): Promise<IDBPDatabase<RitaWorkspaceDB>>;
53
+ /** Pre-warm the DB connection so it's ready when first query runs */
54
+ declare function warmDB(): void;
53
55
  declare function closeDB(): Promise<void>;
54
56
 
55
57
  declare function createDrawing(name?: string, elements?: unknown[], appState?: Record<string, unknown>, folderId?: string | null): Promise<Drawing>;
56
58
  declare function getDrawing(id: string): Promise<Drawing | undefined>;
57
59
  declare function getAllDrawings(): Promise<Drawing[]>;
60
+ /** Lightweight metadata-only fetch — skips elements/appState/files for fast listing */
61
+ type DrawingMeta = Pick<Drawing, 'id' | 'name' | 'folderId' | 'createdAt' | 'updatedAt'>;
62
+ declare function getAllDrawingsMeta(): Promise<DrawingMeta[]>;
58
63
  declare function updateDrawing(id: string, updates: Partial<Omit<Drawing, 'id' | 'createdAt'>>): Promise<Drawing | undefined>;
59
64
  declare function deleteDrawing(id: string): Promise<boolean>;
60
65
  declare function duplicateDrawing(id: string, newName?: string): Promise<Drawing | undefined>;
@@ -168,6 +173,11 @@ interface WorkspaceProviderProps {
168
173
  */
169
174
  lang?: string;
170
175
  }
176
+ /**
177
+ * Check if another tab opened the same drawing BEFORE this tab.
178
+ * Only the tab that opened the drawing later is considered in conflict.
179
+ */
180
+ declare function isDrawingOpenedEarlierInOtherTab(drawingId: string): boolean;
171
181
  declare function WorkspaceProvider({ children, lang }: WorkspaceProviderProps): react_jsx_runtime.JSX.Element;
172
182
 
173
183
  interface SidebarProps {
@@ -377,4 +387,4 @@ interface WorkspacePluginProps {
377
387
  */
378
388
  declare function WorkspacePlugin(props: WorkspacePluginProps): react_jsx_runtime.JSX.Element;
379
389
 
380
- export { type Drawing, DrawingList, DrawingListItem, DrawingsDialog, type DrawingsDialogProps, type ExcalidrawImperativeAPI, type Folder, Sidebar, type SupportedLanguage, type Translations, type Workspace, WorkspaceBridge, type WorkspaceBridgeProps, type WorkspaceContextValue, WorkspaceMenuItems, type WorkspaceMenuItemsProps, WorkspacePlugin, WorkspaceProvider, addDrawingToWorkspace, closeDB, createDrawing, createFolder, deleteDrawing, deleteFolder, duplicateDrawing, getAllDrawings, getAllFolders, getDB, getDrawing, getFolder, getOrCreateDefaultWorkspace, getTranslations, getWorkspace, isLanguageSupported, moveDrawingToFolder, removeDrawingFromWorkspace, renameFolder, setActiveDrawing, updateDrawing, updateWorkspace, useExcalidrawBridge, useWorkspace, useWorkspaceLang };
390
+ export { type Drawing, DrawingList, DrawingListItem, type DrawingMeta, DrawingsDialog, type DrawingsDialogProps, type ExcalidrawImperativeAPI, type Folder, Sidebar, type SupportedLanguage, type Translations, type Workspace, WorkspaceBridge, type WorkspaceBridgeProps, type WorkspaceContextValue, WorkspaceMenuItems, type WorkspaceMenuItemsProps, WorkspacePlugin, WorkspaceProvider, addDrawingToWorkspace, closeDB, createDrawing, createFolder, deleteDrawing, deleteFolder, duplicateDrawing, getAllDrawings, getAllDrawingsMeta, getAllFolders, getDB, getDrawing, getFolder, getOrCreateDefaultWorkspace, getTranslations, getWorkspace, isDrawingOpenedEarlierInOtherTab, isLanguageSupported, moveDrawingToFolder, removeDrawingFromWorkspace, renameFolder, setActiveDrawing, updateDrawing, updateWorkspace, useExcalidrawBridge, useWorkspace, useWorkspaceLang, warmDB };
package/dist/index.js CHANGED
@@ -46,6 +46,7 @@ __export(index_exports, {
46
46
  deleteFolder: () => deleteFolder,
47
47
  duplicateDrawing: () => duplicateDrawing,
48
48
  getAllDrawings: () => getAllDrawings,
49
+ getAllDrawingsMeta: () => getAllDrawingsMeta,
49
50
  getAllFolders: () => getAllFolders,
50
51
  getDB: () => getDB,
51
52
  getDrawing: () => getDrawing,
@@ -53,6 +54,7 @@ __export(index_exports, {
53
54
  getOrCreateDefaultWorkspace: () => getOrCreateDefaultWorkspace,
54
55
  getTranslations: () => getTranslations,
55
56
  getWorkspace: () => getWorkspace,
57
+ isDrawingOpenedEarlierInOtherTab: () => isDrawingOpenedEarlierInOtherTab,
56
58
  isLanguageSupported: () => isLanguageSupported,
57
59
  moveDrawingToFolder: () => moveDrawingToFolder,
58
60
  removeDrawingFromWorkspace: () => removeDrawingFromWorkspace,
@@ -62,7 +64,8 @@ __export(index_exports, {
62
64
  updateWorkspace: () => updateWorkspace,
63
65
  useExcalidrawBridge: () => useExcalidrawBridge,
64
66
  useWorkspace: () => useWorkspace,
65
- useWorkspaceLang: () => useWorkspaceLang
67
+ useWorkspaceLang: () => useWorkspaceLang,
68
+ warmDB: () => warmDB
66
69
  });
67
70
  module.exports = __toCommonJS(index_exports);
68
71
 
@@ -71,9 +74,11 @@ var import_idb = require("idb");
71
74
  var DB_NAME = "rita-workspace";
72
75
  var DB_VERSION = 2;
73
76
  var dbInstance = null;
77
+ var dbPromise = null;
74
78
  async function getDB() {
75
79
  if (dbInstance) return dbInstance;
76
- dbInstance = await (0, import_idb.openDB)(DB_NAME, DB_VERSION, {
80
+ if (dbPromise) return dbPromise;
81
+ dbPromise = (0, import_idb.openDB)(DB_NAME, DB_VERSION, {
77
82
  upgrade(db, oldVersion) {
78
83
  if (!db.objectStoreNames.contains("workspaces")) {
79
84
  const workspaceStore = db.createObjectStore("workspaces", { keyPath: "id" });
@@ -89,8 +94,13 @@ async function getDB() {
89
94
  }
90
95
  }
91
96
  });
97
+ dbInstance = await dbPromise;
98
+ dbPromise = null;
92
99
  return dbInstance;
93
100
  }
101
+ function warmDB() {
102
+ if (!dbInstance && !dbPromise) getDB();
103
+ }
94
104
  async function closeDB() {
95
105
  if (dbInstance) {
96
106
  dbInstance.close();
@@ -124,6 +134,17 @@ async function getAllDrawings() {
124
134
  const db = await getDB();
125
135
  return db.getAllFromIndex("drawings", "by-updated");
126
136
  }
137
+ async function getAllDrawingsMeta() {
138
+ const db = await getDB();
139
+ const all = await db.getAllFromIndex("drawings", "by-updated");
140
+ return all.map(({ id, name, folderId, createdAt, updatedAt }) => ({
141
+ id,
142
+ name,
143
+ folderId,
144
+ createdAt,
145
+ updatedAt
146
+ }));
147
+ }
127
148
  async function updateDrawing(id, updates) {
128
149
  const db = await getDB();
129
150
  const existing = await db.get("drawings", id);
@@ -394,6 +415,7 @@ function isLanguageSupported(langCode) {
394
415
 
395
416
  // src/state/WorkspaceContext.tsx
396
417
  var import_jsx_runtime = require("react/jsx-runtime");
418
+ warmDB();
397
419
  var WorkspaceContext = (0, import_react.createContext)(null);
398
420
  function useWorkspace() {
399
421
  const context = (0, import_react.useContext)(WorkspaceContext);
@@ -643,21 +665,21 @@ function WorkspaceProvider({ children, lang = "en" }) {
643
665
  setIsLoading(true);
644
666
  const ws = await getOrCreateDefaultWorkspace();
645
667
  setWorkspace(ws);
646
- const allDrawings = await getAllDrawings();
668
+ const lastDrawingId = sessionStorage.getItem("rita-workspace-tab-drawing");
669
+ const activeDrawingPromise = lastDrawingId ? getDrawing(lastDrawingId) : Promise.resolve(void 0);
670
+ const [allDrawings, allFolders, eagarActive] = await Promise.all([
671
+ getAllDrawings(),
672
+ getAllFolders(),
673
+ activeDrawingPromise
674
+ ]);
647
675
  const wsDrawings = allDrawings.filter((d) => ws.drawingIds.includes(d.id));
648
676
  setDrawings(wsDrawings);
649
- const allFolders = await getAllFolders();
650
677
  setFolders(allFolders);
651
- const lastDrawingId = sessionStorage.getItem("rita-workspace-tab-drawing");
652
678
  let active = null;
653
- if (lastDrawingId) {
679
+ if (eagarActive && ws.drawingIds.includes(eagarActive.id)) {
680
+ active = eagarActive;
681
+ } else if (lastDrawingId) {
654
682
  active = wsDrawings.find((d) => d.id === lastDrawingId) || null;
655
- if (!active) {
656
- const fromDb = await getDrawing(lastDrawingId);
657
- if (fromDb && ws.drawingIds.includes(fromDb.id)) {
658
- active = fromDb;
659
- }
660
- }
661
683
  }
662
684
  if (!active && wsDrawings.length > 0) {
663
685
  active = wsDrawings[0];
@@ -2459,6 +2481,7 @@ function WorkspacePlugin(props) {
2459
2481
  deleteFolder,
2460
2482
  duplicateDrawing,
2461
2483
  getAllDrawings,
2484
+ getAllDrawingsMeta,
2462
2485
  getAllFolders,
2463
2486
  getDB,
2464
2487
  getDrawing,
@@ -2466,6 +2489,7 @@ function WorkspacePlugin(props) {
2466
2489
  getOrCreateDefaultWorkspace,
2467
2490
  getTranslations,
2468
2491
  getWorkspace,
2492
+ isDrawingOpenedEarlierInOtherTab,
2469
2493
  isLanguageSupported,
2470
2494
  moveDrawingToFolder,
2471
2495
  removeDrawingFromWorkspace,
@@ -2475,5 +2499,6 @@ function WorkspacePlugin(props) {
2475
2499
  updateWorkspace,
2476
2500
  useExcalidrawBridge,
2477
2501
  useWorkspace,
2478
- useWorkspaceLang
2502
+ useWorkspaceLang,
2503
+ warmDB
2479
2504
  });
package/dist/index.mjs CHANGED
@@ -3,9 +3,11 @@ import { openDB } from "idb";
3
3
  var DB_NAME = "rita-workspace";
4
4
  var DB_VERSION = 2;
5
5
  var dbInstance = null;
6
+ var dbPromise = null;
6
7
  async function getDB() {
7
8
  if (dbInstance) return dbInstance;
8
- dbInstance = await openDB(DB_NAME, DB_VERSION, {
9
+ if (dbPromise) return dbPromise;
10
+ dbPromise = openDB(DB_NAME, DB_VERSION, {
9
11
  upgrade(db, oldVersion) {
10
12
  if (!db.objectStoreNames.contains("workspaces")) {
11
13
  const workspaceStore = db.createObjectStore("workspaces", { keyPath: "id" });
@@ -21,8 +23,13 @@ async function getDB() {
21
23
  }
22
24
  }
23
25
  });
26
+ dbInstance = await dbPromise;
27
+ dbPromise = null;
24
28
  return dbInstance;
25
29
  }
30
+ function warmDB() {
31
+ if (!dbInstance && !dbPromise) getDB();
32
+ }
26
33
  async function closeDB() {
27
34
  if (dbInstance) {
28
35
  dbInstance.close();
@@ -56,6 +63,17 @@ async function getAllDrawings() {
56
63
  const db = await getDB();
57
64
  return db.getAllFromIndex("drawings", "by-updated");
58
65
  }
66
+ async function getAllDrawingsMeta() {
67
+ const db = await getDB();
68
+ const all = await db.getAllFromIndex("drawings", "by-updated");
69
+ return all.map(({ id, name, folderId, createdAt, updatedAt }) => ({
70
+ id,
71
+ name,
72
+ folderId,
73
+ createdAt,
74
+ updatedAt
75
+ }));
76
+ }
59
77
  async function updateDrawing(id, updates) {
60
78
  const db = await getDB();
61
79
  const existing = await db.get("drawings", id);
@@ -326,6 +344,7 @@ function isLanguageSupported(langCode) {
326
344
 
327
345
  // src/state/WorkspaceContext.tsx
328
346
  import { jsx } from "react/jsx-runtime";
347
+ warmDB();
329
348
  var WorkspaceContext = createContext(null);
330
349
  function useWorkspace() {
331
350
  const context = useContext(WorkspaceContext);
@@ -575,21 +594,21 @@ function WorkspaceProvider({ children, lang = "en" }) {
575
594
  setIsLoading(true);
576
595
  const ws = await getOrCreateDefaultWorkspace();
577
596
  setWorkspace(ws);
578
- const allDrawings = await getAllDrawings();
597
+ const lastDrawingId = sessionStorage.getItem("rita-workspace-tab-drawing");
598
+ const activeDrawingPromise = lastDrawingId ? getDrawing(lastDrawingId) : Promise.resolve(void 0);
599
+ const [allDrawings, allFolders, eagarActive] = await Promise.all([
600
+ getAllDrawings(),
601
+ getAllFolders(),
602
+ activeDrawingPromise
603
+ ]);
579
604
  const wsDrawings = allDrawings.filter((d) => ws.drawingIds.includes(d.id));
580
605
  setDrawings(wsDrawings);
581
- const allFolders = await getAllFolders();
582
606
  setFolders(allFolders);
583
- const lastDrawingId = sessionStorage.getItem("rita-workspace-tab-drawing");
584
607
  let active = null;
585
- if (lastDrawingId) {
608
+ if (eagarActive && ws.drawingIds.includes(eagarActive.id)) {
609
+ active = eagarActive;
610
+ } else if (lastDrawingId) {
586
611
  active = wsDrawings.find((d) => d.id === lastDrawingId) || null;
587
- if (!active) {
588
- const fromDb = await getDrawing(lastDrawingId);
589
- if (fromDb && ws.drawingIds.includes(fromDb.id)) {
590
- active = fromDb;
591
- }
592
- }
593
612
  }
594
613
  if (!active && wsDrawings.length > 0) {
595
614
  active = wsDrawings[0];
@@ -2390,6 +2409,7 @@ export {
2390
2409
  deleteFolder,
2391
2410
  duplicateDrawing,
2392
2411
  getAllDrawings,
2412
+ getAllDrawingsMeta,
2393
2413
  getAllFolders,
2394
2414
  getDB,
2395
2415
  getDrawing,
@@ -2397,6 +2417,7 @@ export {
2397
2417
  getOrCreateDefaultWorkspace,
2398
2418
  getTranslations,
2399
2419
  getWorkspace,
2420
+ isDrawingOpenedEarlierInOtherTab,
2400
2421
  isLanguageSupported,
2401
2422
  moveDrawingToFolder,
2402
2423
  removeDrawingFromWorkspace,
@@ -2406,5 +2427,6 @@ export {
2406
2427
  updateWorkspace,
2407
2428
  useExcalidrawBridge,
2408
2429
  useWorkspace,
2409
- useWorkspaceLang
2430
+ useWorkspaceLang,
2431
+ warmDB
2410
2432
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rita-workspace",
3
- "version": "0.5.17",
3
+ "version": "0.5.19",
4
4
  "description": "Multi-drawing workspace feature for Rita (Excalidraw fork)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",