UNPKG

react-email

Version:

A live preview of your emails right in your browser.

35 lines (28 loc) 755 B
interface PromiseState { promise: Promise<unknown>; error?: unknown; result?: unknown; } const promiseStates = new Map<string, PromiseState>(); export function useSuspensedPromise<Result>( promiseFn: () => Promise<Result>, key: string, ) { const previousState = promiseStates.get(key); if (previousState) { if ('error' in previousState) { throw previousState.error; } if ('result' in previousState) { return previousState.result as Result; } throw previousState.promise; } const state: PromiseState = { promise: promiseFn() .then((result) => (state.result = result)) .catch((error) => (state.error = error as unknown)), }; promiseStates.set(key, state); throw state.promise; }