mirror of
https://github.com/sergeyyarkov/educt-client.git
synced 2026-10-11 10:19:22 +03:00
78 lines
2.0 KiB
TypeScript
78 lines
2.0 KiB
TypeScript
import React from 'react';
|
|
import { Button } from '@chakra-ui/button';
|
|
import { Text, Flex, Box, Divider } from '@chakra-ui/react';
|
|
import {
|
|
Icon,
|
|
ModalProps,
|
|
Modal,
|
|
ModalOverlay,
|
|
ModalContent,
|
|
ModalHeader,
|
|
ModalFooter,
|
|
ModalBody,
|
|
ModalCloseButton,
|
|
} from '@chakra-ui/react';
|
|
import { IconType } from 'react-icons';
|
|
|
|
export interface IBaseModalProps extends ModalProps {
|
|
isOpen: boolean;
|
|
onClose: () => void;
|
|
onProceed: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
|
|
heading: string;
|
|
icon?: IconType;
|
|
description?: string;
|
|
confirmText?: string;
|
|
isLoading?: boolean | undefined;
|
|
loadingText?: string | undefined;
|
|
}
|
|
|
|
const BaseModal: React.FC<IBaseModalProps> = props => {
|
|
const { heading, description, isOpen, onClose, onProceed, confirmText, icon, isLoading, loadingText, ...modalProps } =
|
|
props;
|
|
|
|
return (
|
|
<Modal isOpen={isOpen} onClose={onClose} {...modalProps}>
|
|
<ModalOverlay />
|
|
<ModalContent>
|
|
<ModalHeader>
|
|
<Flex alignItems='center'>
|
|
{icon && <Icon as={icon} mr='2' />}
|
|
<Text fontWeight='bold'>{heading}</Text>
|
|
</Flex>
|
|
{description && (
|
|
<Box>
|
|
<Text fontSize='md' fontWeight='normal'>
|
|
{description}
|
|
</Text>
|
|
</Box>
|
|
)}
|
|
</ModalHeader>
|
|
|
|
<Divider />
|
|
<ModalCloseButton />
|
|
|
|
<ModalBody>
|
|
<Box>{props.children}</Box>
|
|
</ModalBody>
|
|
<ModalFooter>
|
|
<Button onClick={onClose} borderRadius='md' mr='2'>
|
|
Close
|
|
</Button>
|
|
<Button
|
|
onClick={onProceed}
|
|
isLoading={isLoading}
|
|
loadingText={loadingText || 'Loading...'}
|
|
borderRadius='md'
|
|
variant='outline'
|
|
colorScheme='blue'
|
|
>
|
|
{confirmText || 'Proceed'}
|
|
</Button>
|
|
</ModalFooter>
|
|
</ModalContent>
|
|
</Modal>
|
|
);
|
|
};
|
|
|
|
export default BaseModal;
|