{"version":3,"file":"Toast.mjs","sources":["../../../../../../../../../web/src/adminPortal/shared/components/Toast.tsx"],"sourcesContent":["import CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport CloseIcon from '@mui/icons-material/Close';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport { IconButton, Snackbar, styled, SxProps, Theme } from '@mui/material';\nimport MUIAlert, { alertClasses } from '@mui/material/Alert';\nimport React, {\n  createContext,\n  FC,\n  PropsWithChildren,\n  ReactNode,\n  useCallback,\n  useContext,\n  useRef,\n  useState,\n} from 'react';\n\nimport { mergeSx } from '../utils/mergeSx';\nimport { noop } from '../utils/noop';\nimport { InjectedComponents } from './componentInjection';\n\nconst StyledSnackbar = styled(Snackbar)(({ theme }) => ({\n  bottom: theme.spacing(5),\n}));\n\nconst CloseButton = styled(IconButton)(({ theme }) => ({\n  padding: theme.spacing(0.5),\n}));\n\nconst StyledAlert = styled(MUIAlert)<{ type: ToastType }>(({ theme }) => ({\n  [`& .${alertClasses.icon}`]: {\n    marginRight: theme.spacing(1),\n  },\n  [`& .${alertClasses.message}`]: {\n    padding: 0,\n  },\n  [`& .${alertClasses.action}`]: {\n    marginRight: theme.spacing(-0.5),\n  },\n  [theme.breakpoints.down('sm')]: {\n    width: '100%',\n  },\n  width: 512,\n  padding: theme.spacing(1, 1.5),\n  display: 'flex',\n  alignItems: 'center',\n  '& p': {},\n}));\n\ntype ToastType = 'success' | 'error';\n\ntype ToastContextType = {\n  // openDurationMS represents the time in milliseconds\n  openToast(options: { text: ReactNode; type: ToastType; openDurationMS?: number }): void;\n  closeToast(): void;\n};\n\nconst DEFAULT_STATE: ToastContextType = {\n  openToast: noop,\n  closeToast: noop,\n};\n\nexport const ToastContext = createContext<ToastContextType>(DEFAULT_STATE);\n\nexport const useToast = (): ToastContextType => useContext(ToastContext);\n\nexport type ToastContextProviderCoreProps = PropsWithChildren & {\n  alertSx?: SxProps<Theme>;\n  closeIconSx?: SxProps<Theme>;\n  errorIconSx?: SxProps<Theme>;\n  successIconSx?: SxProps<Theme>;\n  errorSx?: SxProps<Theme>;\n  successSx?: SxProps<Theme>;\n};\n\nexport const ToastContextProviderCore: FC<ToastContextProviderCoreProps & InjectedComponents<'Typography'>> = ({\n  children,\n  alertSx,\n  closeIconSx,\n  errorIconSx,\n  successIconSx,\n  errorSx,\n  successSx,\n  TypographyComponent: Typography,\n}) => {\n  const [open, setOpen] = useState(false);\n  const [toastText, setToastText] = useState('');\n  const [toastType, setToastType] = useState<ToastType>('success');\n  const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n  const closeToast = () => setOpen(false);\n\n  const triggerOpen = useCallback((openDurationMS: number) => {\n    setOpen(true);\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n    }\n    timeoutRef.current = setTimeout(() => {\n      setOpen(false);\n    }, openDurationMS);\n  }, []);\n\n  // Without this useCallback, the value of openToast changes on every render\n  // causing downstream code shaped like\n  // `useEffect(() => ..., [openToast])`\n  // to run again, which we don't want to do\n  const openToast = useCallback(\n    ({ type, text, openDurationMS = 5000 }: { text: string; type: ToastType; openDurationMS?: number }) => {\n      setToastType(type);\n      setToastText(text);\n      triggerOpen(openDurationMS);\n    },\n    [triggerOpen],\n  );\n\n  return (\n    <ToastContext.Provider\n      value={{\n        openToast,\n        closeToast,\n      }}\n    >\n      <StyledSnackbar anchorOrigin={{ horizontal: 'center', vertical: 'bottom' }} open={open}>\n        <StyledAlert\n          sx={mergeSx(alertSx, toastType === 'error' ? errorSx : successSx)}\n          action={\n            <CloseButton onClick={closeToast} size=\"large\">\n              <CloseIcon\n                fontSize=\"small\"\n                sx={mergeSx(closeIconSx, toastType === 'error' ? errorIconSx : successIconSx)}\n              />\n            </CloseButton>\n          }\n          elevation={6}\n          icon={\n            toastType === 'error' ? (\n              <ErrorIcon fontSize=\"small\" sx={errorIconSx} />\n            ) : (\n              <CheckCircleIcon fontSize=\"small\" sx={successIconSx} />\n            )\n          }\n          type={toastType}\n          variant=\"filled\"\n        >\n          <Typography variant=\"body2\">{toastText}</Typography>\n        </StyledAlert>\n      </StyledSnackbar>\n      {children}\n    </ToastContext.Provider>\n  );\n};\n"],"names":["StyledSnackbar","styled","Snackbar","theme","bottom","spacing","CloseButton","IconButton","padding","StyledAlert","MUIAlert","alertClasses","icon","marginRight","message","action","breakpoints","down","width","display","alignItems","DEFAULT_STATE","openToast","noop","closeToast","ToastContext","createContext","useToast","useContext","ToastContextProviderCore","children","alertSx","closeIconSx","errorIconSx","successIconSx","errorSx","successSx","TypographyComponent","Typography","open","setOpen","useState","toastText","setToastText","toastType","setToastType","timeoutRef","useRef","triggerOpen","useCallback","openDurationMS","current","clearTimeout","setTimeout","type","text","React","Provider","value","anchorOrigin","horizontal","vertical","sx","mergeSx","onClick","size","CloseIcon","fontSize","elevation","ErrorIcon","CheckCircleIcon","variant"],"mappings":"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"}