@@ -20,6 +20,7 @@ import { parseAddress, letterToColIndex } from './lib/addressing';
2020import { invoke } from '@tauri-apps/api/core' ;
2121import { scanWorkbookForSuggestions , type SchemaSuggestion , type RemapFieldSuggestion } from './lib/suggestions' ;
2222import { getSheetData , type CellValue , type Workbook } from './lib/excel' ;
23+ import { saveVersionFile , loadVersionFile } from './lib/storage' ;
2324
2425type Mode = 'select' | 'discriminator' ;
2526type 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 }
0 commit comments