import React, { useRef, useEffect, useState } from 'react'; import classnames from 'classnames'; import styles from './styles.module.scss'; import { AppBar, AppBarTitle, AppBarSection, AppBarContext, ButtonGroup, Button, Modal, InputBox, } from '..'; type DialogBaseProps = { // From modal visible: boolean, width?: React.ReactText, height?: React.ReactText, }; // ---------------------------------------------------------------------------- // ALERT DIALOG // ---------------------------------------------------------------------------- export type AlertDialogProps = DialogBaseProps & { prompt: React.ReactNode, onSubmit: () => void, title?: React.ReactNode, confirmText?: React.ReactNode, }; export const AlertDialog: React.FunctionComponent = ({ title='Alert', prompt, confirmText='OK', onSubmit, ...modalProps }) => (
{title}
{prompt}
); AlertDialog.displayName = 'AlertDialog'; // ---------------------------------------------------------------------------- // CONFIRM DIALOG // ---------------------------------------------------------------------------- export type ConfirmDialogProps = DialogBaseProps & { prompt: React.ReactNode, onSubmit: () => void, onDismiss: () => void, title?: React.ReactNode, confirmText?: React.ReactNode, cancelText?: React.ReactNode, }; export const ConfirmDialog: React.FunctionComponent = ({ title="Confirm", prompt, confirmText="Confirm", cancelText="Cancel", onSubmit, onDismiss, ...modalProps }) => (
{title}
{prompt}
); ConfirmDialog.displayName = 'ConfirmDialog'; // ---------------------------------------------------------------------------- // PROMPT DIALOG // ---------------------------------------------------------------------------- export type PromptDialogProps = DialogBaseProps & { prompt: React.ReactNode, onSubmit: (text: string) => void, onDismiss: () => void, title?: React.ReactNode, placeholder?: React.ReactNode, leftIcon?: React.ReactNode, rightIcon?: React.ReactNode, confirmText?: React.ReactNode, cancelText?: React.ReactNode, initialText?: string, emptyValueIsInvalid?: boolean, }; export const PromptDialog: React.FunctionComponent = ({ title='Prompt', prompt, confirmText='Submit', cancelText='Cancel', onSubmit, onDismiss, placeholder, leftIcon, rightIcon, initialText, emptyValueIsInvalid, ...modalProps }) => { const [ text, setText ] = useState(initialText || ''); // When a prompt is shown, auto focus its text box. const textBoxRef = useRef(null); useEffect(() => { if (textBoxRef && textBoxRef.current) { (textBoxRef as any).current.focus(); } }, [modalProps.visible, textBoxRef]); const disabled = emptyValueIsInvalid && text.length === 0; return (
{title}
{prompt ? (
{prompt}
) : null} setText(e.target.value)} placeholder={placeholder} leftIcon={leftIcon} rightIcon={rightIcon} width="100%" onKeyDown={e => { if (!disabled && e.key === 'Enter') { onSubmit(text); } }} ref={textBoxRef} />
); }; PromptDialog.displayName = 'PromptDialog';