{"version":3,"sources":["webpack:///./obj/desktop/src/signature/components/signature-page/signature-page.less","webpack:///./obj/desktop/src/signature/components/touchscreen-pdf-viewer/touchscreen-pdf-viewer.less","webpack:///./obj/desktop/src/signature/components/sign-modal/sign-modal.less","webpack:///./obj/desktop/src/signature/components/document-list-item-card/document-list-item-card.less","webpack:///./obj/desktop/src/signature/components/empty-signature-page/empty-signature-page.less","webpack:///./obj/desktop/src/signature/components/visit-assistant-header/visit-assistant-header.less","webpack:///./obj/desktop/src/signature/components/visit-assistant-sidebar-button/visit-assistant-sidebar-button-desktop.less","webpack:///./obj/desktop/src/signature/components/visit-assistant-sidebar/visit-assistant-sidebar-desktop.less","webpack:///./obj/desktop/src/signature/components/visit-assistant-sidebar/visit-assistant-sidebar.less","webpack:///./obj/desktop/src/signature/components/page-container/page-container.less","webpack:///./obj/desktop/src/signature/components/document-details/document-details.less","webpack:///./obj/desktop/src/signature/components/document-pdf-viewer/document-pdf-viewer.less","webpack:///./obj/desktop/src/signature/stores/signature.store.ts","webpack:///./obj/desktop/src/signature/util/signatureTypeEnumToString.ts","webpack:///./obj/desktop/src/signature/util/document-utils.ts","webpack:///./obj/desktop/src/signature/stores/sign-modal.store.ts","webpack:///./obj/desktop/src/signature/ioc.ts","webpack:///./obj/desktop/src/signature/components/document-list-item-card/document-list-item-card.tsx","webpack:///./obj/desktop/src/signature/components/document-list-item/document-list-item.tsx","webpack:///./obj/desktop/src/signature/components/document-list-empty-message/document-list-empty-message.tsx","webpack:///./obj/desktop/src/signature/components/document-list/document-list.tsx","webpack:///./obj/desktop/src/signature/components/empty-signature-page/empty-signature-page.tsx","webpack:///./obj/desktop/src/signature/components/visit-assistant-header/visit-assistant-header.tsx","webpack:///./obj/desktop/src/signature/components/visit-assistant-sidebar-button/visit-assistant-sidebar-button-desktop.tsx","webpack:///./obj/desktop/src/signature/components/visit-assistant-sidebar/visit-assistant-sidebar-desktop.tsx","webpack:///./obj/desktop/src/signature/components/visit-assistant-sidebar/visit-assistant-sidebar.tsx","webpack:///./obj/desktop/src/signature/components/page-container/page-container.tsx","webpack:///./obj/desktop/src/signature/components/signature-page/signature-page.tsx","webpack:///./obj/desktop/src/signature/components/touchscreen-pdf-viewer/pdf-viewer-controls.tsx","webpack:///./obj/desktop/src/signature/components/touchscreen-pdf-viewer/touchscreen-pdf-viewer.tsx","webpack:///./obj/desktop/src/signature/components/document-pdf-viewer/document-pdf-viewer.tsx","webpack:///./obj/desktop/src/signature/components/document-details/document-details-card.tsx","webpack:///./obj/desktop/src/signature/components/sign-modal/success-page.tsx","webpack:///./obj/desktop/src/signature/components/sign-modal/sign-modal.tsx","webpack:///./obj/desktop/src/signature/components/sign-modal/signature-text.tsx","webpack:///./obj/desktop/src/signature/components/sign-modal/desktop-sign-modal.tsx","webpack:///./obj/desktop/src/signature/components/sign-modal/signature-image.tsx","webpack:///./obj/desktop/src/signature/components/sign-modal/mobile-sign-modal.tsx","webpack:///./obj/desktop/src/signature/components/sign-modal/signature.tsx","webpack:///./obj/desktop/src/signature/util/disclaimerTypeEnumToString.ts","webpack:///./obj/desktop/src/signature/components/document-details/document-details.tsx","webpack:///./obj/desktop/src/signature/components/document-details/document-download/document-download-card.tsx","webpack:///./obj/desktop/src/signature/components/document-details/document-download/document-download.tsx","webpack:///./obj/desktop/src/signature/components/signature-routes.tsx"],"names":["module","exports","jobsApi","visitAssistantApi","formsApi","documentsPollingIntervalTime","setCurrentFormName","formName","currentCustomFormName","loadDocuments","this","jobId","documentsInitialized","showBusy","getSignatureRequestsForJob","jobIsActive","stopDocumentsPolling","console","warn","visitAssistantId","setJobStatus","getJobStatus","isJobCompleted","showSidebar","getVisitActionRequest","documents","length","data","estimateBundleId","jobStatus","setJobId","setEstimateBundleId","setShowSidebar","businessUnitOfficialName","tenantTimeZone","startDocumentsPolling","documentsPollingInterval","setInterval","window","clearInterval","signatureRequest","getSignatureRequestsForJobObservable","NUMBER_2","isOnlineEstimateCompleted","formSignatureRequests","invoiceSignatureRequests","projectSignatureRequests","fetchFormName","submittingId","getFormName","resp","NUMBER_4","SignatureStore","signatureTypeEnumToString","signatureType","NUMBER_1","NUMBER_3","getDocumentId","document","isFormSignature","isInvoiceSignature","invoiceId","isProjectSignature","projectId","getDocumentName","undefined","formApi","signatureStore","invoiceApi","isLoading","isPdfLoading","isSubmitSuccess","setIsLoading","setIsSubmitSuccess","showPdfLoader","hidePdfLoader","sign","request","signingMethod","visitActionId","prepDocument","bind","signInvoice","signProject","signDocument","options","docSignatureRequest","setVisitActionId","SignModalStore","signatureContainer","createChild","lazyInject","toSelf","inSingletonScope","DocumentListItemCard","memo","props","dayFormatted","timeFormatted","signed","signedOn","requestedOn","name","isProject","onClick","dateToDisplay","date","Date","toLocaleDateString","day","month","year","toLocaleTimeString","hour","minute","timeZoneAbbreviation","className","card","justifyContent","Item","alignSelf","size","shrink","direction","el","bold","compact","DocumentListItem","item","signaturesStore","get","DocumentListEmptyMessage","onClickItem","history","params","push","disclaimers","getUsignedDocuments","filter","sort","sortDoc","getSignedDocuments","sortBy","a","b","dir","firstItem","secondItem","render","unsignedDocuments","completedDocuments","Fragment","map","index","key","Component","DocumentList","EmptySignaturePage","container","imageContainer","src","image","noWrap","handleClickBackLink","match","backLinkUrl","primaryText","secondaryText","showTenantName","tenantName","isHomePage","secondaryComponent","portalData","clientData","portalBrandOfficialName","brandData","officialName","wrap","alignItems","header","Boolean","VisitAssistantHeaderUnwrapped","VisitAssistantHeader","VisitAssistantSidebarButtonDesktop","backgroundImageClassName","title","link","to","raised","thin","buttonContainer","buttonBackgroundImage","buttonTitle","VisitAssistantSidebarDesktop","estimateLink","payInvoiceLink","quickLinksTitle","backgroundImageEstimates","backgroundImagePayInvoice","VisitAssistantSidebar","PageContainer","children","page","componentDidMount","signModalStore","componentWillUnmount","showDocumentList","sidebarOffset","pageContent","SignaturePageContainer","PdfViewerControls","pageNumber","onClickPrevious","onClickNext","onClickZoomOut","onClickZoomIn","controlWrapper","control","pagePrevious","pageNext","zoomOut","zoomIn","GlobalWorkerOptions","workerSrc","init","loadingTask","getDocument","setState","promise","doc","renderPage","scale","getPage","viewport","getViewport","canvas","getElementById","width","height","canvasContext","getContext","then","handleClickPrevious","state","handleClickNext","numPages","handleClickZoomOut","newScale","Number","toFixed","handleClickZoomIn","canvasWrapper","id","DocumentPdfViewer","onPdfLoad","navigator","userAgent","includes","maxTouchPoints","fullHeight","onLoad","setTimeout","style","display","DocumentDetailsCard","markup","content","documentPdfUrl","isDocumentSigned","termsFileName","onClickSign","isDisclaimer","handleClickSign","pdfCard","Section","pdfSection","contentSection","dangerouslySetInnerHTML","replace","__html","sharp","primary","blue","bottomSection","closeSuccessPage","onCancel","PureComponent","SuccessPage","SignModal","open","signatureInput","signatureFieldCount","canSubmit","onSubmit","Sizes","S","modal","legalTextMultiPlace","legalText","loading","disabled","SignatureText","value","onChange","error","Input","autoFocus","fluid","type","label","placeholder","handleClickSubmit","formState","validate","signatureText","$","signature","handleClickCancel","reset","handleClose","validators","required","onChangeHandler","hasError","blankSignatureFieldCount","DesktopSignModal","SignatureImage","isCanvasEmpty","setIsCanvasEmpty","bindCanvas","unbindCanvas","clearCanvas","canvasRef","useRef","useEffect","current","handleTouchStart","signatureImageWrapper","color","backspaceIcon","ref","canvasEmpty","onTouchStart","onMouseDown","signaturePad","resizeCanvas","addEventListener","off","removeEventListener","ratio","Math","max","devicePixelRatio","offsetWidth","offsetHeight","clear","isEmpty","alert","dataURL","toDataURL","signatureBase64","Signature","SignModalComponent","disclaimerTypeEnumToString","disclaimerId","isInvoice","nextDisclaimer","basePath","find","getDocumentData","disclaimer","disclaimerType","visitActionRequestId","getDocumentPdfUrl","showSignModal","DocumentDetailsUnwrapped","DocumentDetails","DocumentDownloadCard","full","href","URLSearchParams","location","search","setDocumentUrl","parseInt","invoiceSignatureId","projectSignatureId","subpath","entity","action","docHeader","DocumentDocumentUnwrapped","DocumentDownload","SignatureRoutes","exact","path","component","allowAnonVisitAction"],"mappings":"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","file":"signature.bundle.js?3fde2751e44115989e14","sourcesContent":["// extracted by mini-css-extract-plugin\nmodule.exports = {\"sidebar-offset\":\"_2YtwVTDF-AG-Z_r6_DaVMN\",\"sidebarOffset\":\"_2YtwVTDF-AG-Z_r6_DaVMN\",\"page-content\":\"_3Y8ndpEaI-zweVqX9gyl0L\",\"pageContent\":\"_3Y8ndpEaI-zweVqX9gyl0L\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"control-wrapper\":\"l5fC5j1KVPl4s3mz51i-1\",\"controlWrapper\":\"l5fC5j1KVPl4s3mz51i-1\",\"control\":\"_3o1G_pkxm0DpE8-1Z6kSDJ\",\"page-previous\":\"_268svoLyd-tmZ-dXSZCwU7\",\"pagePrevious\":\"_268svoLyd-tmZ-dXSZCwU7\",\"page-next\":\"_3xnZsp2fWIWtu3s4ufDQGz\",\"pageNext\":\"_3xnZsp2fWIWtu3s4ufDQGz\",\"page-number\":\"_3LuTEkn9_cG0z0awO1DqMH\",\"pageNumber\":\"_3LuTEkn9_cG0z0awO1DqMH\",\"zoom-in\":\"_3tCDVlzD61eXFDcEv_1NHs\",\"zoomIn\":\"_3tCDVlzD61eXFDcEv_1NHs\",\"zoom-out\":\"_23BObJW_S_bo8jOBIseQaK\",\"zoomOut\":\"_23BObJW_S_bo8jOBIseQaK\",\"canvas-wrapper\":\"_3TkJsklt92cyuNOmtsyrQs\",\"canvasWrapper\":\"_3TkJsklt92cyuNOmtsyrQs\",\"canvas\":\"OnL-eiWlK1dOd6mC6WnUp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"modal\":\"_3Wu9P3yvzWk6em2fUEzADk\",\"legalText\":\"_1egUF1ejnasE9tSBnZ4OR_\",\"signatureImageWrapper\":\"_2l1BGBYNkP_bUGTTRAMD6\",\"canvasWrapper\":\"_3kwiJCf7hCMMD8nEHYwheX\",\"canvas\":\"_3b0_EkhgmCbnIW51WL3bwA\",\"canvasEmpty\":\"_24gvKNEegfb0Yys0gYqyrn\",\"placeholder\":\"_2LEEAxcbHnZ0UGLLXTyrO3\",\"backspaceIcon\":\"KJ5R2ljaozE6K9ryfeDFe\",\"header\":\"_23tEi_MT9Snzr0UjUm4_Fp\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"_17WfNLXlK85GJsX-EeyrmV\",\"date\":\"OG3hoby57F6FffeAf2Igm\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"_1GzH9VhNW-CivfLwfGx8oF\",\"image-container\":\"SdnuWjSYqxYKDdYDdmL37\",\"imageContainer\":\"SdnuWjSYqxYKDdYDdmL37\",\"image\":\"_2bTc9YZZWcr_RQOv7HOWcB\",\"no-wrap\":\"_1YRdxrHmjzjN2RsZPwVMLz\",\"noWrap\":\"_1YRdxrHmjzjN2RsZPwVMLz\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"header\":\"_340EVISWE5CDWDp90BcBOh\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"button-container\":\"_2O5gkOMvJlmZm6AzO9SGrK\",\"buttonContainer\":\"_2O5gkOMvJlmZm6AzO9SGrK\",\"button-background-image\":\"mEXMG6baMAkJL34z_goul\",\"buttonBackgroundImage\":\"mEXMG6baMAkJL34z_goul\",\"button-title\":\"_16xiFLNHCg7PdbtA8LQKf_\",\"buttonTitle\":\"_16xiFLNHCg7PdbtA8LQKf_\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"container\":\"_16WQRjA5RsNt-nNbQWOhB_\",\"quick-links-title\":\"_2Kt9G7h6ItMzCZApC38qYL\",\"quickLinksTitle\":\"_2Kt9G7h6ItMzCZApC38qYL\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"background-image-estimates\":\"_1q0pDZCsyaNHRCyLcb8jJB\",\"backgroundImageEstimates\":\"_1q0pDZCsyaNHRCyLcb8jJB\",\"background-image-pay-invoice\":\"tjaUSUtgNERrt_bxYso5r\",\"backgroundImagePayInvoice\":\"tjaUSUtgNERrt_bxYso5r\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"page\":\"_2ksElZ7lYCl32urMh8E_NB\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"card\":\"MdmvZqVjb_prIYIVdmR6W\",\"pdf-card\":\"_1-iV-r4yRT2Hu3vhZLK4AN\",\"pdfCard\":\"_1-iV-r4yRT2Hu3vhZLK4AN\",\"pdf-section\":\"_230Le8-x9Se7CRd5hizJgs\",\"pdfSection\":\"_230Le8-x9Se7CRd5hizJgs\",\"bottom-section\":\"_3JiJBzYF1XvbzEmGTf3qYF\",\"bottomSection\":\"_3JiJBzYF1XvbzEmGTf3qYF\",\"content-section\":\"_3d23x2HvQHHItVRYDTq4R-\",\"contentSection\":\"_3d23x2HvQHHItVRYDTq4R-\"};","// extracted by mini-css-extract-plugin\nmodule.exports = {\"full-height\":\"_1svVl6OE5e0PEDl5scxWeE\",\"fullHeight\":\"_1svVl6OE5e0PEDl5scxWeE\"};","import { injectable } from 'inversify';\nimport { observable, action, computed, runInAction } from 'mobx';\nimport { JobsApiService, VisitAssistantApiService, FormsApiService, JobStatus } from 'src/api';\nimport { FormSignatureRequestModel } from 'src/api/model/formSignatureRequestModel';\nimport { InvoiceSignatureRequestModel } from 'src/api/model/invoiceSignatureRequestModel';\nimport { ProjectSignatureRequestModel } from 'src/api/model/projectSignatureRequestModel';\nimport { ProjectSignatureRequest } from 'src/api/model/projectSignatureRequest';\nimport { VisitActionRequest } from 'src/api/model/visitActionRequest';\nimport { VisitActionRequestTimeZone } from 'src/api/model/visitActionRequestTimeZone';\nimport { SignInvoiceRequest } from 'src/api/model/signInvoiceRequest';\nimport { SignFormRequest } from 'src/api/model/signFormRequest';\n\nexport type SignatureDocument =\n | FormSignatureRequestModel\n | InvoiceSignatureRequestModel\n | ProjectSignatureRequestModel;\nexport type SignDocumentRequest = SignFormRequest | SignInvoiceRequest | ProjectSignatureRequest;\n\n@injectable()\nexport class SignatureStore {\n @observable businessUnitOfficialName?: string;\n @observable tenantTimeZone?: VisitActionRequestTimeZone;\n @observable jobIsActive: boolean;\n @observable estimateBundleId?: string | null;\n @observable showSidebar: boolean;\n @observable currentCustomFormName?: string | null;\n\n private documentsInitialized: boolean;\n private jobId?: number;\n private jobStatus?: JobStatus;\n private visitAssistantId?: string;\n private documentsPollingInterval?: any;\n private documentsPollingIntervalTime = 10000;\n\n constructor(\n private jobsApi: JobsApiService,\n private visitAssistantApi: VisitAssistantApiService,\n private formsApi: FormsApiService\n ) {\n this.documentsInitialized = false;\n this.jobIsActive = true;\n this.showSidebar = false;\n }\n\n @action\n async getVisitActionRequest(visitAssistantId?: string) {\n if (!visitAssistantId) return;\n\n if (!this.jobId || this.visitAssistantId !== visitAssistantId) {\n this.visitAssistantId = visitAssistantId;\n const showBusy = !this.documents.length;\n let data: VisitActionRequest;\n data = (await this.visitAssistantApi.getVisitActionRequest(visitAssistantId, showBusy))\n .data;\n const { jobId, businessUnitOfficialName, tenantTimeZone, estimateBundleId, jobStatus } =\n data;\n this.setJobId(jobId);\n this.setEstimateBundleId(estimateBundleId);\n this.setJobStatus(jobStatus);\n this.setShowSidebar(estimateBundleId);\n\n runInAction(() => {\n this.businessUnitOfficialName = businessUnitOfficialName;\n this.tenantTimeZone = tenantTimeZone;\n });\n }\n }\n\n private async getJobStatus(visitAssistantId: string) {\n return (\n await this.visitAssistantApi.getVisitActionRequest(\n visitAssistantId,\n !this.documents.length\n )\n ).data.jobStatus;\n }\n\n async startDocumentsPolling() {\n if (!this.jobId) {\n return;\n }\n\n await this.loadDocuments();\n if (!this.isJobCompleted()) {\n this.documentsPollingInterval = setInterval(\n this.loadDocuments,\n this.documentsPollingIntervalTime\n );\n }\n }\n\n stopDocumentsPolling() {\n window.clearInterval(this.documentsPollingInterval);\n }\n\n setJobId(jobId: number) {\n this.jobId = jobId;\n }\n\n @action\n setEstimateBundleId(estimateBundleId?: string | null) {\n this.estimateBundleId = estimateBundleId;\n }\n\n setJobStatus(jobStatus: JobStatus) {\n this.jobStatus = jobStatus;\n }\n\n @action\n setShowSidebar(estimateBundleId?: string | null) {\n this.showSidebar = !!estimateBundleId;\n }\n\n @computed\n get documents(): SignatureDocument[] {\n const signatureRequest = this.jobIsActive\n ? this.jobsApi.getSignatureRequestsForJobObservable\n : null;\n\n if (\n signatureRequest &&\n (this.jobStatus === JobStatus.NUMBER_2 || this.isOnlineEstimateCompleted)\n ) {\n const { formSignatureRequests, invoiceSignatureRequests, projectSignatureRequests } =\n signatureRequest;\n return [\n ...formSignatureRequests!,\n ...invoiceSignatureRequests!,\n ...projectSignatureRequests!,\n ];\n }\n\n return [];\n }\n\n @computed\n get isOnlineEstimateCompleted() {\n return this.estimateBundleId && this.isJobCompleted();\n }\n\n @action\n setCurrentFormName = (formName?: string) => {\n this.currentCustomFormName = formName;\n };\n\n async fetchFormName(submittingId: string) {\n const resp = await this.formsApi.getFormName(submittingId, this.visitAssistantId);\n this.setCurrentFormName(resp.data.formName);\n }\n\n isJobCompleted() {\n return this.jobStatus === JobStatus.NUMBER_4; // Completed\n }\n\n loadDocuments = async () => {\n if (!this.jobId) {\n this.documentsInitialized = true;\n return;\n }\n\n const showBusy = !this.documentsInitialized;\n try {\n await this.jobsApi.getSignatureRequestsForJob(this.jobId, showBusy, {\n 400: () => {\n runInAction(() => {\n this.jobIsActive = false;\n });\n this.stopDocumentsPolling();\n return '400 Bad Request';\n },\n });\n } catch (error) {\n console.warn('Get signature requests for job:', error);\n }\n this.documentsInitialized = true;\n\n if (this.visitAssistantId) {\n this.setJobStatus(await this.getJobStatus(this.visitAssistantId));\n if (this.isJobCompleted()) {\n this.stopDocumentsPolling();\n }\n }\n };\n}\n","import { InvoiceSignatureType, ProjectSignatureType } from 'src/api';\n\nexport const signatureTypeEnumToString = (signatureType: number): string => {\n switch (signatureType) {\n case InvoiceSignatureType.NUMBER_1:\n case ProjectSignatureType.NUMBER_1:\n return 'Customer Authorization';\n case InvoiceSignatureType.NUMBER_2:\n case ProjectSignatureType.NUMBER_2:\n return 'Customer Acknowledgement';\n case InvoiceSignatureType.NUMBER_3:\n case ProjectSignatureType.NUMBER_3:\n return 'Notice of the Three-Day Right to Cancel';\n case InvoiceSignatureType.NUMBER_4:\n return 'Invoice Changes';\n default:\n return '';\n }\n};\n","import { SignatureDocument } from 'src/signature/stores/signature.store';\nimport { FormSignatureRequestModel } from 'src/api/model/formSignatureRequestModel';\nimport { InvoiceSignatureRequestModel } from 'src/api/model/invoiceSignatureRequestModel';\nimport { ProjectSignatureRequestModel } from 'src/api/model/projectSignatureRequestModel';\nimport { signatureTypeEnumToString } from './signatureTypeEnumToString';\n\nexport const getDocumentId = (document: SignatureDocument): string | null => {\n if (isFormSignature(document)) {\n return `${document.submittingId}`;\n }\n\n if (isInvoiceSignature(document)) {\n return `${document.invoiceId}_${document.signatureType}`;\n }\n\n if (isProjectSignature(document)) {\n return `${document.projectId}_${document.signatureType}`;\n }\n\n return null;\n};\n\nexport const getDocumentName = (document: SignatureDocument): string | undefined => {\n if (isFormSignature(document)) {\n return `${document.formName}`;\n }\n\n if (isInvoiceSignature(document) || isProjectSignature(document)) {\n return signatureTypeEnumToString(document.signatureType);\n }\n};\n\nexport const isFormSignature = (\n document?: SignatureDocument\n): document is FormSignatureRequestModel => {\n return !!document && (document as FormSignatureRequestModel).submittingId !== undefined;\n};\n\nexport const isInvoiceSignature = (\n document?: SignatureDocument\n): document is InvoiceSignatureRequestModel => {\n return !!document && (document as InvoiceSignatureRequestModel).invoiceId !== undefined;\n};\n\nexport const isProjectSignature = (\n document?: SignatureDocument\n): document is ProjectSignatureRequestModel => {\n return !!document && (document as ProjectSignatureRequestModel).projectId !== undefined;\n};\n\nexport const getDocumentPdfUrl = (\n visitActionRequestId?: string,\n document?: SignatureDocument\n): string | undefined => {\n if (isFormSignature(document)) {\n return `/api/forms/${document.submittingId}/print/?visitActionRequestId=${visitActionRequestId}`;\n }\n};\n","import { injectable } from 'inversify';\nimport { observable, action, runInAction } from 'mobx';\nimport { FormsApiService, InvoicesApiService } from 'src/api';\nimport {\n isInvoiceSignature,\n isFormSignature,\n isProjectSignature,\n} from 'src/signature/util/document-utils';\nimport { SignatureStore, SignatureDocument, SignDocumentRequest } from '../stores/signature.store';\n\ninterface SignatureOptions {\n signatureBase64?: string;\n signatureText?: string;\n}\n\n@injectable()\nexport class SignModalStore {\n @observable isLoading: boolean = false;\n @observable isPdfLoading: boolean = true;\n @observable isSubmitSuccess: boolean = false;\n private visitActionId?: string;\n\n constructor(\n private formApi: FormsApiService,\n private signatureStore: SignatureStore,\n private invoiceApi: InvoicesApiService\n ) {}\n\n @action\n setIsLoading = (isLoading: boolean) => {\n this.isLoading = isLoading;\n };\n\n @action\n setIsSubmitSuccess = (isSubmitSuccess: boolean) => {\n this.isSubmitSuccess = isSubmitSuccess;\n };\n\n @action\n showPdfLoader = () => {\n this.isPdfLoading = true;\n };\n\n @action\n hidePdfLoader = () => {\n this.isPdfLoading = false;\n };\n\n @action\n sign = async (request: SignDocumentRequest, signingMethod: Function) => {\n this.isLoading = true;\n\n try {\n await signingMethod(this.visitActionId, request);\n } catch (e) {\n throw e;\n }\n\n runInAction(() => {\n this.isLoading = false;\n this.isSubmitSuccess = true;\n });\n };\n\n setVisitActionId(visitActionId: string) {\n this.visitActionId = visitActionId;\n }\n\n prepDocument = (document: SignatureDocument) => {\n let signatureRequest;\n let signingMethod = null;\n\n if (isFormSignature(document)) {\n signatureRequest = {\n submittingId: document.submittingId,\n };\n // Todo: Update swagger to use Public Class Fields to aviod this\n signingMethod = this.formApi.sign.bind(this.formApi);\n }\n\n if (isInvoiceSignature(document)) {\n const { signatureType, invoiceId } = document;\n signatureRequest = { signatureType, invoiceId };\n signingMethod = this.invoiceApi.signInvoice.bind(this.invoiceApi);\n }\n\n if (isProjectSignature(document)) {\n const { signatureType, jobId, projectId } = document;\n signatureRequest = { signatureType, jobId, projectId };\n signingMethod = this.invoiceApi.signProject.bind(this.invoiceApi);\n }\n\n return { signatureRequest, signingMethod };\n };\n\n signDocument = async (document: SignatureDocument, options: SignatureOptions) => {\n const { signatureRequest, signingMethod } = this.prepDocument(document);\n\n if (signatureRequest && signingMethod) {\n const docSignatureRequest = {\n ...signatureRequest,\n ...options,\n };\n\n try {\n await this.sign(docSignatureRequest, signingMethod);\n } catch {\n this.isLoading = false;\n return;\n }\n\n await this.signatureStore.loadDocuments();\n }\n };\n}\n","import getDecorators from 'inversify-inject-decorators';\n\nimport { rootContainer } from '../ioc';\n\nimport { SignatureStore } from './stores/signature.store';\nimport { SignModalStore } from './stores/sign-modal.store';\n\nexport const signatureContainer = rootContainer.createChild();\nexport const { lazyInject } = getDecorators(signatureContainer);\n\nsignatureContainer.bind(SignatureStore).toSelf().inSingletonScope();\nsignatureContainer.bind(SignModalStore).toSelf().inSingletonScope();\n","import React from 'react';\nimport classNames from 'classnames';\nimport { Text, Card, Stack, Icon, Tag } from '@servicetitan/design-system';\nimport { SignatureDocument } from '../../stores/signature.store';\nimport { VisitActionRequestTimeZone } from 'src/api/model/visitActionRequestTimeZone';\nimport styles from './document-list-item-card.less';\n\ninterface DocumentListItemCardProps {\n name?: string;\n signed: boolean;\n signedOn?: string;\n requestedOn: string;\n tenantTimeZone?: VisitActionRequestTimeZone;\n isProject: boolean;\n onClick: (item: SignatureDocument) => void;\n}\n\nexport const DocumentListItemCard: React.FC = React.memo(\n (props: DocumentListItemCardProps) => {\n const { signed, signedOn, requestedOn, name, tenantTimeZone, isProject, onClick } = props;\n\n const dateToDisplay = signed ? signedOn : requestedOn;\n let dayFormatted;\n let timeFormatted;\n if (dateToDisplay) {\n const date = new Date(dateToDisplay);\n dayFormatted = date.toLocaleDateString(undefined, {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n });\n timeFormatted = date.toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n });\n if (tenantTimeZone && tenantTimeZone.timeZoneAbbreviation) {\n timeFormatted += ` ${tenantTimeZone.timeZoneAbbreviation}`;\n }\n }\n\n return (\n \n \n \n {signed ? (\n \n ) : (\n \n )}\n \n \n \n \n {name || ''}\n \n \n {isProject && (\n \n For Project\n \n )}\n {signed ? 'Signed' : 'Received'}\n {dateToDisplay ? ` ${dayFormatted} at ${timeFormatted}` : ''}\n \n \n \n \n \n \n \n \n );\n }\n);\n","import React from 'react';\nimport { observer } from 'mobx-react';\nimport { SignatureDocument, SignatureStore } from '../../stores/signature.store';\nimport { DocumentListItemCard } from '../document-list-item-card/document-list-item-card';\nimport { getDocumentName, isProjectSignature } from 'src/signature/util/document-utils';\nimport { signatureContainer } from 'src/signature/ioc';\n\ninterface DocumentListItemProps {\n item: SignatureDocument;\n onClick: (item: SignatureDocument) => void;\n}\n\nexport const DocumentListItem: React.FC = observer(({ item, onClick }) => {\n const signaturesStore = signatureContainer.get(SignatureStore);\n\n const onClickItem = () => {\n onClick(item);\n };\n\n return (\n \n );\n});\n","import React from 'react';\nimport { Text, Stack, Icon } from '@servicetitan/design-system';\n\nexport const DocumentListEmptyMessage: React.FC = () => (\n \n \n \n \n \n \n No new documents to sign, you are up to date.\n \n \n \n);\n","import React from 'react';\nimport { Text } from '@servicetitan/design-system';\nimport { SignatureDocument } from 'src/signature/stores/signature.store';\nimport { DocumentListItem } from '../document-list-item/document-list-item';\nimport { DocumentListEmptyMessage } from '../document-list-empty-message/document-list-empty-message';\nimport {\n isFormSignature,\n isInvoiceSignature,\n isProjectSignature,\n getDocumentId,\n} from 'src/signature/util/document-utils';\nimport { RouteComponentProps, withRouter } from 'react-router';\nimport { RouteParams } from '../signature-routes';\n\ninterface DocumentListProps extends RouteComponentProps {\n documents: SignatureDocument[];\n}\n\nclass DocumentListUnwrapped extends React.Component {\n onClickItem = (document: SignatureDocument) => {\n const { history, match } = this.props;\n const { visitActionId } = match.params;\n\n if (isFormSignature(document)) {\n history.push(`/signatures/${visitActionId}/form-signature/${document.submittingId}`);\n }\n\n if (isInvoiceSignature(document)) {\n if (document.disclaimers.length && document.signedOn == null) {\n history.push(\n `/signatures/${visitActionId}/invoice-signature/${document.invoiceId}/${document.signatureType}/0`\n );\n } else {\n history.push(\n `/signatures/${visitActionId}/invoice-signature/${document.invoiceId}/${document.signatureType}`\n );\n }\n }\n\n if (isProjectSignature(document)) {\n if (document.disclaimers.length && document.signedOn == null) {\n history.push(\n `/signatures/${visitActionId}/project-signature/${document.projectId}/${document.signatureType}/0`\n );\n } else {\n history.push(\n `/signatures/${visitActionId}/project-signature/${document.projectId}/${document.signatureType}`\n );\n }\n }\n };\n\n getUsignedDocuments = () =>\n this.props.documents\n .filter((document: SignatureDocument) => !document.signedOn)\n .sort(this.sortDoc('requestedOn'));\n\n getSignedDocuments = () =>\n this.props.documents\n .filter((document: SignatureDocument) => document.signedOn)\n .sort(this.sortDoc('signedOn'));\n\n sortDoc = (sortBy: string, direction?: 'asc' | 'desc') => (a: any, b: any) => {\n const dir = direction === 'desc' ? 1 : -1;\n const firstItem = a[sortBy];\n const secondItem = b[sortBy];\n\n if (firstItem > secondItem) return 1 * dir;\n if (firstItem < secondItem) return -1 * dir;\n\n return 0;\n };\n\n render() {\n const unsignedDocuments = this.getUsignedDocuments();\n const completedDocuments = this.getSignedDocuments();\n\n return (\n \n \n Unsigned Documents\n \n \n Select a document to review and sign it.\n \n {unsignedDocuments.length ? (\n unsignedDocuments.map((document: SignatureDocument, index) => (\n \n ))\n ) : (\n \n )}\n\n {!!completedDocuments.length && (\n \n \n Signed & Completed\n \n \n You have signed these documents, a copy of each will be emailed to you\n when the job is done.\n \n {completedDocuments.map((document: SignatureDocument, index) => (\n \n ))}\n \n )}\n \n );\n }\n}\n\nexport const DocumentList = withRouter(DocumentListUnwrapped);\n","import * as React from 'react';\nimport classnames from 'classnames';\nimport { Text, Stack } from '@servicetitan/design-system';\nimport styles from './empty-signature-page.less';\n\nexport const EmptySignaturePage: React.FC = () => (\n \n
\n \n
\n \n Welcome to your Visit Assistant\n \n \n Thank you for going contactless.\n \n \n When ready, your technician will send over documents and links for you to view and sign\n here.\n \n
\n);\n","import React from 'react';\nimport classNames from 'classnames';\nimport { observer } from 'mobx-react';\nimport { Text, Stack, Icon } from '@servicetitan/design-system';\nimport { ClientDataStore } from 'src/core/stores/client-data.store';\nimport { RouteParams } from '../signature-routes';\nimport { RouteComponentProps, withRouter } from 'react-router';\nimport { lazyInject } from 'src/signature/ioc';\nimport styles from './visit-assistant-header.less';\n\ninterface VisitAssistantHeaderProps extends RouteComponentProps {\n showTenantName?: boolean;\n tenantName?: string;\n isHomePage?: boolean;\n backLinkUrl?: string;\n secondaryComponent?: React.ReactComponentElement;\n}\n\n@observer\nclass VisitAssistantHeaderUnwrapped extends React.Component {\n @lazyInject(ClientDataStore) clientData!: ClientDataStore;\n\n handleClickBackLink = () => {\n const { history, match, backLinkUrl } = this.props;\n const { visitActionId } = match.params;\n\n if (backLinkUrl) {\n history.push(backLinkUrl);\n } else {\n history.push(`/signatures/${visitActionId}`);\n }\n };\n\n render() {\n const { showTenantName, tenantName, isHomePage, secondaryComponent } = this.props;\n\n let primaryText;\n let secondaryText;\n\n if (showTenantName) {\n const portalData = this.clientData.portalData;\n const portalBrandOfficialName =\n portalData && portalData.brandData && portalData.brandData.officialName;\n primaryText = tenantName || portalBrandOfficialName || '';\n secondaryText = 'Visit Assistant';\n } else {\n primaryText = 'Visit Assistant';\n }\n\n return (\n \n \n {!isHomePage && (\n \n )}\n \n \n \n {primaryText}\n \n \n
\n \n \n {secondaryText}\n \n \n {Boolean(secondaryComponent) && secondaryComponent}\n \n );\n }\n}\n\nexport const VisitAssistantHeader = withRouter(VisitAssistantHeaderUnwrapped);\n","import React from 'react';\nimport classnames from 'classnames';\nimport { NavLink } from 'react-router-dom';\nimport { Card, Stack } from '@servicetitan/design-system';\nimport { SidebarButtonComponentProps } from '../visit-assistant-sidebar/visit-assistant-sidebar';\nimport styles from './visit-assistant-sidebar-button-desktop.less';\n\nexport const VisitAssistantSidebarButtonDesktop: React.FC = (\n props\n) => {\n const { backgroundImageClassName, title, link } = props;\n\n return (\n \n \n \n \n
{title}
\n
\n
\n
\n );\n};\n","import React from 'react';\nimport classnames from 'classnames';\nimport { Stack } from '@servicetitan/design-system';\nimport { VisitAssistantSidebarComponentProps } from './visit-assistant-sidebar';\nimport { VisitAssistantSidebarButtonDesktop } from '../visit-assistant-sidebar-button/visit-assistant-sidebar-button-desktop';\nimport styles from './visit-assistant-sidebar-desktop.less';\nimport sidebarStyles from './visit-assistant-sidebar.less';\n\nexport const VisitAssistantSidebarDesktop: React.FC = (\n props\n) => {\n const { estimateLink, payInvoiceLink } = props;\n return (\n \n
Quick Links
\n {!!estimateLink && (\n \n )}\n {!!payInvoiceLink && (\n \n )}\n \n );\n};\n","import React from 'react';\nimport { observer } from 'mobx-react';\nimport { signatureContainer } from 'src/signature/ioc';\nimport { VisitAssistantSidebarMobile } from './visit-assistant-sidebar-mobile';\nimport { VisitAssistantSidebarDesktop } from './visit-assistant-sidebar-desktop';\nimport { SignatureStore } from 'src/signature/stores/signature.store';\n\nexport interface VisitAssistantSidebarComponentProps {\n estimateLink: string | null;\n payInvoiceLink: string | null;\n}\n\nexport interface SidebarButtonComponentProps {\n backgroundImageClassName: string;\n title: string;\n link: string;\n}\n\nexport const VisitAssistantSidebar: React.FC = observer(() => {\n const { estimateBundleId } = signatureContainer.get(SignatureStore)!;\n\n const estimateLink = estimateBundleId ? `/estimate/${estimateBundleId}` : null;\n const payInvoiceLink = null;\n return (\n \n );\n});\n","import React from 'react';\nimport styles from './page-container.less';\n\nexport const PageContainer: React.FC = ({ children }) => (\n
{children}
\n);\n","import React from 'react';\nimport { RouteComponentProps } from 'react-router';\nimport { observer } from 'mobx-react';\nimport { Stack, Text } from '@servicetitan/design-system';\nimport { lazyInject } from '../../ioc';\nimport { RouteParams } from '../signature-routes';\nimport { SignatureStore } from '../../stores/signature.store';\nimport { SignModalStore } from '../../stores/sign-modal.store';\nimport { DocumentList } from '../document-list/document-list';\nimport { EmptySignaturePage } from '../empty-signature-page/empty-signature-page';\nimport { VisitAssistantHeader } from '../visit-assistant-header/visit-assistant-header';\nimport { VisitAssistantSidebar } from '../visit-assistant-sidebar/visit-assistant-sidebar';\nimport { PageContainer } from '../page-container/page-container';\nimport styles from './signature-page.less';\n\n@observer\nexport class SignaturePageContainer extends React.Component, any> {\n @lazyInject(SignatureStore) signaturesStore!: SignatureStore;\n @lazyInject(SignModalStore) signModalStore!: SignModalStore;\n\n async componentDidMount() {\n const { visitActionId } = this.props.match.params;\n\n if (!visitActionId) {\n return;\n }\n\n await this.signaturesStore.getVisitActionRequest(visitActionId);\n this.signaturesStore.startDocumentsPolling();\n this.signModalStore.showPdfLoader();\n this.signModalStore.setVisitActionId(visitActionId);\n }\n\n componentWillUnmount() {\n this.signaturesStore.stopDocumentsPolling();\n }\n\n render() {\n const { documents, businessUnitOfficialName, isOnlineEstimateCompleted, showSidebar } =\n this.signaturesStore;\n const showDocumentList = !!(documents && (documents.length || isOnlineEstimateCompleted));\n let sidebarStackDirection: 'row' | 'column' = 'row';\n\n return (\n \n \n \n {showSidebar && }\n \n {}\n \n Visit Assistant\n \n {}\n {showDocumentList ? (\n \n ) : (\n \n )}\n \n \n \n );\n }\n}\n","import React from 'react';\nimport classnames from 'classnames';\nimport { Stack } from '@servicetitan/design-system';\nimport styles from './touchscreen-pdf-viewer.less';\n\ninterface PdfViewerControlsProps {\n pageNumber: number;\n onClickPrevious: () => void;\n onClickNext: () => void;\n onClickZoomOut: () => void;\n onClickZoomIn: () => void;\n}\nexport const PdfViewerControls: React.FC = React.memo(\n ({ pageNumber, onClickPrevious, onClickNext, onClickZoomOut, onClickZoomIn }) => (\n \n \n \n {pageNumber}\n \n \n \n )\n);\n","import React from 'react';\nimport pdfjsLib from 'pdfjs-dist';\nimport classnames from 'classnames';\nimport styles from './touchscreen-pdf-viewer.less';\nimport { Stack, Spinner } from '@servicetitan/design-system';\nimport { PdfViewerControls } from './pdf-viewer-controls';\n\npdfjsLib.GlobalWorkerOptions.workerSrc = require('pdfjs-dist/build/pdf');\n\ninterface TouchscreenPdfViewerProps {\n src: string;\n}\n\ninterface TouchscreenPdfViewerState {\n isLoading: boolean;\n pageNumber: number;\n scale: number;\n}\n\nexport class TouchscreenPdfViewer extends React.Component<\n TouchscreenPdfViewerProps,\n TouchscreenPdfViewerState\n> {\n doc?: pdfjsLib.PDFDocumentProxy;\n\n constructor(props: TouchscreenPdfViewerProps) {\n super(props);\n this.state = {\n isLoading: true,\n pageNumber: 1,\n scale: 1.0,\n };\n }\n\n componentDidMount() {\n this.init();\n }\n\n init = async () => {\n const { src } = this.props;\n const loadingTask = pdfjsLib.getDocument(src);\n this.setState({ isLoading: true });\n try {\n this.doc = await loadingTask.promise;\n } catch {\n this.setState({ isLoading: false });\n return;\n }\n this.renderPage(1, 1.5);\n };\n\n renderPage = async (pageNumber: number, scale: number = 1.5) => {\n this.setState({ pageNumber, scale });\n if (this.doc) {\n const page = await this.doc.getPage(pageNumber);\n const viewport = page.getViewport({ scale });\n const canvas = document.getElementById('pdfViewer');\n\n if (!canvas) {\n // prevent error when user navigates before render\n return;\n }\n\n (canvas as any).width = viewport.width;\n (canvas as any).height = viewport.height;\n const canvasContext = (canvas as any).getContext('2d');\n const renderTask = page.render({\n viewport,\n canvasContext,\n });\n renderTask.promise.then(() => {\n this.setState({ isLoading: false });\n });\n }\n };\n\n handleClickPrevious = () => {\n const { pageNumber } = this.state;\n if (pageNumber > 1) {\n this.renderPage(pageNumber - 1);\n }\n };\n\n handleClickNext = () => {\n const { pageNumber } = this.state;\n if (this.doc && pageNumber < this.doc.numPages) {\n this.renderPage(pageNumber + 1);\n }\n };\n\n handleClickZoomOut = () => {\n const { pageNumber, scale } = this.state;\n const newScale = Number((scale * 0.9).toFixed(2));\n this.renderPage(pageNumber, newScale);\n };\n\n handleClickZoomIn = () => {\n const { pageNumber, scale } = this.state;\n const newScale = Number((scale * 1.1).toFixed(2));\n this.renderPage(pageNumber, newScale);\n };\n\n render() {\n const { isLoading, pageNumber } = this.state;\n\n return (\n <>\n {isLoading && (\n \n \n \n )}\n {!isLoading && (\n \n )}\n
\n \n
\n \n );\n }\n}\n","import React from 'react';\nimport { Spinner, Stack } from '@servicetitan/design-system';\nimport classNames from 'classnames';\nimport styles from './document-pdf-viewer.less';\nimport { TouchscreenPdfViewer } from '../touchscreen-pdf-viewer/touchscreen-pdf-viewer';\n\ninterface DocumentPdfViewerProps {\n src: string;\n isLoading: boolean;\n onPdfLoad: () => void;\n}\n\nexport const DocumentPdfViewer: React.FC = (props) => {\n const { src, isLoading, onPdfLoad } = props;\n\n // give iframe time to render. TODO: use ref and requestIdleCallback from the iframe.\n const onIframeLoad = () => {\n setTimeout(() => {\n onPdfLoad();\n }, 100);\n };\n\n // Safari's native pdf viewer on tablet is a bad experience, so we want to use TouchscreenPdfViewer\n const isIpad = () => {\n if (navigator.userAgent.includes('iPad')) {\n return true;\n }\n\n // ios13 userAgent mimics desktop, and currently no apple desktop products have touchscreen\n if (navigator.userAgent.includes('Macintosh') && navigator.maxTouchPoints > 0) {\n return true;\n }\n\n return false;\n };\n\n if (isIpad()) {\n return ;\n }\n\n return (\n <>\n {isLoading && (\n \n \n \n )}\n \n \n );\n};\n","import React from 'react';\nimport { observer } from 'mobx-react';\nimport { Card, Icon, Text, Button, Stack } from '@servicetitan/design-system';\nimport classNames from 'classnames';\nimport styles from './document-details.less';\nimport { SignModalStore } from 'src/signature/stores/sign-modal.store';\nimport { signatureContainer } from 'src/signature/ioc';\nimport { DocumentPdfViewer } from '../document-pdf-viewer/document-pdf-viewer';\n\ninterface DocumentDetailsCardProps {\n header?: string;\n content?: string;\n documentPdfUrl?: string;\n isDocumentSigned?: boolean;\n termsFileName?: string;\n onClickSign: () => void;\n isDisclaimer?: boolean;\n}\n\nexport const DocumentDetailsCard: React.FC = observer(\n ({\n header,\n content,\n documentPdfUrl,\n isDocumentSigned,\n termsFileName,\n onClickSign,\n isDisclaimer,\n }) => {\n const { isPdfLoading, hidePdfLoader } = signatureContainer.get(SignModalStore)!;\n\n const createMarkup = () => {\n let markup = content;\n if (termsFileName && markup) {\n markup = markup.replace(\n '{Terms}',\n `Terms and Conditions` // tslint:disable ter-max-len\n );\n }\n return { __html: markup };\n };\n\n const handleClickSign = () => {\n !isDocumentSigned && onClickSign();\n };\n\n return (\n \n {header}\n {documentPdfUrl ? (\n \n \n \n ) : (\n \n )}\n {isDisclaimer ? (\n \n \n \n \n \n ) : (\n \n {isDocumentSigned && (\n \n )}\n \n {isDocumentSigned ? 'Document Signed' : 'Sign Document'}\n \n \n )}\n \n );\n }\n);\n","import React from 'react';\nimport { withRouter, RouteComponentProps } from 'react-router';\nimport { RouteParams } from '../signature-routes';\nimport { Stack, Icon, Text } from '@servicetitan/design-system';\n\ninterface SuccessPageProps extends RouteComponentProps {\n onCancel: () => void;\n}\n\nclass SuccessPageUnwrapped extends React.PureComponent {\n componentDidMount() {\n setTimeout(this.closeSuccessPage, 800);\n }\n\n closeSuccessPage = () => {\n const { history, match, onCancel } = this.props;\n const { visitActionId } = match.params;\n\n onCancel();\n history.push(`/signatures/${visitActionId}`);\n };\n\n render() {\n return (\n \n \n \n Document Signed\n \n \n );\n }\n}\n\nexport const SuccessPage = withRouter(SuccessPageUnwrapped);\n","import React, { ReactElement } from 'react';\nimport { Modal, Text, ButtonGroup, Button } from '@servicetitan/design-system';\nimport styles from './sign-modal.less';\nimport { SignModalStore } from 'src/signature/stores/sign-modal.store';\nimport { signatureContainer } from 'src/signature/ioc';\nimport { observer } from 'mobx-react';\nimport classNames from 'classnames';\nimport { SuccessPage } from './success-page';\n\ninterface SignModalProps {\n open: boolean;\n canSubmit: boolean;\n signatureInput: ReactElement;\n signatureFieldCount?: number;\n onSubmit: () => void;\n onCancel: () => void;\n}\n\nexport const SignModal: React.FC = observer(\n ({ open, signatureInput, signatureFieldCount = 0, canSubmit, onSubmit, onCancel }) => {\n const { isLoading, isSubmitSuccess } = signatureContainer.get(SignModalStore)!;\n\n if (isSubmitSuccess) {\n return (\n \n \n \n );\n }\n\n // tslint:disable-next-line: ter-max-len\n const legalTextPart1 =\n 'This document may be signed in counterparts, all of which when taken together shall constitute the contract between the contractor and the homeowner.';\n const legalTextPart2 =\n 'As such, this document may be executed and thereafter transmitted by electronic means; in which case the electronic copy of the signature may be relied upon as an original, wet ink signature.';\n const legalTextMultiPlace = `Furthermore, you hereby agree that you have reviewed and approved this document,${' '}\n and you consent for your signature to be used in ${signatureFieldCount} places within.`;\n\n return (\n \n \n Sign Document\n \n \n {legalTextPart1}\n \n \n {legalTextPart2}\n \n {signatureFieldCount > 1 && (\n \n {legalTextMultiPlace}\n \n )}\n {signatureInput}\n \n \n \n Agree and Submit\n \n \n \n );\n }\n);\n","import React from 'react';\nimport { Form } from '@servicetitan/design-system';\nimport { signatureContainer } from 'src/signature/ioc';\nimport { SignModalStore } from 'src/signature/stores/sign-modal.store';\n\ninterface SignatureTextProps {\n value: string;\n onChange: (\n _0: React.SyntheticEvent,\n data: {\n value: string;\n }\n ) => void;\n error: boolean;\n}\n\nexport const SignatureText: React.FC = React.memo(\n ({ value, onChange, error }) => {\n const { isLoading } = signatureContainer.get(SignModalStore)!;\n\n return (\n
\n \n \n );\n }\n);\n","import React from 'react';\nimport { SignModal } from './sign-modal';\nimport { SignatureText } from './signature-text';\nimport { FormState } from 'formstate';\nimport { InputFieldState, FormValidators } from '@servicetitan/form';\nimport { observer } from 'mobx-react';\nimport { lazyInject } from 'src/signature/ioc';\nimport { SignModalStore } from 'src/signature/stores/sign-modal.store';\nimport { FormSignatureRequestModel } from 'src/api';\nimport { SignatureProps } from './signature';\n\n@observer\nexport class DesktopSignModal extends React.Component {\n @lazyInject(SignModalStore) private signModalStore!: SignModalStore;\n\n formState: FormState<{ signature: InputFieldState }>;\n\n constructor(props: SignatureProps) {\n super(props);\n\n this.formState = new FormState({\n signature: new InputFieldState('').validators(FormValidators.required),\n });\n }\n\n handleClickSubmit = () => {\n const { document } = this.props;\n this.formState.validate();\n this.signModalStore.signDocument(document, {\n signatureText: this.formState.$.signature.value,\n });\n };\n\n handleClickCancel = () => {\n this.formState.reset();\n this.props.handleClose();\n };\n\n render() {\n const { document, open } = this.props;\n const { signature } = this.formState.$;\n\n return (\n \n }\n signatureFieldCount={\n (document as FormSignatureRequestModel).blankSignatureFieldCount\n }\n canSubmit={!!signature.value}\n onSubmit={this.handleClickSubmit}\n onCancel={this.handleClickCancel}\n />\n );\n }\n}\n","import React from 'react';\nimport styles from './sign-modal.less';\nimport { SignModalStore } from 'src/signature/stores/sign-modal.store';\nimport { Icon, Text } from '@servicetitan/design-system';\nimport { signatureContainer } from 'src/signature/ioc';\nimport { observer } from 'mobx-react';\nimport classNames from 'classnames';\n\ninterface SignatureImageProps {\n isCanvasEmpty: boolean;\n setIsCanvasEmpty: (isCanvasEmpty: boolean) => void;\n bindCanvas: (el: HTMLCanvasElement | null) => void;\n unbindCanvas: () => void;\n clearCanvas: () => void;\n}\n\nexport const SignatureImage: React.FC = observer(\n ({ isCanvasEmpty, setIsCanvasEmpty, bindCanvas, unbindCanvas, clearCanvas }) => {\n const { isLoading } = signatureContainer.get(SignModalStore)!;\n\n const canvasRef = React.useRef(null);\n\n React.useEffect(() => {\n bindCanvas(canvasRef.current);\n\n return () => unbindCanvas();\n // tslint:disable-next-line: align\n }, [canvasRef]);\n\n const handleTouchStart = () => setIsCanvasEmpty(false);\n const handleClickIcon = () => {\n setIsCanvasEmpty(true);\n clearCanvas();\n };\n\n return (\n
\n
\n {!isCanvasEmpty && !isLoading && (\n \n )}\n \n
\n {isCanvasEmpty && Sign Here}\n
\n );\n }\n);\n","import React from 'react';\nimport { SignModal } from './sign-modal';\nimport { SignatureImage } from './signature-image';\nimport SignaturePad from 'signature_pad';\nimport { lazyInject } from 'src/signature/ioc';\nimport { SignModalStore } from 'src/signature/stores/sign-modal.store';\nimport { FormSignatureRequestModel } from 'src/api';\nimport { SignatureProps } from './signature';\n\ninterface MobileSignModalState {\n isCanvasEmpty: boolean;\n}\n\nexport class MobileSignModal extends React.PureComponent {\n @lazyInject(SignModalStore) private signModalStore!: SignModalStore;\n\n signaturePad?: SignaturePad;\n canvas?: HTMLCanvasElement;\n\n constructor(props: SignatureProps) {\n super(props);\n this.state = {\n isCanvasEmpty: true,\n };\n }\n\n setIsCanvasEmpty = (isCanvasEmpty: boolean) => {\n this.setState({ isCanvasEmpty });\n };\n\n bindCanvas = (el: HTMLCanvasElement | null) => {\n if (!el) return;\n\n this.canvas = el;\n this.signaturePad = new SignaturePad(this.canvas);\n this.resizeCanvas();\n window.addEventListener('resize', this.resizeCanvas);\n };\n\n unbindCanvas = () => {\n this.clearCanvas();\n if (this.signaturePad) {\n this.signaturePad.off();\n }\n window.removeEventListener('resize', this.resizeCanvas);\n };\n\n resizeCanvas = () => {\n if (!this.canvas || !this.signaturePad) {\n return;\n }\n\n const canvasContext = this.canvas.getContext('2d');\n if (!canvasContext) return;\n\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n this.canvas.width = this.canvas.offsetWidth * ratio;\n this.canvas.height = this.canvas.offsetHeight * ratio;\n canvasContext.scale(ratio, ratio);\n this.clearCanvas();\n };\n\n clearCanvas = () => {\n if (!this.signaturePad) return;\n this.signaturePad.clear();\n this.setState({ isCanvasEmpty: true });\n this.signModalStore.setIsLoading(false);\n };\n\n handleClickSubmit = () => {\n const { document } = this.props;\n if (!this.signaturePad) return;\n if (this.signaturePad.isEmpty()) {\n alert('Please provide your signature.');\n return;\n }\n\n const dataURL = this.signaturePad.toDataURL();\n this.signModalStore.signDocument(document, {\n signatureBase64: dataURL,\n });\n };\n\n handleClickCancel = () => {\n this.clearCanvas();\n this.props.handleClose();\n // cancel axios request\n };\n\n render() {\n const { document, open } = this.props;\n const { isCanvasEmpty } = this.state;\n\n return (\n \n }\n signatureFieldCount={\n (document as FormSignatureRequestModel).blankSignatureFieldCount\n }\n canSubmit={!isCanvasEmpty}\n onSubmit={this.handleClickSubmit}\n onCancel={this.handleClickCancel}\n />\n );\n }\n}\n","import React from 'react';\nimport { SignatureDocument } from 'src/signature/stores/signature.store';\nimport { DesktopSignModal } from '../sign-modal/desktop-sign-modal';\nimport { MobileSignModal } from '../sign-modal/mobile-sign-modal';\n\nexport interface SignatureProps {\n document: SignatureDocument;\n open: boolean;\n handleClose: () => void;\n}\n\nexport const Signature: React.FC = (props: SignatureProps) => {\n const { document, open, handleClose } = props;\n\n const isTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n const SignModalComponent = isTouchScreen ? MobileSignModal : DesktopSignModal;\n\n return ;\n};\n","import { SignatureDisclaimerType } from 'src/api';\n\nexport const disclaimerTypeEnumToString = (signatureType: number): string => {\n switch (signatureType) {\n case SignatureDisclaimerType.NUMBER_1:\n return 'California Contractor State License Board';\n default:\n return '';\n }\n};\n","import React from 'react';\nimport { withRouter, RouteComponentProps } from 'react-router';\nimport { Text, Stack } from '@servicetitan/design-system';\nimport { RouteParams } from '../signature-routes';\nimport { lazyInject } from 'src/signature/ioc';\nimport { observer } from 'mobx-react';\nimport { SignatureStore, SignatureDocument } from 'src/signature/stores/signature.store';\nimport { SignModalStore } from 'src/signature/stores/sign-modal.store';\nimport { FormSignatureRequestModel } from 'src/api/model/formSignatureRequestModel';\nimport { InvoiceSignatureRequestModel } from 'src/api/model/invoiceSignatureRequestModel';\nimport { ProjectSignatureRequestModel } from 'src/api/model/projectSignatureRequestModel';\nimport { signatureTypeEnumToString } from 'src/signature/util/signatureTypeEnumToString';\nimport {\n isInvoiceSignature,\n isFormSignature,\n isProjectSignature,\n getDocumentPdfUrl,\n} from 'src/signature/util/document-utils';\nimport { DocumentDetailsCard } from './document-details-card';\nimport { VisitAssistantHeader } from '../visit-assistant-header/visit-assistant-header';\nimport { PageContainer } from '../page-container/page-container';\nimport pageStyles from '../signature-page/signature-page.less';\nimport { Signature } from '../sign-modal/signature';\nimport { disclaimerTypeEnumToString } from 'src/signature/util/disclaimerTypeEnumToString';\n\ninterface DocumentDetailsState {\n open: boolean;\n}\n\ninterface DocumentData {\n header?: string;\n content?: string;\n isDocumentSigned?: boolean;\n termsFileName?: string;\n}\n\n@observer\nclass DocumentDetailsUnwrapped extends React.Component<\n RouteComponentProps,\n DocumentDetailsState\n> {\n @lazyInject(SignatureStore) private signatureStore!: SignatureStore;\n @lazyInject(SignModalStore) private signModalStore!: SignModalStore;\n\n constructor(props: RouteComponentProps) {\n super(props);\n this.state = {\n open: false,\n };\n\n this.init();\n }\n\n init = async () => {\n const { history, match } = this.props;\n const { visitActionId } = match.params;\n const { loadDocuments, documents } = this.signatureStore;\n\n if (!documents.length) {\n await this.signatureStore.getVisitActionRequest(visitActionId);\n this.signModalStore.setVisitActionId(visitActionId!);\n await loadDocuments();\n if (!this.signatureStore.documents.length) {\n history.push(`/signatures/${visitActionId}`);\n }\n }\n };\n\n handleClickSign = () => {\n const { history, match } = this.props;\n const { signatureType, visitActionId, disclaimerId, invoiceId, projectId } = match.params;\n const isInvoice = invoiceId != null;\n const isProject = projectId != null;\n if (disclaimerId != null && (isInvoice || isProject)) {\n const document = this.getDocument() as SignatureDocument;\n const nextDisclaimer = Number(disclaimerId) + 1;\n const docTypePath = isInvoice ? 'invoice-signature' : 'project-signature';\n const basePath = `/signatures/${visitActionId}/${docTypePath}/${invoiceId}/${signatureType}`;\n if (nextDisclaimer < document.disclaimers.length) {\n history.push(`${basePath}/${nextDisclaimer}`);\n } else {\n history.push(basePath);\n }\n } else {\n this.setState({ open: true });\n }\n };\n\n handleClose = () => {\n this.setState({ open: false });\n this.signModalStore.setIsSubmitSuccess(false);\n };\n\n getDocument = (): SignatureDocument | undefined => {\n const { match } = this.props;\n const { invoiceId, projectId, submittingId, signatureType } = match.params;\n const { documents } = this.signatureStore;\n\n if (signatureType) {\n if (invoiceId) {\n return documents.find((document: SignatureDocument) => {\n const doc = document as InvoiceSignatureRequestModel;\n return (\n doc.invoiceId === Number(invoiceId) &&\n Number(signatureType) === doc.signatureType\n );\n });\n }\n\n if (projectId) {\n return documents.find((document: SignatureDocument) => {\n const doc = document as ProjectSignatureRequestModel;\n return (\n doc.projectId === Number(projectId) &&\n Number(signatureType) === doc.signatureType\n );\n });\n }\n }\n\n if (submittingId) {\n return documents.find(\n (document) =>\n (document as FormSignatureRequestModel).submittingId === Number(submittingId)\n );\n }\n };\n\n getDocumentData = (document?: SignatureDocument): DocumentData => {\n const { match } = this.props;\n const { disclaimerId } = match.params;\n if (isInvoiceSignature(document) || isProjectSignature(document)) {\n const disclaimer = document.disclaimers[Number(disclaimerId)];\n return {\n header: disclaimer\n ? disclaimerTypeEnumToString(disclaimer.disclaimerType)\n : signatureTypeEnumToString(document.signatureType),\n content: disclaimer ? disclaimer.legalText : document.legalText,\n isDocumentSigned: !!document.signedOn,\n termsFileName: document.termsFileName,\n };\n }\n\n if (isFormSignature(document)) {\n return {\n header: document.formName,\n isDocumentSigned: !!document.signedOn,\n };\n }\n\n return {};\n };\n\n render() {\n const { open } = this.state;\n const { businessUnitOfficialName, documents } = this.signatureStore;\n const { visitActionId, disclaimerId } = this.props.match.params;\n\n if (!documents.length) {\n return null;\n }\n\n const document = this.getDocument() as SignatureDocument;\n const documentPdfUrl = getDocumentPdfUrl(visitActionId, document);\n const { header, content, isDocumentSigned, termsFileName } = this.getDocumentData(document);\n const showSignModal = !isDocumentSigned || open;\n\n return (\n \n \n {}\n \n \n View and Sign Document\n \n \n \n {}\n\n {}\n\n {showSignModal && (\n \n )}\n \n );\n }\n}\n\nexport const DocumentDetails = withRouter(DocumentDetailsUnwrapped);\n","import React from 'react';\nimport { observer } from 'mobx-react';\nimport { Card, Button, Text } from '@servicetitan/design-system';\n\ninterface DocumentDetailsCardProps {\n header?: string | null;\n documentPdfUrl?: string | null;\n}\n\nexport const DocumentDownloadCard: React.FC = observer(\n ({ header, documentPdfUrl }) => (\n \n \n {header}\n \n \n \n )\n);\n","import React from 'react';\nimport { withRouter, RouteComponentProps } from 'react-router';\nimport { Stack } from '@servicetitan/design-system';\nimport { RouteParams } from '../../signature-routes';\nimport { observer } from 'mobx-react';\nimport { lazyInject } from 'src/signature/ioc';\nimport { SignatureStore } from 'src/signature/stores/signature.store';\nimport { signatureTypeEnumToString } from 'src/signature/util/signatureTypeEnumToString';\nimport { DocumentDownloadCard } from './document-download-card';\nimport { VisitAssistantHeader } from '../../visit-assistant-header/visit-assistant-header';\nimport { PageContainer } from '../../page-container/page-container';\nimport pageStyles from '../../signature-page/signature-page.less';\n\ninterface DocumentDocumentState {\n header?: string | null;\n}\n\n@observer\nclass DocumentDocumentUnwrapped extends React.Component<\n RouteComponentProps,\n DocumentDocumentState\n> {\n @lazyInject(SignatureStore) private signatureStore!: SignatureStore;\n\n documentPdfUrl?: string;\n\n constructor(props: RouteComponentProps) {\n super(props);\n this.state = {\n header: null,\n };\n this.init();\n }\n\n componentDidMount() {\n const { history, match } = this.props;\n const { visitActionId } = match.params;\n const query = new URLSearchParams(this.props.location.search);\n const signatureType = query.get('signatureType');\n this.setDocumentUrl();\n\n if (signatureType) {\n this.setState({\n header: signatureTypeEnumToString(parseInt(signatureType, 10)),\n });\n }\n\n if (!this.documentPdfUrl) {\n history.push(`/signatures/${visitActionId}`);\n }\n }\n\n componentWillUnmount() {\n this.signatureStore.setCurrentFormName();\n }\n\n init = async () => {\n const { match } = this.props;\n const { visitActionId, submittingId } = match.params;\n await this.signatureStore.getVisitActionRequest(visitActionId);\n\n if (submittingId) {\n await this.signatureStore.fetchFormName(submittingId);\n }\n };\n\n setDocumentUrl() {\n const { invoiceSignatureId, projectSignatureId, submittingId } = this.props.match.params;\n const isInvoiceSignature = Boolean(invoiceSignatureId || projectSignatureId);\n\n let documentPdfUrl;\n if (isInvoiceSignature) {\n documentPdfUrl = this.getDocumentPdfUrl(\n `invoice-signature-request/${invoiceSignatureId}`\n );\n }\n\n if (projectSignatureId) {\n documentPdfUrl = this.getDocumentPdfUrl(\n `project-signature-request/${projectSignatureId}`\n );\n }\n\n if (submittingId) {\n documentPdfUrl = this.getDocumentPdfUrl(submittingId, 'form', 'download');\n }\n\n this.documentPdfUrl = documentPdfUrl;\n }\n\n getDocumentPdfUrl(subpath: string, entity: string = 'invoice', action: string = 'print') {\n const { visitActionId } = this.props.match.params;\n return `/api/${entity}s/${subpath}/${action}?visitActionRequestId=${visitActionId}`;\n }\n\n render() {\n const { header } = this.state;\n const { businessUnitOfficialName, currentCustomFormName } = this.signatureStore;\n const docHeader = header || currentCustomFormName;\n\n if (!this.documentPdfUrl || !docHeader) {\n return null;\n }\n\n return (\n \n \n {}\n \n \n \n {}\n\n {}\n \n );\n }\n}\n\nexport const DocumentDownload = withRouter(DocumentDocumentUnwrapped);\n","import * as React from 'react';\nimport { Route, Switch } from 'react-router';\nimport '@servicetitan/anvil-fonts/dist/css/anvil-fonts.css';\nimport '@servicetitan/design-system/dist/system.min.css';\nimport { SignaturePageContainer } from './signature-page/signature-page';\nimport { ErrorPage } from 'src/core/components/error-page/error-page';\nimport { PrivateRoute } from 'src/routes';\nimport { DocumentDetails } from './document-details/document-details';\nimport { DocumentDownload } from './document-details/document-download/document-download';\n\nexport interface RouteParams {\n visitActionId?: string;\n submittingId?: string;\n invoiceId?: string;\n invoiceSignatureId?: string;\n projectId?: string;\n projectSignatureId?: string;\n signatureType?: string;\n disclaimerId?: string;\n}\n\nexport const SignatureRoutes: React.SFC = () => (\n \n }\n />\n \n \n \n \n \n \n \n\n \n \n } />\n \n);\n"],"sourceRoot":""}