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 +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +38 -13
- package/dist/index.mjs +35 -12
- package/package.json +1 -1
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
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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
|
};
|