1919 </AppFormItem >
2020 <AppFormItem label =" Migrate" >
2121 <AppButton @click =" onClickMigrate" >
22- Open folder
22+ From massCode v1.0
23+ </AppButton >
24+ <AppButton @click =" onClickMigrateFromSnippetsLab" >
25+ From SnippetsLab
2326 </AppButton >
2427 <template #desc >
25- To migrate from v1 select the folder containing the database files.
28+ To migrate from massCode v1.0 select the folder containing the
29+ database files.
30+ <p >To migrate from SnippetsLab select JSON file.</p >
31+ <p >
32+ Some Limitations. During migration from SnippetsLab, snippets with
33+ unsupported languages will be set to default Plain Text. Also since
34+ JSON file does not represent nesting for folders, all folders will
35+ be first level.
36+ </p >
2637 </template >
2738 </AppFormItem >
2839 <AppFormItem label =" Count" >
3647import { ipc , store , db , track } from ' @/electron'
3748import { useFolderStore } from ' @/store/folders'
3849import { useSnippetStore } from ' @/store/snippets'
39- import type { MessageBoxRequest } from ' @shared/types/main'
50+ import type { MessageBoxRequest , DialogRequest } from ' @shared/types/main'
4051import { ref } from ' vue'
4152
4253const snippetStore = useSnippetStore ()
@@ -95,12 +106,20 @@ const onClickMigrate = async () => {
95106
96107 try {
97108 const path = await ipc .invoke <any , string >(' main:open-dialog' , {})
109+
110+ if (! path ) return
111+
98112 await db .migrate (path )
113+
99114 ipc .invoke (' main:restart-api' , {})
115+
116+ resetStore ()
117+ await snippetStore .getSnippets ()
118+
100119 ipc .invoke (' main:notification' , {
101120 body: ' DB successfully migrated.'
102121 })
103- snippetStore . getSnippets ()
122+
104123 track (' app/migrate' )
105124 } catch (err ) {
106125 const e = err as Error
@@ -111,22 +130,64 @@ const onClickMigrate = async () => {
111130 }
112131}
113132
133+ const onClickMigrateFromSnippetsLab = async () => {
134+ const state = await ipc .invoke <MessageBoxRequest , boolean >(
135+ ' main:open-message-box' ,
136+ {
137+ message: ' Are you sure you want to migrate from SnippetsLab' ,
138+ detail: ' During migrate, the current library will be overwritten.' ,
139+ buttons: [' Confirm' , ' Cancel' ]
140+ }
141+ )
142+
143+ if (! state ) return
144+
145+ try {
146+ const path = await ipc .invoke <DialogRequest , string >(' main:open-dialog' , {
147+ properties: [' openFile' ]
148+ })
149+
150+ if (! path ) return
151+
152+ db .migrateFromSnippetsLab (path )
153+
154+ ipc .invoke (' main:restart-api' , {})
155+
156+ resetStore ()
157+ await snippetStore .getSnippets ()
158+
159+ ipc .invoke (' main:notification' , {
160+ body: ' DB successfully migrated.'
161+ })
162+
163+ track (' app/migrate' , ' from-snippets-lab' )
164+ } catch (err ) {
165+ const e = err as Error
166+ ipc .invoke (' main:notification' , {
167+ body: e .message
168+ })
169+ console .error (err )
170+ }
171+ }
172+
114173const setStorageAndRestartApi = (path : string , reset ? : boolean ) => {
115174 storagePath .value = path
116175 store .preferences .set (' storagePath' , path )
117176
118- if (reset ) {
119- store .app .delete (' selectedFolderAlias' )
120- store .app .delete (' selectedFolderId' )
121- store .app .delete (' selectedFolderIds' )
122- store .app .delete (' selectedSnippetId' )
123-
124- snippetStore .$reset ()
125- folderStore .$reset ()
126- }
177+ if (reset ) resetStore ()
127178
128179 ipc .invoke (' main:restart-api' , {})
129180}
181+
182+ const resetStore = () => {
183+ store .app .delete (' selectedFolderAlias' )
184+ store .app .delete (' selectedFolderId' )
185+ store .app .delete (' selectedFolderIds' )
186+ store .app .delete (' selectedSnippetId' )
187+
188+ snippetStore .$reset ()
189+ folderStore .$reset ()
190+ }
130191 </script >
131192
132193<style lang="scss" scoped></style >
0 commit comments