import React, { useState, useEffect } from "react"; import { EventEmitter } from "../../utils/EventEmitter"; import { Modal } from "./Modal"; import Typography from "@mui/material/Typography"; import Button from "@mui/material/Button"; import Select, { SelectChangeEvent } from "@mui/material/Select"; import TextField from "@mui/material/TextField"; import MenuItem from "@mui/material/MenuItem"; import { KEY } from "../../utils/KeyboardEventKey"; export const PromptEvent = new EventEmitter<[Prompt]>(); interface Prompt { txt: string; options?: { type?: string; choices?: string[] }; resolve: (result: boolean | string) => void; } export function PromptManager({ hidden }: { hidden: boolean }): React.ReactElement { const [prompt, setPrompt] = useState(null); const resolveCurrentPromptWithDefaultValue = (currentPrompt: Prompt) => { if (["text", "select"].includes(currentPrompt.options?.type ?? "")) { currentPrompt.resolve(""); } else { currentPrompt.resolve(false); } }; useEffect(() => { return PromptEvent.subscribe((newPrompt: Prompt) => { setPrompt((currentPrompt) => { if (currentPrompt) { resolveCurrentPromptWithDefaultValue(currentPrompt); } return newPrompt; }); }); }, []); function close(): void { if (prompt === null) { return; } resolveCurrentPromptWithDefaultValue(prompt); setPrompt(null); } const types: Record React.ReactElement> = { text: PromptMenuText, select: PromptMenuSelect, }; let PromptContent = PromptMenuBoolean; if (prompt?.options?.type && ["text", "select"].includes(prompt.options.type)) { PromptContent = types[prompt.options.type]; } const resolve = (value: boolean | string): void => { prompt?.resolve(value); setPrompt(null); }; return ( {prompt && ( <>
            {prompt.txt}
          
)}
); } interface IContentProps { prompt: Prompt; resolve: (value: boolean | string) => void; } function PromptMenuBoolean({ resolve }: IContentProps): React.ReactElement { const yes = (): void => resolve(true); const no = (): void => resolve(false); return ( <>
); } function PromptMenuText({ prompt, resolve }: IContentProps): React.ReactElement { const [value, setValue] = useState(""); const submit = (): void => { resolve(value); setValue(""); }; useEffect(() => { setValue(""); }, [prompt]); const onInput = (event: React.ChangeEvent): void => { setValue(event.target.value); }; const onKeyDown = (event: React.KeyboardEvent): void => { event.stopPropagation(); if (event.key === KEY.ENTER) { event.preventDefault(); submit(); } }; return ( <>
Confirm, }} />
); } function PromptMenuSelect({ prompt, resolve }: IContentProps): React.ReactElement { const [value, setValue] = useState(""); const submit = (): void => { resolve(value); setValue(""); }; useEffect(() => { setValue(""); }, [prompt]); const onChange = (event: SelectChangeEvent): void => { setValue(event.target.value); }; const getItems = (choices: string[]): React.ReactElement[] => { const content: React.ReactElement[] = []; for (const i of choices) { content.push( {i} , ); } return content; }; if (!Array.isArray(prompt.options?.choices)) { return Error: Please provide an array of string choices; } return ( <>
); }