All files / src/components/common/Modal/Popover CustomPopover.tsx

66.66% Statements 6/9
33.33% Branches 3/9
33.33% Functions 1/3
66.66% Lines 6/9

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110                                                25x   25x                     370x         370x   370x                                                           370x                                                                      
import SwipeableDrawerMobile, {
  SwipeableDrawerMobileProps,
} from "@components/SwipeableDrawerMobile/SwipeableDrawerMobile";
import { palette } from "@palette";
import { SxProps, Popover, PopoverProps } from "@mui/material";
import ErrorCatcher from "@common/Error/ErrorCatcher";
 
export type DialogVariantProps = {
  open: boolean;
  anchorEl: HTMLButtonElement | SVGSVGElement | null;
  onClose: () => void;
  sx?: SxProps;
  children: React.ReactNode;
  renderMobile?: boolean;
  PopoverProps?: Omit<PopoverProps, "open">;
  DrawerProps?: Omit<
    SwipeableDrawerMobileProps,
    "onOpen" | "onClose" | "open"
  > & {
    dataTestId?: string;
  };
  PopoverSx?: SxProps;
};
 
const DRAWER_DEFAULT_TOP = "96px";
 
const CustomPopover = ({
  open,
  anchorEl,
  onClose,
  children,
  sx,
  renderMobile = false,
  PopoverProps = {},
  DrawerProps = {},
  PopoverSx,
}: DialogVariantProps) => {
  const commonProps = {
    open,
    sx,
  };
 
  const { dataTestId, ...drawerProps } = DrawerProps;
 
  Iif (renderMobile) {
    return (
      <SwipeableDrawerMobile
        anchor="bottom"
        onOpen={() => undefined}
        {...commonProps}
        {...drawerProps}
        data-testid={dataTestId}
        onClose={() => !!onClose && onClose()}
        PaperProps={{
          ...drawerProps?.PaperProps,
          sx: {
            background: palette.neutral[5],
            position: "relative",
            maxHeight: `calc(100vh - ${
              (sx as any)?.top || DRAWER_DEFAULT_TOP
            })`,
            ...drawerProps?.PaperProps?.sx,
          },
        }}
        sx={{
          top: "auto",
          ...sx,
        }}
      >
        <ErrorCatcher errorID="swipeable-drawer">{children}</ErrorCatcher>
      </SwipeableDrawerMobile>
    );
  }
 
  return (
    <Popover
      anchorOrigin={{
        vertical: "bottom",
        horizontal: "right",
      }}
      transformOrigin={{
        vertical: "top",
        horizontal: "left",
      }}
      {...PopoverProps}
      slotProps={{
        ...PopoverProps?.slotProps,
        paper: {
          ...PopoverProps?.slotProps?.paper,
          sx: {
            padding: "12px 16px",
            borderRadius: "8px",
            background: palette.neutral.white,
            boxShadow: "0px 3px 15px 0px rgba(2, 2, 2, 0.15)",
            ...PopoverSx,
          },
        },
      }}
      open={open}
      anchorEl={anchorEl}
      onClose={onClose}
      sx={sx}
    >
      <ErrorCatcher errorID="popover">{children}</ErrorCatcher>
    </Popover>
  );
};
 
export default CustomPopover;