Skip to content

Commit f449e11

Browse files
committed
refactor: usePersistedState state value to not be undefined
And in the one odd use case, create a new useClearablePersistedState to allow for that too
1 parent 27d9e33 commit f449e11

3 files changed

Lines changed: 24 additions & 11 deletions

File tree

app/web/features/auth/useAuthStore.test.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { act, renderHook } from "@testing-library/react";
22
import { Empty } from "google-protobuf/google/protobuf/empty_pb";
33
import { StatusCode } from "grpc-web";
4-
import { usePersistedState } from "platform/usePersistedState";
4+
import { useClearablePersistedState } from "platform/usePersistedState";
55
import { service } from "service";
66

77
import wrapper from "../../test/hookWrapper";
@@ -15,44 +15,48 @@ const getIsJailedMock = service.jail.getIsJailed as jest.Mock;
1515
const logoutMock = service.user.logout as jest.Mock;
1616
const getAccountInfoMock = service.account.getAccountInfo as jest.Mock;
1717

18-
describe("usePersistedState hook", () => {
18+
describe("useClearablePersistedState hook", () => {
1919
it("uses a default value", () => {
2020
const defaultValue = "Test string";
21-
const { result } = renderHook(() => usePersistedState("key", defaultValue));
21+
const { result } = renderHook(() =>
22+
useClearablePersistedState("key", defaultValue),
23+
);
2224
expect(result.current[0]).toBe(defaultValue);
2325
});
2426

2527
it("saves then loads a value", () => {
2628
const value = { test: "Test string" };
27-
const { result } = renderHook(() => usePersistedState("key", { test: "" }));
29+
const { result } = renderHook(() =>
30+
useClearablePersistedState("key", { test: "" }),
31+
);
2832
expect(result.current[0]).toStrictEqual({ test: "" });
2933
act(() => result.current[1](value));
3034
expect(result.current[0]).toStrictEqual(value);
3135
expect(localStorage.getItem("key")).toBe(JSON.stringify(value));
3236
const { result: result2 } = renderHook(() =>
33-
usePersistedState("key", { test: "" }),
37+
useClearablePersistedState("key", { test: "" }),
3438
);
3539
expect(result2.current[0]).toStrictEqual(value);
3640
});
3741

3842
it("saves then loads a value from sessionStorage", () => {
3943
const value = { test: "session test" };
4044
const { result } = renderHook(() =>
41-
usePersistedState("key", { test: "" }, "sessionStorage"),
45+
useClearablePersistedState("key", { test: "" }, "sessionStorage"),
4246
);
4347
expect(result.current[0]).toStrictEqual({ test: "" });
4448
act(() => result.current[1](value));
4549
expect(result.current[0]).toStrictEqual(value);
4650
expect(sessionStorage.getItem("key")).toBe(JSON.stringify(value));
4751
const { result: result2 } = renderHook(() =>
48-
usePersistedState("key", { test: "" }, "sessionStorage"),
52+
useClearablePersistedState("key", { test: "" }, "sessionStorage"),
4953
);
5054
expect(result2.current[0]).toStrictEqual(value);
5155
});
5256

5357
it("clears a value", () => {
5458
const { result } = renderHook(() =>
55-
usePersistedState("key", { test: "" }, "sessionStorage"),
59+
useClearablePersistedState("key", { test: "" }, "sessionStorage"),
5660
);
5761
expect(result.current[0]).toStrictEqual({ test: "" });
5862
act(() => result.current[2]());

app/web/features/messages/groupchats/GroupChatSendField.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Empty } from "google-protobuf/google/protobuf/empty_pb";
66
import { RpcError } from "grpc-web";
77
import { useTranslation } from "i18n";
88
import { GLOBAL, MESSAGES } from "i18n/namespaces";
9-
import { usePersistedState } from "platform/usePersistedState";
9+
import { useClearablePersistedState } from "platform/usePersistedState";
1010
import React from "react";
1111
import { useForm } from "react-hook-form";
1212

@@ -43,7 +43,7 @@ export default function GroupChatSendField({
4343
const { register, handleSubmit, reset, watch } = useForm<MessageFormData>();
4444

4545
const [persistedMessage, setPersistedMessage, clearPersistedMessage] =
46-
usePersistedState(
46+
useClearablePersistedState(
4747
`messages.${currentUserId}.${chatId}`,
4848
"",
4949
"sessionStorage",

app/web/platform/usePersistedState.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66

77
type StorageType = "localStorage" | "sessionStorage";
88

9-
export function usePersistedState<T>(
9+
export function useClearablePersistedState<T>(
1010
key: string,
1111
defaultValue: T,
1212
storage: StorageType = "localStorage",
@@ -37,6 +37,15 @@ export function usePersistedState<T>(
3737
return [_state, setState, clearState];
3838
}
3939

40+
export function usePersistedState<T>(
41+
key: string,
42+
defaultValue: T,
43+
storage: StorageType = "localStorage",
44+
) {
45+
const [state, setState] = useClearablePersistedState(key, defaultValue, storage);
46+
return [state as T, setState] as const;
47+
}
48+
4049
export function clearStorage() {
4150
window.sessionStorage.clear();
4251
}

0 commit comments

Comments
 (0)