import type { Selector } from '@legendapp/state'; import { computeSelector, isObservableValueReady } from '@legendapp/state'; import { createElement, FC, ReactElement, ReactNode } from 'react'; import { useSelector } from './useSelector'; interface PropsIf { if: Selector; ifReady?: never; } interface PropsIfReady { if?: never; ifReady: Selector; } interface PropsBase { else?: ReactNode | (() => ReactNode); wrap?: FC; children: ReactNode | ((value?: T) => ReactNode); } type Props = PropsBase & (PropsIf | PropsIfReady); export function Show(props: Props): ReactElement; export function Show({ if: if_, ifReady, else: else_, wrap, children }: Props): ReactElement { const child = useSelector(() => { const value = computeSelector(if_ ?? ifReady); const child = computeSelector( (ifReady !== undefined ? isObservableValueReady(value) : value) ? children : else_ ? else_ : null, ); return child; }); return wrap ? createElement(wrap, undefined, child) : child; }