Skip to content

Commit 1569a45

Browse files
committed
feat: keep files loaded
1 parent 4963a6d commit 1569a45

3 files changed

Lines changed: 72 additions & 2 deletions

File tree

editor/src/App.tsx

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { parseAddress, letterToColIndex } from './lib/addressing';
2020
import { invoke } from '@tauri-apps/api/core';
2121
import { scanWorkbookForSuggestions, type SchemaSuggestion, type RemapFieldSuggestion } from './lib/suggestions';
2222
import { getSheetData, type CellValue, type Workbook } from './lib/excel';
23+
import { saveVersionFile, loadVersionFile } from './lib/storage';
2324

2425
type Mode = 'select' | 'discriminator';
2526
type AppTab = 'editor' | 'extract';
@@ -187,6 +188,7 @@ export default function App() {
187188
const [activeSuggestionId, setActiveSuggestionId] = useState<string | null>(null);
188189
const [pendingSuggestionId, setPendingSuggestionId] = useState<string | null>(null);
189190
const [renamingField, setRenamingField] = useState<StencilField | null>(null);
191+
const currentFileBuffer = useRef<ArrayBuffer | null>(null);
190192

191193
const [pendingVersionAdd, setPendingVersionAdd] = useState<{
192194
discriminatorValue: string;
@@ -292,15 +294,58 @@ export default function App() {
292294
}
293295
}, [pendingVersionAdd, spreadsheet.workbook, schema, injectRemapSuggestions]);
294296

297+
const handleSwitchVersion = useCallback(
298+
(index: number) => {
299+
// Save current file for current version before switching
300+
const currentDiscValue = schema.activeVersion?.discriminatorValue;
301+
if (currentDiscValue && currentFileBuffer.current) {
302+
saveVersionFile(currentDiscValue, currentFileBuffer.current).catch(() => { /* ignore */ });
303+
}
304+
305+
schema.setActiveVersionIndex(index);
306+
307+
// Clear UI state
308+
setSuggestions([]);
309+
setActiveSuggestionId(null);
310+
setSuggestionPreview(null);
311+
setDialogSelection(null);
312+
setShowFieldDialog(false);
313+
setEditingField(null);
314+
setResizeFieldName(null);
315+
setMoveFieldName(null);
316+
spreadsheet.clearSelection();
317+
318+
// Load the file associated with the new version
319+
const newVersion = schema.schema.versions[index];
320+
if (newVersion?.discriminatorValue) {
321+
loadVersionFile(newVersion.discriminatorValue)
322+
.then((buffer) => {
323+
if (buffer) {
324+
spreadsheet.loadFromBuffer(buffer);
325+
currentFileBuffer.current = buffer;
326+
}
327+
})
328+
.catch(() => { /* ignore */ });
329+
}
330+
},
331+
[schema, spreadsheet],
332+
);
333+
295334
const handleFileLoaded = useCallback(
296335
(buffer: ArrayBuffer) => {
297336
spreadsheet.loadFile(buffer);
337+
currentFileBuffer.current = buffer;
298338
setSuggestions([]);
299339
setActiveSuggestionId(null);
300340
setSuggestionPreview(null);
301341
setDialogSelection(null);
342+
343+
const discValue = schema.activeVersion?.discriminatorValue;
344+
if (discValue) {
345+
saveVersionFile(discValue, buffer).catch(() => { /* ignore */ });
346+
}
302347
},
303-
[spreadsheet],
348+
[spreadsheet, schema.activeVersion?.discriminatorValue],
304349
);
305350

306351
const handleSelectionEnd = useCallback(() => {
@@ -1020,7 +1065,7 @@ export default function App() {
10201065
<VersionManager
10211066
versions={schema.schema.versions}
10221067
activeIndex={schema.activeVersionIndex}
1023-
onSwitchVersion={schema.setActiveVersionIndex}
1068+
onSwitchVersion={handleSwitchVersion}
10241069
onAddVersion={handleAddVersion}
10251070
onRemoveVersion={schema.removeVersion}
10261071
onUpdateDiscriminatorValue={schema.setVersionDiscriminatorValue}

editor/src/hooks/useSpreadsheet.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ export function useSpreadsheet() {
121121
selection: state.selection,
122122
isSelecting: state.isSelecting,
123123
loadFile,
124+
loadFromBuffer,
124125
reset,
125126
switchSheet,
126127
startSelection,

editor/src/lib/storage.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,27 @@ export async function loadFile(): Promise<ArrayBuffer | null> {
3232
request.onerror = () => reject(request.error);
3333
});
3434
}
35+
36+
function versionFileKey(discriminatorValue: string): string {
37+
return `version-file:${discriminatorValue}`;
38+
}
39+
40+
export async function saveVersionFile(discriminatorValue: string, buffer: ArrayBuffer): Promise<void> {
41+
const db = await openDB();
42+
return new Promise((resolve, reject) => {
43+
const tx = db.transaction(STORE_NAME, 'readwrite');
44+
tx.objectStore(STORE_NAME).put(buffer, versionFileKey(discriminatorValue));
45+
tx.oncomplete = () => resolve();
46+
tx.onerror = () => reject(tx.error);
47+
});
48+
}
49+
50+
export async function loadVersionFile(discriminatorValue: string): Promise<ArrayBuffer | null> {
51+
const db = await openDB();
52+
return new Promise((resolve, reject) => {
53+
const tx = db.transaction(STORE_NAME, 'readonly');
54+
const request = tx.objectStore(STORE_NAME).get(versionFileKey(discriminatorValue));
55+
request.onsuccess = () => resolve(request.result ?? null);
56+
request.onerror = () => reject(request.error);
57+
});
58+
}

0 commit comments

Comments
 (0)