Bpistle/src/providers/UserPreferencesProvider.tsx
2025-10-17 23:34:56 +08:00

57 lines
1.7 KiB
TypeScript

import storage from '@/services/local-storage.service'
import { TNotificationStyle } from '@/types'
import { createContext, useContext, useState } from 'react'
type TUserPreferencesContext = {
notificationListStyle: TNotificationStyle
updateNotificationListStyle: (style: TNotificationStyle) => void
muteMedia: boolean
updateMuteMedia: (mute: boolean) => void
sidebarCollapse: boolean
updateSidebarCollapse: (collapse: boolean) => void
}
const UserPreferencesContext = createContext<TUserPreferencesContext | undefined>(undefined)
export const useUserPreferences = () => {
const context = useContext(UserPreferencesContext)
if (!context) {
throw new Error('useUserPreferences must be used within a UserPreferencesProvider')
}
return context
}
export function UserPreferencesProvider({ children }: { children: React.ReactNode }) {
const [notificationListStyle, setNotificationListStyle] = useState(
storage.getNotificationListStyle()
)
const [muteMedia, setMuteMedia] = useState(true)
const [sidebarCollapse, setSidebarCollapse] = useState(storage.getSidebarCollapse())
const updateNotificationListStyle = (style: TNotificationStyle) => {
setNotificationListStyle(style)
storage.setNotificationListStyle(style)
}
const updateSidebarCollapse = (collapse: boolean) => {
setSidebarCollapse(collapse)
storage.setSidebarCollapse(collapse)
}
return (
<UserPreferencesContext.Provider
value={{
notificationListStyle,
updateNotificationListStyle,
muteMedia,
updateMuteMedia: setMuteMedia,
sidebarCollapse,
updateSidebarCollapse: updateSidebarCollapse
}}
>
{children}
</UserPreferencesContext.Provider>
)
}