UNPKG

@shopify/react-async

Version:

Tools for creating powerful, asynchronously-loaded React components

110 lines (102 loc) 2.99 kB
'use strict'; 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;