Files
OpenFlare/frontend/contexts/notification-settings-context.tsx
T
ryan 63cd906cfc refactor(repo): consolidate openflare-server to root and move subprojects to internal/apps
- Merge all files inside openflare-server to the repository root directory.
- Relocate agent, relay, and flared subprojects from internal/ to internal/apps/.
- Combine docker-compose files and update build context paths to root.
- Update GitHub workflows and Dockerfiles to refer to new directories and package names.
- Rewrite Go package imports across all files.
- Resolve database renew test race condition and clean up docs.
2026-06-19 14:23:29 +08:00

65 lines
1.8 KiB
TypeScript

"use client"
import {createContext, ReactNode, useContext, useEffect, useMemo, useState} from "react"
interface NotificationSettingsContextType {
showBell: boolean
isMounted: boolean
setShowBell: (value: boolean) => void
}
const NotificationSettingsContext = createContext<NotificationSettingsContextType | undefined>(undefined)
const STORAGE_KEY = "notification-settings"
interface StoredSettings {
showBell: boolean
}
export function NotificationSettingsProvider({ children }: { children: ReactNode }) {
const [showBell, setShowBellState] = useState(true)
const [mounted, setMounted] = useState(false)
useEffect(() => {
const stored = localStorage.getItem(STORAGE_KEY)
if (stored) {
try {
const settings: StoredSettings = JSON.parse(stored)
if (typeof settings.showBell === "boolean") {
setShowBellState(settings.showBell)
}
} catch {
// Ignore parse errors
}
}
setMounted(true)
}, [])
const setShowBell = (value: boolean) => {
setShowBellState(value)
const settings: StoredSettings = { showBell: value }
localStorage.setItem(STORAGE_KEY, JSON.stringify(settings))
}
// Memoize context value to prevent unnecessary re-renders
const contextValue = useMemo<NotificationSettingsContextType>(() => ({
showBell,
isMounted: mounted,
setShowBell,
}), [showBell, mounted])
return (
<NotificationSettingsContext.Provider value={contextValue}>
{children}
</NotificationSettingsContext.Provider>
)
}
export function useNotificationSettings() {
const context = useContext(NotificationSettingsContext)
if (context === undefined) {
throw new Error("useNotificationSettings must be used within a NotificationSettingsProvider")
}
return context
}