mirror of
https://github.com/dergigi/boris.git
synced 2026-02-17 04:54:56 +01:00
- Add three highlight levels: nostrverse (all), friends (followed), and mine (user's own) - Create contactService to fetch user's follow list from kind 3 events - Add three configurable colors in settings (purple, orange, yellow defaults) - Replace mode switcher with independent toggle buttons for each level - Update highlight rendering to apply level-specific colors using CSS custom properties - Add CSS styles for three-level highlights in both marker and underline modes - Classify highlights dynamically based on user's context and follow list - All three levels can be shown/hidden independently via toggle buttons
87 lines
3.1 KiB
TypeScript
87 lines
3.1 KiB
TypeScript
import { useState, useEffect, useCallback } from 'react'
|
|
import { IEventStore } from 'applesauce-core'
|
|
import { RelayPool } from 'applesauce-relay'
|
|
import { EventFactory } from 'applesauce-factory'
|
|
import { AccountManager } from 'applesauce-accounts'
|
|
import { UserSettings, loadSettings, saveSettings, watchSettings } from '../services/settingsService'
|
|
import { loadFont, getFontFamily } from '../utils/fontLoader'
|
|
|
|
const RELAY_URLS = [
|
|
'wss://relay.damus.io', 'wss://nos.lol', 'wss://relay.nostr.band',
|
|
'wss://relay.dergigi.com', 'wss://wot.dergigi.com'
|
|
]
|
|
|
|
interface UseSettingsParams {
|
|
relayPool: RelayPool | null
|
|
eventStore: IEventStore
|
|
pubkey: string | undefined
|
|
accountManager: AccountManager
|
|
}
|
|
|
|
export function useSettings({ relayPool, eventStore, pubkey, accountManager }: UseSettingsParams) {
|
|
const [settings, setSettings] = useState<UserSettings>({})
|
|
const [toastMessage, setToastMessage] = useState<string | null>(null)
|
|
const [toastType, setToastType] = useState<'success' | 'error'>('success')
|
|
|
|
// Load settings and set up subscription
|
|
useEffect(() => {
|
|
if (!relayPool || !pubkey || !eventStore) return
|
|
|
|
const loadAndWatch = async () => {
|
|
try {
|
|
const loadedSettings = await loadSettings(relayPool, eventStore, pubkey, RELAY_URLS)
|
|
if (loadedSettings) setSettings(loadedSettings)
|
|
} catch (err) {
|
|
console.error('Failed to load settings:', err)
|
|
}
|
|
}
|
|
|
|
loadAndWatch()
|
|
|
|
const subscription = watchSettings(eventStore, pubkey, (loadedSettings) => {
|
|
if (loadedSettings) setSettings(loadedSettings)
|
|
})
|
|
|
|
return () => subscription.unsubscribe()
|
|
}, [relayPool, pubkey, eventStore])
|
|
|
|
// Apply settings to document
|
|
useEffect(() => {
|
|
const root = document.documentElement.style
|
|
const fontKey = settings.readingFont || 'system'
|
|
if (fontKey !== 'system') loadFont(fontKey)
|
|
root.setProperty('--reading-font', getFontFamily(fontKey))
|
|
root.setProperty('--reading-font-size', `${settings.fontSize || 16}px`)
|
|
|
|
// Set highlight colors for three levels
|
|
root.setProperty('--highlight-color-mine', settings.highlightColorMine || '#eab308')
|
|
root.setProperty('--highlight-color-friends', settings.highlightColorFriends || '#f97316')
|
|
root.setProperty('--highlight-color-nostrverse', settings.highlightColorNostrverse || '#9333ea')
|
|
}, [settings])
|
|
|
|
const saveSettingsWithToast = useCallback(async (newSettings: UserSettings) => {
|
|
if (!relayPool || !pubkey) return
|
|
try {
|
|
const fullAccount = accountManager.getActive()
|
|
if (!fullAccount) throw new Error('No active account')
|
|
const factory = new EventFactory({ signer: fullAccount })
|
|
await saveSettings(relayPool, eventStore, factory, newSettings, RELAY_URLS)
|
|
setSettings(newSettings)
|
|
setToastType('success')
|
|
setToastMessage('Settings saved')
|
|
} catch (err) {
|
|
console.error('Failed to save settings:', err)
|
|
setToastType('error')
|
|
setToastMessage('Failed to save settings')
|
|
}
|
|
}, [relayPool, pubkey, accountManager, eventStore])
|
|
|
|
return {
|
|
settings,
|
|
saveSettings: saveSettingsWithToast,
|
|
toastMessage,
|
|
toastType,
|
|
clearToast: () => setToastMessage(null)
|
|
}
|
|
}
|