@meetelise/chat 1.21.0 → 1.21.2

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 (76) hide show
  1. package/.github/pull_request_template.md +61 -0
  2. package/.idea/codeStyles/Project.xml +57 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  5. package/.idea/vcs.xml +6 -0
  6. package/.idea/workspace.xml +67 -0
  7. package/README.md +29 -14
  8. package/declarations.d.ts +12 -0
  9. package/package.json +5 -1
  10. package/public/demo/index.html +62 -4
  11. package/public/demo/secret.html +63 -0
  12. package/public/dist/index.js +3184 -1105
  13. package/public/dist/index.js.LICENSE.txt +19 -9
  14. package/public/index.html +6 -4
  15. package/src/MEChat.ts +207 -52
  16. package/src/MyPubnub.ts +657 -0
  17. package/src/WebComponent/LeadSourceClient.ts +300 -0
  18. package/src/WebComponent/Scheduler/date-picker.ts +1 -1
  19. package/src/WebComponent/Scheduler/time-picker.ts +86 -76
  20. package/src/WebComponent/Scheduler/tour-scheduler.ts +694 -764
  21. package/src/WebComponent/Scheduler/tour-type-option.ts +17 -3
  22. package/src/WebComponent/Scheduler/tourSchedulerStyles.ts +418 -0
  23. package/src/WebComponent/actions/InputStyles.ts +32 -10
  24. package/src/WebComponent/actions/action-confirm-button.ts +16 -11
  25. package/src/WebComponent/actions/call-us-window.ts +341 -58
  26. package/src/WebComponent/actions/details-window.ts +30 -16
  27. package/src/WebComponent/actions/email-us-window.ts +89 -58
  28. package/src/WebComponent/actions/formatPhoneNumber.ts +15 -1
  29. package/src/WebComponent/actions/minimize-expand-button.ts +92 -0
  30. package/src/WebComponent/health-chat.ts +267 -0
  31. package/src/WebComponent/healthcare/healthcare-launcher-styles.ts +34 -0
  32. package/src/WebComponent/healthcare/healthcare-launcher.ts +100 -0
  33. package/src/WebComponent/healthchat-styles.ts +119 -0
  34. package/src/WebComponent/index.ts +1 -1
  35. package/src/WebComponent/launcher/Launcher.ts +919 -0
  36. package/src/WebComponent/{launcherStyles.ts → launcher/launcherStyles.ts} +172 -29
  37. package/src/WebComponent/launcher/mobile-launcher.ts +127 -0
  38. package/src/WebComponent/launcher/typeEmojiStyles.ts +161 -0
  39. package/src/WebComponent/launcher/typeMiniStyles.ts +60 -0
  40. package/src/WebComponent/launcher/typeMobileStyles.ts +50 -0
  41. package/src/WebComponent/leasing-chat-styles.ts +114 -0
  42. package/src/WebComponent/me-chat.ts +964 -351
  43. package/src/WebComponent/me-select.ts +48 -21
  44. package/src/WebComponent/mini-loader.ts +28 -0
  45. package/src/WebComponent/pubnub-chat-styles.ts +192 -0
  46. package/src/WebComponent/pubnub-chat.ts +707 -0
  47. package/src/WebComponent/pubnub-media.ts +208 -0
  48. package/src/WebComponent/pubnub-message-styles.ts +54 -0
  49. package/src/WebComponent/pubnub-message.ts +421 -0
  50. package/src/analytics.ts +114 -14
  51. package/src/assetUrls.ts +2 -0
  52. package/src/disclaimers.ts +56 -0
  53. package/src/fetchBuildingABTestType.ts +4 -0
  54. package/src/fetchBuildingInfo.ts +25 -17
  55. package/src/fetchFeatureFlag.ts +147 -0
  56. package/src/fetchLeadSources.ts +67 -1
  57. package/src/fetchPhoneNumberFromSource.ts +31 -0
  58. package/src/fetchWebchatPreferences.ts +55 -0
  59. package/src/getAvailabilities.ts +7 -3
  60. package/src/getBuildingPhoneNumber.ts +26 -0
  61. package/src/getShouldAllowScheduling.ts +16 -0
  62. package/src/getTimezoneString.ts +39 -0
  63. package/src/gtm.ts +17 -0
  64. package/src/handleChatId.ts +101 -0
  65. package/src/insertDNIIntoWebsite.ts +136 -0
  66. package/src/insertLeadSourceIntoSchedulerLinks.ts +50 -0
  67. package/src/postLeadSources.ts +39 -35
  68. package/src/svgIcons.ts +62 -53
  69. package/src/themes.ts +47 -121
  70. package/src/utils.ts +88 -1
  71. package/src/WebComponent/Launcher.ts +0 -559
  72. package/src/WebComponent/actions/text-us-window.ts +0 -279
  73. package/src/chatID.ts +0 -64
  74. package/src/createConversation.ts +0 -57
  75. package/src/fetchCurrentParsedLeadSource.ts +0 -24
  76. package/src/getRegisteredPhoneNumbers.ts +0 -56
@@ -1,5 +1,7 @@
1
1
  import { css, html, LitElement, TemplateResult } from "lit";
2
2
  import { customElement, property } from "lit/decorators.js";
3
+ import { styleMap } from "lit/directives/style-map.js";
4
+ import { defaultBrandColor, defaultBackgroundColor } from "../../themes";
3
5
 
4
6
  @customElement("tour-type-option")
5
7
  export class TourTypeOption extends LitElement {
@@ -12,11 +14,17 @@ export class TourTypeOption extends LitElement {
12
14
  @property({ attribute: false })
13
15
  onClick?: () => void;
14
16
 
17
+ @property({ attribute: true })
18
+ brandColor: string = defaultBrandColor;
19
+
20
+ @property({ attribute: true })
21
+ backgroundColor: string = defaultBackgroundColor;
22
+
15
23
  static styles = [
16
24
  css`
17
25
  .tour-type-option {
18
26
  height: 90px;
19
- width: 200px;
27
+ width: 100%;
20
28
  background: #e7e7e7;
21
29
  border: 1px solid #ffffff;
22
30
  border-radius: 10px;
@@ -46,7 +54,7 @@ export class TourTypeOption extends LitElement {
46
54
  display: flex;
47
55
  flex-direction: column;
48
56
  color: #202020;
49
- font-family: "Poppins";
57
+ font-family: "Helvetica Neue", Arial;
50
58
  }
51
59
 
52
60
  :host([selected]) .text {
@@ -71,7 +79,13 @@ export class TourTypeOption extends LitElement {
71
79
 
72
80
  render(): TemplateResult {
73
81
  return html`
74
- <div class="tour-type-option" tabindex="0">
82
+ <div
83
+ class="tour-type-option"
84
+ tabindex="0"
85
+ style=${styleMap({
86
+ background: this.selected ? this.brandColor : undefined,
87
+ })}
88
+ >
75
89
  <div class="content">
76
90
  <slot name="icon"></slot>
77
91
  <div class="text">
@@ -0,0 +1,418 @@
1
+ import { css } from "lit";
2
+
3
+ // the entire tourScheduler needs a complete rework - it's a mess
4
+ export const tourSchedulerStyles = css`
5
+ * {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ h1,
10
+ h2,
11
+ h3,
12
+ h4,
13
+ h5,
14
+ h6 {
15
+ margin: 0;
16
+ padding: 0;
17
+ }
18
+
19
+ .tour-scheduler-full,
20
+ .tour-scheduler-compact,
21
+ .tour-scheduler-mobile {
22
+ background: #ffffff;
23
+ box-shadow: 0px 16px 18px 10px rgba(21, 21, 21, 0.4);
24
+ border-radius: 10px;
25
+ font-family: "Helvetica Neue", Arial;
26
+ color: #202020;
27
+
28
+ max-width: 1000px;
29
+ }
30
+ .tour-scheduler-full {
31
+ position: fixed;
32
+ left: 50%;
33
+ top: 50%;
34
+ transform: translate(-50%, -50%);
35
+ width: 100%;
36
+ max-width: 1018px;
37
+ }
38
+ .tour-scheduler-compact {
39
+ position: fixed;
40
+ left: 5%;
41
+ top: 50%;
42
+ transform: translate(0%, -50%);
43
+ width: 100%;
44
+ max-width: calc(90% - 340px); /* 340px is width of chat popup */
45
+ }
46
+ .tour-scheduler-mobile {
47
+ position: fixed;
48
+ left: 6px;
49
+ right: 0;
50
+ bottom: 0;
51
+ top: 6px;
52
+ height: calc(100% - 12px);
53
+ width: calc(100% - 12px);
54
+ box-sizing: border-box;
55
+
56
+ display: flex;
57
+ flex-direction: column;
58
+ overflow: hidden;
59
+ }
60
+ #mobile-body-container {
61
+ flex: 1;
62
+ box-sizing: border-box;
63
+ padding: 24px;
64
+ }
65
+
66
+ #mobile-next-bttn {
67
+ height: 50px;
68
+ padding: 13px 22px 14px 22px;
69
+ float: right;
70
+ background: #202020;
71
+ border: 1px solid #ffffff;
72
+ border-radius: 10px;
73
+ font-family: "Helvetica Neue", Arial;
74
+ font-weight: 700;
75
+ font-size: 14px;
76
+ color: #ffffff;
77
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.5);
78
+ margin-top: 22px;
79
+ cursor: pointer;
80
+ }
81
+ #mobile-next-bttn:disabled {
82
+ background: #e7e7e7;
83
+ box-shadow: none;
84
+ }
85
+ #schedule-bttn {
86
+ float: right;
87
+ margin-top: 4px;
88
+ margin-bottom: 4px;
89
+ cursor: pointer;
90
+ }
91
+ #top-header {
92
+ position: sticky;
93
+ top: 0;
94
+ left: 0;
95
+ width: 100%;
96
+ height: 64px;
97
+
98
+ box-sizing: border-box;
99
+ padding-left: 24px;
100
+ padding-right: 24px;
101
+ display: flex;
102
+ justify-content: space-between;
103
+ align-items: center;
104
+
105
+ border-bottom: 1px solid #e7e7e7;
106
+ }
107
+ #tour-header-title {
108
+ font-size: 14px;
109
+ font-weight: 600;
110
+ }
111
+ #close-button {
112
+ background: none;
113
+ border: none;
114
+ cursor: pointer;
115
+ padding: 0;
116
+ margin: 0;
117
+ }
118
+ #scheduler-container {
119
+ padding: 24px;
120
+ height: 500px;
121
+ overflow-y: auto;
122
+ position: relative;
123
+ }
124
+
125
+ #book-tour-journey-items {
126
+ display: flex;
127
+ justify-content: space-between;
128
+ gap: 24px;
129
+ }
130
+ .journey-header {
131
+ font-size: 14px;
132
+ font-weight: 600;
133
+ padding-bottom: 12px;
134
+ }
135
+
136
+ #tour-type-menu-outer-container {
137
+ width: 220px;
138
+ }
139
+ #date-and-time-menu-outer-container {
140
+ width: calc(70% - 220px);
141
+ }
142
+ #user-info-and-layout-menu-outer-container {
143
+ width: 30%;
144
+ }
145
+
146
+ #tour-type-menu {
147
+ align-self: start;
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: 6px;
151
+ }
152
+
153
+ @media screen and (max-width: 1200px) {
154
+ #book-tour-journey-items {
155
+ display: flex;
156
+ flex-direction: column;
157
+ align-items: center;
158
+ }
159
+ #tour-type-menu-outer-container {
160
+ width: 320px;
161
+ padding-bottom: 24px;
162
+ border-bottom: 1px solid #e7e7e7;
163
+ }
164
+ #date-and-time-menu-outer-container {
165
+ width: 320px;
166
+ padding-bottom: 24px;
167
+ border-bottom: 1px solid #e7e7e7;
168
+ }
169
+ #user-info-and-layout-menu-outer-container {
170
+ width: 320px;
171
+ padding-bottom: 64px;
172
+ }
173
+
174
+ #datePicker {
175
+ display: flex;
176
+ flex-direction: column;
177
+ justify-content: center;
178
+ align-items: center;
179
+ width: 100%;
180
+ }
181
+ }
182
+
183
+ /*
184
+ makes button fit size of SVG:
185
+ https://stackoverflow.com/questions/45423874/button-height-is-greater-than-the-nested-contents-height
186
+ otherwise there's some empty space at the bottom of the button, which interferes with vertical centering
187
+ */
188
+ button#closeButton > svg {
189
+ vertical-align: middle;
190
+ }
191
+
192
+ h2 {
193
+ font-weight: 600;
194
+ font-size: 14px;
195
+ grid-row: label-row;
196
+ }
197
+
198
+ h2#tourType {
199
+ grid-column: 1;
200
+ grid-row: 2;
201
+ }
202
+
203
+ h2#dateAndTime {
204
+ grid-column: 2;
205
+ grid-row: 2;
206
+ }
207
+
208
+ h2#yourInformation {
209
+ grid-column: 3;
210
+ grid-row: 2;
211
+ }
212
+
213
+ #datePicker {
214
+ display: flex;
215
+ gap: 8px;
216
+ }
217
+
218
+ #dateAndTimeMenu {
219
+ grid-row: 4 / 5;
220
+ grid-column: 2;
221
+ align-self: start;
222
+ display: flex;
223
+ flex-direction: column;
224
+ }
225
+
226
+ #yourInformationMenu {
227
+ grid-row: 4 / 5;
228
+ grid-column: 3;
229
+ display: flex;
230
+ flex-direction: column;
231
+ gap: 12px;
232
+ }
233
+
234
+ #yourInformationMenu input {
235
+ width: 100%;
236
+ height: 49px;
237
+ }
238
+
239
+ hr {
240
+ grid-row: 6;
241
+ grid-column: 1 / 5;
242
+ /* remove side margins because of this
243
+ * (https://stackoverflow.com/questions/34365271/hr-inside-container-with-display-flex-become-corrupted)
244
+ * and top/bottom margins to position the line exactly at the gridline
245
+ */
246
+ margin: 0;
247
+ }
248
+
249
+ #tour-scheduler-footer {
250
+ height: 100px;
251
+ display: flex;
252
+ justify-content: space-between;
253
+ align-items: center;
254
+ border-top: 1px solid #e7e7e7;
255
+
256
+ padding-left: 24px;
257
+ padding-right: 24px;
258
+ box-sizing: border-box;
259
+ }
260
+
261
+ .explanation {
262
+ font-weight: 400;
263
+ font-size: 12px;
264
+ padding-right: 24px;
265
+ }
266
+ #schedule {
267
+ width: 145px;
268
+ height: 50px;
269
+ justify-self: end;
270
+ }
271
+
272
+ #confirmationMessage {
273
+ display: flex;
274
+ flex-direction: column;
275
+ justify-content: center;
276
+ align-items: center;
277
+ padding: 24px;
278
+ box-sizing: border-box;
279
+ gap: 12px;
280
+ }
281
+
282
+ #confirmationMessage > p {
283
+ font-size: 18px;
284
+ }
285
+
286
+ /* Loading styles: pulsing gray overlay on all the form elements */
287
+
288
+ @keyframes spin {
289
+ 0% {
290
+ transform: none;
291
+ }
292
+ 50% {
293
+ transform: rotateZ(180deg);
294
+ }
295
+ 100% {
296
+ transform: rotateZ(360deg);
297
+ }
298
+ }
299
+
300
+ svg#loadingIcon {
301
+ animation: spin 2s infinite linear;
302
+ }
303
+
304
+ .tour-scheduler.loading #scheduleATour {
305
+ display: flex;
306
+ gap: 10px;
307
+ }
308
+
309
+ @keyframes loadingPulse {
310
+ 0% {
311
+ background-color: #e7e7e7;
312
+ }
313
+ 50% {
314
+ background-color: white;
315
+ }
316
+ 100% {
317
+ background-color: #e7e7e7;
318
+ }
319
+ }
320
+
321
+ tour-type-option,
322
+ date-picker,
323
+ #yourInformationMenu .inputContainer {
324
+ position: relative;
325
+ }
326
+
327
+ #self-guided-redirect-bttn {
328
+ height: 50px;
329
+ width: 240px;
330
+ background: #d4d4d4;
331
+ border: 1px solid #ffffff;
332
+ border-radius: 10px;
333
+ font-family: "Helvetica Neue", Arial;
334
+ font-weight: 500;
335
+ font-size: 14px;
336
+ color: #000000;
337
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.5);
338
+ cursor: pointer;
339
+ }
340
+
341
+ .tour-scheduler.loading
342
+ :is(tour-type-option, date-picker, #yourInformationMenu
343
+ .inputContainer)::after {
344
+ content: "";
345
+ position: absolute;
346
+ top: 0;
347
+ left: 0;
348
+ height: 100%;
349
+ z-index: 1;
350
+ animation: loadingPulse 2s infinite;
351
+ }
352
+
353
+ .tour-scheduler.loading tour-type-option::after {
354
+ border-radius: 10px;
355
+ width: 200px;
356
+ }
357
+
358
+ .tour-scheduler.loading date-picker::after {
359
+ border-radius: 10px;
360
+ width: 205px;
361
+ }
362
+
363
+ .tour-scheduler.loading #yourInformationMenu .inputContainer input {
364
+ visibility: hidden;
365
+ }
366
+
367
+ .tour-scheduler.loading time-picker {
368
+ display: none;
369
+ }
370
+
371
+ #namesWrapper {
372
+ display: flex;
373
+ justify-content: space-between;
374
+ }
375
+
376
+ .nameContainer {
377
+ width: 48%;
378
+ }
379
+
380
+ .nameInput {
381
+ width: 100%;
382
+ }
383
+
384
+ .center-tour-not-avail {
385
+ display: flex;
386
+ justify-content: center;
387
+ align-items: center;
388
+ flex-direction: column;
389
+
390
+ height: 320px;
391
+ box-sizing: border-box;
392
+ text-align: center;
393
+
394
+ width: 100%;
395
+ padding: 24px;
396
+ max-width: 440px;
397
+ margin: auto;
398
+ }
399
+ .center-tour-not-avail > h1 {
400
+ font-size: 18px;
401
+ font-weight: 400;
402
+ text-align: center;
403
+ margin: 0;
404
+ }
405
+ .center-tour-not-avail > p {
406
+ font-size: 14px;
407
+ text-align: left;
408
+ }
409
+ .loading-entire-tour-icon {
410
+ padding: 24px;
411
+ }
412
+
413
+ .reschedule-buttons-wrapper {
414
+ display: flex;
415
+ gap: 12px;
416
+ align-items: center;
417
+ }
418
+ `;
@@ -3,20 +3,42 @@ import { css } from "lit";
3
3
  export const InputStyles = css`
4
4
  .webchat-input {
5
5
  outline: none;
6
+
6
7
  color: #202020;
8
+ font-family: "Helvetica Neue", Arial;
9
+ font-style: normal;
10
+ font-weight: 400;
11
+ line-height: 22px;
12
+
13
+ background: #d9d9d9;
14
+ border: 1px solid #efefef;
15
+ border-radius: 100px;
16
+ padding: 10px 16px;
17
+
18
+ font-size: 14px;
19
+ }
20
+
21
+ .webchat-input__error {
22
+ border-color: #ff0000;
23
+ }
24
+
25
+ .error-message {
26
+ color: #ff0000;
27
+ font-size: 12px;
7
28
  font-weight: 400;
8
- font-size: 16px;
9
29
  line-height: 16px;
10
- font-family: "Poppins";
30
+ margin-top: 4px;
31
+ }
11
32
 
12
- background: #ffffff;
13
- border-radius: 20px;
14
- border: none;
15
- padding: 0px 20px;
16
- border: 1px solid #83818e;
33
+ .webchat-font__desktop {
34
+ font-size: 14px;
35
+ }
36
+ .webchat-font__mobile {
37
+ font-size: 16px;
17
38
  }
18
39
  .webchat-textarea {
19
- padding: 20px 20px;
40
+ border-radius: 8px;
41
+ padding: 8px 16px;
20
42
  }
21
43
 
22
44
  .webchat-input:active {
@@ -29,7 +51,7 @@ export const InputStyles = css`
29
51
 
30
52
  .webchat-input::placeholder {
31
53
  color: rgba(32, 32, 32, 0.5);
32
- font-family: "Poppins";
33
- font-size: 16px;
54
+ font-family: "Helvetica Neue", Arial;
55
+ font-size: 14px;
34
56
  }
35
57
  `;
@@ -10,16 +10,17 @@ export class ActionConfirmButton extends LitElement {
10
10
  display: flex;
11
11
  justify-content: center;
12
12
  align-items: center;
13
- background: #1e1e1e;
14
- border: 2px solid #ffffff;
15
- box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.5);
13
+
14
+ background: #000000;
15
+ border: none;
16
+
16
17
  border-radius: 20px;
17
18
 
18
- font-family: "Poppins";
19
+ font-family: "Helvetica Neue", Arial;
19
20
  font-style: normal;
20
21
  font-weight: 400;
21
- font-size: 14px;
22
- line-height: 22px;
22
+ font-size: 12px;
23
+ line-height: 20px;
23
24
 
24
25
  color: #ffffff;
25
26
  padding: 5px 15px;
@@ -47,16 +48,15 @@ export class ActionConfirmButton extends LitElement {
47
48
  .lds-ring {
48
49
  display: inline-block;
49
50
  position: relative;
50
- width: 48px;
51
- height: 48px;
51
+ width: 28px;
52
+ height: 28px;
52
53
  }
53
54
  .lds-ring div {
54
55
  box-sizing: border-box;
55
56
  display: block;
56
57
  position: absolute;
57
- width: 32px;
58
- height: 32px;
59
- margin: 8px;
58
+ width: 28px;
59
+ height: 28px;
60
60
  border: 8px solid #fff;
61
61
  border-radius: 50%;
62
62
  animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
@@ -94,12 +94,17 @@ export class ActionConfirmButton extends LitElement {
94
94
  @property({ type: String })
95
95
  width = "initial";
96
96
 
97
+ focus = (): void => {
98
+ this.shadowRoot?.querySelector("button")?.focus();
99
+ };
100
+
97
101
  render = (): TemplateResult => {
98
102
  return html`<button
99
103
  class=${classnames("action-confirm-button", { loading: this.isLoading })}
100
104
  @click=${!this.isLoading ? this.onClick : null}
101
105
  ?disabled=${this.disabled}
102
106
  style=${`height: ${this.height}; width: ${this.width};`}
107
+ tabindex="0"
103
108
  >
104
109
  ${!this.isLoading
105
110
  ? this.text