{"version":3,"sources":["./src/app/models/chat-type-model.ts","./src/app/services/pre-chat.service.ts","./src/app/components/form-header/form-header.component.html","./src/app/components/form-header/form-header.component.ts","./src/app/models/log-event-type.model.ts","./src/app/models/fb-field-type-id.enum.ts","./src/app/shared/pre-chat-constants.ts","./src/app/services/form-control.service.ts","./src/app/shared/directives/no-white-space.directive.ts","./src/app/shared/directives/email.directive.ts","./src/app/components/form-field/form-field.component.html","./src/app/components/form-field/form-field.component.ts","./src/app/components/form/form.component.html","./src/app/components/form/form.component.ts","./src/app/components/form-footer/form-footer.component.ts","./src/app/components/form-footer/form-footer.component.html","./src/app/pre-chat/pre-chat.component.html","./src/app/pre-chat/pre-chat.component.ts","./src/app/pre-chat/pre-chat-app.module.ts"],"names":["CHAT_TYPE","PreChatService","http","chatParams$","BehaviorSubject","chatTaskData$","activeChatData$","Subject","invitationAccepted$","reactiveFormSubmit$","errorMessage$","window","addEventListener","event","this","receiveMessage","asObservable","data","console","debug","message","next","params","invitationAccepted","submit","text","warn","parent","postMessage","lang","formTag","get","id","upstream","customerchat","helpers","GetTimeZoneName","skillAddressesFromPreChatForm","formType","logEventCode","logEventDescription","eventCode","eventDescription","errorMessage","error","FormHeaderComponent","preChatService","resources","top","hideChat","LogEventType","FBFieldTypeId","PreChatConstants","EMAIL_REGEXP","QUOTED_EMAIL_REGEXP","FormControlService","fields","group","forEach","field","syncValidators","fieldTypeId","SkillDropdown","isRequired","push","required","control","Error","value","trim","length","whitespace","CustomerEmail","isValid","RegExp","test","log","incorrectMailFormat","rowId","formGroup","controlName","addControl","abstractControl","validator","isRequiredControl","FormFieldComponent","formControlService","FieldDisplayType","form","controls","formControl","invalid","row","fieldTypeName","mappingFieldName","options","Dropdown","Email","PlainText","option","optionLanguages","optionLabel","label","getOptionLabel","name","FormComponent","chatFormSubmitted","reCaptchaFormControlName","formSubmitted","documentReferrer","model","referrer","recaptchaResponse","overriddenSkillAddresses","targetSkillAddress","isBrowserSupported","settings","REACTIVE","PROACTIVE","tag","info","formSettings","customParams$","bindToMessageEvents","customTaskData$","bindToCustomTaskData","captchaRef","reset","acceptInvitationSubscription","subscribe","isActiveFormValid","logProactiveEvent","ChatFormOffer","showPreChatFormForProactive","submitForm","reactiveFormSubmitSubscription","activeForm","toFormGroup","rows","disable","reCaptchaEnabled","addFormControl","captchaResponse","ChatFormSubmit","preChatForm","nativeElement","emit","setFormSubmitted","execute","logEvent","unsubscribe","hasFocus","borderClassName","wrapperNativeElement","chatButtonWrapper","classList","remove","add","onSubmit","toggleBorder","FormFooterComponent","PreChatComponent","recaptchaEnabled","reCaptchaSiteKey","language","userLanguage","timezone","displaySettingId","parseInt","skillAvailabilityCheckSeconds","activeChatData","location","chatSessionId","loadForm","navigator","setPreferredLanguageCss","getTimeZone","sendChatFrameLoadEvent","type","form$","getPreChatForm","pipe","catchError","err","throwError","tap","logWithTimestamp","displaySetting$","getDisplaySetting","combineLatest","displaySetting","skillField","find","map","valueCode","sendPreChatFormReadyEvent","sourceUrl","pathname","sendProactiveErrorMessage","msg","Date","toLocaleTimeString","PreChatAppModule","failed","isPreChatForm","offlineTimeout","customerTimeout","clearChatId","PreChat","init","provide","useValue","multi"],"mappings":"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","file":"2.4192cf1b86c6372af821.js","sourcesContent":["export enum CHAT_TYPE{\r\n REACTIVE = 1,\r\n PROACTIVE,\r\n EXTERNAL\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { ChatParam } from '../models/chat-param';\r\nimport { DisplaySetting } from '../models/display-setting';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PreChatService {\r\n readonly chatParams$ = new BehaviorSubject([]);\r\n readonly chatTaskData$ = new BehaviorSubject([]);\r\n public activeChatData$ = new Subject();\r\n public invitationAccepted$ = new BehaviorSubject(false);\r\n public reactiveFormSubmit$ = new Subject();\r\n public errorMessage$ = new Subject();\r\n\r\n constructor(private http: HttpClient) {\r\n window.addEventListener(\"message\", (event) => {\r\n this.receiveMessage(event);\r\n });\r\n }\r\n\r\n bindToMessageEvents(): Observable {\r\n return this.chatParams$.asObservable();\r\n }\r\n\r\n bindToCustomTaskData(): Observable {\r\n return this.chatTaskData$.asObservable();\r\n }\r\n\r\n receiveMessage(event) {\r\n if (!event.data) return;\r\n console.debug('[PreChatService] Received %c%s', 'color:magenta', event.data.message);\r\n switch (event.data.message) {\r\n case 'uwfSetChatParams':\r\n let params: ChatParam[] = event.data.params || [];\r\n this.chatParams$.next(params);\r\n break;\r\n case 'uwfSetChatTaskData':\r\n let taskData: ChatParam[] = event.data.params || [];\r\n this.chatTaskData$.next(taskData);\r\n break;\r\n case 'uwfInvitationAccepted':\r\n this.invitationAccepted$.next(event.data.invitationAccepted);\r\n break;\r\n case 'uwfActiveChatData':\r\n this.activeChatData$.next(event.data);\r\n break;\r\n case 'uwReactiveFormSubmit':\r\n this.reactiveFormSubmit$.next(event.data.submit);\r\n break;\r\n case 'uwfErrorMessage':\r\n this.errorMessage$.next(event.data.text);\r\n break;\r\n default:\r\n console.warn('[PreChatService] Unknown message received:', event.data.message);\r\n }\r\n }\r\n\r\n hideChat(): void {\r\n parent.postMessage('uwfRecreateChat', '*');\r\n }\r\n\r\n hideChatButton(): void {\r\n parent.postMessage('uwfHideChatButton', '*');\r\n }\r\n\r\n getPreChatForm(lang: string, formTag: string) {\r\n return this.http.get(`/api/ChatAdminSettings/GetPrechatForm/${lang}/${formTag}`);\r\n }\r\n\r\n getDisplaySetting(id: number) {\r\n return this.http.get(`/api/ChatAdminSettings/DisplaySetting/${id}`);\r\n }\r\n\r\n getTimeZone() {\r\n return upstream.customerchat.helpers.GetTimeZoneName();\r\n }\r\n\r\n setFormSubmitted() {\r\n parent.postMessage('uwfSetFormSubmitted', '*');\r\n }\r\n\r\n showPreChatFormForProactive() {\r\n parent.postMessage('uwfShowChatForActiveSession', '*');\r\n }\r\n\r\n sendChatFrameLoadEvent() {\r\n parent.postMessage(\"uwfChatFrameLoaded\", \"*\");\r\n }\r\n\r\n sendPreChatFormReadyEvent(skillAddressesFromPreChatForm, formType) {\r\n parent.postMessage({\r\n message: 'uwfPreChatFormReady',\r\n skillAddressesFromPreChatForm: skillAddressesFromPreChatForm,\r\n formType: formType\r\n }, '*')\r\n }\r\n\r\n logEvent(logEventCode: number, logEventDescription: string) {\r\n parent.postMessage({\r\n message: 'uwfLogEvent',\r\n eventCode: logEventCode,\r\n eventDescription: logEventDescription\r\n }, '*');\r\n }\r\n\r\n sendProactiveErrorMessage(errorMessage: string) {\r\n parent.postMessage({ message: 'uwfProactiveError', error: errorMessage }, \"*\");\r\n }\r\n}\r\n","
\r\n \r\n

{{ headerText }}\r\n

\r\n
","import { Component, Input, OnInit } from '@angular/core';\r\nimport { PreChatService } from '../../services/pre-chat.service';\r\nimport { DisplaySetting } from '../../models/display-setting';\r\n\r\n@Component({\r\n selector: 'app-form-header',\r\n templateUrl: './form-header.component.html',\r\n styleUrls: ['./form-header.component.scss']\r\n})\r\n\r\nexport class FormHeaderComponent implements OnInit {\r\n\r\n @Input() displaySetting: DisplaySetting;\r\n @Input() form;\r\n resources: any = resources;\r\n\r\n get isTop(): boolean {\r\n return window.top === window;\r\n }\r\n\r\n constructor(private preChatService: PreChatService) { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n hideChat(): void {\r\n this.preChatService.hideChat();\r\n } \r\n}\r\n","export enum LogEventType{\r\n ChatFormOffer = 5,\r\n ChatFormDecline = 6,\r\n ChatFormSubmit = 7\r\n}\r\n","export enum FBFieldTypeId {\r\n ContactName = 1,\r\n CustomerId,\r\n CustomerEmail,\r\n PhoneNumber,\r\n InitialMessage,\r\n SkillDropdown,\r\n Dropdown,\r\n Custom\r\n}\r\n","export class PreChatConstants {\r\n // UP-8371 We stopped supporting IE in 5.0, however coming up on 5.0 release the current implementation now calls EmailValidator on pre-chat init.\r\n // The look behind in regular expressions is not supported by IE (and perhaps some early versions of FF), so use a string instead.\r\n\r\n // If local part of the email is unquoted it allows following:\r\n // - uppercase and lowercase letters A to Z and a to z\r\n // - digits 0 to 9\r\n // - characters !#$%&'*+-/=?^_`{|}~\r\n // - dot ., provided that it is not the first or last character and it does not appear consecutively\r\n public static readonly EMAIL_REGEXP = \"^[a-z0-9!#$%&'*+\\\\/=?^_`{|}~-]+(\\\\.?[a-z0-9!#$%&'*+\\\\/=?^_`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\\\\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?$\";\r\n\r\n // In exceptional case local part of the email can be enclosed in quotes. In such case in addition to conditions described above it allows:\r\n // - whitespaces\r\n // - dot . can be a first or last character and appear consecutively\r\n // - characters (),:;<>@[\\]\r\n public static readonly QUOTED_EMAIL_REGEXP = \"^\\\"[a-z0-9!#$%&'*+\\\\/=?^_`{|}~\\\\- \\\\.(),:;<>\\\\\\\\@\\\\[\\\\]]+\\\"@([a-z0-9]([a-z0-9-]*[a-z0-9])?\\\\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?$\";\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormControl, FormGroup, Validators, AbstractControl, ValidatorFn } from '@angular/forms';\r\nimport { FBFieldTypeId } from '../models/fb-field-type-id.enum';\r\nimport { noWhitespaceValidator, emailValidator } from '../shared';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormControlService {\r\n\r\n constructor() { }\r\n\r\n toFormGroup(fields: any[]) {\r\n let group: any = {};\r\n\r\n fields.forEach(field => {\r\n let syncValidators: ValidatorFn[] = [];\r\n\r\n if (field.fieldTypeId === FBFieldTypeId.SkillDropdown || field.isRequired) {\r\n syncValidators.push(Validators.required);\r\n syncValidators.push(noWhitespaceValidator());\r\n }\r\n\r\n if (field.fieldTypeId === FBFieldTypeId.CustomerEmail) {\r\n syncValidators.push(emailValidator());\r\n }\r\n\r\n group[field.rowId] = new FormControl('', syncValidators);\r\n });\r\n\r\n return new FormGroup(group);\r\n }\r\n\r\n addFormControl(formGroup: FormGroup, controlName: string, required: boolean = false) {\r\n let syncValidators: ValidatorFn[] = [];\r\n if (required) syncValidators.push(Validators.required);\r\n let control = new FormControl('', syncValidators);\r\n formGroup.addControl(controlName, control);\r\n }\r\n\r\n isRequiredControl(abstractControl: AbstractControl): boolean {\r\n if (abstractControl.validator) {\r\n const validator = abstractControl.validator({} as AbstractControl);\r\n if (validator && validator.required) {\r\n return true;\r\n }\r\n }\r\n\r\n if (abstractControl['controls']) {\r\n for (const controlName in abstractControl['controls']) {\r\n if (abstractControl['controls'][controlName]) {\r\n if (this.isRequiredControl(abstractControl['controls'][controlName])) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n","import { FormControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\r\n\r\nexport function noWhitespaceValidator(): ValidatorFn {\r\n return (control: FormControl): ValidationErrors | null => {\r\n if (!control) {\r\n throw new Error(\"FormControl is undefined/null\");\r\n }\r\n const isWhitespace = !((control.value as string) || \"\").trim().length;\r\n const isValid = !isWhitespace;\r\n return isValid ? null : { whitespace: true };\r\n };\r\n}\r\n","import { FormControl, ValidationErrors, ValidatorFn } from \"@angular/forms\";\r\nimport { PreChatConstants } from \"../pre-chat-constants\";\r\n\r\nexport function emailValidator(): ValidatorFn {\r\n return (control: FormControl): ValidationErrors | null => {\r\n if (!control) {\r\n throw new Error(\"FormControl is undefined/null\");\r\n }\r\n\r\n const isValid = control.value === \"\" || (((control.value as string) || \"\").trim().length >= 5 && \r\n (new RegExp(PreChatConstants.EMAIL_REGEXP, \"i\").test(control.value) || new RegExp(PreChatConstants.QUOTED_EMAIL_REGEXP, \"i\").test(control.value)));\r\n console.log(\"isValid \", isValid, \"control name \", control.value);\r\n return isValid ? null : { incorrectMailFormat: true };\r\n };\r\n}\r\n","\r\n\r\n \r\n \r\n {{ rowData.fieldTitle }}\r\n \r\n {{ getOptionLabel(o) }}\r\n \r\n * {{ resources.Required }}\r\n \r\n \r\n \r\n\r\n \r\n \r\n {{ rowData.fieldTitle }}\r\n \r\n {{ resources.InvalidEmail }}\r\n \r\n \r\n\r\n \r\n \r\n {{ rowData.fieldTitle }}\r\n \r\n \r\n \r\n \r\n\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\nimport { FormControlService } from '../../services/form-control.service';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { FormFieldDisplayType } from '@chatForm/src/app/models/form-field-display-type.enum';\r\nimport { DisplaySetting } from '../../models/display-setting';\r\n\r\n@Component({\r\n selector: 'app-form-field',\r\n templateUrl: './form-field.component.html',\r\n styleUrls: ['./form-field.component.scss']\r\n})\r\nexport class FormFieldComponent implements OnInit {\r\n\r\n @Input() form: FormGroup;\r\n @Input() field;\r\n @Input() displaySetting: DisplaySetting;\r\n FieldDisplayType: typeof FormFieldDisplayType = FormFieldDisplayType;\r\n resources: any = resources;\r\n\r\n get formControl() { return this.form.controls[this.field.rowId]; }\r\n get isRequired() { return this.formControlService.isRequiredControl(this.formControl); }\r\n get invalid() { return this.formControl.invalid; }\r\n\r\n constructor(private formControlService: FormControlService) { }\r\n\r\n ngOnInit() { }\r\n\r\n getName(row: any): string {\r\n if (row.fieldTypeName === \"Custom\" || row.fieldTypeName === \"Dropdown\") {\r\n return `Parameters[ChatParam_${row.mappingFieldName}]`;\r\n }\r\n\r\n return row.mappingFieldName;\r\n }\r\n\r\n getFieldDisplayType(row: any): FormFieldDisplayType {\r\n if (row.options && row.options.length) return FormFieldDisplayType.Dropdown;\r\n if (row.mappingFieldName === 'Email') return FormFieldDisplayType.Email;\r\n return FormFieldDisplayType.PlainText;\r\n }\r\n\r\n getOptionLabel(option): string {\r\n return option.optionLanguages[0].optionLabel;\r\n }\r\n\r\n getOptionTooltip(option): string {\r\n const label: string = this.getOptionLabel(option);\r\n return label.length > 45 ? label : '';\r\n }\r\n\r\n}\r\n","
\r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n","import { Observable, Subscription } from 'rxjs';\r\nimport { AfterViewInit, Component, ElementRef, Input, OnDestroy, OnInit, ViewChild, EventEmitter, Output } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { RecaptchaComponent } from 'ng-recaptcha';\r\n\r\nimport { FormControlService } from '../../services/form-control.service';\r\nimport { PreChatService } from '../../services/pre-chat.service';\r\nimport { ChatParam } from '../../models/chat-param';\r\nimport { CHAT_TYPE } from '../../models/chat-type-model';\r\nimport { LogEventType } from '../../models/log-event-type.model';\r\n\r\n@Component({\r\n selector: 'app-form',\r\n templateUrl: './form.component.html',\r\n styleUrls: ['./form.component.scss']\r\n})\r\nexport class FormComponent implements OnInit, AfterViewInit, OnDestroy {\r\n\r\n @Input() settings;\r\n @Input() language;\r\n @Input() timezone;\r\n @Input() reCaptchaEnabled;\r\n @Input() reCaptchaSiteKey;\r\n @Output() chatFormSubmitted = new EventEmitter();\r\n @ViewChild('captchaRef') captchaRef: RecaptchaComponent;\r\n @ViewChild('preChatForm') preChatForm: ElementRef;\r\n readonly reCaptchaFormControlName: string = 'reCaptcha';\r\n form: FormGroup;\r\n customParams$: Observable;\r\n customTaskData$: Observable;\r\n formSubmitted = false;\r\n documentReferrer = model.referrer;\r\n recaptchaResponse = '';\r\n overriddenSkillAddresses = model.overriddenSkillAddresses;\r\n targetSkillAddress = model.targetSkillAddress;\r\n activeForm: any;\r\n isBrowserSupported: boolean = model.isBrowserSupported;\r\n acceptInvitationSubscription: Subscription;\r\n reactiveFormSubmitSubscription: Subscription;\r\n @ViewChild('chatButtonWrapper') chatButtonWrapper: ElementRef;\r\n\r\n constructor(private preChatService: PreChatService, private formControlService: FormControlService) {\r\n }\r\n\r\n /*\r\n * Return true if proactive is enabled and has same form loaded as mentioned in _uwc('use-rule') command\r\n * Return true if proactive form is disabled\r\n * Return false if formTag is set to null for Reactive\r\n * Return false if formTag is set to null for Proactive\r\n * Return true for an incorrect formTag for Proactive\r\n */\r\n isActiveFormValid() {\r\n if (this.settings.formType === CHAT_TYPE.REACTIVE) {\r\n return this.settings.formTag !== null;\r\n }\r\n if (this.settings.formType === CHAT_TYPE.PROACTIVE) {\r\n if (this.settings.formTag === null)\r\n return false;\r\n if (this.settings.formTag !== this.settings.form.tag)\r\n return true;\r\n if (this.settings.formTag === this.settings.form.tag)\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n ngOnInit() {\r\n console.info('[FormComponent] Initializing.');\r\n this.formSettings(this.settings.form);\r\n this.customParams$ = this.preChatService.bindToMessageEvents();\r\n this.customTaskData$ = this.preChatService.bindToCustomTaskData();\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.captchaRef) {\r\n this.captchaRef.reset();\r\n }\r\n this.acceptInvitationSubscription = this.preChatService.invitationAccepted$.subscribe(invitationAccepted => {\r\n if (invitationAccepted) {\r\n const isValid = this.isActiveFormValid();\r\n console.info(\"[FormComponent] Received %cinvitationAccepted$%c. Active form valid:\", 'color:magenta', '', isValid);\r\n if (isValid) {\r\n this.logProactiveEvent(LogEventType.ChatFormOffer);\r\n this.preChatService.showPreChatFormForProactive();\r\n } else {\r\n this.submitForm();\r\n }\r\n }\r\n });\r\n this.reactiveFormSubmitSubscription = this.preChatService.reactiveFormSubmit$.subscribe(submit => {\r\n const isValid = this.isActiveFormValid();\r\n console.info(\"[FormComponent] Received %creactiveFormSubmit$%c. Active form valid:\", 'color:magenta', '', isValid);\r\n if (submit && !isValid) {\r\n this.submitForm();\r\n }\r\n });\r\n }\r\n\r\n formSettings(activeForm) {\r\n this.activeForm = activeForm;\r\n if (!this.isActiveFormValid()) {\r\n this.form = this.formControlService.toFormGroup([]);\r\n return;\r\n }\r\n this.form = this.formControlService.toFormGroup(activeForm.rows);\r\n\r\n if (!this.isBrowserSupported) {\r\n this.form.disable();\r\n }\r\n\r\n if (this.reCaptchaEnabled) {\r\n this.formControlService.addFormControl(this.form, this.reCaptchaFormControlName, false);\r\n }\r\n }\r\n\r\n reCaptchaResponseCallback(captchaResponse: string) {\r\n this.recaptchaResponse = captchaResponse;\r\n this.submitForm();\r\n }\r\n\r\n submitForm() {\r\n console.info('[FormComponent] Submitting form.');\r\n if (this.settings.formType === CHAT_TYPE.PROACTIVE && this.settings.formTag === this.settings.form.tag) {\r\n //If the above mentioned conditions are true. then Proactive chat has a valid form\r\n // and submitForm() will be invoke only on clicking of chat form submit button, hence the log\r\n this.logProactiveEvent(LogEventType.ChatFormSubmit);\r\n }\r\n var prechatElement = this.preChatForm.nativeElement;\r\n prechatElement.submit();\r\n this.formSubmitted = true;\r\n this.chatFormSubmitted.emit();\r\n this.preChatService.setFormSubmitted();\r\n }\r\n\r\n onSubmit(event) {\r\n if (this.reCaptchaEnabled) {\r\n this.captchaRef.execute();\r\n } else {\r\n this.submitForm();\r\n }\r\n }\r\n\r\n logProactiveEvent(logEvent: LogEventType) {\r\n if (this.settings.formType !== CHAT_TYPE.PROACTIVE) {\r\n return;\r\n }\r\n this.preChatService.logEvent(logEvent, LogEventType[logEvent]);\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.acceptInvitationSubscription) {\r\n this.acceptInvitationSubscription.unsubscribe();\r\n }\r\n if (this.reactiveFormSubmitSubscription) {\r\n this.reactiveFormSubmitSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n toggleBorder(hasFocus) {\r\n const borderClassName = 'chat-button-border';\r\n const wrapperNativeElement = this.chatButtonWrapper.nativeElement;\r\n wrapperNativeElement.classList.remove(borderClassName);\r\n\r\n if (hasFocus) {\r\n wrapperNativeElement.classList.add(borderClassName);\r\n }\r\n }\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { DisplaySetting } from '../../models/display-setting';\r\n\r\n@Component({\r\n selector: 'app-form-footer',\r\n templateUrl: './form-footer.component.html',\r\n styleUrls: ['./form-footer.component.scss']\r\n})\r\nexport class FormFooterComponent implements OnInit {\r\n\r\n @Input() displaySetting: DisplaySetting;\r\n @Input() text: string;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","\r\n
{{ text }}
\r\n","
\r\n \r\n
\r\n

{{ resources.UserBrowserNotSupported }}

\r\n
\r\n
\r\n
\r\n
\r\n
{{error}}
\r\n
\r\n
\r\n

{{ welcomeMessage }}

\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { combineLatest, Observable, throwError } from 'rxjs';\r\nimport { catchError, tap } from 'rxjs/operators';\r\n\r\nimport { PreChatService } from '../services/pre-chat.service';\r\nimport { DisplaySetting } from '../models/display-setting';\r\nimport { SkillAvailability } from '../models/skill-availability';\r\nimport { CHAT_TYPE } from '../models/chat-type-model';\r\n\r\n@Component({\r\n selector: 'pre-chat-root',\r\n templateUrl: './pre-chat.component.html',\r\n styleUrls: ['./pre-chat.component.scss']\r\n})\r\n\r\nexport class PreChatComponent implements OnInit {\r\n\r\n reCaptchaEnabled: boolean = model.recaptchaEnabled;\r\n reCaptchaSiteKey: string = model.reCaptchaSiteKey;\r\n error: string = model.error;\r\n language: string = model.userLanguage;\r\n formTag: string;\r\n formType: CHAT_TYPE;\r\n timezone: string = \"\";\r\n displaySettingId: number = parseInt(model.displaySettingId);\r\n resources = resources;\r\n model = model;\r\n skillAvailabilityList: SkillAvailability[];\r\n settings: any = null;\r\n form: any;\r\n chatSessionId: string;\r\n location: Location;\r\n skillAvailabilityCheckTimer: any;\r\n skillAvailabilityCheckSeconds: number = parseInt(model.skillAvailabilityCheckSeconds);\r\n isBrowserSupported: boolean = model.isBrowserSupported;\r\n\r\n constructor(private preChatService: PreChatService) {\r\n this.preChatService.activeChatData$.subscribe(activeChatData => {\r\n if (activeChatData.formTag) {\r\n this.formTag = activeChatData.formTag;\r\n } else {\r\n this.formTag = null;\r\n }\r\n\r\n if (activeChatData.location) {\r\n this.location = activeChatData.location;\r\n }\r\n\r\n this.formType = activeChatData.formType;\r\n this.chatSessionId = activeChatData.chatSessionId;\r\n this.loadForm();\r\n });\r\n\r\n this.preChatService.errorMessage$.subscribe(text => {\r\n this.error = text;//set the error message\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n console.info('[PreChatComponent] Initializing.');\r\n this.language = this.language || window.navigator.language || \"en\";\r\n upstream.customerchat.helpers.setPreferredLanguageCss(this.language);\r\n this.timezone = this.preChatService.getTimeZone();\r\n this.preChatService.sendChatFrameLoadEvent();\r\n\r\n if (!this.isBrowserSupported) {\r\n console.warn(\"This browser version is not supported.\");\r\n }\r\n }\r\n\r\n loadForm() {\r\n console.info('[PreChatComponent] Loading form', { type: CHAT_TYPE[this.formType], tag: this.formTag });\r\n\r\n this.settings = null;\r\n let form$: Observable = this.preChatService.getPreChatForm(this.language, this.formTag).pipe(\r\n catchError(err => {\r\n console.error(`Failed to load pre chat form with language '${this.language}' and formTag '${this.formTag}'`);\r\n return throwError(err);\r\n }),\r\n tap(() => this.logWithTimestamp('Init', 'Successfully fetched pre chat form'))\r\n );\r\n let displaySetting$: Observable = this.preChatService.getDisplaySetting(this.displaySettingId).pipe(\r\n catchError(err => {\r\n console.error(`Failed to load display setting with id '${this.displaySettingId}'`);\r\n return throwError(err);\r\n }),\r\n tap(() => this.logWithTimestamp('Init', 'Successfully fetched display setting'))\r\n );\r\n\r\n combineLatest(form$, displaySetting$).subscribe({\r\n next: data => {\r\n let [form, displaySetting] = data;\r\n\r\n // Get list of skill addresses configured in the pre-chat form\r\n let skillField = form.rows.find(row => row.fieldTypeName === 'Skill Dropdown' && row.mappingFieldName === 'Source');\r\n // Use drop down options OR empty skill, any overidden skill or default skill address is handled in chat engine\r\n let skillAddressesFromPreChatForm = skillField\r\n ? skillField.options.map(option => option.valueCode)\r\n : this.model.targetSkillAddress\r\n ? [this.model.targetSkillAddress]\r\n : [];\r\n // send list of skills so that we can a skill Availability check\r\n this.logWithTimestamp('Init', 'Send Prechat Form Ready event');\r\n this.preChatService.sendPreChatFormReadyEvent(skillAddressesFromPreChatForm, this.formType);\r\n\r\n this.form = form;\r\n this.settings = {\r\n form,\r\n displaySetting,\r\n formTag: this.formTag,\r\n formType: this.formType,\r\n chatSessionId: this.chatSessionId,\r\n sourceUrl: this.location.pathname\r\n };\r\n\r\n if (this.formType === CHAT_TYPE.REACTIVE) {\r\n if (this.formTag !== null && form.tag !== this.formTag) {\r\n console.warn(`Unable to find form with tag '${this.formTag}' so loading default form with Id 1`);\r\n }\r\n //TODO Handle scenario when error occurs on submitting Reactive chat in case there is no form\r\n if (this.formTag === null && this.error) {\r\n model.error = this.error = null;\r\n console.error(\"Error occurred while creating reactive chat\");\r\n }\r\n } else if (this.formType === CHAT_TYPE.PROACTIVE && this.error && form.tag !== this.formTag) {\r\n //Send error response to proactive engine for displaying error when no form is provided for Proactive\r\n this.preChatService.sendProactiveErrorMessage(this.error);\r\n //since error will be handled by proactive engine hence setting it null here\r\n model.error = this.error = null;\r\n }\r\n },\r\n error: err => {\r\n console.error(err);\r\n }\r\n });\r\n }\r\n\r\n logWithTimestamp(tag: string, msg: string) {\r\n console.debug(tag + ': ' + msg + ' at ' + new Date().toLocaleTimeString());\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { PreChatComponent } from './pre-chat.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { AppMaterialModule } from '../app-material.module';\r\nimport { SharedModule } from '../shared/shared.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n PreChatComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n SharedModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n AppMaterialModule,\r\n SharedModule,\r\n ],\r\n providers: [\r\n { provide: 'components', useValue: [PreChatComponent], multi: true }\r\n ],\r\n})\r\nexport class PreChatAppModule {\r\n constructor() {\r\n let options = {\r\n failed: !!model.error,\r\n language: model.userLanguage,\r\n isPreChatForm: true,\r\n displaySettingId: model.displaySettingId,\r\n offlineTimeout: parseInt(model.customerTimeout) * 1000,\r\n isBrowserSupported: model.isBrowserSupported,\r\n clearChatId: model.clearChatId\r\n };\r\n var prechat = new PreChat(options);\r\n prechat.init();\r\n }\r\n}"],"sourceRoot":"webpack:///"}