@ -3,7 +3,17 @@
* Stores : auto - save , user . name , user . email , theme , messagingPreferences
* Stores : auto - save , user . name , user . email , theme , messagingPreferences
* /
* /
import logger from './logger.js' ;
// Lazy import logger to avoid initialization order issues
import type { Logger } from '../types/logger.js' ;
let loggerCache : Logger | null = null ;
const getLogger = async ( ) : Promise < Logger > = > {
if ( ! loggerCache ) {
const loggerModule = await import ( './logger.js' ) ;
loggerCache = loggerModule . default ;
}
return loggerCache ;
} ;
const DB_NAME = 'gitrepublic_settings' ;
const DB_NAME = 'gitrepublic_settings' ;
const DB_VERSION = 1 ;
const DB_VERSION = 1 ;
@ -47,32 +57,36 @@ export class SettingsStore {
}
}
if ( typeof window === 'undefined' || ! window . indexedDB ) {
if ( typeof window === 'undefined' || ! window . indexedDB ) {
const logger = await getLogger ( ) ;
logger . debug ( 'IndexedDB not available, using in-memory cache only' ) ;
logger . debug ( 'IndexedDB not available, using in-memory cache only' ) ;
return ;
return ;
}
}
this . initPromise = new Promise ( ( resolve , reject ) = > {
this . initPromise = ( async ( ) = > {
const request = indexedDB . open ( DB_NAME , DB_VERSION ) ;
const logger = await getLogger ( ) ;
return new Promise < void > ( ( resolve , reject ) = > {
const request = indexedDB . open ( DB_NAME , DB_VERSION ) ;
request . onerror = ( ) = > {
request . onerror = ( ) = > {
logger . error ( 'Failed to open settings IndexedDB' ) ;
logger . error ( 'Failed to open settings IndexedDB' ) ;
reject ( new Error ( 'Failed to open settings IndexedDB' ) ) ;
reject ( new Error ( 'Failed to open settings IndexedDB' ) ) ;
} ;
} ;
request . onsuccess = ( ) = > {
request . onsuccess = ( ) = > {
this . db = request . result ;
this . db = request . result ;
resolve ( ) ;
resolve ( ) ;
} ;
} ;
request . onupgradeneeded = ( event ) = > {
request . onupgradeneeded = ( event ) = > {
const db = ( event . target as IDBOpenDBRequest ) . result ;
const db = ( event . target as IDBOpenDBRequest ) . result ;
// Settings store - stores all settings as a single object
// Settings store - stores all settings as a single object
if ( ! db . objectStoreNames . contains ( STORE_SETTINGS ) ) {
if ( ! db . objectStoreNames . contains ( STORE_SETTINGS ) ) {
db . createObjectStore ( STORE_SETTINGS , { keyPath : 'id' } ) ;
db . createObjectStore ( STORE_SETTINGS , { keyPath : 'id' } ) ;
}
}
} ;
} ;
} ) ;
} ) ;
} ) ( ) ;
return this . initPromise ;
return this . initPromise ;
}
}
@ -114,6 +128,7 @@ export class SettingsStore {
this . settingsCache = result ;
this . settingsCache = result ;
return result ;
return result ;
} catch ( error ) {
} catch ( error ) {
const logger = await getLogger ( ) ;
logger . error ( { error } , 'Error reading settings from IndexedDB' ) ;
logger . error ( { error } , 'Error reading settings from IndexedDB' ) ;
return { . . . DEFAULT_SETTINGS } ;
return { . . . DEFAULT_SETTINGS } ;
}
}
@ -125,6 +140,8 @@ export class SettingsStore {
async updateSettings ( updates : Partial < Settings > ) : Promise < void > {
async updateSettings ( updates : Partial < Settings > ) : Promise < void > {
await this . init ( ) ;
await this . init ( ) ;
const logger = await getLogger ( ) ;
if ( ! this . db ) {
if ( ! this . db ) {
logger . debug ( 'IndexedDB not available, cannot save settings' ) ;
logger . debug ( 'IndexedDB not available, cannot save settings' ) ;
return ;
return ;
@ -191,6 +208,7 @@ export class SettingsStore {
// Clear cache
// Clear cache
this . settingsCache = null ;
this . settingsCache = null ;
} catch ( error ) {
} catch ( error ) {
const logger = await getLogger ( ) ;
logger . error ( { error } , 'Error clearing settings' ) ;
logger . error ( { error } , 'Error clearing settings' ) ;
}
}
}
}