From 04572a8e5081b1e4871e273cde9dbaaa44c52fe0 Mon Sep 17 00:00:00 2001 From: MohamedBassem Date: Wed, 13 Mar 2024 21:43:44 +0000 Subject: structure: Create apps dir and copy tooling dir from t3-turbo repo --- apps/mobile/lib/storage-state.ts | 51 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 apps/mobile/lib/storage-state.ts (limited to 'apps/mobile/lib/storage-state.ts') diff --git a/apps/mobile/lib/storage-state.ts b/apps/mobile/lib/storage-state.ts new file mode 100644 index 00000000..4988f0e0 --- /dev/null +++ b/apps/mobile/lib/storage-state.ts @@ -0,0 +1,51 @@ +import * as SecureStore from "expo-secure-store"; +import * as React from "react"; + +type UseStateHook = [[boolean, T | null], (value: T | null) => void]; + +function useAsyncState( + initialValue: [boolean, T | null] = [true, null], +): UseStateHook { + return React.useReducer( + ( + state: [boolean, T | null], + action: T | null = null, + ): [boolean, T | null] => [false, action], + initialValue, + ) as UseStateHook; +} + +export async function setStorageItemAsync(key: string, value: string | null) { + if (value == null) { + await SecureStore.deleteItemAsync(key); + } else { + await SecureStore.setItemAsync(key, value); + } +} + +export function useStorageState(key: string): UseStateHook { + // Public + const [state, setState] = useAsyncState(); + + // Get + React.useEffect(() => { + SecureStore.getItemAsync(key).then((value) => { + if (!value) { + setState(null); + return null; + } + setState(JSON.parse(value)); + }); + }, [key]); + + // Set + const setValue = React.useCallback( + (value: T | null) => { + setState(value); + setStorageItemAsync(key, JSON.stringify(value)); + }, + [key], + ); + + return [state, setValue]; +} -- cgit v1.2.3-70-g09d2