{"version":3,"file":"LazyBillUploadPage.919cccb2d6229d5a.prod.js","mappings":"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","sources":["webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/bill-upload.generated.tsx","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/utils/constants.ts","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/utils/functions.ts","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/utils/testing.ts","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/components/file-list.tsx","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/components/uploader.tsx","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/components/bill-upload.tsx","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/components/buttons.tsx","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/components/faq.tsx","webpack://aurora-new-frontend/./packages/lead-capture/src/pages/bill-upload/bill-upload-page.tsx"],"sourcesContent":["// @ts-ignore: Ignore unused { * as Types } import\nimport * as Types from '@aurorasolar/graphql-client-schema';\n\nimport { gql } from '@apollo/client';\nimport * as Apollo from '@apollo/client';\nconst defaultOptions = {} as const;\nexport type SubmitSanitizationJobMutationVariables = Types.Exact<{\n sanitizationJobInput: Types.SubmitLeadCaptureSanitizationJobInput;\n}>;\n\n\nexport type SubmitSanitizationJobMutation = { __typename: 'Mutation', submitLeadCaptureSanitizationJob: boolean };\n\n\nexport const SubmitSanitizationJobDocument = gql`\n mutation submitSanitizationJob($sanitizationJobInput: SubmitLeadCaptureSanitizationJobInput!) @trace_info(traceInfo: {pod: leads}) {\n submitLeadCaptureSanitizationJob(sanitizationJobInput: $sanitizationJobInput)\n}\n `;\nexport type SubmitSanitizationJobMutationFn = Apollo.MutationFunction;\n\n/**\n * __useSubmitSanitizationJobMutation__\n *\n * To run a mutation, you first call `useSubmitSanitizationJobMutation` within a React component and pass it any options that fit your needs.\n * When your component renders, `useSubmitSanitizationJobMutation` returns a tuple that includes:\n * - A mutate function that you can call at any time to execute the mutation\n * - An object with fields that represent the current status of the mutation's execution\n *\n * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;\n *\n * @example\n * const [submitSanitizationJobMutation, { data, loading, error }] = useSubmitSanitizationJobMutation({\n * variables: {\n * sanitizationJobInput: // value for 'sanitizationJobInput'\n * },\n * });\n */\nexport function useSubmitSanitizationJobMutation(baseOptions?: Apollo.MutationHookOptions) {\n const options = {...defaultOptions, ...baseOptions}\n return Apollo.useMutation(SubmitSanitizationJobDocument, options);\n }\nexport type SubmitSanitizationJobMutationHookResult = ReturnType;\nexport type SubmitSanitizationJobMutationResult = Apollo.MutationResult;\nexport type SubmitSanitizationJobMutationOptions = Apollo.BaseMutationOptions;","import type { FileResultType } from '@aurorasolar/file-uploader';\nimport { SupportedMimeTypes } from '@aurorasolar/file-uploader';\n\nexport interface UtilityBillFile {\n error?: ErrorType;\n file: File;\n type: FileResultType;\n uploadStatus: UploadStatus;\n}\n\nexport enum ErrorType {\n FILE_SIZE_TOO_LARGE = \"This file won't upload since it's larger than 20 MB. Remove this file to continue.\",\n INVALID_MIME_TYPE = \"This file won't upload since it's the wrong format. Accepted file formats: jpg, png, pdf, webp. Remove this file to continue.\",\n TOO_MANY_FILES = 'You can attach up to 3 files. Remove one or more files to continue.',\n}\n\nexport enum UploadStatus {\n PENDING = 'pending',\n IN_PROGRESS = 'in_progress',\n COMPLETE = 'complete',\n}\n\nexport const MaxFileSize = 1024 * 1024 * 20; // 20mb in bytes\n\nexport const ValidMimeTypes: string[] = [\n SupportedMimeTypes.JPEG,\n SupportedMimeTypes.PDF,\n SupportedMimeTypes.PNG,\n SupportedMimeTypes.WEBP,\n];\n","import { getFileResultType } from '@aurorasolar/file-uploader';\n\nimport { ErrorType, MaxFileSize, UploadStatus, UtilityBillFile, ValidMimeTypes } from './constants';\n\nexport const createUtilityBillFile = (file: File): UtilityBillFile => ({\n error: determineFileError(file.size, file.type),\n file,\n type: getFileResultType(file.type),\n uploadStatus: UploadStatus.PENDING,\n});\n\nconst determineFileError = (fileSize: number, fileType: string) => {\n if (fileSize > MaxFileSize) {\n return ErrorType.FILE_SIZE_TOO_LARGE;\n }\n\n if (!ValidMimeTypes.includes(fileType)) {\n return ErrorType.INVALID_MIME_TYPE;\n }\n\n return undefined;\n};\n","import { FileResultType } from '@aurorasolar/file-uploader';\n\nimport { ErrorType, UploadStatus, UtilityBillFile } from './constants';\n\nexport const pngFile = new File(['png file content'], 'file.png', { type: 'image/png' });\nexport const jpgFile = new File(['jpg file content'], 'file.jpg', { type: 'image/jpeg' });\nexport const webpFile = new File(['webp file content'], 'file.webp', { type: 'image/webp' });\nexport const pdfFile = new File(['pdf file content'], 'file.pdf', { type: 'application/pdf' });\nexport const textFile = new File(['text file content'], 'file.txt', { type: 'text/plain' });\n\nexport const FILE_SIZE_TOO_LARGE: UtilityBillFile[] = [\n {\n error: ErrorType.FILE_SIZE_TOO_LARGE,\n file: pngFile,\n type: FileResultType.IMAGE,\n uploadStatus: UploadStatus.PENDING,\n },\n];\n\nexport const INVALID_MIME_TYPE: UtilityBillFile[] = [\n {\n error: ErrorType.INVALID_MIME_TYPE,\n file: textFile,\n type: FileResultType.UNKNOWN,\n uploadStatus: UploadStatus.PENDING,\n },\n];\n\nexport const TOO_MANY_FILES: UtilityBillFile[] = [\n {\n error: undefined,\n file: pngFile,\n type: FileResultType.IMAGE,\n uploadStatus: UploadStatus.PENDING,\n },\n {\n error: undefined,\n file: jpgFile,\n type: FileResultType.IMAGE,\n uploadStatus: UploadStatus.PENDING,\n },\n {\n error: undefined,\n file: pdfFile,\n type: FileResultType.DOCUMENT,\n uploadStatus: UploadStatus.PENDING,\n },\n {\n error: undefined,\n file: webpFile,\n type: FileResultType.IMAGE,\n uploadStatus: UploadStatus.PENDING,\n },\n];\n\nexport const UPLOAD_PENDING: UtilityBillFile[] = [\n {\n error: undefined,\n file: pngFile,\n type: FileResultType.IMAGE,\n uploadStatus: UploadStatus.PENDING,\n },\n];\n\nexport const UPLOAD_IN_PROGRESS: UtilityBillFile[] = [\n {\n error: undefined,\n file: pngFile,\n type: FileResultType.IMAGE,\n uploadStatus: UploadStatus.IN_PROGRESS,\n },\n];\n\nexport const UPLOAD_COMPLETE: UtilityBillFile[] = [\n {\n error: undefined,\n file: pngFile,\n type: FileResultType.IMAGE,\n uploadStatus: UploadStatus.COMPLETE,\n },\n];\n","import { useMemo } from 'react';\nimport { Box, Flex } from 'reflexbox/styled-components';\nimport styled from 'styled-components';\n\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\nimport { FileResultType, getFileSizeFormatted } from '@aurorasolar/file-uploader';\n\nimport { LCAIButton, LCAIButtonIntent } from '../../../typography/lcai-button/lcai-button';\nimport { LCAIText } from '../../../typography/lcai-text/lcai-text';\nimport {\n ERROR_TEXT_COLOR,\n INPUT_BACKGROUND_COLOR,\n INPUT_ERROR_COLOR,\n PRIMARY_COLOR,\n SECONDARY_COLOR,\n} from '../../../utils/constants';\nimport { BillUploadTestIds } from '../../../utils/test-ids';\nimport { ErrorType, UploadStatus, UtilityBillFile } from '../utils';\n\ninterface FileListProps {\n filesToUpload: UtilityBillFile[];\n removeFileHandler: (index: number) => void;\n}\n\nexport function FileList({ filesToUpload, removeFileHandler }: FileListProps) {\n return (\n <>\n {filesToUpload.map((utilityBillFile, index) => (\n removeFileHandler(index)}\n />\n ))}\n {filesToUpload.length > 3 && (\n \n {ErrorType.TOO_MANY_FILES}\n \n )}\n \n );\n}\n\ninterface FileListItemProps {\n listItem: UtilityBillFile;\n removeFileHandler: () => void;\n}\n\nfunction FileListItem({ listItem, removeFileHandler }: FileListItemProps) {\n const fileSize = useMemo(() => {\n return getFileSizeFormatted(listItem.file.size);\n }, [listItem.file.size]);\n\n return (\n \n \n \n \n \n {listItem.file.name}\n \n \n {fileSize}\n \n \n {listItem.uploadStatus === UploadStatus.PENDING ? (\n \n \n \n ) : (\n \n \n \n )}\n \n {listItem.error && (\n \n \n {listItem.error}\n \n \n )}\n \n );\n}\n\ninterface FileContainerProps {\n isError: boolean;\n}\n\nconst FileContainer = styled(Flex)`\n background: ${(props) => (props.isError ? INPUT_ERROR_COLOR : INPUT_BACKGROUND_COLOR)};\n border: 1px solid ${(props) => (props.isError ? INPUT_ERROR_COLOR : INPUT_BACKGROUND_COLOR)};\n border-radius: 6px;\n padding-left: 16px;\n padding-right: 0;\n flex-direction: column;\n`;\n\nconst FileNameText = styled(LCAIText)`\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst FileSizeText = styled(LCAIText)`\n text-align: right;\n white-space: nowrap;\n flex: 1;\n`;\n\nconst RemoveFileButton = styled(LCAIButton)`\n :hover,\n :active {\n &&& {\n background-image: none;\n }\n }\n`;\n","import { DropzoneRootProps, useDropzone } from 'react-dropzone';\nimport { Box, Flex } from 'reflexbox/styled-components';\nimport styled from 'styled-components';\n\nimport { Colors } from '@aurorasolar/common-core/src/colors';\nimport { AuroraIcon, AuroraIconType } from '@aurorasolar/common-core/src/icon';\n\nimport { LCAIText } from '../../../typography/lcai-text/lcai-text';\nimport {\n DROP_AREA_BORDER_COLOR,\n INPUT_BACKGROUND_COLOR,\n PRIMARY_COLOR,\n SECONDARY_COLOR,\n} from '../../../utils/constants';\nimport { BillUploadTestIds } from '../../../utils/test-ids';\nimport { ValidMimeTypes } from '../utils';\n\ninterface UploaderProps {\n addFileHandler: (filesToAdd: File[]) => void;\n uploadInProgress: boolean;\n}\n\nexport function Uploader({ addFileHandler, uploadInProgress }: UploaderProps) {\n const { getRootProps, getInputProps, isDragActive, isDragAccept, isDragReject } = useDropzone({\n accept: ValidMimeTypes,\n disabled: uploadInProgress,\n multiple: true,\n onDrop: (acceptedFiles, fileRejections) => {\n const rejectedFiles = fileRejections.map((reject) => reject.file);\n addFileHandler([...acceptedFiles, ...rejectedFiles]);\n },\n });\n\n return (\n <>\n \n \n \n \n \n \n \n Attach files\n \n \n \n \n Drag and drop\n \n \n \n \n or \n \n \n browse files\n \n \n \n \n \n \n \n Attach file or take a photo\n \n \n \n \n );\n}\n\nconst DesktopDropAreaContainer = styled.div`\n border-radius: 6px;\n background: ${INPUT_BACKGROUND_COLOR};\n padding: 24px;\n\n @media (hover: none) {\n display: none;\n }\n`;\n\nconst DropAreaContents = styled.div`\n pointer-events: none;\n`;\n\ntype ValidDropzoneRootProps = Pick<\n DropzoneRootProps,\n 'isDragActive' | 'isDragAccept' | 'isDragReject'\n> & {\n isDisabled?: boolean;\n};\n\nconst DropArea = styled.div`\n border: 2px dashed\n ${({ isDragAccept, isDragReject, isDragActive }) => {\n if (isDragAccept) {\n return Colors.PRIMARY_GREEN;\n }\n if (isDragReject) {\n return Colors.RED;\n }\n if (isDragActive) {\n return Colors.BLACK;\n }\n return DROP_AREA_BORDER_COLOR;\n }};\n cursor: ${({ isDisabled }) => (isDisabled ? 'not-allowed !important' : 'pointer')};\n padding: 32px;\n transition: border 0.24s ease-in-out;\n`;\n\nconst MobileDropAreaContainer = styled(Flex)`\n background: ${INPUT_BACKGROUND_COLOR};\n border: 1px solid ${INPUT_BACKGROUND_COLOR};\n height: 48px;\n border-radius: 6px;\n align-items: center;\n justify-content: space-between;\n padding: 16px 14px 16px 16px;\n cursor: ${({ isDisabled }) => (isDisabled ? 'not-allowed !important' : 'pointer')};\n\n @media (hover: hover) {\n display: none;\n }\n`;\n","import { useCallback } from 'react';\nimport styled from 'styled-components';\n\nimport {\n Analytics,\n AnalyticsEventTypes,\n LeadCaptureBillUploadErrorTypes,\n useAppModule,\n} from '@aurorasolar/common-module-loader';\n\nimport { createUtilityBillFile, ErrorType, UtilityBillFile } from '../utils';\nimport { FileList } from './file-list';\nimport { Uploader } from './uploader';\n\ninterface BillUploadProps {\n filesToUpload: UtilityBillFile[];\n projectId: string;\n updateFilesToUpload: (files: UtilityBillFile[]) => void;\n uploadInProgress: boolean;\n}\n\nexport function BillUpload({\n filesToUpload,\n projectId,\n updateFilesToUpload,\n uploadInProgress,\n}: BillUploadProps) {\n const analytics = useAppModule(Analytics);\n\n const addFileHandler = useCallback(\n (filesToAdd: File[]) => {\n const newFiles: UtilityBillFile[] = filesToAdd.map((file) => createUtilityBillFile(file));\n\n newFiles\n .filter((newFile) => newFile.error)\n .forEach((newFile) => {\n analytics?.track(AnalyticsEventTypes.LeadCaptureBillUploadError, {\n error_type:\n newFile.error === ErrorType.FILE_SIZE_TOO_LARGE\n ? LeadCaptureBillUploadErrorTypes.FileSize\n : LeadCaptureBillUploadErrorTypes.FileType,\n file_type:\n newFile.error === ErrorType.INVALID_MIME_TYPE ? newFile.file.type : undefined,\n project_id: projectId,\n });\n });\n\n updateFilesToUpload([...filesToUpload, ...newFiles]);\n },\n [analytics, filesToUpload, projectId, updateFilesToUpload],\n );\n\n const removeFileHandler = useCallback(\n (index: number) => {\n const files = [...filesToUpload];\n files.splice(index, 1);\n\n updateFilesToUpload(files);\n },\n [filesToUpload, updateFilesToUpload],\n );\n\n return (\n \n \n \n \n );\n}\n\nconst BillUploadContainer = styled.div`\n display: grid;\n grid-row-gap: 8px;\n margin-top: 8px;\n`;\n","import { LCAIButton, LCAIButtonIntent } from '../../../typography/lcai-button/lcai-button';\nimport { BillUploadTestIds } from '../../../utils/test-ids';\n\nexport const UPLOAD_BUTTON_TEXT = 'Upload';\nexport const UPLOAD_BUTTON_IN_PROGRESS_TEXT = 'Uploading...';\n\ninterface ButtonsProps {\n isUploadAllowed: () => boolean;\n skipBillUpload: () => void;\n uploadBill: () => void;\n uploadInProgress: boolean;\n}\n\nexport function Buttons({\n isUploadAllowed,\n skipBillUpload,\n uploadBill,\n uploadInProgress,\n}: ButtonsProps) {\n return (\n <>\n \n {uploadInProgress ? UPLOAD_BUTTON_IN_PROGRESS_TEXT : UPLOAD_BUTTON_TEXT}\n \n \n Skip\n \n \n );\n}\n","import { TextAccordion } from '../../../shared-components';\n\nexport function Faq() {\n return (\n <>\n \n \n \n \n );\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useDebouncedCallback } from '@aurorasolar/common-core/src/hooks';\nimport {\n Analytics,\n AnalyticsEventTypes,\n AnalyticsPageTypes,\n AppRouterNavigation,\n FileUploadHandler,\n LeadCaptureBillUploadErrorTypes,\n useAppModule,\n} from '@aurorasolar/common-module-loader';\nimport { FileResultType } from '@aurorasolar/file-uploader';\n\nimport { useCreateLCAIBssUploadUrls, useRouteData } from '../../hooks';\nimport { AnimateView, BoxWithMargin, Image, SplitView, TopRail } from '../../shared-components';\nimport { LCAIText } from '../../typography/lcai-text/lcai-text';\nimport { DEBOUNCE_TIME, HEADER_COLOR } from '../../utils/constants';\nimport { SourcePage } from '../../utils/source-page';\nimport { useSubmitSanitizationJobMutation } from './bill-upload.generated';\nimport { BillUpload, Buttons, Faq, UploadStatus, UtilityBillFile } from './components';\n\nexport interface BillUploadPageProps {\n projectId: string;\n sourcePage: SourcePage;\n}\n\nexport function BillUploadPage({ projectId, sourcePage }: BillUploadPageProps) {\n const navigation = useAppModule(AppRouterNavigation);\n const analytics = useAppModule(Analytics);\n const fileUploader = useAppModule(FileUploadHandler);\n\n const { templateId } = useRouteData();\n const { fetchBssUploadUrls } = useCreateLCAIBssUploadUrls();\n\n const [submitSanitizationJob] = useSubmitSanitizationJobMutation();\n\n const [filesToUpload, setFilesToUpload] = useState([]);\n const [uploadInProgress, setUploadInProgress] = useState(false);\n\n const updateFilesToUpload = (files: UtilityBillFile[]) => {\n setFilesToUpload(files);\n };\n\n useEffect(() => {\n analytics?.page(AnalyticsPageTypes.LeadCaptureBillUpload, {\n project_id: projectId,\n });\n }, [analytics, projectId]);\n\n const isUploadAllowed = useCallback(() => {\n return (\n filesToUpload.length > 0 &&\n filesToUpload.length <= 3 &&\n filesToUpload.filter((selectedFile) => selectedFile.error).length === 0\n );\n }, [filesToUpload]);\n\n const getUploadBillArrays = useMemo(() => {\n return filesToUpload.reduce<{\n files: File[];\n inProgressFiles: UtilityBillFile[];\n }>(\n (acc, curr) => ({\n files: [...acc.files, curr.file],\n inProgressFiles: [\n ...acc.inProgressFiles,\n { ...curr, uploadStatus: UploadStatus.IN_PROGRESS },\n ],\n }),\n { files: [], inProgressFiles: [] },\n );\n }, [filesToUpload]);\n\n const uploadBillFiles = useCallback(async () => {\n const { files, inProgressFiles } = getUploadBillArrays;\n setFilesToUpload(inProgressFiles);\n\n const bssUploadUrls = await fetchBssUploadUrls({ files, projectId });\n\n const blobIdsPromises = bssUploadUrls?.map(async (uploadUrl, i) => {\n let blobId: string | undefined;\n\n try {\n if (uploadUrl) {\n blobId = await fileUploader?.uploadToSignedUrl?.(files[i], uploadUrl);\n }\n } catch {\n await analytics?.track(AnalyticsEventTypes.LeadCaptureBillUploadError, {\n error_type: LeadCaptureBillUploadErrorTypes.Upload,\n project_id: projectId,\n });\n } finally {\n inProgressFiles[i].uploadStatus = UploadStatus.COMPLETE;\n setFilesToUpload([...inProgressFiles]);\n }\n\n return blobId;\n });\n\n if (blobIdsPromises) {\n const blobIds = (await Promise.all(blobIdsPromises)).filter((id): id is string => !!id);\n if (blobIds.length > 0) {\n try {\n await submitSanitizationJob({\n variables: {\n sanitizationJobInput: {\n blobIds,\n id: projectId,\n },\n },\n });\n } catch {\n await analytics?.track(AnalyticsEventTypes.LeadCaptureBillUploadError, {\n error_type: LeadCaptureBillUploadErrorTypes.Sanitization,\n project_id: projectId,\n });\n }\n }\n }\n }, [\n analytics,\n fetchBssUploadUrls,\n fileUploader,\n getUploadBillArrays,\n projectId,\n submitSanitizationJob,\n ]);\n\n const uploadBill = useDebouncedCallback(\n async () => {\n setUploadInProgress(true);\n await uploadBillFiles();\n await analytics?.track(AnalyticsEventTypes.LeadCaptureSubmittedBill, {\n contains_files: filesToUpload.some((file) => file.type === FileResultType.DOCUMENT),\n contains_images: filesToUpload.some((file) => file.type === FileResultType.IMAGE),\n number_of_files: filesToUpload.length,\n project_id: projectId,\n });\n navigation?.navigate(`/projects/${projectId}/profile-review`, { replace: true });\n },\n [analytics, navigation, projectId, uploadBillFiles, filesToUpload],\n DEBOUNCE_TIME,\n );\n\n const skipBillUpload = useDebouncedCallback(\n async () => {\n navigation?.navigate(`/projects/${projectId}/profile-review`, { replace: true });\n },\n [navigation, projectId],\n DEBOUNCE_TIME,\n );\n\n return (\n <>\n \n \n \n }\n leftContent={\n <>\n \n Upload your utility bill to get a more accurate quote\n \n \n \n \n \n \n \n \n }\n rightContent={}\n />\n \n \n );\n}\n\nexport default BillUploadPage;\n"],"names":["defaultOptions","SubmitSanitizationJobDocument","ErrorType","UploadStatus","ValidMimeTypes","JPEG","PDF","PNG","WEBP","createUtilityBillFile","file","error","determineFileError","size","type","uploadStatus","PENDING","fileSize","fileType","FILE_SIZE_TOO_LARGE","includes","INVALID_MIME_TYPE","pngFile","File","jpgFile","webpFile","pdfFile","textFile","IMAGE","UNKNOWN","DOCUMENT","IN_PROGRESS","COMPLETE","FileList","filesToUpload","removeFileHandler","map","utilityBillFile","index","FileListItem","listItem","name","length","color","pt","TOO_MANY_FILES","useMemo","FileContainer","isError","width","alignItems","fillColor","IMAGE_PREVIEW","DOCUMENT_PREVIEW","testid","FILE_LIST_ICON","FileNameText","FILE_LIST_NAME","px","FileSizeText","FILE_LIST_SIZE","RemoveFileButton","REMOVE_FILE_BUTTON","iconOnly","intent","GHOST_LIGHT","onClick","CLOSE","height","justifyContent","PROGRESS_SPINNER","CHECKMARK","spin","FILE_LIST_SPINNER_ICON","FILE_LIST_COMPLETE_ICON","pb","pr","props","Uploader","addFileHandler","uploadInProgress","getRootProps","getInputProps","isDragActive","isDragAccept","isDragReject","accept","disabled","multiple","onDrop","acceptedFiles","fileRejections","rejectedFiles","reject","FILE_UPLOADER_INPUT","DesktopDropAreaContainer","DropArea","isDisabled","DropAreaContents","ATTACH_FILE","ml","mt","textAlign","textDecoration","MobileDropAreaContainer","BTN_PLUS","div","PRIMARY_GREEN","RED","BLACK","BillUpload","projectId","updateFilesToUpload","analytics","useCallback","filesToAdd","newFiles","filter","newFile","forEach","track","LeadCaptureBillUploadError","error_type","FileSize","FileType","file_type","undefined","project_id","files","splice","BillUploadContainer","UPLOAD_BUTTON_TEXT","UPLOAD_BUTTON_IN_PROGRESS_TEXT","Buttons","isUploadAllowed","skipBillUpload","uploadBill","UPLOAD_BUTTON","PRIMARY_LIGHT","SKIP_BUTTON","Faq","text","expandedTexts","BillUploadPage","sourcePage","navigation","fileUploader","templateId","fetchBssUploadUrls","submitSanitizationJob","baseOptions","options","useSubmitSanitizationJobMutation","setFilesToUpload","useState","setUploadInProgress","useEffect","page","LeadCaptureBillUpload","selectedFile","getUploadBillArrays","reduce","acc","curr","inProgressFiles","uploadBillFiles","async","bssUploadUrls","blobIdsPromises","uploadUrl","i","blobId","uploadToSignedUrl","Upload","blobIds","Promise","all","id","variables","sanitizationJobInput","Sanitization","LeadCaptureSubmittedBill","contains_files","some","contains_images","number_of_files","navigate","replace","buttons","leftContent","fontWeight","rightContent"],"sourceRoot":""}