@meetelise/chat 1.43.30 → 1.43.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/src/WebComponent/actions/details-window.d.ts +3 -1
  2. package/dist/src/WebComponent/launcher/Launcher.d.ts +4 -0
  3. package/dist/src/WebComponent/me-chat.d.ts +2 -0
  4. package/dist/src/WebComponent/pubnub-chat.d.ts +4 -0
  5. package/dist/src/utils.d.ts +1 -0
  6. package/package.json +1 -1
  7. package/public/dist/index.js +346 -292
  8. package/src/WebComponent/FeeCalculator/components/fee-calculator-layout/fee-calculator-layout-styles.ts +1 -1
  9. package/src/WebComponent/FeeCalculator/components/floor-plan-selector/floor-plan-selector-styles.ts +1 -1
  10. package/src/WebComponent/FeeCalculator/components/floorplan-image-card/floorplan-image-card-styles.ts +1 -1
  11. package/src/WebComponent/FeeCalculator/fee-calculator-styles.ts +2 -1
  12. package/src/WebComponent/MEChat.css +1 -1
  13. package/src/WebComponent/Scheduler/date-picker.ts +6 -0
  14. package/src/WebComponent/Scheduler/time-picker.ts +17 -0
  15. package/src/WebComponent/Scheduler/tourSchedulerStyles.ts +22 -3
  16. package/src/WebComponent/actions/details-window.ts +16 -8
  17. package/src/WebComponent/actions/email-us-window.ts +2 -0
  18. package/src/WebComponent/healthchat-styles.ts +3 -1
  19. package/src/WebComponent/launcher/Launcher.ts +41 -22
  20. package/src/WebComponent/launcher/launcherStyles.ts +1 -1
  21. package/src/WebComponent/leasing-chat-styles.ts +3 -1
  22. package/src/WebComponent/loaders/skeleton-loader-styles.ts +2 -2
  23. package/src/WebComponent/me-chat.ts +16 -9
  24. package/src/WebComponent/pubnub-chat.ts +40 -23
  25. package/src/WebComponent/utilities-styles.ts +4 -2
  26. package/src/utils.ts +19 -2
@@ -106,7 +106,7 @@ export default css`
106
106
  min-height: 300px;
107
107
  }
108
108
 
109
- @media (max-width: 768px) {
109
+ @media (max-width: 767px) {
110
110
  .fee-calculator-layout {
111
111
  flex-direction: column;
112
112
  gap: 10px;
@@ -118,7 +118,7 @@ const floorPlanSelectorStyles = css`
118
118
  }
119
119
  }
120
120
 
121
- @media (max-width: 768px) {
121
+ @media (max-width: 767px) {
122
122
  .date-fields {
123
123
  gap: 10px;
124
124
  }
@@ -96,7 +96,7 @@ const floorplanImageCardStyles = css`
96
96
  font-weight: 500;
97
97
  }
98
98
 
99
- @media (max-width: 768px) {
99
+ @media (max-width: 767px) {
100
100
  .floorplan-image-card {
101
101
  width: 100%;
102
102
  min-width: 18rem;
@@ -274,10 +274,11 @@ export const feeCalculatorStyles = css`
274
274
  justify-content: center;
275
275
  }
276
276
 
277
- @media (max-width: 768px) {
277
+ @media (max-width: 767px) {
278
278
  .fee-calculator-container {
279
279
  width: 100vw;
280
280
  height: 100vh;
281
+ height: 100svh;
281
282
  padding: 8px;
282
283
  padding-top: 2px;
283
284
  border-radius: 0;
@@ -1,4 +1,4 @@
1
- @media screen and (min-width: 767px) {
1
+ @media screen and (min-width: 768px) {
2
2
  .meetelise-chat.pane.launcher__desktop {
3
3
  right: -32px;
4
4
  }
@@ -127,6 +127,12 @@ export class DatePicker extends LitElement {
127
127
  padding: 15px 12px 15px;
128
128
  }
129
129
 
130
+ @media screen and (max-width: 767px) {
131
+ #calendar {
132
+ width: 100%;
133
+ }
134
+ }
135
+
130
136
  #header {
131
137
  display: flex;
132
138
  align-items: center;
@@ -143,6 +143,23 @@ export class TimePicker extends LitElement {
143
143
  width: 100%;
144
144
  }
145
145
  }
146
+
147
+ @media screen and (max-width: 767px) {
148
+ #optionContainer {
149
+ max-width: none;
150
+ max-height: none;
151
+ width: 100%;
152
+ overflow-y: auto;
153
+ justify-content: flex-start;
154
+ align-content: flex-start;
155
+ }
156
+
157
+ .option {
158
+ width: auto;
159
+ flex: 1 1 0;
160
+ min-width: 80px;
161
+ }
162
+ }
146
163
  `;
147
164
 
148
165
  render(): TemplateResult {
@@ -49,7 +49,8 @@ export const tourSchedulerStyles = css`
49
49
  right: 0;
50
50
  bottom: 0;
51
51
  top: 6px;
52
- height: calc(100% - 12px);
52
+ height: calc(100vh - 12px);
53
+ height: calc(100svh - 12px);
53
54
  width: calc(100% - 12px);
54
55
  box-sizing: border-box;
55
56
 
@@ -59,8 +60,10 @@ export const tourSchedulerStyles = css`
59
60
  }
60
61
  #mobile-body-container {
61
62
  flex: 1;
63
+ min-height: 0;
62
64
  box-sizing: border-box;
63
65
  padding: 24px;
66
+ overflow-y: auto;
64
67
  }
65
68
 
66
69
  #mobile-next-bttn {
@@ -117,7 +120,9 @@ export const tourSchedulerStyles = css`
117
120
  }
118
121
  #scheduler-container {
119
122
  padding: 24px;
120
- height: 500px;
123
+ max-height: 500px;
124
+ flex: 1;
125
+ min-height: 0;
121
126
  overflow-y: auto;
122
127
  position: relative;
123
128
  }
@@ -180,6 +185,20 @@ export const tourSchedulerStyles = css`
180
185
  }
181
186
  }
182
187
 
188
+ @media screen and (max-width: 767px) {
189
+ #dateAndTimeMenu {
190
+ display: flex;
191
+ flex-direction: column;
192
+ width: 100%;
193
+ }
194
+
195
+ #datePicker {
196
+ flex-direction: column;
197
+ align-items: stretch;
198
+ width: 100%;
199
+ }
200
+ }
201
+
183
202
  /*
184
203
  makes button fit size of SVG:
185
204
  https://stackoverflow.com/questions/45423874/button-height-is-greater-than-the-nested-contents-height
@@ -247,7 +266,7 @@ otherwise there's some empty space at the bottom of the button, which interferes
247
266
  }
248
267
 
249
268
  #tour-scheduler-footer {
250
- height: 100px;
269
+ min-height: 64px;
251
270
  display: flex;
252
271
  justify-content: space-between;
253
272
  align-items: center;
@@ -1,7 +1,7 @@
1
1
  import { css, html, LitElement, TemplateResult } from "lit";
2
2
  import { customElement, property, state } from "lit/decorators.js";
3
3
  import { styleMap } from "lit/directives/style-map.js";
4
- import { isMobile } from "../../utils";
4
+ import { isMobile, onMobileChange } from "../../utils";
5
5
 
6
6
  @customElement("details-window")
7
7
  export class DetailsWindow extends LitElement {
@@ -14,6 +14,9 @@ export class DetailsWindow extends LitElement {
14
14
 
15
15
  border-radius: 10px 0px 0px 10px;
16
16
  padding: 49px 18px 24px;
17
+ max-height: calc(100vh - 40px);
18
+ max-height: calc(100svh - 40px);
19
+ overflow-y: auto;
17
20
  }
18
21
 
19
22
  .close-window-button {
@@ -87,20 +90,25 @@ export class DetailsWindow extends LitElement {
87
90
  onCloseClick?: (e: MouseEvent) => void;
88
91
 
89
92
  @state()
90
- isMobileSized = false;
93
+ isMobileSized = isMobile();
91
94
 
92
95
  @property({ attribute: true })
93
96
  useGradientDesign = false;
94
97
 
95
- async firstUpdated(): Promise<void> {
96
- // Give the browser a chance to paint
97
- await new Promise((resolve) => setTimeout(resolve, 0));
98
- this.isMobileSized = isMobile();
99
- window.addEventListener("resize", () => {
100
- this.isMobileSized = isMobile();
98
+ private _cleanupMobileListener?: () => void;
99
+
100
+ connectedCallback(): void {
101
+ super.connectedCallback();
102
+ this._cleanupMobileListener = onMobileChange((m) => {
103
+ this.isMobileSized = m;
101
104
  });
102
105
  }
103
106
 
107
+ disconnectedCallback(): void {
108
+ this._cleanupMobileListener?.();
109
+ super.disconnectedCallback();
110
+ }
111
+
104
112
  render(): TemplateResult {
105
113
  return html`
106
114
  <div
@@ -69,6 +69,8 @@ export class EmailUsWindow extends LitElement {
69
69
  width: 100%;
70
70
  width: -webkit-fill-available;
71
71
  width: -moz-available;
72
+ min-height: 80px;
73
+ max-height: 159px;
72
74
  height: 159px;
73
75
  }
74
76
 
@@ -20,6 +20,8 @@ export const healthChatStyles = css`
20
20
  .healthchat-container__desktop {
21
21
  width: 300px;
22
22
  height: 420px;
23
+ max-height: calc(100vh - 160px);
24
+ max-height: calc(100svh - 160px);
23
25
  border-radius: 10px;
24
26
  }
25
27
 
@@ -101,7 +103,7 @@ export const healthChatStyles = css`
101
103
 
102
104
  padding-right: 6px; /* width of the scrollbar */
103
105
  box-sizing: border-box;
104
- z-index: 1000000000000000000000000001;
106
+ z-index: 10;
105
107
  }
106
108
  #healthcare-inner-footer > #message-input:focus {
107
109
  outline: none;
@@ -22,7 +22,7 @@ import {
22
22
  import "./mobile-launcher";
23
23
  import "../actions/collapse-expand-button";
24
24
  import { DesignConcepts } from "../../fetchBuildingWebchatView";
25
- import { isMobile } from "../../utils";
25
+ import { isMobile, onMobileChange } from "../../utils";
26
26
  import classNames from "classnames";
27
27
  import LeadSourceClient from "../LeadSourceClient";
28
28
 
@@ -212,6 +212,11 @@ export class Launcher extends LitElement {
212
212
  @state()
213
213
  private leadSourceMultitouchClient: LeadSourceMultitouchClient | null = null;
214
214
 
215
+ @state()
216
+ _isMobile = isMobile();
217
+
218
+ private _cleanupMobileListener?: () => void;
219
+
215
220
  @state()
216
221
  isEmailWindowOpen = false;
217
222
  @state()
@@ -226,6 +231,18 @@ export class Launcher extends LitElement {
226
231
  @state()
227
232
  private isMobileFeaturesExpanded = false;
228
233
 
234
+ connectedCallback(): void {
235
+ super.connectedCallback();
236
+ this._cleanupMobileListener = onMobileChange((m) => {
237
+ this._isMobile = m;
238
+ });
239
+ }
240
+
241
+ disconnectedCallback(): void {
242
+ this._cleanupMobileListener?.();
243
+ super.disconnectedCallback();
244
+ }
245
+
229
246
  getNumCallToActions = (): number => {
230
247
  const isEmailEnabled =
231
248
  this.hasEmailEnabledDesktop || this.hasEmailEnabledMobile;
@@ -391,11 +408,11 @@ export class Launcher extends LitElement {
391
408
 
392
409
  renderActionPills = (): TemplateResult => {
393
410
  if (
394
- isMobile() ||
411
+ this._isMobile ||
395
412
  this.isMinimized ||
396
413
  this.designConcept === DesignConcepts.MINIMIZED
397
414
  ) {
398
- return html` ${this.hasHideMobileFeatures && isMobile()
415
+ return html` ${this.hasHideMobileFeatures && this._isMobile
399
416
  ? html`<collapse-expand-button
400
417
  .toExpand=${this.isMobileFeaturesExpanded}
401
418
  .primaryColor=${this.primaryColor}
@@ -411,40 +428,40 @@ export class Launcher extends LitElement {
411
428
  .onClickApplyNowOption=${this.onClickApplyNowOption}
412
429
  .onClickPriceCalculatorOption=${this.onClickPriceCalculatorOption}
413
430
  .overrideRentgrata=${this.overrideRentgrata}
414
- .isMobileDesign=${isMobile() ||
431
+ .isMobileDesign=${this._isMobile ||
415
432
  this.designConcept === DesignConcepts.MINIMIZED}
416
433
  .primaryColor=${this.primaryColor}
417
434
  .backgroundColor=${this.backgroundColor}
418
- .hasChatEnabled=${!isMobile()
435
+ .hasChatEnabled=${!this._isMobile
419
436
  ? this.hasChatEnabledDesktop
420
437
  : this.hasChatEnabledMobile}
421
- .hasEmailEnabled=${!isMobile()
438
+ .hasEmailEnabled=${!this._isMobile
422
439
  ? this.hasEmailEnabledDesktop
423
440
  : this.hasHideMobileFeatures && !this.isMobileFeaturesExpanded
424
441
  ? false
425
442
  : this.hasEmailEnabledMobile}
426
- .hasCallUsEnabled=${!isMobile()
443
+ .hasCallUsEnabled=${!this._isMobile
427
444
  ? this.phoneNumber && this.hasCallUsEnabledDesktop
428
445
  : this.hasHideMobileFeatures && !this.isMobileFeaturesExpanded
429
446
  ? false
430
447
  : this.hasCallUsEnabledMobile}
431
- .hasTextUsEnabled=${!isMobile()
448
+ .hasTextUsEnabled=${!this._isMobile
432
449
  ? this.hasTextUsEnabledDesktop
433
450
  : this.hasHideMobileFeatures && !this.isMobileFeaturesExpanded
434
451
  ? false
435
452
  : this.hasTextUsEnabledMobile}
436
- .hasSSTEnabled=${!isMobile()
453
+ .hasSSTEnabled=${!this._isMobile
437
454
  ? this.hasSSTEnabledDesktop
438
455
  : this.hasHideMobileFeatures && !this.isMobileFeaturesExpanded
439
456
  ? false
440
457
  : this.hasSSTEnabledMobile}
441
- .hasApplyNowEnabled=${!isMobile()
458
+ .hasApplyNowEnabled=${!this._isMobile
442
459
  ? this.hasApplyNowEnabledDesktop
443
460
  : this.hasHideMobileFeatures && !this.isMobileFeaturesExpanded
444
461
  ? false
445
462
  : this.hasApplyNowEnabledMobile}
446
463
  .applicationLink=${this.applicationLink}
447
- .hasPricingCalculatorEnabled=${!isMobile()
464
+ .hasPricingCalculatorEnabled=${!this._isMobile
448
465
  ? this.hasPricingCalculatorEnabledDesktop
449
466
  : this.hasHideMobileFeatures && !this.isMobileFeaturesExpanded
450
467
  ? false
@@ -1174,19 +1191,19 @@ export class Launcher extends LitElement {
1174
1191
  }
1175
1192
  const overrideStyleWindows = {
1176
1193
  top:
1177
- !isMobile() && this.top !== undefined && !isNaN(this.top)
1194
+ !this._isMobile && this.top !== undefined && !isNaN(this.top)
1178
1195
  ? `${this.top}px`
1179
1196
  : undefined,
1180
1197
  bottom:
1181
- !isMobile() && this.bottom !== undefined && !isNaN(this.bottom)
1198
+ !this._isMobile && this.bottom !== undefined && !isNaN(this.bottom)
1182
1199
  ? `${this.bottom}px`
1183
1200
  : undefined,
1184
1201
  left:
1185
- !isMobile() && this.left !== undefined && !isNaN(this.left)
1202
+ !this._isMobile && this.left !== undefined && !isNaN(this.left)
1186
1203
  ? `${this.left}px`
1187
1204
  : undefined,
1188
1205
  right:
1189
- !isMobile() && this.right !== undefined && !isNaN(this.right)
1206
+ !this._isMobile && this.right !== undefined && !isNaN(this.right)
1190
1207
  ? `${this.right}px`
1191
1208
  : undefined,
1192
1209
  };
@@ -1194,35 +1211,37 @@ export class Launcher extends LitElement {
1194
1211
  return html`
1195
1212
  <div
1196
1213
  class=${classNames({
1197
- ["launcher__mobile-launcher-wrapper"]: isMobile() || this.isMinimized,
1198
- ["launcher__mini-launcher-wrapper"]: !isMobile() && !this.isMinimized,
1214
+ ["launcher__mobile-launcher-wrapper"]:
1215
+ this._isMobile || this.isMinimized,
1216
+ ["launcher__mini-launcher-wrapper"]:
1217
+ !this._isMobile && !this.isMinimized,
1199
1218
  ["launcher__mini-elevated"]:
1200
1219
  this.orgSlug.toLowerCase() === "livcor" &&
1201
- (isMobile() || this.isMinimized),
1220
+ (this._isMobile || this.isMinimized),
1202
1221
  })}
1203
1222
  style=${styleMap({
1204
1223
  ...this.launcherStyles,
1205
1224
  ...this.mobileStyles,
1206
1225
  top:
1207
- !isMobile() && this.top !== undefined && !isNaN(this.top)
1226
+ !this._isMobile && this.top !== undefined && !isNaN(this.top)
1208
1227
  ? `${this.top - 700}px`
1209
1228
  : this.mobileStyles.top !== undefined
1210
1229
  ? `${this.mobileStyles.top}px`
1211
1230
  : undefined,
1212
1231
  bottom:
1213
- !isMobile() && this.bottom !== undefined && !isNaN(this.bottom)
1232
+ !this._isMobile && this.bottom !== undefined && !isNaN(this.bottom)
1214
1233
  ? `${this.bottom}px`
1215
1234
  : this.mobileStyles.bottom !== undefined
1216
1235
  ? `${this.mobileStyles.bottom}px`
1217
1236
  : "72px",
1218
1237
  left:
1219
- !isMobile() && this.left !== undefined && !isNaN(this.left)
1238
+ !this._isMobile && this.left !== undefined && !isNaN(this.left)
1220
1239
  ? `${this.left}px`
1221
1240
  : this.mobileStyles.left !== undefined
1222
1241
  ? `${this.mobileStyles.left}px`
1223
1242
  : undefined,
1224
1243
  right:
1225
- !isMobile() && this.right !== undefined && !isNaN(this.right)
1244
+ !this._isMobile && this.right !== undefined && !isNaN(this.right)
1226
1245
  ? `${this.right}px`
1227
1246
  : this.mobileStyles.right !== undefined
1228
1247
  ? `${this.mobileStyles.right}px`
@@ -274,7 +274,7 @@ export const launcherStyles = css`
274
274
  border-radius: 50%;
275
275
  }
276
276
 
277
- @media screen and (max-width: 768px) {
277
+ @media screen and (max-width: 767px) {
278
278
  .launcher__mini-elevated {
279
279
  bottom: 75px;
280
280
  }
@@ -29,6 +29,8 @@ export const leasingChatStyles = css`
29
29
  bottom: 110px;
30
30
  width: 340px;
31
31
  height: 600px;
32
+ max-height: calc(100vh - 220px);
33
+ max-height: calc(100svh - 220px);
32
34
  border-radius: 24px 24px 0px 24px;
33
35
  }
34
36
  #leasing-header {
@@ -106,7 +108,7 @@ export const leasingChatStyles = css`
106
108
  background: none;
107
109
  padding-right: 6px; /* width of the scrollbar */
108
110
  box-sizing: border-box;
109
- z-index: 1000000000000000000000000001;
111
+ z-index: 10;
110
112
  }
111
113
  #message-input:focus {
112
114
  outline: none;
@@ -77,7 +77,7 @@ export const skeletonCardStyles = css`
77
77
  animation: shimmer 2s infinite ease-in-out;
78
78
  }
79
79
 
80
- @media (max-width: 768px) {
80
+ @media (max-width: 767px) {
81
81
  .skeleton-card {
82
82
  margin-bottom: 10px;
83
83
  }
@@ -100,7 +100,7 @@ export const skeletonLoaderStyles = css`
100
100
  box-sizing: border-box;
101
101
  }
102
102
 
103
- @media (max-width: 768px) {
103
+ @media (max-width: 767px) {
104
104
  .skeleton-loader {
105
105
  width: 100%;
106
106
  padding: 0 10px;
@@ -19,7 +19,7 @@ import fetchPhoneNumberFromSource, {
19
19
  } from "../fetchPhoneNumberFromSource";
20
20
  import { defaultPrimaryColor, defaultBackgroundColor } from "../themes";
21
21
  import getShouldShowWebchat from "../getShouldShowWebchat";
22
- import { isMobile } from "../utils";
22
+ import { isMobile, onMobileChange } from "../utils";
23
23
  import { installLauncher } from "./launcher/Launcher";
24
24
  import parseISO from "date-fns/parseISO";
25
25
  import isPast from "date-fns/isPast";
@@ -98,7 +98,7 @@ export class MEChat extends LitElement {
98
98
  padding-top: 0px;
99
99
  padding-right: 12px;
100
100
 
101
- z-index: 1000000000;
101
+ z-index: 100002;
102
102
  }
103
103
  #chatAdditionalActionsPubnub::after {
104
104
  content: "";
@@ -140,6 +140,11 @@ export class MEChat extends LitElement {
140
140
  @property({ type: String })
141
141
  private foregroundColorOnSecondaryBackgroundColor: string | null = null;
142
142
 
143
+ @state()
144
+ private _isMobile = isMobile();
145
+
146
+ private _cleanupMobileListener?: () => void;
147
+
143
148
  @state()
144
149
  private chatId = "";
145
150
  @state()
@@ -711,6 +716,9 @@ export class MEChat extends LitElement {
711
716
  super.connectedCallback();
712
717
  window.addEventListener("resize", this.adjustPositionChatAdditionalActions);
713
718
  window.addEventListener("keydown", this.handleKeydownTab);
719
+ this._cleanupMobileListener = onMobileChange((m) => {
720
+ this._isMobile = m;
721
+ });
714
722
  }
715
723
 
716
724
  private static readonly FOCUSABLE_SELECTOR =
@@ -818,6 +826,7 @@ export class MEChat extends LitElement {
818
826
  this.adjustPositionChatAdditionalActions
819
827
  );
820
828
  window.removeEventListener("keydown", this.handleKeydownTab);
829
+ this._cleanupMobileListener?.();
821
830
 
822
831
  super.disconnectedCallback();
823
832
  }
@@ -854,7 +863,7 @@ export class MEChat extends LitElement {
854
863
  render(): TemplateResult {
855
864
  installLauncher();
856
865
  const showChatAdditionalActions =
857
- this.hideLauncher && !this.isLoading && !isMobile();
866
+ this.hideLauncher && !this.isLoading && !this._isMobile;
858
867
 
859
868
  return html`
860
869
  <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -920,8 +929,8 @@ export class MEChat extends LitElement {
920
929
  id='meetelise-chat-launcher-container'
921
930
  class=${classMap({
922
931
  launcherContainer: true,
923
- ["launcher__mobile"]: isMobile(),
924
- ["launcher__desktop"]: !isMobile(),
932
+ ["launcher__mobile"]: this._isMobile,
933
+ ["launcher__desktop"]: !this._isMobile,
925
934
  ["meetelise-chat"]: true,
926
935
  launcher: true,
927
936
  shouldBeVisible: true,
@@ -953,7 +962,7 @@ export class MEChat extends LitElement {
953
962
  .overrideRentgrata=${this.overrideRentgrata}
954
963
  .autoOpenChatWidget=${this.buildingWebchatView
955
964
  ?.autoOpenChat ?? false}
956
- .mobileStyles=${isMobile() || this.isMinimized
965
+ .mobileStyles=${this._isMobile || this.isMinimized
957
966
  ? this.mobileStyles
958
967
  : {}}
959
968
  chatCallUsHeader=${this.buildingWebchatView
@@ -971,9 +980,7 @@ export class MEChat extends LitElement {
971
980
  selfGuidedTourEnabled="${this.buildingWebchatView
972
981
  ?.isSelfGuidedTourEnabled}"
973
982
  designConcept="${this.designConcept ?? ""}"
974
- currentLeadSource="${this.LeadSourceClient?.leadSource ??
975
- null ??
976
- ""}"
983
+ currentLeadSource="${this.LeadSourceClient?.leadSource ?? ""}"
977
984
  featureFlagShowDropdown="${this.featureFlagShowDropdown}"
978
985
  .leadSources="${this.leadSources ?? []}"
979
986
  escortedToursLink="${this.buildingWebchatView