index.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. import useKeyPress from "src/hooks/useKeyPress";
  6. type ControlProps = React.PropsWithChildren<{
  7. setVisible: (status: boolean) => void;
  8. }>;
  9. type ModalTypes = {
  10. Header: ReactComponent;
  11. Content: ReactComponent;
  12. Controls: React.FC<ControlProps>;
  13. };
  14. export interface ModalProps {
  15. visible: boolean;
  16. setVisible: React.Dispatch<React.SetStateAction<boolean>>;
  17. }
  18. const Header: ReactComponent = ({ children }) => {
  19. return (
  20. <Styled.HeaderWrapper>
  21. <Styled.Title>{children}</Styled.Title>
  22. </Styled.HeaderWrapper>
  23. );
  24. };
  25. const Content: ReactComponent = ({ children }) => {
  26. return <Styled.ContentWrapper>{children}</Styled.ContentWrapper>;
  27. };
  28. const Controls: React.FC<ControlProps> = ({ children, setVisible }) => {
  29. const handleEspacePress = useKeyPress("Escape");
  30. React.useEffect(() => {
  31. if (handleEspacePress) setVisible(false);
  32. }, [handleEspacePress]);
  33. return (
  34. <Styled.ControlsWrapper>
  35. <Button onClick={() => setVisible(false)}>Close</Button>
  36. {children}
  37. </Styled.ControlsWrapper>
  38. );
  39. };
  40. const Modal: React.FC<React.PropsWithChildren<ModalProps>> & ModalTypes = ({
  41. children,
  42. visible,
  43. setVisible,
  44. }) => {
  45. const onClick = (e: React.SyntheticEvent<HTMLDivElement>) => {
  46. if (e.currentTarget === e.target) {
  47. setVisible((v) => !v);
  48. }
  49. };
  50. return (
  51. <Styled.ModalWrapper visible={visible} onClick={onClick}>
  52. <Styled.ModalInnerWrapper>{children}</Styled.ModalInnerWrapper>
  53. </Styled.ModalWrapper>
  54. );
  55. };
  56. Modal.Header = Header;
  57. Modal.Content = Content;
  58. Modal.Controls = Controls;
  59. export { Modal };