story-research-zapwall/lib/filterPreferences.ts
2026-01-15 11:31:09 +01:00

78 lines
2.0 KiB
TypeScript

import { createIndexedDBHelper, type IndexedDBHelper } from './helpers/indexedDBHelper'
import type { ArticleFilters } from '@/components/ArticleFilters'
const DB_NAME = 'nostr_paywall_settings'
const DB_VERSION = 3
const STORE_NAME = 'filter_preferences'
export interface FilterPreferencesItem {
key: 'filters'
value: ArticleFilters
timestamp: number
}
const FILTERS_KEY = 'filters'
class FilterPreferencesService {
private readonly dbHelper: IndexedDBHelper
constructor() {
this.dbHelper = createIndexedDBHelper({
dbName: DB_NAME,
version: DB_VERSION,
storeName: STORE_NAME,
keyPath: 'key',
indexes: [{ name: 'timestamp', keyPath: 'timestamp', unique: false }],
})
}
async saveFilters(filters: ArticleFilters): Promise<void> {
try {
const item: FilterPreferencesItem = {
key: FILTERS_KEY,
value: filters,
timestamp: Date.now(),
}
await this.dbHelper.put(item)
} catch (error) {
console.error('Error saving filter preferences:', error)
}
}
async getFilters(): Promise<ArticleFilters | null> {
try {
const item = await this.dbHelper.get<FilterPreferencesItem>(FILTERS_KEY)
if (item?.value) {
return item.value
}
return null
} catch (error) {
console.error('Error getting filter preferences:', error)
return null
}
}
async clearFilters(): Promise<void> {
try {
await this.dbHelper.delete(FILTERS_KEY)
} catch (error) {
console.error('Error clearing filter preferences:', error)
throw error
}
}
}
const filterPreferencesService = new FilterPreferencesService()
export async function saveFilterPreferences(filters: ArticleFilters): Promise<void> {
return filterPreferencesService.saveFilters(filters)
}
export async function getFilterPreferences(): Promise<ArticleFilters | null> {
return filterPreferencesService.getFilters()
}
export async function clearFilterPreferences(): Promise<void> {
return filterPreferencesService.clearFilters()
}