Skip to content

Commit

Permalink
useLocalStorage
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrieljablonski committed May 13, 2022
1 parent 2a22597 commit f4f3dac
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/hooks/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
export { };
import useLocalStorage, { LocalStorageKeys } from './useLocalStorage';

export { useLocalStorage };

export { LocalStorageKeys };
41 changes: 41 additions & 0 deletions src/hooks/useLocalStorage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useState, useEffect, useCallback } from 'react';
import { hasValue } from 'utils';

// eslint-disable-next-line no-shadow
export enum LocalStorageKeys {
EXAMPLE_KEY = 'example-key',
}

export default function useLocalStorage<DataType = unknown>(
key: LocalStorageKeys,
defaultValue?: DataType,
): [
DataType | undefined,
React.Dispatch<React.SetStateAction<DataType | undefined>>,
() => void,
] {
const actualKey = `@${process.env.REACT_APP_NAME}:${key}`;

const inLocalStorage = localStorage.getItem(actualKey);
let actualDefault: DataType | undefined;
try {
actualDefault = JSON.parse(inLocalStorage || '{}').value as DataType;
} catch (err) {
// eslint-disable-next-line no-console
console.log('Local storage error:', err);
}
if (!hasValue(actualDefault)) {
actualDefault = defaultValue;
}
if (!hasValue(actualDefault)) {
actualDefault = undefined;
}
const [value, setValue] = useState(actualDefault);
useEffect(() => {
localStorage.setItem(actualKey, JSON.stringify({ value }));
}, [actualKey, value]);
const remove = useCallback(() => {
localStorage.removeItem(actualKey);
}, [actualKey]);
return [value, setValue, remove];
}

0 comments on commit f4f3dac

Please sign in to comment.