{"version":3,"file":"LazyBillUploadPage.d205430a5cc4551b.0.6737.0.js","mappings":"60BAKA,MAAMA,EAAiB,CAAC,EASXC,EAAgC,IAAG;;;;UCJpCC,EAMAC,E,+EANZ,SAAYD,GACV,2GACA,oJACA,sFACD,CAJD,CAAYA,IAAAA,EAAS,KAMrB,SAAYC,GACV,oBACA,4BACA,qBACD,CAJD,CAAYA,IAAAA,EAAY,KAMjB,MAEMC,EAA2B,CACtC,UACA,SACA,SACA,WCjBIC,EAAqB,CAACC,EAAkBC,IACxCD,EDUqB,SCThBJ,EAAUM,oBAGdJ,EAAeK,SAASF,QAA7B,EACSL,EAAUQ,kBCbRC,EAAU,IAAIC,KAAK,CAAC,oBAAqB,WAAY,CAAEC,KAAM,cAC7DC,EAAU,IAAIF,KAAK,CAAC,oBAAqB,WAAY,CAAEC,KAAM,eAC7DE,EAAW,IAAIH,KAAK,CAAC,qBAAsB,YAAa,CAAEC,KAAM,eAChEG,EAAU,IAAIJ,KAAK,CAAC,oBAAqB,WAAY,CAAEC,KAAM,oBAC7DI,EAAW,IAAIL,KAAK,CAAC,qBAAsB,WAAY,CAAEC,KAAM,eAIjEX,EAAUM,oBAEX,WACQL,EAAae,QAMpBhB,EAAUQ,kBAEX,aACQP,EAAae,QAQrB,WACQf,EAAae,QAKrB,WACQf,EAAae,QAKrB,cACQf,EAAae,QAKrB,WACQf,EAAae,QAQrB,WACQf,EAAae,QAQrB,WACQf,EAAagB,YAQrB,WACQhB,EAAaiB,S,uPCtDxB,SAASC,GAAS,cAAEC,EAAa,kBAAEC,IACxC,OACE,gCACGD,EAAcE,KAAI,CAACC,EAAiBC,IACnC,gBAACC,EAAY,CACXC,IAAKH,EAAgBI,KAAKC,KAC1BC,SAAUN,EACVF,kBAAmB,IAAMA,EAAkBG,OAG9CJ,EAAcU,OAAS,GACtB,gBAAC,IAAQ,CAACC,MAAO,KAAkBC,GAAG,MAAMrB,KAAK,cAC9CX,EAAUiC,gBAKrB,CAOA,SAASR,GAAa,SAAEI,EAAQ,kBAAER,IAChC,MAAMjB,GAAW,IAAA8B,UAAQ,KAChB,QAAqBL,EAASF,KAAKQ,OACzC,CAACN,EAASF,KAAKQ,OAElB,OACE,gBAACC,EAAa,CAACC,UAAWR,EAASS,OACjC,gBAAC,KAAI,CAACC,MAAM,QACV,gBAAC,KAAI,CAACC,WAAW,SAASD,MAAM,QAC9B,gBAAC,KAAU,CACTE,UAAW,KACXb,KACEC,EAASlB,OAAS,WACd,mBACA,sBAENwB,KAAM,GACNO,OAAQ,qBAEV,gBAACC,EAAY,CACXZ,MAAO,KAAa,cACP,mBACba,GAAI,EACJjC,KAAK,WAEJkB,EAASF,KAAKC,MAEjB,gBAACiB,EAAY,CACXd,MAAO,KAAe,cACT,mBACbpB,KAAK,WAEJP,IAGJyB,EAASiB,eAAiB7C,EAAae,QACtC,gBAAC+B,EAAgB,eACF,uBACbC,UAAQ,EACRC,OAAQ,gBACRC,QAAS7B,GAET,gBAAC,KAAU,CAACoB,UAAW,KAAeb,KAAM,WAAsBO,KAAM,MAG1E,gBAAC,KAAI,CAACK,WAAW,SAASW,OAAO,OAAOC,eAAe,SAASb,MAAM,QACpE,gBAAC,KAAU,CACTE,UAAW,KACXb,KACEC,EAASiB,eAAiB7C,EAAagB,YACnC,sBACA,eAENkB,KAAM,GACNkB,KAAMxB,EAASiB,eAAiB7C,EAAagB,YAC7CyB,OACEb,EAASiB,eAAiB7C,EAAagB,YACnC,2BACA,gCAMbY,EAASS,OACR,gBAAC,KAAG,CAACgB,GAAG,OAAOC,GAAG,OAAOhB,MAAM,QAC7B,gBAAC,IAAQ,CAACR,MAAO,KAAkBpB,KAAK,cACrCkB,EAASS,QAMtB,CAMA,MAAMF,GAAgB,aAAO,MAAK,kEAAoB;gBACrCoB,GAAWA,EAAMnB,QAAU,KAAoB;sBACzCmB,GAAWA,EAAMnB,QAAU,KAAoB;;;;;EAOhEM,GAAe,aAAO,KAAS;;;;EAM/BE,GAAe,aAAO,KAAS;;;;EAM/BE,GAAmB,aAAO,KAAW;;;;;;;wHC7HpC,SAASU,GAAS,eAAEC,EAAc,iBAAEC,IACzC,MAAM,aAAEC,EAAY,cAAEC,EAAa,aAAEC,EAAY,aAAEC,EAAY,aAAEC,IAAiB,QAAY,CAC5FC,OAAQ/D,EACRgE,SAAUP,EACVQ,UAAU,EACVC,OAAQ,CAACC,EAAeC,KACtB,MAAMC,EAAgBD,EAAehD,KAAKkD,GAAWA,EAAO7C,OAC5D+B,EAAe,IAAIW,KAAkBE,GAAe,IAIxD,OACE,gCACE,uCAAoB,2BAA2CV,MAC/D,gBAACY,EAAwB,KACvB,gBAACC,EAAQ,CACPC,WAAYhB,KACRC,EAAa,CACfG,eACAD,eACAE,kBAGF,gBAACY,EAAgB,KACf,gBAAC,KAAI,CAACpC,WAAW,SAASY,eAAe,UACvC,gBAAC,KAAU,CAACX,UAAW,KAAeb,KAAM,iBAA4BO,KAAM,KAC9E,gBAAC,IAAQ,CAACJ,MAAO,KAAe8C,GAAI,EAAGlE,KAAK,YAAU,iBAIxD,gBAAC,KAAG,CAACmE,GAAG,OAAOC,UAAU,UACvB,gBAAC,IAAQ,CAAChD,MAAO,KAAepB,KAAK,WAAS,kBAIhD,gBAAC,KAAG,CAACoE,UAAU,UACb,gBAAC,IAAQ,CAAChD,MAAO,KAAepB,KAAK,WAAS,OAG9C,gBAAC,IAAQ,CAACoB,MAAO,KAAeiD,eAAe,YAAYrE,KAAK,WAAS,oBAOjF,gBAACsE,EAAuB,CACtBN,WAAYhB,KACRC,EAAa,CACfG,eACAD,eACAE,kBAGF,gBAAC,IAAQ,CAACjC,MAAO,KAAiBpB,KAAK,WAAS,+BAGhD,gBAAC,KAAU,CAAC8B,UAAW,KAAeb,KAAM,cAAyBO,KAAM,MAInF,CAEA,MAAMsC,EAA2B,yBAAU;;gBAE3B;;;;;;EAQVG,EAAmB,yBAAU;;EAW7BF,EAAW,yBAAU,kDAAwB;;MAE7C,EAAGX,eAAcC,eAAcF,kBAC3BC,EACK,mBAELC,EACK,SAELF,EACK,WAEF;YAED,EAAGa,gBAAkBA,EAAa,yBAA2B;;;EAKnEM,GAA0B,aAAO,MAAK,2EAAwB;gBACpD;sBACM;;;;;;YAMV,EAAGN,gBAAkBA,EAAa,yBAA2B;;;;;ECjHlE,SAASO,GAAW,cACzB9D,EAAa,UACb+D,EAAS,oBACTC,EAAmB,iBACnBzB,IAEA,MAAM0B,GAAY,QAAa,MAEzB3B,GAAiB,IAAA4B,cACpBC,IACC,MAAMC,EAA8BD,EAAWjE,KAAKK,GJ3BrB,CAACA,IAAgC,CACpEW,MAAOnC,EAAmBwB,EAAKQ,KAAMR,EAAKhB,MAC1CgB,OACAhB,MAAM,QAAkBgB,EAAKhB,MAC7BmC,aAAc7C,EAAae,UIuBsCyE,CAAsB9D,KAEnF6D,EACGE,QAAQC,GAAYA,EAAQrD,QAC5BsD,SAASD,IACRN,GAAWQ,MAAM,gCAAgD,CAC/DC,WACEH,EAAQrD,QAAUtC,EAAUM,oBACxB,cACA,cACNyF,UACEJ,EAAQrD,QAAUtC,EAAUQ,kBAAoBmF,EAAQhE,KAAKhB,UAAOqF,EACtEC,WAAYd,GACZ,IAGNC,EAAoB,IAAIhE,KAAkBoE,GAAU,GAEtD,CAACH,EAAWjE,EAAe+D,EAAWC,IAGlC/D,GAAoB,IAAAiE,cACvB9D,IACC,MAAM0E,EAAQ,IAAI9E,GAClB8E,EAAMC,OAAO3E,EAAO,GAEpB4D,EAAoBc,EAAM,GAE5B,CAAC9E,EAAegE,IAGlB,OACE,gBAACgB,EAAmB,KAClB,gBAAC3C,EAAQ,CAACC,eAAgBA,EAAgBC,iBAAkBA,IAC5D,gBAACxC,EAAQ,CAACC,cAAeA,EAAeC,kBAAmBA,IAGjE,CAEA,MAAM+E,EAAsB,yBAAU;;;;ECvD/B,SAASC,GAAQ,gBACtBC,EAAe,eACfC,EAAc,WACdC,EAAU,iBACV7C,IAEA,OACE,gCACE,gBAAC,IAAU,eACI,kBACbO,UAAWoC,KAAqB3C,EAChCV,OAAQ,kBACRC,QAASsD,GAER7C,EAvBqC,eADZ,UA0B5B,gBAAC,IAAU,eACI,gBACbV,OAAQ,gBACRC,QAASqD,GAAc,QAM/B,CCpCO,SAASE,IACd,OACE,gCACE,gBAAC,KAAa,CACZC,cAAe,CACb,2QAEFC,KAAK,6BAEP,gBAAC,KAAa,CACZD,cAAe,CACb,6MACA,+IAEFC,KAAK,4BAEP,gBAAC,KAAa,CACZD,cAAe,CACb,4IAEFC,KAAK,mCAIb,CCDO,SAASC,GAAe,UAAEzB,EAAS,WAAE0B,IAC1C,MAAMC,GAAa,QAAa,MAC1BzB,GAAY,QAAa,MACzB0B,GAAe,QAAa,OAE5B,WAAEC,IAAe,WACjB,mBAAEC,IAAuB,WAExBC,GTGF,SAA0CC,GACzC,MAAMC,EAAU,IAAItH,KAAmBqH,GACvC,OAAO,IAA0FpH,EAA+BqH,EAClI,CSN4BC,IAEzBjG,EAAekG,IAAoB,IAAAC,UAA4B,KAC/D5D,EAAkB6D,IAAuB,IAAAD,WAAS,IAMzD,IAAAE,YAAU,KACRpC,GAAWqC,KAAK,2BAA0C,CACxDzB,WAAYd,GACZ,GACD,CAACE,EAAWF,IAEf,MAAMmB,GAAkB,IAAAhB,cAAY,IAEhClE,EAAcU,OAAS,GACvBV,EAAcU,QAAU,GAC8C,IAAtEV,EAAcsE,QAAQiC,GAAiBA,EAAarF,QAAOR,QAE5D,CAACV,IAEEwG,GAAsB,IAAA1F,UAAQ,IAC3Bd,EAAcyG,QAInB,CAACC,EAAKC,KAAS,CACb7B,MAAO,IAAI4B,EAAI5B,MAAO6B,EAAKpG,MAC3BqG,gBAAiB,IACZF,EAAIE,gBACP,IAAKD,EAAMjF,aAAc7C,EAAagB,iBAG1C,CAAEiF,MAAO,GAAI8B,gBAAiB,MAE/B,CAAC5G,IAEE6G,GAAkB,IAAA3C,cAAY4C,UAClC,MAAM,MAAEhC,EAAK,gBAAE8B,GAAoBJ,EACnCN,EAAiBU,GAEjB,MAEMG,SAFsBlB,EAAmB,CAAEf,QAAOf,gBAEjB7D,KAAI4G,MAAOE,EAAWC,KAC3D,IAAIC,EAEJ,IACMF,IACFE,QAAevB,GAAcwB,oBAAoBrC,EAAMmC,GAAID,I,CAE7D,YACM/C,GAAWQ,MAAM,gCAAgD,CACrEC,WAAY,YACZG,WAAYd,I,SAGd6C,EAAgBK,GAAGvF,aAAe7C,EAAaiB,SAC/CoG,EAAiB,IAAIU,G,CAGvB,OAAOM,CAAM,IAGf,GAAIH,EAAiB,CACnB,MAAMK,SAAiBC,QAAQC,IAAIP,IAAkBzC,QAAQiD,KAAuBA,IACpF,GAAIH,EAAQ1G,OAAS,EACnB,UACQoF,EAAsB,CAC1B0B,UAAW,CACTC,qBAAsB,CACpBL,UACAG,GAAIxD,K,CAIV,YACME,GAAWQ,MAAM,gCAAgD,CACrEC,WAAY,kBACZG,WAAYd,I,KAKnB,CACDE,EACA4B,EACAF,EACAa,EACAzC,EACA+B,IAGIV,GAAa,QACjB0B,UACEV,GAAoB,SACdS,UACA5C,GAAWQ,MAAM,8BAA8C,CACnEiD,eAAgB1H,EAAc2H,MAAMpH,GAASA,EAAKhB,OAAS,gBAC3DqI,gBAAiB5H,EAAc2H,MAAMpH,GAASA,EAAKhB,OAAS,aAC5DsI,gBAAiB7H,EAAcU,OAC/BmE,WAAYd,KAEd2B,GAAYoC,SAAS,aAAa/D,mBAA4B,CAAEgE,SAAS,GAAO,GAElF,CAAC9D,EAAWyB,EAAY3B,EAAW8C,EAAiB7G,GACpD,MAGImF,GAAiB,QACrB2B,UACEpB,GAAYoC,SAAS,aAAa/D,mBAA4B,CAAEgE,SAAS,GAAO,GAElF,CAACrC,EAAY3B,GACb,MAGF,OACE,gCACE,gBAAC,KAAO,CAACA,UAAWA,EAAW0B,WAAYA,EAAYG,WAAYA,IACnE,gBAAC,KAAW,KACV,gBAAC,KAAS,CACRoC,QACE,gBAAC/C,EAAO,CACNC,gBAAiBA,EACjBC,eAAgBA,EAChBC,WAAYA,EACZ7C,iBAAkBA,IAGtB0F,YACE,gCACE,gBAAC,IAAQ,CAACtH,MAAO,KAAcuH,WAAW,SAAS3I,KAAK,YAAU,yDAGlE,gBAAC,KAAa,KACZ,gBAACuE,EAAU,CACT9D,cAAeA,EACf+D,UAAWA,EACXC,oBAvIac,IAC3BoB,EAAiBpB,EAAM,EAuITvC,iBAAkBA,KAGtB,gBAAC,KAAa,KACZ,gBAAC8C,EAAG,QAIV8C,aAAc,gBAAC,KAAK,CAAC1C,WAAYA,OAK3C,CAEA,S","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 React, { 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 React from 'react';\nimport { 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 React, { 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 React from 'react';\n\nimport { 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 React from 'react';\n\nimport { TextAccordion } from '../../../shared-components';\n\nexport function Faq() {\n return (\n <>\n \n \n \n \n );\n}\n","import React, { 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","determineFileError","fileSize","fileType","FILE_SIZE_TOO_LARGE","includes","INVALID_MIME_TYPE","pngFile","File","type","jpgFile","webpFile","pdfFile","textFile","PENDING","IN_PROGRESS","COMPLETE","FileList","filesToUpload","removeFileHandler","map","utilityBillFile","index","FileListItem","key","file","name","listItem","length","color","pt","TOO_MANY_FILES","useMemo","size","FileContainer","isError","error","width","alignItems","fillColor","testid","FileNameText","px","FileSizeText","uploadStatus","RemoveFileButton","iconOnly","intent","onClick","height","justifyContent","spin","pb","pr","props","Uploader","addFileHandler","uploadInProgress","getRootProps","getInputProps","isDragActive","isDragAccept","isDragReject","accept","disabled","multiple","onDrop","acceptedFiles","fileRejections","rejectedFiles","reject","DesktopDropAreaContainer","DropArea","isDisabled","DropAreaContents","ml","mt","textAlign","textDecoration","MobileDropAreaContainer","BillUpload","projectId","updateFilesToUpload","analytics","useCallback","filesToAdd","newFiles","createUtilityBillFile","filter","newFile","forEach","track","error_type","file_type","undefined","project_id","files","splice","BillUploadContainer","Buttons","isUploadAllowed","skipBillUpload","uploadBill","Faq","expandedTexts","text","BillUploadPage","sourcePage","navigation","fileUploader","templateId","fetchBssUploadUrls","submitSanitizationJob","baseOptions","options","useSubmitSanitizationJobMutation","setFilesToUpload","useState","setUploadInProgress","useEffect","page","selectedFile","getUploadBillArrays","reduce","acc","curr","inProgressFiles","uploadBillFiles","async","blobIdsPromises","uploadUrl","i","blobId","uploadToSignedUrl","blobIds","Promise","all","id","variables","sanitizationJobInput","contains_files","some","contains_images","number_of_files","navigate","replace","buttons","leftContent","fontWeight","rightContent"],"sourceRoot":""}