fediversion/frontend/contexts/preferences-context.tsx
fullsizemalt b4cddf41ea feat: Initialize Fediversion multi-band platform
- Fork elmeg-demo codebase for multi-band support
- Add data importer infrastructure with base class
- Create band-specific importers:
  - phish.py: Phish.net API v5
  - grateful_dead.py: Grateful Stats API
  - setlistfm.py: Dead & Company, Billy Strings (Setlist.fm)
- Add spec-kit configuration for Gemini
- Update README with supported bands and architecture
2025-12-28 12:39:28 -08:00

98 lines
2.8 KiB
TypeScript

"use client"
import { createContext, useContext, useEffect, useState } from "react"
import { getApiUrl } from "@/lib/api-config"
interface Preferences {
wiki_mode: boolean
show_ratings: boolean
show_comments: boolean
theme: string
email_on_reply: boolean
email_on_chase: boolean
email_digest: boolean
}
interface PreferencesContextType {
preferences: Preferences
updatePreferences: (newPrefs: Partial<Preferences>) => Promise<void>
loading: boolean
}
const defaultPreferences: Preferences = {
wiki_mode: false,
show_ratings: true,
show_comments: true,
theme: "system",
email_on_reply: true,
email_on_chase: true,
email_digest: false,
}
const PreferencesContext = createContext<PreferencesContextType>({
preferences: defaultPreferences,
updatePreferences: async () => { },
loading: false,
})
export function PreferencesProvider({ children }: { children: React.ReactNode }) {
const [preferences, setPreferences] = useState<Preferences>(defaultPreferences)
const [loading, setLoading] = useState(true)
useEffect(() => {
const fetchPreferences = async () => {
const token = localStorage.getItem("token")
if (!token) {
setLoading(false)
return
}
try {
const res = await fetch(`${getApiUrl()}/preferences/`, {
headers: { Authorization: `Bearer ${token}` }
})
if (res.ok) {
const data = await res.json()
// Ensure we merge with defaults in case of missing fields
setPreferences(prev => ({ ...prev, ...data }))
}
} catch (err) {
console.error("Failed to load preferences", err)
} finally {
setLoading(false)
}
}
fetchPreferences()
}, [])
const updatePreferences = async (newPrefs: Partial<Preferences>) => {
// Optimistic update
setPreferences(prev => ({ ...prev, ...newPrefs }))
const token = localStorage.getItem("token")
if (!token) return
try {
await fetch(`${getApiUrl()}/preferences/`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`
},
body: JSON.stringify(newPrefs)
})
} catch (err) {
console.error("Failed to save preferences", err)
// Optionally revert state here on error
}
}
return (
<PreferencesContext.Provider value={{ preferences, updatePreferences, loading }}>
{children}
</PreferencesContext.Provider>
)
}
export const usePreferences = () => useContext(PreferencesContext)