{
  "version": 3,
  "sources": ["../../src/modules/access-gate/components/AccessCodeGateFlexbox.tsx", "../../src/modules/access-gate/components/CodeTextField.tsx", "../../src/modules/access-gate/hooks/useAccessCodes.ts"],
  "sourcesContent": ["import { ButtonEx } from '@ariestools/sdk-react/button'\nimport type { FlexBoxProps } from '@ariestools/sdk-react/flexbox'\nimport { FlexGrowCol, FlexGrowRow } from '@ariestools/sdk-react/flexbox'\nimport { FormControl } from '@mui/material'\nimport type { PropsWithChildren } from 'react'\nimport React, {\n  useCallback, useEffect, useState,\n} from 'react'\n\nimport { CodeTextField } from './CodeTextField.tsx'\n\n/** Props for {@link AccessCodeGateFlexbox}. */\nexport interface AccessCodeGateFlexbox extends PropsWithChildren, FlexBoxProps {\n  onAccessCodeSuccess?: (code?: string) => void\n  onCodeInputChange?: (codeInput?: string) => void\n  successRedirectDelay?: number\n  textFieldHelperText?: string\n  userAccessCodes?: string[]\n  validAccessCodes?: string[]\n  validateFunction?: (codeInput?: string) => boolean\n}\n\n/** Access gate UI that shows children only after a valid access code is entered. */\nexport const AccessCodeGateFlexbox: React.FC<AccessCodeGateFlexbox> = ({\n  children,\n  onCodeInputChange,\n  onAccessCodeSuccess,\n  successRedirectDelay = 1500,\n  userAccessCodes,\n  validAccessCodes,\n  validateFunction,\n  ...props\n}) => {\n  const [initialized, setInitialized] = useState(false)\n  const [accessGranted, setAccessGranted] = useState(false)\n  const [codeInput, setCodeInput] = useState<string>()\n  const [validCode, setValidCode] = useState<boolean | null>(null)\n\n  const disabled = validateFunction ? !validateFunction(codeInput) : !codeInput\n  const validateCode = useCallback((accessCode: string) => (accessCode ? validAccessCodes?.includes(accessCode) : false), [validAccessCodes])\n\n  // keep the parent informed of the code input\n  useEffect(() => {\n    if (onCodeInputChange) {\n      onCodeInputChange(codeInput)\n    }\n  }, [codeInput, onCodeInputChange])\n\n  const onEnter = () => {\n    onCodeInputChange?.(codeInput)\n    if (codeInput) {\n      const granted = validateCode(codeInput)\n      if (granted) {\n        setValidCode(true)\n        // delay success callback to ensure the ui shows success before next action\n        setTimeout(() => {\n          setAccessGranted(granted)\n          onAccessCodeSuccess?.(codeInput)\n        }, successRedirectDelay)\n      } else {\n        setValidCode(false)\n      }\n    }\n  }\n\n  useEffect(() => {\n    // whenever a code changes, reset the success/failure warning\n    // eslint-disable-next-line react-hooks/set-state-in-effect, react-x/set-state-in-effect\n    setValidCode(null)\n  }, [codeInput])\n\n  useEffect(() => {\n    if (userAccessCodes) {\n      const granted = userAccessCodes.some(code => validateCode(code))\n      if (granted) {\n        // eslint-disable-next-line react-hooks/set-state-in-effect, react-x/set-state-in-effect\n        setAccessGranted(true)\n        onAccessCodeSuccess?.()\n      }\n    }\n    // eslint-disable-next-line react-x/set-state-in-effect\n    setInitialized(true)\n    // eslint-disable-next-line react-hooks/exhaustive-deps, react-x/exhaustive-deps\n  }, [userAccessCodes, validateCode])\n\n  return (\n    <>\n      {initialized\n        ? accessGranted\n          ? children\n          : (\n              <FlexGrowCol\n                {...props}\n                sx={[{ gap: 2 }, ...(Array.isArray(props.sx) ? props.sx : [props.sx])]}\n              >\n                <FlexGrowRow\n                  sx={{\n                    gap: 2,\n                    alignItems: 'start',\n                  }}\n                >\n                  <FormControl>\n                    <CodeTextField\n                      codeInput={codeInput}\n                      disabled={disabled}\n                      label=\"Enter Access Code\"\n                      setCodeInput={setCodeInput}\n                      validCode={validCode}\n                      onEnter={onEnter}\n                    />\n                  </FormControl>\n                  <FormControl>\n                    <ButtonEx disabled={disabled} onClick={onEnter} variant=\"contained\">\n                      Enter\n                    </ButtonEx>\n                  </FormControl>\n                </FlexGrowRow>\n              </FlexGrowCol>\n            )\n\n        : null}\n    </>\n  )\n}\n", "import { CheckCircleOutlined, ErrorOutlined } from '@mui/icons-material'\nimport type { TextFieldProps } from '@mui/material'\nimport {\n  InputAdornment, styled, TextField,\n} from '@mui/material'\nimport type { KeyboardEvent } from 'react'\nimport React from 'react'\n\n/** Props for {@link CodeTextField}. */\nexport type CodeTextFieldProps = TextFieldProps & {\n  codeInput?: string\n  disabled?: boolean\n  onEnter?: () => void\n  setCodeInput?: (code?: string) => void\n  validCode?: boolean | null\n}\n\n/** Access code text field with success/error adornments and enter-key support. */\nexport const CodeTextField: React.FC<CodeTextFieldProps> = ({\n  codeInput, disabled, onEnter, setCodeInput, validCode, ...props\n}) => (\n  <StyledTextField\n    slotProps={{\n      input: {\n        endAdornment: (\n          <InputAdornment position=\"start\">\n            {/* Having a display block element for all 3 states (null, false, true) means the icon coming in and out\n            does not affect the overall width */}\n            <CheckCircleOutlined sx={{ display: validCode === null ? 'block' : 'hidden', visibility: 'hidden' }} />\n            <CheckCircleOutlined\n              color=\"success\"\n              fontSize=\"medium\"\n              sx={{ position: 'absolute', visibility: validCode === true ? 'visible' : 'hidden' }}\n            />\n            <ErrorOutlined color=\"error\" fontSize=\"medium\" sx={{ position: 'absolute', visibility: validCode === false ? 'visible' : 'hidden' }} />\n          </InputAdornment>\n        ),\n      },\n    }}\n    onKeyUp={(event: KeyboardEvent) => (event.key === 'Enter' && !disabled ? onEnter?.() : null)}\n    autoFocus\n    size=\"small\"\n    value={codeInput ?? ''}\n    onChange={(event: React.ChangeEvent<HTMLInputElement>) => setCodeInput?.(event.target.value)}\n    {...props}\n  />\n)\n\nconst StyledTextField = styled(TextField, { name: 'StyledTextField' })(() => ({ '& .MuiInputBase-root': { paddingRight: 0 } }))\n", "import { useMemo, useState } from 'react'\n\n/** Manages access code input, validation, and localStorage persistence. */\nexport const useAccessCodes = (localStorageKey: string, validCodeLength = 6) => {\n  const [validated, setValidated] = useState(false)\n  const [codeInput, setCodeInput] = useState('')\n\n  const onAccessCodeSuccess = () => {\n    // Save the access code to local storage\n    if (codeInput) {\n      localStorage.setItem(localStorageKey, JSON.stringify([codeInput]))\n      setValidated(true)\n    } else {\n      // If the codeInput is empty, but we have success, do nothing since the successful code is already saved\n      setValidated(true)\n    }\n  }\n  const validateCodeInput = (code?: string) => {\n    return code?.length === validCodeLength\n  }\n  const onCodeInputChange = (code?: string) => {\n    setCodeInput(code ?? '')\n  }\n  const userAccessCodes = useMemo(() => {\n    const storedCodes = localStorage.getItem(localStorageKey)\n    if (storedCodes) {\n      const parsedResult = JSON.parse(storedCodes ?? '')\n      if (Array.isArray(parsedResult)) return parsedResult\n    }\n  }, [localStorageKey])\n\n  return {\n    codeInput, validated, userAccessCodes, onAccessCodeSuccess, onCodeInputChange, validateCodeInput,\n  }\n}\n"],
  "mappings": "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",
  "names": ["jsx", "jsxs", "useState"]
}
