You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
795 B
37 lines
795 B
// eslint-disable-next-line no-restricted-imports |
|
import { |
|
atom, |
|
Provider, |
|
useAtom, |
|
useAtomValue, |
|
useSetAtom, |
|
createStore, |
|
type PrimitiveAtom, |
|
} from "jotai"; |
|
import { useLayoutEffect } from "react"; |
|
|
|
export const appJotaiStore = createStore(); |
|
|
|
export { atom, Provider, useAtom, useAtomValue, useSetAtom }; |
|
|
|
export const useAtomWithInitialValue = < |
|
T extends unknown, |
|
A extends PrimitiveAtom<T>, |
|
>( |
|
atom: A, |
|
initialValue: T | (() => T), |
|
) => { |
|
const [value, setValue] = useAtom(atom); |
|
|
|
useLayoutEffect(() => { |
|
if (typeof initialValue === "function") { |
|
// @ts-ignore |
|
setValue(initialValue()); |
|
} else { |
|
setValue(initialValue); |
|
} |
|
// eslint-disable-next-line react-hooks/exhaustive-deps |
|
}, []); |
|
|
|
return [value, setValue] as const; |
|
};
|
|
|