1- import { LocalStorageData } from '@shared/types' ;
1+ import { Account , LocalStorageData } from '@shared/types' ;
22import { app , ipcMain } from 'electron' ;
33import path from 'path' ;
44import fs from 'fs' ;
@@ -7,12 +7,27 @@ import { log } from '@shared/utils/logger';
77import { difference , differenceBy , differenceWith } from 'lodash' ;
88
99const USER_DATA_PATH = path . join ( app . getPath ( "userData" ) , 'user_data.json' ) ;
10+ const AVAILABLE_USER_DATA_PATH = path . join ( app . getPath ( "userData" ) , 'available_user_data.json' ) ;
1011
1112class Store < T > {
1213
14+
1315 constructor ( ) {
14- if ( ! fs . existsSync ( USER_DATA_PATH ) ) {
15- fs . writeFileSync ( USER_DATA_PATH , JSON . stringify ( { } ) )
16+ if ( ! fs . existsSync ( USER_DATA_PATH ) || ! fs . existsSync ( AVAILABLE_USER_DATA_PATH ) ) {
17+ if ( ! fs . existsSync ( AVAILABLE_USER_DATA_PATH ) ) {
18+ if ( ! fs . existsSync ( USER_DATA_PATH ) ) {
19+ fs . writeFileSync ( AVAILABLE_USER_DATA_PATH , JSON . stringify ( { } ) )
20+ } else {
21+ const data = fs . readFileSync ( USER_DATA_PATH , 'utf-8' ) ;
22+ const retrivedStore : LocalStorageData = JSON . parse ( data ) ;
23+ if ( retrivedStore . auth ?. availableAccounts ) {
24+ fs . writeFileSync ( AVAILABLE_USER_DATA_PATH , JSON . stringify ( retrivedStore . auth ! . availableAccounts ) )
25+ } else {
26+ fs . writeFileSync ( AVAILABLE_USER_DATA_PATH , JSON . stringify ( { } ) )
27+ }
28+ }
29+ }
30+ ! fs . existsSync ( USER_DATA_PATH ) && fs . writeFileSync ( USER_DATA_PATH , JSON . stringify ( { } ) )
1631 } else {
1732 this . store = this . getFromDisk ( )
1833 }
@@ -24,31 +39,47 @@ class Store<T> {
2439 return this . store [ selector ]
2540 }
2641
27- set ( selector : keyof T , value : any ) {
42+ set ( selector : keyof T , value : any , force : boolean = false ) {
2843 const o = Object . assign ( { } , this . store )
2944 o [ selector ] = value
3045 const diff = difference ( Object . values ( o ) , Object . values ( this . store as any ) )
31- if ( diff . length > 0 ) {
46+ log ( { diff } )
47+ if ( diff . length > 0 || force ) {
3248 this . store = o
3349 ipcMain . emit ( IPC_EVENTS . UPDATE_SHARED_STATE , undefined , this . store , 'main' , selector )
3450 }
3551 }
3652
3753 updateStore ( newState : T , from : string ) {
38- const diff = difference ( Object . values ( newState as any ) , Object . values ( this . store as any ) )
39- if ( diff . length > 0 ) {
54+ const diff = difference ( Object . values ( newState as any || { } ) , Object . values ( this . store as any || { } ) )
55+ if ( diff . length > 0 || this . store === undefined ) {
4056 this . store = Object . assign ( { } , newState )
4157 }
4258 }
4359
44- saveToDisk ( ) {
60+ saveToDisk ( forceSave : boolean = false ) {
61+ const availableUserData = ( this . store as LocalStorageData ) . auth ?. availableAccounts
4562 fs . writeFileSync ( USER_DATA_PATH , JSON . stringify ( this . store ) ) ;
63+ if ( Object . keys ( availableUserData || { } ) . length > 0 || forceSave ) {
64+ fs . writeFileSync ( AVAILABLE_USER_DATA_PATH , JSON . stringify ( availableUserData ) ) ;
65+ }
66+ }
67+
68+ getAvailableFromDisk ( ) : { [ accountUID : string ] : Account ; } {
69+ if ( fs . existsSync ( AVAILABLE_USER_DATA_PATH ) ) {
70+ const availableUserData = fs . readFileSync ( AVAILABLE_USER_DATA_PATH , 'utf-8' ) ;
71+ return JSON . parse ( availableUserData )
72+ }
73+ return { }
4674 }
4775
4876 getFromDisk ( ) {
4977 try {
5078 const data = fs . readFileSync ( USER_DATA_PATH , 'utf-8' ) ;
51- return JSON . parse ( data ) ;
79+ const availableUserData = fs . readFileSync ( AVAILABLE_USER_DATA_PATH , 'utf-8' ) ;
80+ const retrivedStore = JSON . parse ( data ) ;
81+ ( retrivedStore as LocalStorageData ) . auth ! . availableAccounts = JSON . parse ( availableUserData )
82+ return retrivedStore
5283 } catch ( error ) {
5384 log ( 'Error retrieving user data' , error ) ;
5485 // you may want to propagate the error, up to you
@@ -58,21 +89,6 @@ class Store<T> {
5889}
5990
6091export const store : Store < LocalStorageData > = new Store < LocalStorageData > ( )
61- export function useStoreState < T > ( selector : keyof LocalStorageData ) : [ T | undefined , ( arg0 : T | ( ( ex : T ) => T | undefined ) | undefined ) => void ] {
62-
63- const setter = ( arg0 : ( T | undefined ) | ( ( ex : T ) => T | undefined ) ) => {
64- let v : T | undefined = arg0 as ( T | undefined )
65- if ( typeof arg0 === 'function' ) {
66- v = ( arg0 as ( ex : T | undefined ) => T | undefined ) ( store . store [ selector ] as T | undefined )
67- }
68- store . set ( selector , v )
69- }
70-
71- return [
72- store . get ( selector ) as T | undefined ,
73- setter
74- ]
75- }
7692
7793
7894
0 commit comments