{"version":3,"file":"SnackbarProvider.cjs","sources":["../src/Snackbar/SnackbarProvider.tsx"],"sourcesContent":["import { Portal, type PortalProps } from '@mui/base/Portal';\nimport clsx from 'clsx';\nimport { identity } from 'ramda';\nimport { createContext, type JSX, useCallback, useState } from 'react';\n\nimport type {\n  ComponentProps,\n  SlotComponentPropsWithoutOverride,\n} from '../components.ts';\nimport { assocDefaultStyle } from '../utils/assign-default-style.ts';\nimport { mergeRootSlotPropsToComponentProps } from '../utils/merge-root-slot-props-to-component-prop.ts';\nimport {\n  Snackbar,\n  type SnackbarCloseReason,\n  type SnackbarProps,\n} from './Snackbar.tsx';\n\nexport const GlobalSnackbar = createContext<{\n  closeSnackbar: (notificationId: string) => void;\n  enqueueSnackbar: (props: SnackbarProps) => string;\n  isSnackbarAppear: (notificationId: string) => boolean;\n}>({\n  closeSnackbar: () => {},\n  enqueueSnackbar: () => '',\n  isSnackbarAppear: () => false,\n});\n\ninterface SlotProps {\n  root?: SlotComponentPropsWithoutOverride<'div'>;\n}\nexport type SnackbarProviderProps = ComponentProps<\n  SlotProps,\n  { portal?: PortalProps }\n>;\n\nexport function SnackbarProvider({\n  children,\n  disableDefaultClasses,\n  portal,\n  slotProps: givenSlotProps,\n  ...rest\n}: SnackbarProviderProps) {\n  const [snackbars, setSnackbars] = useState<JSX.Element[]>([]);\n  const portalContainer = portal?.container ?? document.body;\n  const slotProps = disableDefaultClasses\n    ? givenSlotProps\n    : assocDefaultStyle<SlotProps>({\n        slotWithDefaultClasses: {\n          root: clsx(\n            'tw-absolute tw-left-1/2 tw-top-0 tw-z-20 tw--translate-x-1/2',\n          ),\n        },\n      })(givenSlotProps);\n  const rootProps = mergeRootSlotPropsToComponentProps()(slotProps, rest);\n  const closeSnackbar = useCallback((notificationId: string) => {\n    setSnackbars(prev =>\n      prev.filter(snackbar => snackbar.key !== notificationId),\n    );\n  }, []);\n  const isSnackbarAppear = useCallback(\n    (notificationId: string) => {\n      return snackbars.some(snackbar => snackbar.key === notificationId);\n    },\n    [snackbars],\n  );\n  const enqueueSnackbar = useCallback(\n    (props: SnackbarProps) => {\n      const { key, onClose, ...rest } = props;\n      const notificationId = String(key ?? window.crypto.randomUUID());\n      if (isSnackbarAppear(notificationId)) return notificationId;\n      const onSnackbarClose = (_: any, reason: SnackbarCloseReason) => {\n        if (reason === 'clickaway') return;\n        closeSnackbar(notificationId);\n        (onClose ?? identity)(_, reason);\n      };\n      const snackbar = (\n        <Snackbar\n          {...rest}\n          key={notificationId}\n          onClose={onSnackbarClose}\n          open={true}\n        />\n      );\n      setSnackbars(prev => [...prev, snackbar]);\n      return notificationId;\n    },\n    [closeSnackbar, isSnackbarAppear],\n  );\n\n  return (\n    <GlobalSnackbar.Provider\n      value={{ closeSnackbar, enqueueSnackbar, isSnackbarAppear }}\n    >\n      <Portal container={portalContainer}>\n        <div {...rootProps}>{snackbars}</div>\n      </Portal>\n      {children}\n    </GlobalSnackbar.Provider>\n  );\n}\n"],"names":["GlobalSnackbar","createContext","SnackbarProvider","children","disableDefaultClasses","portal","givenSlotProps","rest","snackbars","setSnackbars","useState","portalContainer","slotProps","assocDefaultStyle","clsx","rootProps","mergeRootSlotPropsToComponentProps","closeSnackbar","useCallback","notificationId","prev","snackbar","isSnackbarAppear","enqueueSnackbar","props","key","onClose","onSnackbarClose","_","reason","identity","createElement","Snackbar","jsxs","jsx","Portal"],"mappings":"w4BAiBO,MAAMA,EAAiBC,EAAAA,cAI3B,CACD,cAAe,IAAM,CAAC,EACtB,gBAAiB,IAAM,GACvB,iBAAkB,IAAM,EAC1B,CAAC,EAUM,SAASC,EAAiB,CAC/B,SAAAC,EACA,sBAAAC,EACA,OAAAC,EACA,UAAWC,EACX,GAAGC,CACL,EAA0B,CACxB,KAAM,CAACC,EAAWC,CAAY,EAAIC,EAAA,SAAwB,CAAE,CAAA,EACtDC,GAAkBN,GAAA,YAAAA,EAAQ,YAAa,SAAS,KAChDO,EAAYR,EACdE,EACAO,oBAA6B,CAC3B,uBAAwB,CACtB,KAAMC,EAAA,KACJ,8DACF,CACF,CAAA,CACD,EAAER,CAAc,EACfS,EAAYC,EAAA,mCAAA,EAAqCJ,EAAWL,CAAI,EAChEU,EAAgBC,cAAaC,GAA2B,CAC5DV,KACEW,EAAK,OAAmBC,GAAAA,EAAS,MAAQF,CAAc,CAAA,CAE3D,EAAG,CAAE,CAAA,EACCG,EAAmBJ,EAAA,YACtBC,GACQX,EAAU,KAAiBa,GAAAA,EAAS,MAAQF,CAAc,EAEnE,CAACX,CAAS,CAAA,EAENe,EAAkBL,EAAA,YACrBM,GAAyB,CACxB,KAAM,CAAE,IAAAC,EAAK,QAAAC,EAAS,GAAGnB,GAASiB,EAC5BL,EAAiB,OAAOM,GAAO,OAAO,OAAO,YAAY,EAC/D,GAAIH,EAAiBH,CAAc,EAAU,OAAAA,EACvC,MAAAQ,EAAkB,CAACC,EAAQC,IAAgC,CAC3DA,IAAW,cACfZ,EAAcE,CAAc,GAC3BO,GAAWI,EAAAA,UAAUF,EAAGC,CAAM,EAAA,EAE3BR,EACJU,EAAA,cAACC,EAAA,SAAA,CACE,GAAGzB,EACJ,IAAKY,EACL,QAASQ,EACT,KAAM,EAAA,CAAA,EAGV,OAAAlB,EAAqBW,GAAA,CAAC,GAAGA,EAAMC,CAAQ,CAAC,EACjCF,CACT,EACA,CAACF,EAAeK,CAAgB,CAAA,EAIhC,OAAAW,EAAA,kBAAA,KAACjC,EAAe,SAAf,CACC,MAAO,CAAE,cAAAiB,EAAe,gBAAAM,EAAiB,iBAAAD,CAAiB,EAE1D,SAAA,CAACY,EAAAA,kBAAAA,IAAAC,EAAAA,OAAA,CAAO,UAAWxB,EACjB,SAAAuB,EAAAA,kBAAAA,IAAC,OAAK,GAAGnB,EAAY,WAAU,CACjC,CAAA,EACCZ,CAAA,CAAA,CAAA,CAGP"}