summaryrefslogtreecommitdiff
path: root/src/components/Modal.tsx
blob: dfb968319445dec1fbf14fabf7a70a256ed328db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import cx from 'clsx';
import * as React from 'react';
import ReactModalBase, { Props as ReactModalProps } from 'react-modal';

import s0 from './Modal.module.scss';

type Props = ReactModalProps & {
  isOpen: boolean;
  onRequestClose: (...args: any[]) => any;
  children: React.ReactNode;
};

const ReactModal = ReactModalBase as unknown as React.ComponentType<ReactModalProps>;

function withBaseClass(
  className: ReactModalProps['className'],
  baseClassName: string
): ReactModalProps['className'] {
  if (!className) {
    return baseClassName;
  }

  if (typeof className === 'string') {
    return cx(className, baseClassName);
  }

  return {
    ...className,
    base: cx(className.base, baseClassName),
  };
}

function ModalAPIConfig({
  isOpen,
  onRequestClose,
  className,
  overlayClassName,
  children,
  ...otherProps
}: Props) {
  const contentCls = withBaseClass(className, s0.content);
  const overlayCls = withBaseClass(overlayClassName, s0.overlay);
  return (
    <ReactModal
      isOpen={isOpen}
      onRequestClose={onRequestClose}
      className={contentCls}
      overlayClassName={overlayCls}
      {...otherProps}
    >
      {children}
    </ReactModal>
  );
}

export default React.memo(ModalAPIConfig);