-
-
Notifications
You must be signed in to change notification settings - Fork 567
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
breaking(utils): predictable atomWithDefault #1939
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 a206800:
|
Size Change: -147 B (0%) Total Size: 66.2 kB
ℹ️ View Unchanged
|
[![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 [pmndrs/jotai#1990 - fix(utils): revert atomWithStorage typing by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1994 - fix(utils): improve selectAtom typing by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1995 - fix(utils): improve unstable_unwrap for sometimes async atom by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1996 - fix(utils): unstable_unwrap to support writable atom by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1997 ##### New Contributors - [@​SariSabouh](https://togithub.com/SariSabouh) made their first contribution in [pmndrs/jotai#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 [pmndrs/jotai#1939 - breaking(utils): improve atomWithStorage by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1958 - feat(vanilla): new store listeners for devtools by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1966 - fix(build): mode env for "import" condition" by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1978 #### New Contributors - [@​reinierkaper-carewell](https://togithub.com/reinierkaper-carewell) made their first contribution in [pmndrs/jotai#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 [pmndrs/jotai#1933 - fix(vanilla): update atoms with tree structure dependencies (regression from v1) by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1959 - fix: prefer PromiseLike where appropriate by [@​dai-shi](https://togithub.com/dai-shi) in [pmndrs/jotai#1967 #### New Contributors - [@​blissdev](https://togithub.com/blissdev) made their first contribution in [pmndrs/jotai#1945 - [@​hwanyoungChoi](https://togithub.com/hwanyoungChoi) made their first contribution in [pmndrs/jotai#1957 - [@​alexhad6](https://togithub.com/alexhad6) made their first contribution in [pmndrs/jotai#1971 - [@​backbone87](https://togithub.com/backbone87) made their first contribution in [pmndrs/jotai#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).
I encountered some confusion regarding a breaking change while upgrading from version 2.1.x. Does this imply that if atomWithDefault is initially asynchronous, it will remain asynchronous consistently? I find the ability of atomWithDefault to transition from asynchronous to synchronous quite impressive. However, the current behavior seems weird: const asyncAtom = atomWithDefault(async () => {
await sleep(1000);
return "async";
});
const setAsyncAtom = atom(null, async (get, set) => {
await sleep(1000);
set(asyncAtom, Promise.resolve("update"));
}); here is codesandbox: https://codesandbox.io/p/sandbox/async-atom-and-update-hdp67v?file=%2Fsrc%2FApp.tsx%3A9%2C4 before this change, i could write in this way: const asyncAtom = atomWithDefault(async () => {
await sleep(1000);
return "async";
});
const setAsyncAtom = atom(null, async (get, set) => {
await sleep(1000);
set(asyncAtom, "update");
}); Did i do something wrong? |
Yes, and it's how Jotai v2 is designed for all async atoms, not specific only for atomWithDefault. And, Though, I think you can set a non-promise value. const anAtom = atomWithDefault<Promise<number> | number>(() => Promise.resolve(1));
const set = useSetAtom(anAtom);
set(2); I haven't looked your codesandbox, but is it a type only issue? |
Yes, i can write like this |
Related Issues or Discussions
Fixes #1937
Summary
As it turns out, the conversion of atomWithDefault from jotai v1 to jotai v2 wasn't very ideal. It's unnecessary complex and the behavior isn't very predictable.
This fixes it. However, it comes with breaking change.
Migration guide
Check List
yarn run prettier
for formatting code and docs