Skip to content

Instantly share code, notes, and snippets.

@adhrinae
Created August 13, 2020 03:59
Show Gist options
  • Save adhrinae/20112f781876e3bcd9afd4a59e65baad to your computer and use it in GitHub Desktop.
Save adhrinae/20112f781876e3bcd9afd4a59e65baad to your computer and use it in GitHub Desktop.
useLocalStorage
import { useCallback, useMemo, useState } from 'react';
import { LOCAL_STORAGE_KEY } from '../constants';
export function useLocalStorage<T extends object>(): {
parsedData: T;
loadLocalStorageData: () => Promise<T>;
setLocalStorageData: (data: T) => void;
clear: () => void;
} {
const [localStorageRawData, setLocalStorageRawData] = useState<string>('{}');
const parsedData: T = useMemo(() => JSON.parse(localStorageRawData), [localStorageRawData]);
const loadLocalStorageData = useCallback(async () => {
const rawData = window.localStorage.getItem(LOCAL_STORAGE_KEY) || '{}';
setLocalStorageRawData(rawData);
return JSON.parse(rawData);
}, []);
const setLocalStorageData = useCallback(
(data: T) => {
window.localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(data));
loadLocalStorageData();
},
[loadLocalStorageData],
);
const clear = useCallback(() => {
window.localStorage.clear();
setLocalStorageRawData('{}');
}, []);
return {
parsedData,
loadLocalStorageData,
setLocalStorageData,
clear,
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment