UNPKG

@atlaskit/editor-plugin-paste-options-toolbar

Version:

Paste options toolbar for @atlaskit/editor-core

43 lines (42 loc) 1.48 kB
/** How long to wait for each `isAsyncHidden` check before treating it as hidden. */ export const ASYNC_HIDDEN_TIMEOUT_MS = 3000; const hasAsyncHidden = component => typeof component.isAsyncHidden === 'function'; const rejectOnTimeout = (promise, timeoutMs) => { let timeoutId; const timeoutPromise = new Promise((_, reject) => { timeoutId = setTimeout(() => reject(new Error('isAsyncHidden timeout')), timeoutMs); }); return Promise.race([promise.finally(() => { if (timeoutId !== undefined) { clearTimeout(timeoutId); } }), timeoutPromise]); }; const evaluateComponentAsyncHidden = async (component, context) => { try { const hidden = await rejectOnTimeout(component.isAsyncHidden(context), ASYNC_HIDDEN_TIMEOUT_MS); return { key: component.key, hidden }; } catch { return { key: component.key, hidden: true }; } }; /** * Evaluates all `isAsyncHidden` functions in parallel. * Each check is raced against a timeout; timeouts and errors are hidden. * * Returns a plain object that maps each component key to its hidden state. * Components without `isAsyncHidden` are not present in the result. */ export async function evaluateAsyncHidden(components, context) { const results = await Promise.all(components.filter(hasAsyncHidden).map(component => evaluateComponentAsyncHidden(component, context))); return Object.fromEntries(results.map(({ key, hidden }) => [key, hidden])); }