@atlaskit/node-data-provider 4.1.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/index.js +1 -232
  3. package/dist/es2019/index.js +0 -191
  4. package/dist/esm/index.js +0 -227
  5. package/dist/types/index.d.ts +0 -134
  6. package/dist/types-ts4.5/index.d.ts +0 -134
  7. package/package.json +6 -15
  8. package/cache/package.json +0 -15
  9. package/content/package.json +0 -15
  10. package/dist/cjs/cache.js +0 -145
  11. package/dist/cjs/consumption/_global-ndp-caches.js +0 -21
  12. package/dist/cjs/consumption/_internal-context.js +0 -77
  13. package/dist/cjs/consumption/_lru-cache.js +0 -45
  14. package/dist/cjs/consumption/content.js +0 -56
  15. package/dist/cjs/get-providers/confluence-page.js +0 -15
  16. package/dist/cjs/internal-types.js +0 -5
  17. package/dist/cjs/plugin-hooks.js +0 -100
  18. package/dist/cjs/providers/emoji.js +0 -54
  19. package/dist/es2019/cache.js +0 -96
  20. package/dist/es2019/consumption/_global-ndp-caches.js +0 -13
  21. package/dist/es2019/consumption/_internal-context.js +0 -71
  22. package/dist/es2019/consumption/_lru-cache.js +0 -30
  23. package/dist/es2019/consumption/content.js +0 -49
  24. package/dist/es2019/get-providers/confluence-page.js +0 -10
  25. package/dist/es2019/internal-types.js +0 -1
  26. package/dist/es2019/plugin-hooks.js +0 -69
  27. package/dist/es2019/providers/emoji.js +0 -26
  28. package/dist/esm/cache.js +0 -141
  29. package/dist/esm/consumption/_global-ndp-caches.js +0 -13
  30. package/dist/esm/consumption/_internal-context.js +0 -71
  31. package/dist/esm/consumption/_lru-cache.js +0 -38
  32. package/dist/esm/consumption/content.js +0 -49
  33. package/dist/esm/get-providers/confluence-page.js +0 -9
  34. package/dist/esm/internal-types.js +0 -1
  35. package/dist/esm/plugin-hooks.js +0 -93
  36. package/dist/esm/providers/emoji.js +0 -47
  37. package/dist/types/cache.d.ts +0 -61
  38. package/dist/types/consumption/_global-ndp-caches.d.ts +0 -8
  39. package/dist/types/consumption/_internal-context.d.ts +0 -32
  40. package/dist/types/consumption/_lru-cache.d.ts +0 -7
  41. package/dist/types/consumption/content.d.ts +0 -65
  42. package/dist/types/get-providers/confluence-page.d.ts +0 -6
  43. package/dist/types/internal-types.d.ts +0 -2
  44. package/dist/types/plugin-hooks.d.ts +0 -32
  45. package/dist/types/providers/emoji.d.ts +0 -10
  46. package/dist/types-ts4.5/cache.d.ts +0 -61
  47. package/dist/types-ts4.5/consumption/_global-ndp-caches.d.ts +0 -8
  48. package/dist/types-ts4.5/consumption/_internal-context.d.ts +0 -32
  49. package/dist/types-ts4.5/consumption/_lru-cache.d.ts +0 -7
  50. package/dist/types-ts4.5/consumption/content.d.ts +0 -65
  51. package/dist/types-ts4.5/get-providers/confluence-page.d.ts +0 -6
  52. package/dist/types-ts4.5/internal-types.d.ts +0 -2
  53. package/dist/types-ts4.5/plugin-hooks.d.ts +0 -32
  54. package/dist/types-ts4.5/providers/emoji.d.ts +0 -10
  55. package/emoji-provider/package.json +0 -15
  56. package/get-confluence-page-providers/package.json +0 -15
  57. package/plugin-hooks/package.json +0 -15
@@ -1,56 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.ContentNodeDataProviders = ContentNodeDataProviders;
8
- Object.defineProperty(exports, "__testOnly_resetGlobalNdpCachesContext", {
9
- enumerable: true,
10
- get: function get() {
11
- return _globalNdpCaches._resetGlobalNdpCachesContext;
12
- }
13
- });
14
- exports.useContentNodeDataProviders = useContentNodeDataProviders;
15
- var _react = _interopRequireDefault(require("react"));
16
- var _globalNdpCaches = require("./_global-ndp-caches");
17
- var _internalContext = require("./_internal-context");
18
- /* eslint-disable @atlaskit/editor/no-re-export */
19
- // Entry file
20
-
21
- var ContentNodeDataProvidersContext = /*#__PURE__*/_react.default.createContext(undefined);
22
-
23
- /**
24
- *
25
- * @example
26
- * ```tsx
27
- * <ContentNodeDataProviders
28
- * contentType="page" contentId="9001"
29
- * adf={doc}
30
- * placeholder={<Spinner />}
31
- * existingProvidersCache={ssrProvidersCache}
32
- * getNodeDataProviders={getPageNodeDataProviders}
33
- * onCacheWarmed={trackCacheWarmed}
34
- * >
35
- * <Editor />
36
- * </ContentNodeDataProviders>
37
- * ```
38
- */
39
- function ContentNodeDataProviders(props) {
40
- var contentNodeDataProviders = (0, _internalContext.useContentNodeDataProvidersSetup)({
41
- contentType: props.contentType,
42
- contentId: props.contentId
43
- }, {
44
- adfToUpdateWith: props.adf,
45
- existingProvidersCache: props.existingProvidersCache,
46
- getNodeDataProviders: props.getNodeDataProviders,
47
- onCacheWarmed: props.onCacheWarmed
48
- });
49
- return /*#__PURE__*/_react.default.createElement(ContentNodeDataProvidersContext.Provider, {
50
- value: contentNodeDataProviders
51
- }, props.children);
52
- }
53
- function useContentNodeDataProviders() {
54
- var contentNodeDataProvidersContext = _react.default.useContext(ContentNodeDataProvidersContext);
55
- return contentNodeDataProvidersContext;
56
- }
@@ -1,15 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.getConfluencePageProviders = getConfluencePageProviders;
7
- var _emoji = require("../providers/emoji");
8
- function getConfluencePageProviders(_ref) {
9
- var emojiProvider = _ref.emojiProvider;
10
- return {
11
- emoji: (0, _emoji.createEmojiNodeDataProvider)({
12
- emojiProvider: emojiProvider
13
- })
14
- };
15
- }
@@ -1,5 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
@@ -1,100 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.useNodeDataProviderGet = useNodeDataProviderGet;
8
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
10
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
- var _react = require("react");
13
- /**
14
- *
15
- *
16
- * This hook is intended to simplify accessing data via the one tick providers.
17
- *
18
- * ```ts
19
- * const value = useNodeDataProviderGet(emojiProvider, emojiNode);
20
- *
21
- * if (value.state === 'loading') {
22
- * return <Loading />;
23
- * }
24
- * if (value.state === 'failed') {
25
- * return <Fallback />;
26
- * }
27
- * return <Emoji properties=(value.result) />
28
- * ```
29
- */
30
- function useNodeDataProviderGet(options) {
31
- var getResult = (0, _react.useMemo)(
32
- // Ignored via go/ees005
33
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
34
- function () {
35
- return options.provider.get(options.node);
36
- }, [options.provider, options.node]);
37
- var _useState = (0, _react.useState)(getResult !== undefined && !isPromise(getResult) ? getResult : undefined),
38
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
39
- resolved = _useState2[0],
40
- setResolved = _useState2[1];
41
- (0, _react.useEffect)(function () {
42
- if (!isPromise(getResult)) {
43
- return;
44
- }
45
- var cancelled = false;
46
- (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
47
- var _resolved;
48
- return _regenerator.default.wrap(function _callee$(_context) {
49
- while (1) switch (_context.prev = _context.next) {
50
- case 0:
51
- _context.prev = 0;
52
- _context.next = 3;
53
- return getResult;
54
- case 3:
55
- _resolved = _context.sent;
56
- if (!cancelled) {
57
- if (_resolved === undefined) {
58
- setResolved('error');
59
- } else {
60
- setResolved(_resolved);
61
- }
62
- }
63
- _context.next = 10;
64
- break;
65
- case 7:
66
- _context.prev = 7;
67
- _context.t0 = _context["catch"](0);
68
- setResolved('error');
69
- case 10:
70
- case "end":
71
- return _context.stop();
72
- }
73
- }, _callee, null, [[0, 7]]);
74
- }))();
75
- return function () {
76
- cancelled = true;
77
- };
78
- }, [getResult]);
79
- if (resolved === undefined) {
80
- return {
81
- state: 'loading',
82
- result: undefined
83
- };
84
- }
85
- if (resolved === 'error') {
86
- return {
87
- state: 'failed',
88
- result: undefined
89
- };
90
- }
91
- return {
92
- state: 'resolved',
93
- result: resolved
94
- };
95
- }
96
- function isPromise(obj) {
97
- return !!obj && ((0, _typeof2.default)(obj) === 'object' || typeof obj === 'function') &&
98
- // @ts-ignore
99
- typeof obj.then === 'function';
100
- }
@@ -1,54 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.createEmojiNodeDataProvider = createEmojiNodeDataProvider;
8
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
- var _index = require("../index");
11
- function createEmojiNodeDataProvider(_ref) {
12
- var emojiProvider = _ref.emojiProvider,
13
- existingCache = _ref.existingCache;
14
- var emojiNodeDataProvider = new _index.NodeDataProvider({
15
- existingCache: existingCache,
16
- nodeName: 'emoji',
17
- nodeToKey: function nodeToKey(node) {
18
- var key = "".concat(node.attrs.id, "-").concat(node.attrs.shortName, "-").concat(node.attrs.text);
19
- return key;
20
- },
21
- resolve: function resolve(node, _resolveOptions) {
22
- return (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
23
- var emojiDescriptionWithVariations;
24
- return _regenerator.default.wrap(function _callee$(_context) {
25
- while (1) switch (_context.prev = _context.next) {
26
- case 0:
27
- _context.next = 2;
28
- return emojiProvider;
29
- case 2:
30
- _context.next = 4;
31
- return _context.sent.fetchByEmojiId({
32
- id: node.attrs.id,
33
- shortName: node.attrs.shortName,
34
- fallback: node.attrs.text
35
- }, true);
36
- case 4:
37
- emojiDescriptionWithVariations = _context.sent;
38
- if (emojiDescriptionWithVariations) {
39
- _context.next = 7;
40
- break;
41
- }
42
- throw new Error('Could not resolve emoji');
43
- case 7:
44
- return _context.abrupt("return", emojiDescriptionWithVariations);
45
- case 8:
46
- case "end":
47
- return _context.stop();
48
- }
49
- }, _callee);
50
- }))();
51
- }
52
- });
53
- return emojiNodeDataProvider;
54
- }
@@ -1,96 +0,0 @@
1
- import { traverse } from '@atlaskit/adf-utils/traverse';
2
-
3
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
4
-
5
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6
-
7
- /**
8
- * Builds {@link NodeDataProvider}s caches for a document.
9
- *
10
- * It will traverse the document and call the resolve method for each node.
11
- * When all promises are resolved, NodeDataProviders will have their caches populated.
12
- *
13
- * The providers will then be ready for use with an Editor.
14
- *
15
- * To limit the time spent building the cache, a signal can be provided to abort the request.
16
- *
17
- * ## Usage
18
- *
19
- * @example
20
- * ```ts
21
- * buildCaches({
22
- * adf: doc,
23
- * nodeDataProviders: { emoji: emojiNodeDataProvider, ... },
24
- * signal: AbortSignal.timeout(5000),
25
- * });
26
- * ```
27
- *
28
- * ### Using caches
29
- *
30
- * To make use of a cache in another provider (ie. for a cache created on the server), you can retrieve the cache
31
- * from the provider and pass it to the new provider.
32
- *
33
- * @example
34
- * ```tsx
35
- * // SSR env
36
- * const ssrProvidersCaches = await buildCaches({adf, nodeDataProviders: { emoji }})
37
- *
38
- * // Client env (providersCaches is the cache from the server)
39
- * <ContentNodeDataProviders ... existingProvidersCache={ssrProvidersCaches} />
40
- * ```
41
- *
42
- * *Note:* On the client - buildCache is not expected to be used directly.
43
- *
44
- * @see {@link ContentNodeDataProviders} for expected client usage.
45
- */
46
- export async function buildCaches({
47
- adf,
48
- nodeDataProviders,
49
- signal = new AbortController().signal,
50
- existingProvidersCache
51
- }) {
52
- const visitors = {};
53
- const promises = [];
54
- for (const _nodeDataProvider of Object.values(nodeDataProviders)) {
55
- // widen type to avoid typescript errors with the specific node data provider types
56
- const nodeDataProvider = _nodeDataProvider;
57
- if (existingProvidersCache && existingProvidersCache[nodeDataProvider.nodeName]) {
58
- nodeDataProvider.updateCache(existingProvidersCache[nodeDataProvider.nodeName], {
59
- strategy: 'merge-override'
60
- });
61
- }
62
- visitors[nodeDataProvider.nodeName] = node => {
63
- const result = nodeDataProvider.get(node, {
64
- signal
65
- });
66
- if (!isPromise(result)) {
67
- nodeDataProvider.cache[nodeDataProvider.nodeToKey(node)] = result;
68
- return;
69
- }
70
- promises.push(result);
71
- result.then(resolvedValue => {
72
- const signalAborted = signal ? signal.aborted : false;
73
- if (!signalAborted && resolvedValue !== undefined) {
74
- nodeDataProvider.cache[nodeDataProvider.nodeToKey(node)] = resolvedValue;
75
- }
76
- });
77
- return undefined;
78
- };
79
- }
80
- if (adf) {
81
- traverse(adf, visitors);
82
- await Promise.all(promises);
83
- } else {
84
- await Promise.resolve();
85
- }
86
- const caches = {};
87
- for (const nodeDataProvider of Object.values(nodeDataProviders)) {
88
- caches[nodeDataProvider.nodeName] = nodeDataProvider.cache;
89
- }
90
- return caches;
91
- }
92
- function isPromise(obj) {
93
- return !!obj && (typeof obj === 'object' || typeof obj === 'function') &&
94
- // @ts-ignore
95
- typeof obj.then === 'function';
96
- }
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- let GlobalNdpCachesContext = /*#__PURE__*/React.createContext({});
3
- export function useGlobalNdpCachesContext() {
4
- const globalNdpCachesContextValue = React.useContext(GlobalNdpCachesContext);
5
- return globalNdpCachesContextValue;
6
- }
7
-
8
- // The ndp caches currently use module scope to store the caches. This is not ideal, and a global provider
9
- // will avoid the need for this.
10
- // This function is used to reset the global ndp caches context in tests.
11
- export function _resetGlobalNdpCachesContext() {
12
- GlobalNdpCachesContext = /*#__PURE__*/React.createContext({});
13
- }
@@ -1,71 +0,0 @@
1
- import React from 'react';
2
- import { buildCaches } from '../cache';
3
- import { useGlobalNdpCachesContext } from './_global-ndp-caches';
4
- import { LRUCache } from './_lru-cache';
5
-
6
- /**
7
- * The settings for the data providers lru cache,
8
- * increasing the value will increase the number of data providers that can be stored in the cache.
9
- */
10
- const lruCacheSettings = {
11
- page: 5,
12
- default: 1
13
- };
14
-
15
- /**
16
- * Sets up nodeview data providers for a content node.
17
- *
18
- * This will return the cached node data providers if they exist, otherwise it will call the provided getNodeDataProviders function.
19
- *
20
- * Note: Calling this has side effects where caches for the nodeview data providers will continue to be built
21
- * in the background after this resolves to a set of nodeview data providers that can be used.
22
- */
23
- export function useContentNodeDataProvidersSetup(content,
24
- /**
25
- * Note: changes to this object will not be reflected in the cache.
26
- */
27
- setupOptions) {
28
- const _globalNdpCachesContextValue = useGlobalNdpCachesContext();
29
- // Create a cache for the content type if it doesn't exist
30
- // While this will not result in any existing context consumers getting the updated value.
31
- // It will ensure that the cache is available for future consumers.
32
- if (_globalNdpCachesContextValue[content.contentType] === undefined) {
33
- var _lruCacheSettings$con;
34
- _globalNdpCachesContextValue[content.contentType] = new LRUCache((_lruCacheSettings$con = lruCacheSettings[content.contentType]) !== null && _lruCacheSettings$con !== void 0 ? _lruCacheSettings$con : lruCacheSettings.default);
35
- }
36
- const contentTypeNdpCaches = _globalNdpCachesContextValue[content.contentType];
37
-
38
- // The node data providers should only be rebuilt if the content changes
39
- // to avoid unnecessary rebuilding of the cache.
40
- // useRef is used over useMemo as use memo is not a guarantee that the value will be reused
41
- // - in development it can be called twice
42
- // - react have made clear that in future versions useMemo may add features that throw away the cache, and [recommend refs](https://react.dev/reference/react/useMemo#caveats) for this use case.
43
- const currentContentKey = `${content.contentType}-${content.contentId}`;
44
- const contentKeyRef = React.useRef();
45
- const nodeDataProvidersRef = React.useRef();
46
- if (contentKeyRef.current !== currentContentKey) {
47
- contentKeyRef.current = currentContentKey;
48
- const cachedContentNdps = contentTypeNdpCaches === null || contentTypeNdpCaches === void 0 ? void 0 : contentTypeNdpCaches.get(content.contentId);
49
- const nodeDataProviders = cachedContentNdps || setupOptions.getNodeDataProviders();
50
-
51
- /**
52
- * Note: while this will remove old NodeDataProviders from the cache -- these are passed directly to consumers,
53
- * so removing from the cache will not result in actively used NodeDataProviders being deleted in some way.
54
- *
55
- */
56
- contentTypeNdpCaches.set(content.contentId, nodeDataProviders);
57
- buildCaches({
58
- adf: setupOptions.adfToUpdateWith,
59
- nodeDataProviders: nodeDataProviders,
60
- existingProvidersCache: setupOptions.existingProvidersCache
61
- }).then(warmedNodeDataProvidersCache => {
62
- var _setupOptions$onCache;
63
- (_setupOptions$onCache = setupOptions.onCacheWarmed) === null || _setupOptions$onCache === void 0 ? void 0 : _setupOptions$onCache.call(setupOptions, {
64
- warmedNodeDataProvidersCache,
65
- nodeDataProviders
66
- });
67
- });
68
- nodeDataProvidersRef.current = nodeDataProviders;
69
- }
70
- return nodeDataProvidersRef.current;
71
- }
@@ -1,30 +0,0 @@
1
- export class LRUCache {
2
- constructor(capacity) {
3
- this.capacity = capacity;
4
- this.cache = new Map();
5
- }
6
- get(key) {
7
- if (!this.cache.has(key)) {
8
- return undefined;
9
- }
10
-
11
- // Move the used key to the end to mark it as most recently used
12
- // Ignored via go/ees005
13
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
14
- const value = this.cache.get(key);
15
- this.cache.delete(key);
16
- this.cache.set(key, value);
17
- return value;
18
- }
19
- set(key, value) {
20
- // Check if the key already exists and delete it to update its position
21
- if (this.cache.has(key)) {
22
- this.cache.delete(key);
23
- } else if (this.cache.size >= this.capacity) {
24
- // Remove the first (least recently used) cache item if we're at capacity
25
- const firstKey = this.cache.keys().next().value;
26
- this.cache.delete(firstKey);
27
- }
28
- this.cache.set(key, value);
29
- }
30
- }
@@ -1,49 +0,0 @@
1
- /* eslint-disable @atlaskit/editor/no-re-export */
2
- // Entry file
3
-
4
- import React from 'react';
5
- import { _resetGlobalNdpCachesContext } from './_global-ndp-caches';
6
- import { useContentNodeDataProvidersSetup } from './_internal-context';
7
- const ContentNodeDataProvidersContext = /*#__PURE__*/React.createContext(undefined);
8
-
9
- /**
10
- *
11
- * @example
12
- * ```tsx
13
- * <ContentNodeDataProviders
14
- * contentType="page" contentId="9001"
15
- * adf={doc}
16
- * placeholder={<Spinner />}
17
- * existingProvidersCache={ssrProvidersCache}
18
- * getNodeDataProviders={getPageNodeDataProviders}
19
- * onCacheWarmed={trackCacheWarmed}
20
- * >
21
- * <Editor />
22
- * </ContentNodeDataProviders>
23
- * ```
24
- */
25
- export function ContentNodeDataProviders(props) {
26
- const contentNodeDataProviders = useContentNodeDataProvidersSetup({
27
- contentType: props.contentType,
28
- contentId: props.contentId
29
- }, {
30
- adfToUpdateWith: props.adf,
31
- existingProvidersCache: props.existingProvidersCache,
32
- getNodeDataProviders: props.getNodeDataProviders,
33
- onCacheWarmed: props.onCacheWarmed
34
- });
35
- return /*#__PURE__*/React.createElement(ContentNodeDataProvidersContext.Provider, {
36
- value: contentNodeDataProviders
37
- }, props.children);
38
- }
39
- export function useContentNodeDataProviders() {
40
- const contentNodeDataProvidersContext = React.useContext(ContentNodeDataProvidersContext);
41
- return contentNodeDataProvidersContext;
42
- }
43
- export {
44
- /**
45
- * Exported for testing purposes only.
46
- *
47
- * This API will change.
48
- */
49
- _resetGlobalNdpCachesContext as __testOnly_resetGlobalNdpCachesContext };
@@ -1,10 +0,0 @@
1
- import { createEmojiNodeDataProvider } from '../providers/emoji';
2
- export function getConfluencePageProviders({
3
- emojiProvider
4
- }) {
5
- return {
6
- emoji: createEmojiNodeDataProvider({
7
- emojiProvider
8
- })
9
- };
10
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,69 +0,0 @@
1
- import { useEffect, useMemo, useState } from 'react';
2
- /**
3
- *
4
- *
5
- * This hook is intended to simplify accessing data via the one tick providers.
6
- *
7
- * ```ts
8
- * const value = useNodeDataProviderGet(emojiProvider, emojiNode);
9
- *
10
- * if (value.state === 'loading') {
11
- * return <Loading />;
12
- * }
13
- * if (value.state === 'failed') {
14
- * return <Fallback />;
15
- * }
16
- * return <Emoji properties=(value.result) />
17
- * ```
18
- */
19
- export function useNodeDataProviderGet(options) {
20
- const getResult = useMemo(
21
- // Ignored via go/ees005
22
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
23
- () => options.provider.get(options.node), [options.provider, options.node]);
24
- const [resolved, setResolved] = useState(getResult !== undefined && !isPromise(getResult) ? getResult : undefined);
25
- useEffect(() => {
26
- if (!isPromise(getResult)) {
27
- return;
28
- }
29
- let cancelled = false;
30
- (async function () {
31
- try {
32
- const resolved = await getResult;
33
- if (!cancelled) {
34
- if (resolved === undefined) {
35
- setResolved('error');
36
- } else {
37
- setResolved(resolved);
38
- }
39
- }
40
- } catch {
41
- setResolved('error');
42
- }
43
- })();
44
- return () => {
45
- cancelled = true;
46
- };
47
- }, [getResult]);
48
- if (resolved === undefined) {
49
- return {
50
- state: 'loading',
51
- result: undefined
52
- };
53
- }
54
- if (resolved === 'error') {
55
- return {
56
- state: 'failed',
57
- result: undefined
58
- };
59
- }
60
- return {
61
- state: 'resolved',
62
- result: resolved
63
- };
64
- }
65
- function isPromise(obj) {
66
- return !!obj && (typeof obj === 'object' || typeof obj === 'function') &&
67
- // @ts-ignore
68
- typeof obj.then === 'function';
69
- }
@@ -1,26 +0,0 @@
1
- import { NodeDataProvider } from '../index';
2
- export function createEmojiNodeDataProvider({
3
- emojiProvider,
4
- existingCache
5
- }) {
6
- const emojiNodeDataProvider = new NodeDataProvider({
7
- existingCache,
8
- nodeName: 'emoji',
9
- nodeToKey: node => {
10
- const key = `${node.attrs.id}-${node.attrs.shortName}-${node.attrs.text}`;
11
- return key;
12
- },
13
- async resolve(node, _resolveOptions) {
14
- const emojiDescriptionWithVariations = await (await emojiProvider).fetchByEmojiId({
15
- id: node.attrs.id,
16
- shortName: node.attrs.shortName,
17
- fallback: node.attrs.text
18
- }, true);
19
- if (!emojiDescriptionWithVariations) {
20
- throw new Error('Could not resolve emoji');
21
- }
22
- return emojiDescriptionWithVariations;
23
- }
24
- });
25
- return emojiNodeDataProvider;
26
- }