ConceptPortal-public/rsconcept/frontend/src/hooks/useLocalStorage.ts

32 lines
904 B
TypeScript
Raw Normal View History

'use client';
2023-07-25 20:27:29 +03:00
import { useEffect, useState } from 'react';
2023-07-15 17:46:19 +03:00
import { storage } from '@/utils/constants';
2023-12-28 14:04:44 +03:00
function useLocalStorage<ValueType>(key: string, defaultValue: ValueType | (() => ValueType)) {
const prefixedKey = `${storage.PREFIX}${key}`;
2023-12-28 14:04:44 +03:00
const [value, setValue] = useState<ValueType>(() => {
const loadedJson = localStorage.getItem(prefixedKey);
2023-10-23 18:22:55 +03:00
if (loadedJson != null) {
return JSON.parse(loadedJson) as ValueType;
} else if (typeof defaultValue === 'function') {
return (defaultValue as () => ValueType)();
} else {
return defaultValue;
}
2023-07-15 17:46:19 +03:00
});
useEffect(() => {
2023-07-25 20:27:29 +03:00
if (value === undefined) {
localStorage.removeItem(prefixedKey);
2023-07-15 17:46:19 +03:00
} else {
localStorage.setItem(prefixedKey, JSON.stringify(value));
2023-07-15 17:46:19 +03:00
}
}, [prefixedKey, value]);
2023-07-15 17:46:19 +03:00
2023-10-23 18:22:55 +03:00
return [value, setValue] as [ValueType, typeof setValue];
}
2023-07-15 17:46:19 +03:00
2023-12-28 14:04:44 +03:00
export default useLocalStorage;