import * as React from 'react';
import { _, renderChildren, Children } from '../../utils';
export const Then = ({ children }: { children?: Children }) => {
return (renderChildren(children)) as JSX.Element;
};
export const Else = ({ children }: { children?: Children }) => {
return (renderChildren(children)) as JSX.Element;
};
export function If({
condition,
children,
}: {
condition: boolean | (() => boolean);
children?: Children;
}): JSX.Element | null {
if (!children || children === null) {
return null;
}
if (typeof children === 'function') {
return _(condition) ? children() : null;
}
const elseTypes = React.useMemo(() => ([
().type,
().type
]), []);
const thenTypes = React.useMemo(() => ([
().type,
().type
]), []);
if (typeof children === 'string'
|| typeof children === 'number'
|| typeof children === 'boolean'
|| (!Array.isArray(children) && !elseTypes.includes((children as any).type))
) {
return _(condition) ? <>{children}> : null;
}
const options = (Array.isArray(children) ? children : [children]);
const thens = options.filter((child: any) => !elseTypes.includes(child!.type)) || null;
const elses = options.filter((child: any) => !thenTypes.includes(child!.type)) || null;
if (_(condition)) {
if (thens && thens.length > 1) {
return (
<>
{thens}
>
);
}
return thens[0] as JSX.Element;
}
if (elses && elses.length > 1) {
return (
<>
{elses}
>
);
}
return elses[0] as JSX.Element;
}
export function ElseIf({
condition,
children,
}: {
condition: boolean | (() => boolean);
children?: Children;
}) {
return (
{children}
);
}
export function ThenIf({
condition,
children,
}: {
condition: boolean | (() => boolean);
children?: Children;
}) {
return (
{children}
);
}
export default { If, Then, Else, ElseIf };