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/helpers/keyCodes"; export const PromptEvent = new EventEmitter<[Prompt]>(); interface Prompt { txt: string; options?: { type?: string; choices?: string[] }; resolve: (result: boolean | string) => void; } export function PromptManager(): React.ReactElement { const [prompt, setPrompt] = useState(null); useEffect(() => { return PromptEvent.subscribe((p: Prompt) => { setPrompt(p); }); }, []); if (prompt === null) { return <>; } function close(): void { if (prompt === null) return; if (["text", "select"].includes(prompt?.options?.type ?? "")) { prompt.resolve(""); } else { prompt.resolve(false); } setPrompt(null); } const types: { [key: string]: any } = { 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.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({ resolve }: IContentProps): React.ReactElement { const [value, setValue] = useState(""); const submit = (): void => resolve(value); 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); const onChange = (event: SelectChangeEvent): void => { setValue(event.target.value); }; const getItems = (choices: string[]): React.ReactElement[] => { const content = []; for (const i of choices) { // @ts-ignore content.push( {i} , ); } return content; }; return ( <>
); }