@atlaskit/editor-plugin-paste-options-toolbar
Version:
Paste options toolbar for @atlaskit/editor-core
43 lines (42 loc) • 1.48 kB
JavaScript
/** 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]));
}