rita-workspace 0.5.18 → 0.5.20

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>;
@@ -382,4 +387,4 @@ interface WorkspacePluginProps {
382
387
  */
383
388
  declare function WorkspacePlugin(props: WorkspacePluginProps): react_jsx_runtime.JSX.Element;
384
389
 
385
- 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, isDrawingOpenedEarlierInOtherTab, 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>;
@@ -382,4 +387,4 @@ interface WorkspacePluginProps {
382
387
  */
383
388
  declare function WorkspacePlugin(props: WorkspacePluginProps): react_jsx_runtime.JSX.Element;
384
389
 
385
- 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, isDrawingOpenedEarlierInOtherTab, 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,
@@ -63,7 +64,8 @@ __export(index_exports, {
63
64
  updateWorkspace: () => updateWorkspace,
64
65
  useExcalidrawBridge: () => useExcalidrawBridge,
65
66
  useWorkspace: () => useWorkspace,
66
- useWorkspaceLang: () => useWorkspaceLang
67
+ useWorkspaceLang: () => useWorkspaceLang,
68
+ warmDB: () => warmDB
67
69
  });
68
70
  module.exports = __toCommonJS(index_exports);
69
71
 
@@ -72,9 +74,11 @@ var import_idb = require("idb");
72
74
  var DB_NAME = "rita-workspace";
73
75
  var DB_VERSION = 2;
74
76
  var dbInstance = null;
77
+ var dbPromise = null;
75
78
  async function getDB() {
76
79
  if (dbInstance) return dbInstance;
77
- 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, {
78
82
  upgrade(db, oldVersion) {
79
83
  if (!db.objectStoreNames.contains("workspaces")) {
80
84
  const workspaceStore = db.createObjectStore("workspaces", { keyPath: "id" });
@@ -90,8 +94,13 @@ async function getDB() {
90
94
  }
91
95
  }
92
96
  });
97
+ dbInstance = await dbPromise;
98
+ dbPromise = null;
93
99
  return dbInstance;
94
100
  }
101
+ function warmDB() {
102
+ if (!dbInstance && !dbPromise) getDB();
103
+ }
95
104
  async function closeDB() {
96
105
  if (dbInstance) {
97
106
  dbInstance.close();
@@ -125,6 +134,17 @@ async function getAllDrawings() {
125
134
  const db = await getDB();
126
135
  return db.getAllFromIndex("drawings", "by-updated");
127
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
+ }
128
148
  async function updateDrawing(id, updates) {
129
149
  const db = await getDB();
130
150
  const existing = await db.get("drawings", id);
@@ -395,6 +415,7 @@ function isLanguageSupported(langCode) {
395
415
 
396
416
  // src/state/WorkspaceContext.tsx
397
417
  var import_jsx_runtime = require("react/jsx-runtime");
418
+ warmDB();
398
419
  var WorkspaceContext = (0, import_react.createContext)(null);
399
420
  function useWorkspace() {
400
421
  const context = (0, import_react.useContext)(WorkspaceContext);
@@ -644,21 +665,21 @@ function WorkspaceProvider({ children, lang = "en" }) {
644
665
  setIsLoading(true);
645
666
  const ws = await getOrCreateDefaultWorkspace();
646
667
  setWorkspace(ws);
647
- 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
+ ]);
648
675
  const wsDrawings = allDrawings.filter((d) => ws.drawingIds.includes(d.id));
649
676
  setDrawings(wsDrawings);
650
- const allFolders = await getAllFolders();
651
677
  setFolders(allFolders);
652
- const lastDrawingId = sessionStorage.getItem("rita-workspace-tab-drawing");
653
678
  let active = null;
654
- if (lastDrawingId) {
679
+ if (eagarActive && ws.drawingIds.includes(eagarActive.id)) {
680
+ active = eagarActive;
681
+ } else if (lastDrawingId) {
655
682
  active = wsDrawings.find((d) => d.id === lastDrawingId) || null;
656
- if (!active) {
657
- const fromDb = await getDrawing(lastDrawingId);
658
- if (fromDb && ws.drawingIds.includes(fromDb.id)) {
659
- active = fromDb;
660
- }
661
- }
662
683
  }
663
684
  if (!active && wsDrawings.length > 0) {
664
685
  active = wsDrawings[0];
@@ -813,6 +834,7 @@ function WorkspaceProvider({ children, lang = "en" }) {
813
834
  }, [workspace]);
814
835
  const saveCurrentDrawing = (0, import_react.useCallback)(async (elements, appState, files) => {
815
836
  if (!activeDrawing) return;
837
+ if (isDrawingOpenedEarlierInOtherTab(activeDrawing.id)) return;
816
838
  try {
817
839
  const updateData = {
818
840
  elements,
@@ -827,6 +849,7 @@ function WorkspaceProvider({ children, lang = "en" }) {
827
849
  }
828
850
  }, [activeDrawing]);
829
851
  const saveDrawingById = (0, import_react.useCallback)(async (id, elements, appState, files) => {
852
+ if (isDrawingOpenedEarlierInOtherTab(id)) return;
830
853
  try {
831
854
  const updateData = {
832
855
  elements,
@@ -2460,6 +2483,7 @@ function WorkspacePlugin(props) {
2460
2483
  deleteFolder,
2461
2484
  duplicateDrawing,
2462
2485
  getAllDrawings,
2486
+ getAllDrawingsMeta,
2463
2487
  getAllFolders,
2464
2488
  getDB,
2465
2489
  getDrawing,
@@ -2477,5 +2501,6 @@ function WorkspacePlugin(props) {
2477
2501
  updateWorkspace,
2478
2502
  useExcalidrawBridge,
2479
2503
  useWorkspace,
2480
- useWorkspaceLang
2504
+ useWorkspaceLang,
2505
+ warmDB
2481
2506
  });
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];
@@ -744,6 +763,7 @@ function WorkspaceProvider({ children, lang = "en" }) {
744
763
  }, [workspace]);
745
764
  const saveCurrentDrawing = useCallback(async (elements, appState, files) => {
746
765
  if (!activeDrawing) return;
766
+ if (isDrawingOpenedEarlierInOtherTab(activeDrawing.id)) return;
747
767
  try {
748
768
  const updateData = {
749
769
  elements,
@@ -758,6 +778,7 @@ function WorkspaceProvider({ children, lang = "en" }) {
758
778
  }
759
779
  }, [activeDrawing]);
760
780
  const saveDrawingById = useCallback(async (id, elements, appState, files) => {
781
+ if (isDrawingOpenedEarlierInOtherTab(id)) return;
761
782
  try {
762
783
  const updateData = {
763
784
  elements,
@@ -2390,6 +2411,7 @@ export {
2390
2411
  deleteFolder,
2391
2412
  duplicateDrawing,
2392
2413
  getAllDrawings,
2414
+ getAllDrawingsMeta,
2393
2415
  getAllFolders,
2394
2416
  getDB,
2395
2417
  getDrawing,
@@ -2407,5 +2429,6 @@ export {
2407
2429
  updateWorkspace,
2408
2430
  useExcalidrawBridge,
2409
2431
  useWorkspace,
2410
- useWorkspaceLang
2432
+ useWorkspaceLang,
2433
+ warmDB
2411
2434
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rita-workspace",
3
- "version": "0.5.18",
3
+ "version": "0.5.20",
4
4
  "description": "Multi-drawing workspace feature for Rita (Excalidraw fork)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",