index.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import React from "react";
  2. import { ReactComponent } from "src/typings/global";
  3. import { Button } from "src/components/Button";
  4. import * as Styled from "./styles";
  5. type ControlProps = React.PropsWithChildren<{
  6. setVisible: (status: boolean) => void;
  7. }>;
  8. type ModalTypes = {
  9. Header: ReactComponent;
  10. Content: ReactComponent;
  11. Controls: React.FC<ControlProps>;
  12. };
  13. interface ModalProps {
  14. visible: boolean;
  15. setVisible: React.Dispatch<React.SetStateAction<boolean>>;
  16. }
  17. const Header: ReactComponent = ({ children }) => {
  18. return (
  19. <Styled.HeaderWrapper>
  20. <Styled.Title>{children}</Styled.Title>
  21. </Styled.HeaderWrapper>
  22. );
  23. };
  24. const Content: ReactComponent = ({ children }) => {
  25. return <Styled.ContentWrapper>{children}</Styled.ContentWrapper>;
  26. };
  27. const Controls: React.FC<ControlProps> = ({ children, setVisible }) => {
  28. return (
  29. <Styled.ControlsWrapper>
  30. <Button onClick={() => setVisible(false)}>Close</Button>
  31. {children}
  32. </Styled.ControlsWrapper>
  33. );
  34. };
  35. const Modal: React.FC<React.PropsWithChildren<ModalProps>> & ModalTypes = ({
  36. children,
  37. visible,
  38. setVisible,
  39. }) => {
  40. const onClick = (e: React.SyntheticEvent<HTMLDivElement>) => {
  41. if (e.currentTarget === e.target) {
  42. setVisible((v) => !v);
  43. }
  44. };
  45. return (
  46. <Styled.ModalWrapper visible={visible} onClick={onClick}>
  47. <Styled.ModalInnerWrapper>{children}</Styled.ModalInnerWrapper>
  48. </Styled.ModalWrapper>
  49. );
  50. };
  51. Modal.Header = Header;
  52. Modal.Content = Content;
  53. Modal.Controls = Controls;
  54. export { Modal };