This commit is contained in:
Stefan Pejcic
2024-11-07 19:03:37 +01:00
parent c6df945ed5
commit 09f9f9502d
2472 changed files with 620417 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
import { renderHook, act } from "@testing-library/react";
import { useLocalStorage } from "./use-local-storage";
import { getLocalStorage, setLocalStorage } from "../utils/local-storage";
jest.mock("../utils/local-storage");
describe("useLocalStorage", () => {
const name = "test";
const defaultValue = "default";
beforeEach(() => {
jest.clearAllMocks();
});
it("should return the default value if localStorage is empty", () => {
(getLocalStorage as jest.Mock).mockReturnValueOnce(defaultValue);
const { result } = renderHook(() =>
useLocalStorage({ name, defaultValue }),
);
expect(result.current[0]).toEqual(defaultValue);
});
it("should return the value from localStorage if available", () => {
const value = "value";
(getLocalStorage as jest.Mock).mockReturnValueOnce(value);
const { result } = renderHook(() =>
useLocalStorage({ name, defaultValue }),
);
expect(result.current[0]).toEqual(value);
});
it("should update the value in localStorage when setValue is called", () => {
const value = "value";
const { result } = renderHook(() =>
useLocalStorage({ name, defaultValue }),
);
act(() => {
result.current[1](value);
});
expect(setLocalStorage).toHaveBeenCalledWith(name, value);
});
});

View File

@@ -0,0 +1,19 @@
import { useEffect, useState } from "react";
import { getLocalStorage, setLocalStorage } from "../utils/local-storage";
type Props<T> = {
name: string;
defaultValue: T;
};
export const useLocalStorage = <T>({ name, defaultValue }: Props<T>) => {
const [value, setValue] = useState<T>(() => {
return getLocalStorage(name, defaultValue);
});
useEffect(() => {
setLocalStorage(name, value);
}, [value]);
return [value, setValue] as const;
};