@shopify/react-async
Version:
Tools for creating powerful, asynchronously-loaded React components
110 lines (102 loc) • 2.99 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var async = require('@shopify/async');
var reactIdle = require('@shopify/react-idle');
var hooks = require('./hooks.js');
var types = require('./types.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
function createAsyncContext({
id,
load
}) {
const resolver = async.createResolver({
id,
load
});
const Context = /*#__PURE__*/React__default["default"].createContext(null);
// Just like a "normal" value returned from `createContext`, rendering
// the value itself is not supported. This component is just a placeholder
// to provide a more useful error.
function Root() {
throw new Error('Do not attempt to render the result of calling `createAsyncContext()` directly. Render its `.Provider` component instead.');
}
function Provider(props) {
const {
load,
resolved
} = hooks.useAsync(resolver, {
assets: types.AssetTiming.Immediate
});
React.useEffect(() => {
load();
}, [load]);
return /*#__PURE__*/React__default["default"].createElement(Context.Provider, Object.assign({
value: resolved
}, props));
}
function Consumer(props) {
return /*#__PURE__*/React__default["default"].createElement(Context.Consumer, props);
}
function usePreload() {
return hooks.useAsync(resolver, {
assets: types.AssetTiming.NextPage
}).load;
}
function Preload() {
const preload = usePreload();
reactIdle.useIdleCallback(preload);
return null;
}
function Prefetch() {
const preload = usePreload();
React.useEffect(() => {
preload();
}, [preload]);
return null;
}
const FinalComponent = Root;
Reflect.defineProperty(FinalComponent, 'resolver', {
value: resolver,
writable: false
});
Reflect.defineProperty(FinalComponent, 'Provider', {
value: Provider,
writable: false
});
Reflect.defineProperty(FinalComponent, 'Consumer', {
value: Consumer,
writable: false
});
Reflect.defineProperty(FinalComponent, 'Context', {
value: Context,
writable: false
});
Reflect.defineProperty(FinalComponent, 'Preload', {
value: Preload,
writable: false
});
Reflect.defineProperty(FinalComponent, 'Prefetch', {
value: Prefetch,
writable: false
});
Reflect.defineProperty(FinalComponent, 'KeepFresh', {
value: Preload,
writable: false
});
Reflect.defineProperty(FinalComponent, 'usePreload', {
value: usePreload,
writable: false
});
Reflect.defineProperty(FinalComponent, 'usePrefetch', {
value: usePreload,
writable: false
});
Reflect.defineProperty(FinalComponent, 'useKeepFresh', {
value: usePreload,
writable: false
});
return FinalComponent;
}
exports.createAsyncContext = createAsyncContext;