Releases: jotaijs/jotai-effect
v1.1.4
🚀 Highlights
1. New observe
API for Managing Side-Effects
PR: #55
This release introduces the observe
API, a lightweight and flexible utility for managing global side effects in Jotai. observe
allows you to subscribe to state changes on a Jotai store and execute reactive logic without being tied to React's lifecycle.
Example Usage
import { observe } from 'jotai-effect'
observe((get, set) => {
set(logAtom, `someAtom changed: ${get(someAtom)}`)
})
Usage With React
When using a Jotai Provider, pass the store to both observe
and the Provider
to ensure the effect is mounted on the correct store.
const store = createStore()
observe((get, set) => {
set(logAtom, `someAtom changed: ${get(someAtom)}`)
}, store)
<Provider store={store}>...</Provider>
observe
makes managing Jotai state-dependent logic simpler and more ergonomic. Check out the documentation for more details.
2. Repository Modernization
PR: #57
This release also modernizes the repository to align with the latest development standards:
- Switched to Vite + Vitest for faster builds and modern testing.
- Updated TypeScript and ESLint Configurations to leverage modern tooling.
- Improved Repository Structure by renaming
__tests__
totests
and removing outdated examples. - Enhanced README Clarity to simplify onboarding and usage.
📦 Installation
To update to v1.1.4
, run:
npm install jotai-effect@1.1.4
We hope you enjoy these updates! Feedback and contributions are always welcome. Open an issue if you encounter any problems.
v1.0.7
v1.0.6
v1.0.5
What's Changed
- atomEffect should not suspend the component by @dmaskasky in #45
Full Changelog: v1.0.4...v1.0.5
v1.0.2
- Addresses a compatibility issue with jotai@2.9.0 that caused atomEffects to lose their dependencies during recomputations.
- Introduces a new utility helper
withAtomEffect
Usage
const anAtom = atom(0)
// the effect is automatically added to the resulting atom
// setting the resulting atom is forwarded to the atom passed in
const anAtomWithEffect = withAtomEffect(anAtom, (get, set) => {
console.log(`anAtom value is now ${get(anAtom)}`)
})
...
const [value, setValue] = useAtom(anAtomWithEffect)
v1.0.0
I am thrilled to announce the release of Jotai Effect version 1.0! This milestone represents a significant achievement marking its readiness for production use.
Jotai Effect was started last October with the aim of providing a utility package for reactive side effects within the Jotai ecosystem. Over the past six months, I have been closely monitoring the API's stability and its effectiveness in real-world applications.
For those eagerly waiting for Jotai to be considered production-ready, the moment has finally arrived. The feedback from our community has been overwhelmingly positive, and today, I'm confident that Jotai Effect is ready for its prime time.
I couldn't have reached this point without the help of our amazing contributors, Daishi Kato (@dai-shi) and Alex Yang (@himself65). Their early contributions were pivotal in honing the library to what it is today. Additionally, I want to extend my gratitude to our vibrant community on Discord for their continuous support and feedback.
Thank you.
As we celebrate this release, I encourage you to explore Jotai Effect and discover how it can streamline your reactive programming workflows. Happy Coding!
Best regards,
David Maskasky
The full discussion can be viewed here.
v0.6.0
What's Changed
- rethrow errors thrown during effectFn and cleanup by @dmaskasky in #33
Full Changelog: v0.5.0...v0.6.0
v0.5.0
Adds support for reading an atom's value without subscribing to it.
Read atom data without subscribing to changes with get.peek
.
const countAtom = atom(0)
atomEffect((get, set) => {
// will not rerun when countAtom changes
const count = get.peek(countAtom)
})
What's Changed
- feat: get.peek reads atom value without subscribing to updates by @dmaskasky in #30
Full Changelog: v0.4.0...v0.5.0
v0.4.0
Adds support for recursion. 🥳
Recursion is supported with set.recurse for both sync and async use cases, but is not supported in the cleanup function.
const countAtom = atom(0)
atomEffect((get, set) => {
// increments count once per second
const count = get(countAtom)
const timeoutId = setTimeout(() => {
set.recurse(countAtom, increment)
}, 1000)
return () => clearTimeout(timeoutId)
})
What's Changed
- Recurse by @dmaskasky in #29
Full Changelog: v0.3.2...v0.4.0