import * as React from 'react' import { TSR_DEFERRED_PROMISE, defer } from '@tanstack/router-core' import type { DeferredPromise } from '@tanstack/router-core' export type AwaitOptions = { promise: Promise } export function useAwaited({ promise: _promise, }: AwaitOptions): [T, DeferredPromise] { const promise = defer(_promise) if (promise[TSR_DEFERRED_PROMISE].status === 'pending') { throw promise } if (promise[TSR_DEFERRED_PROMISE].status === 'error') { throw promise[TSR_DEFERRED_PROMISE].error } return [promise[TSR_DEFERRED_PROMISE].data, promise] } export function Await( props: AwaitOptions & { fallback?: React.ReactNode children: (result: T) => React.ReactNode }, ) { const inner = if (props.fallback) { return {inner} } return inner } function AwaitInner( props: AwaitOptions & { fallback?: React.ReactNode children: (result: T) => React.ReactNode }, ): React.JSX.Element { const [data] = useAwaited(props) return props.children(data) as React.JSX.Element }