import { Button, Modal } from "antd"; import { useRef, useState } from "react"; import ReactDOM from "react-dom"; interface ISelectorProps { onSelected: (item?: string) => any; } export function MyStringSelector(props: ISelectorProps): JSX.Element { const { onSelected } = props; return <> <Button onClick={() => onSelected("A")}>A</Button> <Button onClick={() => onSelected("B")}>B</Button> <Button onClick={() => onSelected("C")}>C</Button> </>; } interface IProps { title: string | JSX.Element; selector: JSX.Element; onSelect: () => any; onCancel: () => any; } export function SelectorModal(props: IProps): JSX.Element { const { title, selector, onSelect, onCancel } = props; const [isModalVisible, setIsModalVisible] = useState(true); const myRef = useRef(null); function handleOk() { onSelect(); unmount(); } function handleCancel() { onCancel(); unmount(); } function unmount() { setIsModalVisible(false); if (!myRef.current) return; setTimeout(() => ReactDOM.unmountComponentAtNode(myRef.current!), 500); } return <div ref={myRef}> <Modal title={title} visible={isModalVisible} onOk={handleOk} onCancel={handleCancel}>{selector}</Modal> </div> } function selectAValue() { return new Promise<string | undefined>((resolve) => { let selectedValue: string | undefined = undefined; ReactDOM.createPortal(<SelectorModal title="Selecteer een waarde" onSelect={() => resolve(selectedValue)} onCancel={() => resolve(undefined)} selector={<MyStringSelector onSelected={(x) => selectedValue = x} />} />, document.body); }); } async function Test() { const result = await selectAValue(); // if (result.selectedLine) { // // set it! // } }
640400cookie-checkReact Modal handling (WIP)