React hooks
import * as MR from 'mutoid/react'
useSelector
const userName = useSelector(store, s => s.userName)
useMutation
const m = useMutation(store, mutation)
useResourceFetcher
Deprecated. Use instead useFetchReaderObservableResource. You can also use useFetchObservableResource, but useFetchReaderObservableResource is a better solution.
useFetchReaderObservableResource
import { ajax } from 'rxjs/ajax'
import * as RES from 'mutoid/http/Resource'
import * as ROR from 'mutoid/http/ReaderObservableResource'
import * as OR from 'mutoid/http/ObservableResource'
import { useFetchReaderObservableResource } from 'mutoid/react'
import { pipe } from 'fp-ts/function'
import * as t from 'io-ts'
export const userDecoders = {
200: t.type({
name: t.string,
}).decode,
}
export const userFetcher = (id: number) => (deps: { ajax: typeof ajax }) =>
OR.fromAjax(deps.ajax(`https://api.io/user/${id}`), userDecoders)
const App: React.FC<{ id: number }> = ({ id }) => {
const [userResource, dispatch, resetState] = useFetchReaderObservableResource(userFetcher, { ajax })
React.useEffect(() => {
dispatch(id)
}, [dispatch, id])
return (
<>
<h1>Hello</h1>
<p>
{pipe(
userResource,
RES.matchD({
onPending: () => 'loading...',
onDone: r => r.payload.name,
onFail: e => e.type,
})
)}
</p>
<button onClick={() => dispatch(id)} type="button">
Refetch
</button>
<button onClick={resetState} type="button">
Reset
</button>
</>
)
}
All unsubscriptions are automatically managed by the Hook and you don't need to care about it in your useEffect.
useFetchObservableResource
Same as useFetchReaderObservableResource, the only difference is the input ObservableResource instead of ReaderObservableResource.
useStore
If you have a lazy store, you can use the following hook to maintain the ref over the renders:
const appStore = () => MS.ctor({ name: 'appStore', initState: { userName: 'Marco' } })
const appStoreRef = useStore(appStore)