UNPKG

@atlaskit/editor-nodeview-data-provider

Version:

NodeView data provider for @atlaskit/editor-core plugins

129 lines (125 loc) 4.13 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useNodeViewDataProvider = useNodeViewDataProvider; exports.useNodeViewDataProviderGet = useNodeViewDataProviderGet; exports.useNodeViewDataProviderValue = useNodeViewDataProviderValue; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); function useNodeViewDataProvider() { // Implementation pending } // re exported to avoid type issues // this type is only used in jsdoc comments in this file. /** * Access the value via {@link NodeViewDataProvider} when cached. * * It will return the value of the provider if it is already available. * * For more information on building caches, see {@link buildCaches}. * * @example * ```ts * await buildCaches({ adf, oneTickProviders: [emojiNodeViewDataProvider] }); * const value = useNodeViewDataProviderValue({ provider: emojiNodeViewDataProvider, node }); * if (value) { * return <SinglePassRenderEmoji emoji={value} />; * } * return <LegacyMultiPassRenderEmoji node={node} />; * ``` */ function useNodeViewDataProviderValue(options) { var providerValue = (0, _react.useMemo)(function () { return options.provider.cache[options.provider.nodeToKey(options.node)]; }, [options.provider, options.node]); return providerValue; } // The following hooks are not expected to be used with the initial experimentation of the NodeViewDataProvider // and are not covered in the initial tests. // They are provided as a reference /** * * * This hook is intended to simplify accessing data via the one tick providers. * * ```ts * const value = useNodeViewDataProviderGet(emojiProvider, emojiNode); * * if (value.state === 'loading') { * return <Loading />; * } * if (value.state === 'failed') { * return <Fallback />; * } * return <Emoji properties=(value.result) /> * ``` */ function useNodeViewDataProviderGet(options) { var getResult = (0, _react.useMemo)(function () { return options.provider.get(options.node); }, [options.provider, options.node]); var _useState = (0, _react.useState)(getResult !== undefined && !isPromise(getResult) ? getResult : undefined), _useState2 = (0, _slicedToArray2.default)(_useState, 2), resolved = _useState2[0], setResolved = _useState2[1]; (0, _react.useEffect)(function () { if (!isPromise(getResult)) { return; } var cancelled = false; (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { var _resolved; return _regenerator.default.wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return getResult; case 3: _resolved = _context.sent; if (!cancelled) { setResolved(_resolved); } _context.next = 10; break; case 7: _context.prev = 7; _context.t0 = _context["catch"](0); setResolved('error'); case 10: case "end": return _context.stop(); } }, _callee, null, [[0, 7]]); }))(); return function () { cancelled = true; }; }, [getResult]); if (resolved === undefined) { return { state: 'loading', result: undefined }; } if (resolved === 'error') { return { state: 'failed', result: undefined }; } return { state: 'resolved', result: resolved }; } function isPromise(obj) { return !!obj && ((0, _typeof2.default)(obj) === 'object' || typeof obj === 'function') && // @ts-ignore typeof obj.then === 'function'; }