jotai
Version:
👻 Primitive and flexible state management for React
45 lines (44 loc) • 1.27 kB
JavaScript
'use client';
import React from 'react';
import { isPromiseLike } from './continuablePromise.js';
import { useAtomValueRaw } from './useAtomValueRaw.js';
const attachPromiseStatus = (promise) => {
if (!promise.status) {
promise.status = 'pending';
promise.then((v) => {
promise.status = 'fulfilled';
promise.value = v;
}, (e) => {
promise.status = 'rejected';
promise.reason = e;
});
}
};
const use = React.use ||
// A shim for older React versions
((promise) => {
if (promise.status === 'pending') {
throw promise;
}
else if (promise.status === 'fulfilled') {
return promise.value;
}
else if (promise.status === 'rejected') {
throw promise.reason;
}
else {
attachPromiseStatus(promise);
throw promise;
}
});
export function useAtomValue(atom, options) {
const { unstable_promiseStatus: promiseStatus = !React.use } = options || {};
const value = useAtomValueRaw(atom, options);
if (isPromiseLike(value)) {
if (promiseStatus) {
attachPromiseStatus(value);
}
return use(value);
}
return value;
}