cohost/html/dialogue.tsx

33 lines
861 B
TypeScript
Raw Normal View History

2023-07-12 14:15:53 -04:00
import { JSX } from "preact";
2023-07-09 13:21:24 -04:00
2023-07-12 14:15:53 -04:00
type DNode = JSX.Element | string;
type DOption = [DNode, Dialogue];
type Dialogue = DNode | [DNode, ...DOption[]];
2023-07-09 13:21:24 -04:00
function not_empty<T>(arr: T[]): arr is [T, ...T[]] {
return arr.length > 0;
}
2023-07-12 14:15:53 -04:00
export function reify_dialogue(d: Dialogue): JSX.Element | string {
2023-07-09 13:21:24 -04:00
if (!Array.isArray(d)) return d;
const [r, ...rest] = d;
if (rest.length == 0) {
return r;
} else {
return (
<div class="dialogue">
{r}
{...rest.map(([r, d]) => {
return (
<details>
<summary class="option">{r}</summary>
<div class="response">{reify_dialogue(d)}</div>
</details>
);
})}
</div>
);
}
}