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 +11 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.js +38 -13
- package/dist/index.mjs +34 -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>;
|
|
@@ -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
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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];
|
|
@@ -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
|
};
|