57 lines
1.7 KiB
TypeScript
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>
|
|
)
|
|
}
|