-
-
Notifications
You must be signed in to change notification settings - Fork 637
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(utils/useHydrateAtoms) - Optionally rehydrate with force hydrate #1990
feat(utils/useHydrateAtoms) - Optionally rehydrate with force hydrate #1990
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. Latest deployment of this branch, based on commit c4c5e4c:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your suggestion. Added some comments.
Added all requested changes @dai-shi |
On second thought, we could do and suggest to use store api for such use cases. const Component = () => {
const store = useStore()
store.set(countAtom, countValue)
// ...
} What do you think? |
Basically disregard the forceHydrate and suggest using the store API? If yes, that could technically fully replace the |
Basically disregard force hydrate, but store api wouldn't fully replace useHydreteAtoms which ensures only setting values if unset.
I'm not sure if I get those cases. |
I can try to re-produce it again but I remember going for the |
The reason to be against |
So you are suggesting that we do something like this: export const Component = ({
componentPreferences,
}: ComponentPageProps) => {
useHydrateAtoms([[componentPreferencesAtom, componentPreferences]])
const store = useStore()
componentPreferencesValue.reset &&
store.set(componentPreferencesAtom, componentPreferences) Which this code removes the need for useHydrateAtoms because |
I'm not sure if I understand the purpose of "reset", but my suggestion was if you use Ah, I see you want to force hydrate if reset is true, and otherwise, only hydrate initially. |
I'm open to ideas. The issue is that we hydrate a page with data that is needed until a certain action completion. Once this action is completed, we want to fully reset that atom and get new data from SSR on next time this page loads. |
I feel like merging this PR as the code is clean and it has
I'm curious about your case. When you get new data from SSR on next time, how would the store be kept in memory (assumed so because you want to fully reset) ? |
We have a store instance that stays maintained, and the only thing we fully reset is that specific atom. So basically here is the flow:
That is how we got to where we are. I was hoping |
Hmm? If this is a user action, we should update atoms at the same time. Updating atoms in render is something we should really avoid. It's not just bad practice, but theoretically delayed. |
So once the user completes the action it takes him out of the page. And they won't get the newest set of data until they reach that page. Like once you complete checkout, you are taken out of checkout and your checkout data is reset. However, once you come back from checkout, you need the newest set of data from the server to be hydrated again. Client side won't know the data until they reach checkout, which is SSR. |
I'm not exactly sure how the second SSR&hydration work, but it sounds like you can only get the new data from props. In that case, the render time updating wouldn't be avoidable. Can't be helped because you don't have control, right? Sounds fair enough, because we usually suggest useEffect for sync with props, but that's far from ideal. |
Exactly. We want to avoid the useEffect as it was adding unnecessary complexity and conditions that are not needed. I agree with the hydrate once design, but a reset after checkout seems common enough. |
I think there should be a better way, probably atoms-in-atom or jotai-molecules, and we want to educate such ones for common use cases. This PR change helps as an escape hatch for edge cases, so I want to merge, but we shouldn't teach people to use it for common cases. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the discussion. It was convincing. I will merge it later.
Haven't messed with jotai-molecules yet, but definitely will give them a shot! |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [jotai](https://togithub.com/pmndrs/jotai) | [`2.1.0` -> `2.2.1`](https://renovatebot.com/diffs/npm/jotai/2.1.0/2.2.1) | [![age](https://badges.renovateapi.com/packages/npm/jotai/2.2.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/npm/jotai/2.2.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/npm/jotai/2.2.1/compatibility-slim/2.1.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/npm/jotai/2.2.1/confidence-slim/2.1.0)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>pmndrs/jotai (jotai)</summary> ### [`v2.2.1`](https://togithub.com/pmndrs/jotai/releases/tag/v2.2.1) [Compare Source](https://togithub.com/pmndrs/jotai/compare/v2.2.0...v2.2.1) This includes some improvements in `jotai/utils`. Especially, `unstable_unwrap` is getting to be stable. ##### What's Changed - feat(utils/useHydrateAtoms) - Optionally rehydrate with force hydrate by [@​SariSabouh](https://togithub.com/SariSabouh) in [https://github.com/pmndrs/jotai/pull/1990](https://togithub.com/pmndrs/jotai/pull/1990) - fix(utils): revert atomWithStorage typing by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1994](https://togithub.com/pmndrs/jotai/pull/1994) - fix(utils): improve selectAtom typing by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1995](https://togithub.com/pmndrs/jotai/pull/1995) - fix(utils): improve unstable_unwrap for sometimes async atom by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1996](https://togithub.com/pmndrs/jotai/pull/1996) - fix(utils): unstable_unwrap to support writable atom by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1997](https://togithub.com/pmndrs/jotai/pull/1997) ##### New Contributors - [@​SariSabouh](https://togithub.com/SariSabouh) made their first contribution in [https://github.com/pmndrs/jotai/pull/1990](https://togithub.com/pmndrs/jotai/pull/1990) **Full Changelog**: pmndrs/jotai@v2.2.0...v2.2.1 ### [`v2.2.0`](https://togithub.com/pmndrs/jotai/releases/tag/v2.2.0) [Compare Source](https://togithub.com/pmndrs/jotai/compare/v2.1.1...v2.2.0) It includes a few improvements. Some utils are rewritten as there was a misconception when migrating from v1. ESM builds are optimized for Vite users. #### Migration Guide for `jotai/utils` ##### `atomWithDefault` ```js // suppose we have this const asyncAtom = atom(() => Promise.resolve(1)) const countAtom = atomWithDefault((get) => get(asyncAtom)) // and in component const setCount = useSetAtom(countAtom) // previously, setCount((c) => c + 1) // it worked, but it will no longer work // instead, you need to do this setCount((countPromise) => countPromise.then((c) => c + 1)) ``` ##### `atomWithStorage` ```js // suppose we have async storage const storage = createJSONStorage(() => AsyncStorage) const countAtom = atomWithStorage('count-key', 0, storage) // in component const [count, setCount] = useAtom(countAom) // previously, countAtom is a sync atom, so you could update like this: setCount((c) => c + 1) // with the new version, it becomes async occasionally, so you need to resolve it: setCount(async (c) => (await c) + 1) ``` #### What's Changed - breaking(utils): predictable atomWithDefault by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1939](https://togithub.com/pmndrs/jotai/pull/1939) - breaking(utils): improve atomWithStorage by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1958](https://togithub.com/pmndrs/jotai/pull/1958) - feat(vanilla): new store listeners for devtools by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1966](https://togithub.com/pmndrs/jotai/pull/1966) - fix(build): mode env for "import" condition" by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1978](https://togithub.com/pmndrs/jotai/pull/1978) #### New Contributors - [@​reinierkaper-carewell](https://togithub.com/reinierkaper-carewell) made their first contribution in [https://github.com/pmndrs/jotai/pull/1980](https://togithub.com/pmndrs/jotai/pull/1980) **Full Changelog**: pmndrs/jotai@v2.1.1...v2.2.0 ### [`v2.1.1`](https://togithub.com/pmndrs/jotai/releases/tag/v2.1.1) [Compare Source](https://togithub.com/pmndrs/jotai/compare/v2.1.0...v2.1.1) This version fixes some issues in edge cases. #### What's Changed - fix(vanilla): Stable promise by [@​backbone87](https://togithub.com/backbone87) in [https://github.com/pmndrs/jotai/pull/1933](https://togithub.com/pmndrs/jotai/pull/1933) - fix(vanilla): update atoms with tree structure dependencies (regression from v1) by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1959](https://togithub.com/pmndrs/jotai/pull/1959) - fix: prefer PromiseLike where appropriate by [@​dai-shi](https://togithub.com/dai-shi) in [https://github.com/pmndrs/jotai/pull/1967](https://togithub.com/pmndrs/jotai/pull/1967) #### New Contributors - [@​blissdev](https://togithub.com/blissdev) made their first contribution in [https://github.com/pmndrs/jotai/pull/1945](https://togithub.com/pmndrs/jotai/pull/1945) - [@​hwanyoungChoi](https://togithub.com/hwanyoungChoi) made their first contribution in [https://github.com/pmndrs/jotai/pull/1957](https://togithub.com/pmndrs/jotai/pull/1957) - [@​alexhad6](https://togithub.com/alexhad6) made their first contribution in [https://github.com/pmndrs/jotai/pull/1971](https://togithub.com/pmndrs/jotai/pull/1971) - [@​backbone87](https://togithub.com/backbone87) made their first contribution in [https://github.com/pmndrs/jotai/pull/1933](https://togithub.com/pmndrs/jotai/pull/1933) **Full Changelog**: pmndrs/jotai@v2.1.0...v2.1.1 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/sullivanpj/open-system).
Related Issues or Discussions
The useHydrateAtom discussion has been live since August of 2021 in #669.
Summary
We found a use case within our project that required a rehydration after a specific event. We had to manually rely on conditional useEffect actions to manually update the store rather than hydrating back from a fully reset SSR page. After review, a forceHydration option meets that requirement and a lot of the cases mentioned within that option discussion.
Check List
yarn run prettier
for formatting code and docs