/** * IndexedDB storage for locale preference */ import { createIndexedDBHelper, type IndexedDBHelper } from './helpers/indexedDBHelper' const DB_NAME = 'nostr_paywall_settings' const DB_VERSION = 2 // Incremented to add locale store const STORE_NAME = 'locale' export type Locale = 'fr' | 'en' class LocaleStorageService { private readonly dbHelper: IndexedDBHelper constructor() { this.dbHelper = createIndexedDBHelper({ dbName: DB_NAME, version: DB_VERSION, storeName: STORE_NAME, keyPath: 'key', }) } /** * Get locale from IndexedDB */ async getLocale(): Promise { try { const result = await this.dbHelper.get<{ key: string; value: Locale }>('locale') const locale = result?.value if (locale === 'fr' || locale === 'en') { return locale } return null } catch (error) { console.error('Error retrieving locale from IndexedDB:', error) return null } } /** * Save locale to IndexedDB */ async saveLocale(locale: Locale): Promise { try { await this.dbHelper.put({ key: 'locale', value: locale }) } catch (error) { console.error('Error saving locale to IndexedDB:', error) throw error } } /** * Migrate locale from localStorage to IndexedDB if it exists */ async migrateFromLocalStorage(): Promise { if (typeof window === 'undefined') { return } try { const LOCALE_STORAGE_KEY = 'zapwall-locale' const storedLocale = window.localStorage.getItem(LOCALE_STORAGE_KEY) as Locale | null if (storedLocale && (storedLocale === 'fr' || storedLocale === 'en')) { // Check if already in IndexedDB const existingLocale = await this.getLocale() if (!existingLocale) { // Migrate from localStorage to IndexedDB await this.saveLocale(storedLocale) // Remove from localStorage after successful migration window.localStorage.removeItem(LOCALE_STORAGE_KEY) } } } catch (error) { console.error('Error migrating locale from localStorage:', error) } } } export const localeStorage = new LocaleStorageService()