Skip to content

Instantly share code, notes, and snippets.

@Junglecrew
Last active July 19, 2022 10:09
Show Gist options
  • Save Junglecrew/e783042ec5c7c27d2c713b91e8d92439 to your computer and use it in GitHub Desktop.
Save Junglecrew/e783042ec5c7c27d2c713b91e8d92439 to your computer and use it in GitHub Desktop.
// mobx: 6.3.3
// React 16.8+
interface IStore {
name: string;
}
export const useSelector = <T>(
selector: () => T,
deps: DependencyList = []
): T => {
const [selected, setSelected] = useState(selector);
// eslint-disable-next-line react-hooks/exhaustive-deps
useEffect(() => autorun(() => setSelected(selector())), deps);
return selected;
};
const store = observable.object({
name: '',
});
export const updateStore = (newValues) => {
runInAction(() => {
Object.assign(store, newValues);
});
};
export const useStore = () => useSelector(() => ({ ...store }));
export const useStoreName = () => useSelector(() => store.name);
export const useStoreValue = <T extends keyof IStore>(key: T): IStore[T] =>
useSelector(() => store[key]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment