Skip to content
Snippets Groups Projects
Modal.component.tsx 1.99 KiB
Newer Older
Adrian Orłów's avatar
Adrian Orłów committed
import { useAppDispatch } from '@/redux/hooks/useAppDispatch';
import { useAppSelector } from '@/redux/hooks/useAppSelector';
import { modalSelector } from '@/redux/modal/modal.selector';
import { closeModal } from '@/redux/modal/modal.slice';
import { Icon } from '@/shared/Icon';
Adrian Orłów's avatar
Adrian Orłów committed
import dynamic from 'next/dynamic';
Adrian Orłów's avatar
Adrian Orłów committed
import { twMerge } from 'tailwind-merge';
Adrian Orłów's avatar
Adrian Orłów committed
import { LoginModal } from './LoginModal';
Adrian Orłów's avatar
Adrian Orłów committed
import { MODAL_ROLE } from './Modal.constants';
import { OverviewImagesModal } from './OverviewImagesModal';
import { PublicationsModal } from './PublicationsModal';
Adrian Orłów's avatar
Adrian Orłów committed

const MolArtModal = dynamic(
  () => import('./MolArtModal/MolArtModal.component').then(mod => mod.MolArtModal),
  { ssr: false },
);
Adrian Orłów's avatar
Adrian Orłów committed

export const Modal = (): React.ReactNode => {
  const dispatch = useAppDispatch();
  const { isOpen, modalName, modalTitle } = useAppSelector(modalSelector);

  const handleCloseModal = (): void => {
    dispatch(closeModal());
  };

  return (
    <div
      className={twMerge(
        'absolute left-0 top-0 z-10 h-full w-full bg-cetacean-blue/[.48]',
        isOpen ? '' : 'hidden',
      )}
      role={MODAL_ROLE}
    >
      <div className="flex h-full w-full items-center justify-center">
        <div
          className={twMerge(
            'flex h-5/6 w-10/12	flex-col	overflow-hidden rounded-lg',
            modalName === 'login' && 'h-auto w-[400px]',
          )}
        >
Adrian Orłów's avatar
Adrian Orłów committed
          <div className="flex items-center justify-between bg-white p-[24px] text-xl">
            <div>{modalTitle}</div>
            <button type="button" onClick={handleCloseModal} aria-label="close button">
              <Icon name="close" className="fill-font-500" />
            </button>
          </div>
          {isOpen && modalName === 'overview-images' && <OverviewImagesModal />}
Mateusz Bolewski's avatar
Mateusz Bolewski committed
          {isOpen && modalName === 'mol-art' && <MolArtModal />}
          {isOpen && modalName === 'login' && <LoginModal />}
          {isOpen && modalName === 'publications' && <PublicationsModal />}
Adrian Orłów's avatar
Adrian Orłów committed
        </div>
      </div>
    </div>
  );
};