{"version":3,"file":"SettingsContainer.mjs","sources":["../../../../../../../../web/src/adminPortal/components/SettingsContainer.tsx"],"sourcesContent":["import { styled } from '@mui/material';\nimport React, { createContext, FC, ReactNode, useContext, useState } from 'react';\n\nimport { extractErrorMessage } from '../../utils/extractErrorMessage';\nimport { UseBlockNavigation } from '../Router';\nimport { noop } from '../shared/utils/noop';\nimport { Button } from './Button';\nimport { FlexBox } from './FlexBox';\nimport { Modal, useModalState } from './Modal';\nimport { useToast } from './Toast';\nimport { Typography } from './Typography';\n\nconst Container = styled('div')(({ theme }) => ({\n  border: '1px solid',\n  borderColor: theme.styleConfig.colors.subtle,\n  borderRadius: theme.styleConfig.borderRadius,\n  backgroundColor: theme.styleConfig.container.backgroundColor,\n}));\n\nconst TitleContainer = styled('div')(({ theme }) => ({\n  [theme.breakpoints.down('sm')]: {\n    flexDirection: 'column',\n    alignItems: 'flex-start',\n    gap: theme.spacing(1),\n  },\n  padding: theme.spacing(1.5, 2),\n  borderBottom: '1px solid',\n  borderBottomColor: theme.styleConfig.colors.subtle,\n  display: 'flex',\n  justifyContent: 'space-between',\n  alignItems: 'center',\n}));\n\nconst ContentContainer = styled('div')(({ theme }) => ({ padding: theme.spacing(2) }));\n\ntype SettingsContextType = {\n  editing: boolean;\n  setEditing: (editing: boolean) => void;\n};\n\nconst DEFAULT_STATE: SettingsContextType = {\n  editing: false,\n  setEditing: noop,\n};\n\nconst SettingsContext = createContext<SettingsContextType>(DEFAULT_STATE);\n\nexport const useSettingsContainer = (): SettingsContextType => useContext(SettingsContext);\n\ntype Props = {\n  hasCTA?: boolean;\n  onCancel?: () => void;\n  onSave?: () => Promise<void>;\n  title: string;\n  canEdit?: boolean;\n  disableSave?: boolean;\n  customCTA?: ReactNode;\n  creating?: boolean;\n  editing?: boolean;\n  setEditing?: (value: boolean) => void;\n  modalDescription?: string;\n  children: ReactNode;\n  useBlockNavigation: UseBlockNavigation;\n};\n\nexport const SettingsContainer: FC<Props> = ({\n  canEdit = true,\n  disableSave,\n  children,\n  hasCTA,\n  onCancel,\n  onSave,\n  title,\n  customCTA,\n  creating,\n  editing: externalEditing,\n  setEditing: externalSetEditing,\n  modalDescription,\n  useBlockNavigation,\n}) => {\n  const [internalEditing, internalSetEditing] = useState(creating ?? false);\n  const [isSaving, setIsSaving] = useState(false);\n  const { openToast, closeToast } = useToast();\n\n  const shouldUseExternalEditing = externalEditing !== undefined && !!externalSetEditing;\n\n  const editing = shouldUseExternalEditing ? externalEditing : internalEditing;\n  const setEditing = shouldUseExternalEditing ? externalSetEditing : internalSetEditing;\n\n  const { allowNavigation, blocked, cancelNavigation } = useBlockNavigation(editing && !isSaving);\n\n  const edit = () => {\n    setEditing(true);\n  };\n\n  const cancel = () => {\n    onCancel?.();\n    closeToast();\n    setEditing(false);\n  };\n\n  const save = async () => {\n    setIsSaving(true);\n    try {\n      await onSave?.();\n      setEditing(false);\n    } catch (e) {\n      const message = extractErrorMessage(e);\n      if (message) {\n        openToast({ type: 'error', text: message });\n      }\n    } finally {\n      setIsSaving(false);\n    }\n  };\n\n  const modalState = useModalState(save);\n\n  if (!modalDescription) {\n    modalDescription = 'Double check before saving your changes.';\n  }\n\n  return (\n    <SettingsContext.Provider\n      value={{\n        editing,\n        setEditing,\n      }}\n    >\n      <Modal\n        {...modalState}\n        confirmButtonText=\"Save changes\"\n        description={modalDescription}\n        title=\"Save changes?\"\n        warning\n      />\n      <Modal\n        isOpen={blocked}\n        close={cancelNavigation}\n        confirm={() => {\n          allowNavigation();\n          return Promise.resolve();\n        }}\n        confirmButtonText=\"Navigate without saving\"\n        cancelButtonText=\"Keep editing\"\n        description={'Your changes are unsaved – are you sure you want to navigate away?'}\n        title=\"Save changes?\"\n        warning\n      />\n      <Container>\n        <TitleContainer>\n          <Typography variant=\"h3\">{title}</Typography>\n\n          <FlexBox alignItems=\"center\" gap={1}>\n            {hasCTA && (\n              <>\n                {editing ? (\n                  <>\n                    <Button compact onClick={cancel} variant=\"ghost\">\n                      Cancel\n                    </Button>\n                    <Button compact disabled={disableSave} onClick={modalState.open}>\n                      Save\n                    </Button>\n                  </>\n                ) : (\n                  <>\n                    {customCTA\n                      ? customCTA\n                      : canEdit && (\n                          <Button compact onClick={edit} variant=\"ghost\">\n                            Edit\n                          </Button>\n                        )}\n                  </>\n                )}\n              </>\n            )}\n          </FlexBox>\n        </TitleContainer>\n        <ContentContainer>{children}</ContentContainer>\n      </Container>\n    </SettingsContext.Provider>\n  );\n};\n"],"names":["Container","styled","theme","border","borderColor","styleConfig","colors","subtle","borderRadius","backgroundColor","container","TitleContainer","breakpoints","down","flexDirection","alignItems","gap","spacing","padding","borderBottom","borderBottomColor","display","justifyContent","ContentContainer","DEFAULT_STATE","editing","setEditing","noop","SettingsContext","createContext","useSettingsContainer","useContext","SettingsContainer","canEdit","disableSave","children","hasCTA","onCancel","onSave","title","customCTA","creating","externalEditing","externalSetEditing","modalDescription","useBlockNavigation","internalEditing","internalSetEditing","useState","isSaving","setIsSaving","openToast","closeToast","useToast","shouldUseExternalEditing","undefined","allowNavigation","blocked","cancelNavigation","edit","cancel","save","e","message","extractErrorMessage","type","text","modalState","useModalState","React","Provider","value","Modal","confirmButtonText","description","warning","isOpen","close","confirm","Promise","resolve","cancelButtonText","Typography","variant","FlexBox","Button","compact","onClick","disabled","open"],"mappings":"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"}