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>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|