mirror of
https://github.com/lux-tel/websites.git
synced 2026-10-30 20:31:36 +00:00
47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
'use client';
|
|
|
|
import { volatileStorageKey } from '@/lib/constants';
|
|
import { type ReactNode, createContext, useContext } from 'react';
|
|
import { PreferenceStorage } from 'usepref/storage/preference-storage';
|
|
|
|
type VolatileStorageContext = {
|
|
volatileStorage: PreferenceStorage;
|
|
};
|
|
|
|
const Context = createContext<VolatileStorageContext | undefined>(undefined);
|
|
|
|
let browserVolatileStorage: PreferenceStorage | undefined;
|
|
|
|
function createVolatileStorage() {
|
|
return new PreferenceStorage({
|
|
key: volatileStorageKey,
|
|
});
|
|
}
|
|
|
|
export function getVolatileStorage() {
|
|
if (!browserVolatileStorage) browserVolatileStorage = createVolatileStorage();
|
|
return browserVolatileStorage;
|
|
}
|
|
|
|
// TODO: investigate adding multi storage support to the usePref library
|
|
|
|
export default function VolatileStorageProvider({ children }: { children: ReactNode }) {
|
|
const volatileStorage = getVolatileStorage();
|
|
return <Context.Provider value={{ volatileStorage }}>{children}</Context.Provider>;
|
|
}
|
|
|
|
export const useVolatileStorage = () => {
|
|
const context = useContext(Context);
|
|
|
|
if (context === undefined) {
|
|
throw new Error('useVolatileStorage must be used inside VolatileStorageProvider');
|
|
}
|
|
|
|
const instance = context.volatileStorage;
|
|
|
|
return {
|
|
getItem: instance.getItem.bind(instance),
|
|
setItem: instance.setItem.bind(instance),
|
|
};
|
|
};
|