@meetelise/chat 1.20.69 → 1.20.71

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meetelise/chat",
3
- "version": "1.20.69",
3
+ "version": "1.20.71",
4
4
  "description": "",
5
5
  "main": "public/dist/index.js",
6
6
  "type": "module",
@@ -2509,20 +2509,20 @@ var e={8005:function(e,t,n){var i,r=this&&this.__extends||(i=function(e,t){retur
2509
2509
  justify-content: center;
2510
2510
  align-items: center;
2511
2511
  }
2512
- `;var zi=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a};let Vi=class extends ae{constructor(){super(...arguments),this.onClickMinimize=()=>{},this.onClickEmailOption=()=>{},this.onClickPhoneOption=()=>{},this.onClickSSTOption=()=>{},this.onChatTapped=()=>{},this.hideChat=!1,this.isMobile=!1,this.brandColor=ri,this.renderListElement=(e,t)=>J` <li
2513
- @click=${e}
2512
+ `;var zi=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a};let Vi=class extends ae{constructor(){super(...arguments),this.onClickMinimize=()=>{},this.onClickEmailOption=()=>{},this.onClickPhoneOption=()=>{},this.onClickSSTOption=()=>{},this.onChatTapped=()=>{},this.hideChat=!1,this.isMobile=!1,this.brandColor=ri,this.hasChatEnabled=!1,this.hasEmailEnabled=!1,this.hasCallUsEnabled=!1,this.hasSSTEnabled=!1,this.renderListElement=(e,t,n)=>e?J` <li
2513
+ @click=${t}
2514
2514
  class="typeMobile-bttn"
2515
2515
  style=${Si({background:`${this.brandColor}`})}
2516
2516
  >
2517
2517
  <div class="typeMobile-inner">
2518
- <div class="typeMobile-icon">${t}</div>
2518
+ <div class="typeMobile-icon">${n}</div>
2519
2519
  </div>
2520
- </li>`}render(){return J`<div class="typeMobile-list">
2520
+ </li>`:""}render(){return J`<div class="typeMobile-list">
2521
2521
  <ul>
2522
- ${this.renderListElement(this.onClickEmailOption,Pi)}
2523
- ${this.renderListElement(this.onClickPhoneOption,Mi)}
2524
- ${this.renderListElement(this.onClickSSTOption,_i)}
2525
- ${this.hideChat?"":this.renderListElement(this.onChatTapped,qi)}
2522
+ ${this.renderListElement(this.hasEmailEnabled,this.onClickEmailOption,Pi)}
2523
+ ${this.renderListElement(this.hasCallUsEnabled,this.onClickPhoneOption,Mi)}
2524
+ ${this.renderListElement(this.hasSSTEnabled,this.onClickSSTOption,_i)}
2525
+ ${this.renderListElement(this.hasChatEnabled&&!this.hideChat,this.onChatTapped,qi)}
2526
2526
  ${this.isMobile||this.hideChat?"":J`
2527
2527
  <minimize-expand-button
2528
2528
  .onClick=${this.onClickMinimize}
@@ -2531,7 +2531,7 @@ var e={8005:function(e,t,n){var i,r=this&&this.__extends||(i=function(e,t){retur
2531
2531
  ></minimize-expand-button>
2532
2532
  `}
2533
2533
  </ul>
2534
- </div>`}};Vi.styles=[Qi],zi([de({attribute:!0})],Vi.prototype,"onClickMinimize",void 0),zi([de({attribute:!0})],Vi.prototype,"onClickEmailOption",void 0),zi([de({attribute:!0})],Vi.prototype,"onClickPhoneOption",void 0),zi([de({attribute:!0})],Vi.prototype,"onClickSSTOption",void 0),zi([de({attribute:!0})],Vi.prototype,"onChatTapped",void 0),zi([de({attribute:!0})],Vi.prototype,"hideChat",void 0),zi([de({attribute:!0})],Vi.prototype,"isMobile",void 0),zi([de({attribute:!0})],Vi.prototype,"brandColor",void 0),Vi=zi([ue("mobile-launcher")],Vi);var Xi=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a};let Yi=class extends ae{constructor(){super(...arguments),this.isMobile=!1,this.isMinimized=!1,this.isFirstMount=!1,this.backgroundColor="rgba(255, 255, 255, 0.75)",this.textColor="#202020",this.isMini=!0,this.autoOpenChatWidget=!1,this.phoneNumber="",this.chatId="",this.chatCallUsHeader="",this.buildingId=0,this.buildingSlug="",this.orgSlug="",this.sgtUrl="",this.buildingABTestType="",this.featureFlagShowDropdown="",this.leadSources=[],this.currentLeadSource="",this.escortedToursLink="",this.virtualToursLink="",this.hasCallUsEnabled=!1,this.hasChatEnabled=!1,this.hasEmailEnabled=!1,this.hasSSTEnabled=!1,this.hasTextUsEnabled=!1,this.layoutOptions=[],this.unitOptions=[],this.tourTypeOptions=[],this.onChatTapped=()=>{},this.onClickMinimize=()=>{},this.launcherStyles={},this.brandColor=ri,this.isEmailWindowOpen=!1,this.isCallUsWindowOpen=!1,this.isSSTWindowOpen=!1,this.isTextUsWindowOpen=!1,this.getNumCallToActions=()=>[this.hasEmailEnabled,!!this.phoneNumber&&this.hasCallUsEnabled,this.hasSSTEnabled,this.hasTextUsEnabled].filter((e=>e)).length,this.emailUsWindowRef=Oe(),this.textUsWindowRef=Oe(),this.tourSchedulerRef=Oe(),this.updated=async()=>{if(this.attachOnClickToEmailUsWindow(),this.attachOnClickToTextUsWindow(),this.attachOnClickToSSTWindow(),this.buildingId){const e=await(async e=>{if(Wi[e])return Wi[e];const n=`https://app.meetelise.com/sms_management_numbers/webchat/building/${e}/numbers`,i=await t().get(n);return Wi[e]=i.data,i.data})(this.buildingId);this.hasTextUsEnabled=e.length>0&&this.hasTextUsEnabled&&4895!==this.buildingId,await async function(e){return!!e}(this.buildingId)&&this.hasSSTEnabled&&(this.hasSSTEnabled=!0)}},this.attachOnClickToEmailUsWindow=()=>{const e=this.emailUsWindowRef.value;e&&(e.onCloseClicked=this.onCloseEmailWindow)},this.attachOnClickToTextUsWindow=()=>{const e=this.textUsWindowRef.value;e&&(e.onCloseClicked=this.onCloseTextUsWindow)},this.attachOnClickToSSTWindow=()=>{const e=this.tourSchedulerRef.value;e&&(e.onCloseClicked=this.onCloseSSTWindow)},this.onClickEmailOption=e=>{e.preventDefault(),e.stopPropagation(),this.isEmailWindowOpen=!0},this.onCloseEmailWindow=()=>{this.isEmailWindowOpen=!1},this.renderEmailOption=()=>{const e=this.getNumCallToActions()>2?"Email":"Email us";return J`
2534
+ </div>`}};Vi.styles=[Qi],zi([de({attribute:!0})],Vi.prototype,"onClickMinimize",void 0),zi([de({attribute:!0})],Vi.prototype,"onClickEmailOption",void 0),zi([de({attribute:!0})],Vi.prototype,"onClickPhoneOption",void 0),zi([de({attribute:!0})],Vi.prototype,"onClickSSTOption",void 0),zi([de({attribute:!0})],Vi.prototype,"onChatTapped",void 0),zi([de({attribute:!0})],Vi.prototype,"hideChat",void 0),zi([de({attribute:!0})],Vi.prototype,"isMobile",void 0),zi([de({attribute:!0})],Vi.prototype,"brandColor",void 0),zi([de({attribute:!0})],Vi.prototype,"hasChatEnabled",void 0),zi([de({attribute:!0})],Vi.prototype,"hasEmailEnabled",void 0),zi([de({attribute:!0})],Vi.prototype,"hasCallUsEnabled",void 0),zi([de({attribute:!0})],Vi.prototype,"hasSSTEnabled",void 0),Vi=zi([ue("mobile-launcher")],Vi);var Xi=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a};let Yi=class extends ae{constructor(){super(...arguments),this.isMobile=!1,this.isMinimized=!1,this.isFirstMount=!1,this.backgroundColor="rgba(255, 255, 255, 0.75)",this.textColor="#202020",this.isMini=!0,this.autoOpenChatWidget=!1,this.phoneNumber="",this.chatId="",this.chatCallUsHeader="",this.buildingId=0,this.buildingSlug="",this.orgSlug="",this.sgtUrl="",this.buildingABTestType="",this.featureFlagShowDropdown="",this.leadSources=[],this.currentLeadSource="",this.escortedToursLink="",this.virtualToursLink="",this.hasCallUsEnabled=!1,this.hasChatEnabled=!1,this.hasEmailEnabled=!1,this.hasSSTEnabled=!1,this.hasTextUsEnabled=!1,this.layoutOptions=[],this.unitOptions=[],this.tourTypeOptions=[],this.onChatTapped=()=>{},this.onClickMinimize=()=>{},this.launcherStyles={},this.brandColor=ri,this.isEmailWindowOpen=!1,this.isCallUsWindowOpen=!1,this.isSSTWindowOpen=!1,this.isTextUsWindowOpen=!1,this.getNumCallToActions=()=>[this.hasEmailEnabled,!!this.phoneNumber&&this.hasCallUsEnabled,this.hasSSTEnabled,this.hasTextUsEnabled].filter((e=>e)).length,this.emailUsWindowRef=Oe(),this.textUsWindowRef=Oe(),this.tourSchedulerRef=Oe(),this.updated=async()=>{if(this.attachOnClickToEmailUsWindow(),this.attachOnClickToTextUsWindow(),this.attachOnClickToSSTWindow(),this.buildingId){const e=await(async e=>{if(Wi[e])return Wi[e];const n=`https://app.meetelise.com/sms_management_numbers/webchat/building/${e}/numbers`,i=await t().get(n);return Wi[e]=i.data,i.data})(this.buildingId);this.hasTextUsEnabled=e.length>0&&this.hasTextUsEnabled&&4895!==this.buildingId,await async function(e){return!!e}(this.buildingId)&&this.hasSSTEnabled&&(this.hasSSTEnabled=!0)}},this.attachOnClickToEmailUsWindow=()=>{const e=this.emailUsWindowRef.value;e&&(e.onCloseClicked=this.onCloseEmailWindow)},this.attachOnClickToTextUsWindow=()=>{const e=this.textUsWindowRef.value;e&&(e.onCloseClicked=this.onCloseTextUsWindow)},this.attachOnClickToSSTWindow=()=>{const e=this.tourSchedulerRef.value;e&&(e.onCloseClicked=this.onCloseSSTWindow)},this.onClickEmailOption=e=>{e.preventDefault(),e.stopPropagation(),this.isEmailWindowOpen=!0},this.onCloseEmailWindow=()=>{this.isEmailWindowOpen=!1},this.renderEmailOption=()=>{const e=this.getNumCallToActions()>2?"Email":"Email us";return J`
2535
2535
  <div
2536
2536
  @click=${this.onClickEmailOption}
2537
2537
  class="launcher__call-to-action-option"
@@ -2576,6 +2576,10 @@ var e={8005:function(e,t,n){var i,r=this&&this.__extends||(i=function(e,t){retur
2576
2576
  .onChatTapped=${this.onChatTapped}
2577
2577
  .isMobile=${this.isMobile}
2578
2578
  .brandColor=${this.brandColor}
2579
+ .hasChatEnabled=${this.hasChatEnabled}
2580
+ .hasEmailEnabled=${this.hasEmailEnabled}
2581
+ .hasCallUsEnabled=${this.phoneNumber&&this.hasCallUsEnabled}
2582
+ .hasSSTEnabled=${this.hasSSTEnabled}
2579
2583
  ></mobile-launcher>`:this.buildingABTestType===pi.ConceptEmoji?J`
2580
2584
  <div
2581
2585
  class="type-hey__list"
@@ -2837,7 +2841,7 @@ var e={8005:function(e,t,n){var i,r=this&&this.__extends||(i=function(e,t){retur
2837
2841
  cursor: pointer;
2838
2842
  filter: brightness(90%);
2839
2843
  }
2840
- `],pr([de({attribute:!0})],fr.prototype,"onClick",void 0),pr([de({attribute:!0})],fr.prototype,"brandColor",void 0),pr([de({attribute:!0})],fr.prototype,"toExpand",void 0),fr=pr([ue("minimize-expand-button")],fr);var hr,mr=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a};let vr=hr=class extends ae{constructor(){super(...arguments),this.buildingSlug="",this.orgSlug="",this.themeId="Glass",this.useMiniWidget=!0,this.launcherStyles={},this.isMinimized=!1,this.brandColor=null,this.popup=null,this.theme=ui({themeId:this.themeId,brandColor:this.brandColor}),this.chatId="",this.analytics=null,this.isMobile=r(),this.launcher=null,this.building=null,this.buildingABTestType=null,this.leadSources=null,this.currentLeadSource=null,this.featureFlagShowDropdown=Mn.always,this.phoneNumberForSource=null,this.hasMounted=!1,this.hideLauncher=!1,this.isLoading=!0,this.talkjsPopupElement=null,this.yardiDNIScriptInterval=null,this.launcherRef=Oe(),this.initializeInstanceVariables=async()=>{await this.setBuildingDerivedInfo(),await this.initializeLaunchJS(),this.attachOnClickToLauncher(),this.isLoading=!1,"true"===localStorage.getItem("overrideContactUsForm")&&this.overrideContactUsForm()},this.setBuildingDerivedInfo=async()=>{var e,n,i,r;if(!this.buildingSlug||!this.orgSlug)return;const[o,a,s,u,l,d,c]=await Promise.all([di(this.orgSlug,this.buildingSlug),fi(this.buildingSlug),cr(this.buildingSlug),hi(this.buildingSlug,document.referrer),Pn(this.buildingSlug),Dn(this.buildingSlug),ci(this.buildingSlug)]);o.phoneNumber=Fe(o.phoneNumber),this.building=o,this.buildingABTestType=null!==(e=null==a?void 0:a.abTestType)&&void 0!==e?e:"",this.leadSources=s,this.currentLeadSource=u,this.featureFlagShowDropdown=l,c&&(null===this.brandColor&&(this.brandColor=null!==(n=c.primaryColor)&&void 0!==n?n:null),null===this.buildingABTestType&&(this.buildingABTestType=null!==(i=c.designConcept)&&void 0!==i?i:null)),null===this.brandColor&&(this.brandColor=ri);let p=null;d&&(p=await async function(e,n){try{const i=await t().get(`https://app.meetelise.com/platformApi/webchat/${e}/phone-number-by-source?source=${n}`);return i.data?{number:Fe(i.data.number),isMatch:i.data.isMatch,isPropertyWebsiteCatchall:i.data.isPropertyWebsiteCatchall}:null}catch(e){return null}}(this.buildingSlug,this.currentLeadSource)),this.phoneNumberForSource=p||{number:this.building.phoneNumber,isMatch:!1,isPropertyWebsiteCatchall:!0},this.currentLeadSource&&(this.leadSources.includes(this.currentLeadSource)||this.leadSources.push(this.currentLeadSource)),An(this.building.id),this.chatId=function(e,t){const n=ei(e,t),i=localStorage.getItem(n);return i&&!function(e,t){const n=ti(e,t),i=localStorage.getItem(n)||$n(e,t),r=new Date(new Date(i).getTime()+216e5);return new Date>r}(e,t)?i:Zn(e,t)}(this.orgSlug,this.buildingSlug),this.avatarSrc=this.avatarSrc||this.building.avatarSrc,this.theme=ui({themeId:null!==(r=this.themeId)&&void 0!==r?r:this.building.themeId,brandColor:this.brandColor}),this.analytics=new jn(this.orgSlug,this.buildingSlug,this.chatId),this.analytics.ping("webchat_heartbeat")},this.initializeLaunchJS=async()=>{var e;if(!this.building||!this.theme)return;if(this.popup&&this.launcher)return;const[t,n,i,r]=await Promise.all([this.building,this.theme,this.avatarSrc,hr.session]);if(t.conversationMaintenanceMode)return new Promise((()=>{console.warn("MeetElise Chat is in maintenance mode. Chat icon will not appear.")}));await this.configureTalkJSPopup(t,n,r,i),this.configureLauncherElement(),null===(e=this.analytics)||void 0===e||e.ping("load"),this.yardiDNIScriptInterval=setInterval((()=>this.pollForYardiCampaignSource()),1e3),setTimeout(clearInterval,15e3,this.yardiDNIScriptInterval)},this.configureLauncherElement=()=>{this.popup&&this.launcherRef.value&&(this.launcher=this.launcherRef.value)},this.configureTalkJSPopup=async(e,t,n,i)=>{var o;const a=n.createPopup(li(n,e,t,i||e.avatarSrc,this.chatId,this.isMobile),{launcher:"never",showCloseInHeader:!0,messageField:{placeholder:"Ask a question..."}});await a.mount({show:!1}),a.on("close",(()=>{this.hideLauncher=!1}));const s=document.querySelector(".__talkjs_popup");if(this.talkjsPopupElement=s,!s)throw new Error("Failed to find chat window");s.classList.add("meetelise-chat","pane"),this.isMobile||s.classList.add("launcher__desktop"),s.style.zIndex="99999999999",this.popup=a;const u=sessionStorage.getItem("autoOpenedTimestamp"),l=!u||u&&an(un(u));e.autoOpenChatWidget&&l&&!r()&&(this.popup.show(),this.hideLauncher=!0,this.hasMounted=!0,sessionStorage.setItem("autoOpenedTimestamp",tn(function(e,t){Ue(2,arguments);var n=et(t);return tt(e,6e4*n)}(new Date,15))),null===(o=this.analytics)||void 0===o||o.ping("autoOpen"))},this.firstUpdated=()=>{this.initializeInstanceVariables()},this.handleContactClicked=e=>{var t,n;null===(t=this.popup)||void 0===t||t.hide(),this.hideLauncher=!1,null===(n=this.launcherRef.value)||void 0===n||n.onClickEmailOption(e)},this.handleTourClicked=e=>{var t,n;null===(t=this.popup)||void 0===t||t.hide(),this.hideLauncher=!1,null===(n=this.launcherRef.value)||void 0===n||n.onClickSSTOption(e)},this.handleContactTabClicked=e=>{var t,n;null===(t=this.popup)||void 0===t||t.hide(),this.hideLauncher=!1,null===(n=this.launcherRef.value)||void 0===n||n.onClickPhoneOption(e)},this.adjustTopHeaderContactCoords=()=>{var e;if(this.talkjsPopupElement){const t=this.talkjsPopupElement.getBoundingClientRect(),n=null===(e=this.shadowRoot)||void 0===e?void 0:e.getElementById("chatAdditionalActions");if(!n)return;n.style.left=`${t.left+20}px`,n.style.top=t.bottom-24+"px"}},this.onClickMinimize=e=>{e.preventDefault(),e.stopPropagation(),this.isMinimized=!this.isMinimized},this.attachOnClickToLauncher=()=>{const e=this.launcherRef.value;e&&(e.onChatTapped=async()=>{var e;this.popup&&(this.popup.show(),null===(e=this.analytics)||void 0===e||e.ping("open"),this.hideLauncher=!0,this.hasMounted=!0)})},this.overrideContactUsForm=()=>{var e;const t=document.getElementById("myContactForm");let n;if(!(t&&t instanceof HTMLFormElement))return;for(let e=0;e<t.elements.length;e++){const i=t.elements[e];if("button"===i.tagName.toLowerCase()&&"fakebutton"===i.getAttribute("data-selenium-id")){n=i;break}}if(!n)return;const i=n.cloneNode(!0);null===(e=n.parentNode)||void 0===e||e.replaceChild(i,n),i.textContent="Elise Submit";const r=()=>{const e={firstName:document.getElementById("firstname"),lastName:document.getElementById("lastname"),email:document.getElementById("email"),phone:document.getElementById("phonenumber"),message:document.getElementById("message")};return Object.values(e).some((e=>null===e)),e};i.onclick=function(e){if(!Object.values(r()).every((e=>null!==e&&"true"!==e.getAttribute("aria-invalid"))))return;e.preventDefault();const n=(()=>{const e={};return Object.entries(r()).forEach((([t,n])=>e[t]=null==n?void 0:n.value)),e})(),i={email_address:n.email,first_name:n.firstName,last_name:n.lastName,phone_number:n.phone,first_message:n.message,building_id:3660},o=JSON.stringify(i);fetch("https://app.meetelise.com/platformApi/state/create/contactMe",{method:"POST",headers:{"Content-Type":"application/json","building-slug":"e2e-test-yardi-building","org-slug":"test-company"},body:o}).then((e=>{if(!e.ok)throw new Error(`HTTP error ${e.status}`);return t.reset(),e.json()}))}}}pollForYardiCampaignSource(){var e,t,n;(null===(t=null===(e=window.RCTPCampaign)||void 0===e?void 0:e.CampaignDetails)||void 0===t?void 0:t.Source)&&(null===(n=this.analytics)||void 0===n||n.ping("yardi-DNI-init"),this.yardiDNIScriptInterval&&clearInterval(this.yardiDNIScriptInterval))}async restartConversation(){if(!(this.analytics&&this.analytics.chatId&&this.building&&this.popup&&hr.session))return;this.chatId=Zn(this.orgSlug,this.buildingSlug);const e=await hr.session;this.analytics.chatId=this.chatId,this.popup.select(li(e,this.building,this.theme,this.avatarSrc||this.building.avatarSrc,this.chatId,this.isMobile))}remove(){var e;null===(e=this.popup)||void 0===e||e.destroy()}open(){var e;null===(e=this.popup)||void 0===e||e.show()}close(){var e;null===(e=this.popup)||void 0===e||e.hide()}show(){this.launcher&&(this.launcher.style.display="")}hide(){this.launcher&&(this.launcher.style.display="none")}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.adjustTopHeaderContactCoords)}disconnectedCallback(){window.removeEventListener("resize",this.adjustTopHeaderContactCoords),super.disconnectedCallback()}updated(){this.adjustTopHeaderContactCoords()}render(){var e,t,n,i,r,o,a,s,u,l,d,c,p,f,h,m,v,g,y,b,w,S,T,A,x,O,C,I,N,R,E,F,_,M;window.customElements.get("meetelise-launcher")||window.customElements.define("meetelise-launcher",Yi);const P=this.hideLauncher&&!this.isLoading&&!this.isMobile;return J`
2844
+ `],pr([de({attribute:!0})],fr.prototype,"onClick",void 0),pr([de({attribute:!0})],fr.prototype,"brandColor",void 0),pr([de({attribute:!0})],fr.prototype,"toExpand",void 0),fr=pr([ue("minimize-expand-button")],fr);var hr,mr=function(e,t,n,i){var r,o=arguments.length,a=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,n):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,i);else for(var s=e.length-1;s>=0;s--)(r=e[s])&&(a=(o<3?r(a):o>3?r(t,n,a):r(t,n))||a);return o>3&&a&&Object.defineProperty(t,n,a),a};let vr=hr=class extends ae{constructor(){super(...arguments),this.buildingSlug="",this.orgSlug="",this.themeId="Glass",this.useMiniWidget=!0,this.launcherStyles={},this.isMinimized=!1,this.brandColor=null,this.popup=null,this.theme=ui({themeId:this.themeId,brandColor:this.brandColor}),this.chatId="",this.analytics=null,this.isMobile=r(),this.launcher=null,this.building=null,this.buildingABTestType=null,this.leadSources=null,this.currentLeadSource=null,this.featureFlagShowDropdown=Mn.always,this.phoneNumberForSource=null,this.hasMounted=!1,this.hideLauncher=!1,this.isLoading=!0,this.talkjsPopupElement=null,this.yardiDNIScriptInterval=null,this.launcherRef=Oe(),this.initializeInstanceVariables=async()=>{await this.setBuildingDerivedInfo(),await this.initializeLaunchJS(),this.attachOnClickToLauncher(),this.isLoading=!1},this.setBuildingDerivedInfo=async()=>{var e,n,i,r;if(!this.buildingSlug||!this.orgSlug)return;const[o,a,s,u,l,d,c]=await Promise.all([di(this.orgSlug,this.buildingSlug),fi(this.buildingSlug),cr(this.buildingSlug),hi(this.buildingSlug,document.referrer),Pn(this.buildingSlug),Dn(this.buildingSlug),ci(this.buildingSlug)]);o.phoneNumber=Fe(o.phoneNumber),this.building=o,this.buildingABTestType=null!==(e=null==a?void 0:a.abTestType)&&void 0!==e?e:"",this.leadSources=s,this.currentLeadSource=u,this.featureFlagShowDropdown=l,c&&(null===this.brandColor&&(this.brandColor=null!==(n=c.primaryColor)&&void 0!==n?n:null),null===this.buildingABTestType&&(this.buildingABTestType=null!==(i=c.designConcept)&&void 0!==i?i:null)),null===this.brandColor&&(this.brandColor=ri);let p=null;d&&(p=await async function(e,n){try{const i=await t().get(`https://app.meetelise.com/platformApi/webchat/${e}/phone-number-by-source?source=${n}`);return i.data?{number:Fe(i.data.number),isMatch:i.data.isMatch,isPropertyWebsiteCatchall:i.data.isPropertyWebsiteCatchall}:null}catch(e){return null}}(this.buildingSlug,this.currentLeadSource)),this.phoneNumberForSource=p||{number:this.building.phoneNumber,isMatch:!1,isPropertyWebsiteCatchall:!0},this.currentLeadSource&&(this.leadSources.includes(this.currentLeadSource)||this.leadSources.push(this.currentLeadSource)),An(this.building.id),this.chatId=function(e,t){const n=ei(e,t),i=localStorage.getItem(n);return i&&!function(e,t){const n=ti(e,t),i=localStorage.getItem(n)||$n(e,t),r=new Date(new Date(i).getTime()+216e5);return new Date>r}(e,t)?i:Zn(e,t)}(this.orgSlug,this.buildingSlug),this.avatarSrc=this.avatarSrc||this.building.avatarSrc,this.theme=ui({themeId:null!==(r=this.themeId)&&void 0!==r?r:this.building.themeId,brandColor:this.brandColor}),this.analytics=new jn(this.orgSlug,this.buildingSlug,this.chatId),this.analytics.ping("webchat_heartbeat")},this.initializeLaunchJS=async()=>{var e;if(!this.building||!this.theme)return;if(this.popup&&this.launcher)return;const[t,n,i,r]=await Promise.all([this.building,this.theme,this.avatarSrc,hr.session]);if(t.conversationMaintenanceMode)return new Promise((()=>{console.warn("MeetElise Chat is in maintenance mode. Chat icon will not appear.")}));await this.configureTalkJSPopup(t,n,r,i),this.configureLauncherElement(),null===(e=this.analytics)||void 0===e||e.ping("load"),this.yardiDNIScriptInterval=setInterval((()=>this.pollForYardiCampaignSource()),1e3),setTimeout(clearInterval,15e3,this.yardiDNIScriptInterval)},this.configureLauncherElement=()=>{this.popup&&this.launcherRef.value&&(this.launcher=this.launcherRef.value)},this.configureTalkJSPopup=async(e,t,n,i)=>{var o;const a=n.createPopup(li(n,e,t,i||e.avatarSrc,this.chatId,this.isMobile),{launcher:"never",showCloseInHeader:!0,messageField:{placeholder:"Ask a question..."}});await a.mount({show:!1}),a.on("close",(()=>{this.hideLauncher=!1}));const s=document.querySelector(".__talkjs_popup");if(this.talkjsPopupElement=s,!s)throw new Error("Failed to find chat window");s.classList.add("meetelise-chat","pane"),this.isMobile||s.classList.add("launcher__desktop"),s.style.zIndex="99999999999",this.popup=a;const u=sessionStorage.getItem("autoOpenedTimestamp"),l=!u||u&&an(un(u));e.autoOpenChatWidget&&l&&!r()&&(this.popup.show(),this.hideLauncher=!0,this.hasMounted=!0,sessionStorage.setItem("autoOpenedTimestamp",tn(function(e,t){Ue(2,arguments);var n=et(t);return tt(e,6e4*n)}(new Date,15))),null===(o=this.analytics)||void 0===o||o.ping("autoOpen"))},this.firstUpdated=()=>{this.initializeInstanceVariables()},this.handleContactClicked=e=>{var t,n;null===(t=this.popup)||void 0===t||t.hide(),this.hideLauncher=!1,null===(n=this.launcherRef.value)||void 0===n||n.onClickEmailOption(e)},this.handleTourClicked=e=>{var t,n;null===(t=this.popup)||void 0===t||t.hide(),this.hideLauncher=!1,null===(n=this.launcherRef.value)||void 0===n||n.onClickSSTOption(e)},this.handleContactTabClicked=e=>{var t,n;null===(t=this.popup)||void 0===t||t.hide(),this.hideLauncher=!1,null===(n=this.launcherRef.value)||void 0===n||n.onClickPhoneOption(e)},this.adjustTopHeaderContactCoords=()=>{var e;if(this.talkjsPopupElement){const t=this.talkjsPopupElement.getBoundingClientRect(),n=null===(e=this.shadowRoot)||void 0===e?void 0:e.getElementById("chatAdditionalActions");if(!n)return;n.style.left=`${t.left+20}px`,n.style.top=t.bottom-24+"px"}},this.onClickMinimize=e=>{e.preventDefault(),e.stopPropagation(),this.isMinimized=!this.isMinimized},this.attachOnClickToLauncher=()=>{const e=this.launcherRef.value;e&&(e.onChatTapped=async()=>{var e;this.popup&&(this.popup.show(),null===(e=this.analytics)||void 0===e||e.ping("open"),this.hideLauncher=!0,this.hasMounted=!0)})}}pollForYardiCampaignSource(){var e,t,n;(null===(t=null===(e=window.RCTPCampaign)||void 0===e?void 0:e.CampaignDetails)||void 0===t?void 0:t.Source)&&(null===(n=this.analytics)||void 0===n||n.ping("yardi-DNI-init"),this.yardiDNIScriptInterval&&clearInterval(this.yardiDNIScriptInterval))}async restartConversation(){if(!(this.analytics&&this.analytics.chatId&&this.building&&this.popup&&hr.session))return;this.chatId=Zn(this.orgSlug,this.buildingSlug);const e=await hr.session;this.analytics.chatId=this.chatId,this.popup.select(li(e,this.building,this.theme,this.avatarSrc||this.building.avatarSrc,this.chatId,this.isMobile))}remove(){var e;null===(e=this.popup)||void 0===e||e.destroy()}open(){var e;null===(e=this.popup)||void 0===e||e.show()}close(){var e;null===(e=this.popup)||void 0===e||e.hide()}show(){this.launcher&&(this.launcher.style.display="")}hide(){this.launcher&&(this.launcher.style.display="none")}connectedCallback(){super.connectedCallback(),window.addEventListener("resize",this.adjustTopHeaderContactCoords)}disconnectedCallback(){window.removeEventListener("resize",this.adjustTopHeaderContactCoords),super.disconnectedCallback()}updated(){this.adjustTopHeaderContactCoords()}render(){var e,t,n,i,r,o,a,s,u,l,d,c,p,f,h,m,v,g,y,b,w,S,T,A,x,O,C,I,N,R,E,F,_,M,P,D,q,U,B,k,L,j;window.customElements.get("meetelise-launcher")||window.customElements.define("meetelise-launcher",Yi);const H=this.hideLauncher&&!this.isLoading&&!this.isMobile;return J`
2841
2845
  <meta name="viewport" content="width=device-width, initial-scale=1 user-scalable=1">
2842
2846
  <div id="aria-describe-info" style="display: none;">
2843
2847
  EliseAI widget that allows you to chat with a virtual assistant, book
@@ -2886,7 +2890,7 @@ var e={8005:function(e,t,n){var i,r=this&&this.__extends||(i=function(e,t){retur
2886
2890
  </div>
2887
2891
  <div
2888
2892
  id="chatAdditionalActions"
2889
- class=${ve({showTab:P,hideTab:!P})}
2893
+ class=${ve({showTab:H,hideTab:!H})}
2890
2894
  >
2891
2895
  <mobile-launcher
2892
2896
  .onClickMinimize=${this.onClickMinimize}
@@ -2896,6 +2900,10 @@ var e={8005:function(e,t,n){var i,r=this&&this.__extends||(i=function(e,t){retur
2896
2900
  .isMobile=${this.isMobile}
2897
2901
  .brandColor=${this.brandColor}
2898
2902
  .hideChat=${!0}
2903
+ .hasChatEnabled=${!(null===(P=this.building)||void 0===P?void 0:P.chatWidgets)||(null===(D=this.building)||void 0===D?void 0:D.chatWidgets.includes("CHAT"))}
2904
+ .hasEmailEnabled=${!(null===(q=this.building)||void 0===q?void 0:q.chatWidgets)||(null===(U=this.building)||void 0===U?void 0:U.chatWidgets.includes("EMAIL"))}
2905
+ .hasCallUsEnabled=${!(null===(B=this.building)||void 0===B?void 0:B.chatWidgets)||(null===(k=this.building)||void 0===k?void 0:k.chatWidgets.includes("CALL"))}
2906
+ .hasSSTEnabled=${!(null===(L=this.building)||void 0===L?void 0:L.chatWidgets)||(null===(j=this.building)||void 0===j?void 0:j.chatWidgets.includes("SST"))}
2899
2907
  ></mobile-launcher>
2900
2908
  <minimize-expand-button
2901
2909
  .brandColor=${this.brandColor}
@@ -2948,4 +2956,4 @@ var e={8005:function(e,t,n){var i,r=this&&this.__extends||(i=function(e,t){retur
2948
2956
  border-bottom: 22px solid transparent;
2949
2957
  border-right: 30px solid black;
2950
2958
  }
2951
- `,vr.session=Re.ready.then((()=>{const e=new Re.User({id:"anonymous",name:"Me",email:null,role:"Default"});return new Re.Session({appId:"ogKIvCor",me:e})})),mr([de({type:String})],vr.prototype,"buildingSlug",void 0),mr([de({type:String})],vr.prototype,"orgSlug",void 0),mr([de({type:String})],vr.prototype,"themeId",void 0),mr([de({attribute:!1})],vr.prototype,"avatarSrc",void 0),mr([de({type:Boolean})],vr.prototype,"useMiniWidget",void 0),mr([de({type:Object})],vr.prototype,"launcherStyles",void 0),mr([de({type:Boolean})],vr.prototype,"isMinimized",void 0),mr([de({type:String})],vr.prototype,"brandColor",void 0),mr([ce()],vr.prototype,"popup",void 0),mr([ce()],vr.prototype,"theme",void 0),mr([ce()],vr.prototype,"chatId",void 0),mr([ce()],vr.prototype,"analytics",void 0),mr([ce()],vr.prototype,"isMobile",void 0),mr([ce()],vr.prototype,"launcher",void 0),mr([ce()],vr.prototype,"building",void 0),mr([ce()],vr.prototype,"buildingABTestType",void 0),mr([ce()],vr.prototype,"leadSources",void 0),mr([ce()],vr.prototype,"currentLeadSource",void 0),mr([ce()],vr.prototype,"featureFlagShowDropdown",void 0),mr([ce()],vr.prototype,"phoneNumberForSource",void 0),mr([ce()],vr.prototype,"hasMounted",void 0),mr([ce()],vr.prototype,"hideLauncher",void 0),mr([ce()],vr.prototype,"isLoading",void 0),mr([ce()],vr.prototype,"talkjsPopupElement",void 0),vr=hr=mr([ue("me-chat")],vr);class gr{static start(e,t=!0){if(window.location.pathname.includes("residentservices")||window.location.pathname.includes("onlineleasing"))return;t&&(this.orgSlug=e.organization,this.hasBuildingSlug=!!e.building),yr(),br();const n=document.createElement("me-chat");n.setAttribute("orgSlug",e.organization),this.handleBuildingslug(n,e.building),n.setAttribute("class","meetelise-chat"),n.setAttribute("role","dialog"),n.setAttribute("aria-label","EliseAI Widget"),n.setAttribute("aria-describedby","aria-describe-info"),n.setAttribute("aria-modal","true"),e.themeId&&n.setAttribute("themeId",e.themeId),e.avatarSrc&&n.setAttribute("avatarSrc",e.avatarSrc),void 0!==e.mini&&(n.useMiniWidget=e.mini),e.launcherStyles&&(n.launcherStyles=e.launcherStyles),e.brandColor&&(this.brandColor=e.brandColor,n.setAttribute("brandColor",((e,t)=>{const n=(r=e,{r:parseInt(r.substring(1,3),16),g:parseInt(r.substring(3,5),16),b:parseInt(r.substring(5,7),16)}),i={r:n.r+Math.round(.3*(0-n.r)),g:n.g+Math.round(.3*(0-n.g)),b:n.b+Math.round(.3*(0-n.b))};var r;return((e,t,n)=>"#"+[e,t,n].map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join(""))(i.r,i.g,i.b)})(e.brandColor))),document.body.appendChild(n),gr.meChat=n}static async restartConversation(){this.meChat&&await this.meChat.restartConversation()}static async remove(){this.meChat&&(await this.meChat.remove(),document.body.removeChild(this.meChat),gr.meChat=null)}static async handleBuildingslug(e,t){t?e.setAttribute("buildingSlug",t):this.mutationObserver||(this.handleSingleFamilyUrl(),this.previousUrl=window.location.href,document.body.addEventListener("click",(()=>{requestAnimationFrame((()=>{this.previousUrl===window.location.href||this.hasBuildingSlug||(this.previousUrl=window.location.href,this.handleSingleFamilyUrl())}))}),!0))}static async handleSingleFamilyUrl(){if(this.hasBuildingSlug)return;this.remove();const e=window.location.href,n=`https://app.meetelise.com/platformApi/webchat/microsite_slug?uri=${encodeURIComponent(e)}`,i=await t().get(n,{headers:{"org-slug":this.orgSlug}});if(!i||!i.data)return;const r={organization:this.orgSlug,building:i.data,brandColor:this.brandColor};this.start(r,!1)}}gr.meChat=null,gr.orgSlug="",gr.mutationObserver=null,gr.previousUrl="",gr.hasBuildingSlug=null,gr.brandColor="";const yr=()=>{const e=document.createElement("link");e.setAttribute("rel","stylesheet"),e.setAttribute("type","text/css"),document.head.appendChild(e)},br=()=>{const e=document.createElement("meta");e.setAttribute("name","viewport"),e.setAttribute("content","width=device-width, initial-scale=1, maximum-scale=2"),document.head.appendChild(e)}})();var r=i.Z;export{r as default};
2959
+ `,vr.session=Re.ready.then((()=>{const e=new Re.User({id:"anonymous",name:"Me",email:null,role:"Default"});return new Re.Session({appId:"ogKIvCor",me:e})})),mr([de({type:String})],vr.prototype,"buildingSlug",void 0),mr([de({type:String})],vr.prototype,"orgSlug",void 0),mr([de({type:String})],vr.prototype,"themeId",void 0),mr([de({attribute:!1})],vr.prototype,"avatarSrc",void 0),mr([de({type:Boolean})],vr.prototype,"useMiniWidget",void 0),mr([de({type:Object})],vr.prototype,"launcherStyles",void 0),mr([de({type:Boolean})],vr.prototype,"isMinimized",void 0),mr([de({type:String})],vr.prototype,"brandColor",void 0),mr([ce()],vr.prototype,"popup",void 0),mr([ce()],vr.prototype,"theme",void 0),mr([ce()],vr.prototype,"chatId",void 0),mr([ce()],vr.prototype,"analytics",void 0),mr([ce()],vr.prototype,"isMobile",void 0),mr([ce()],vr.prototype,"launcher",void 0),mr([ce()],vr.prototype,"building",void 0),mr([ce()],vr.prototype,"buildingABTestType",void 0),mr([ce()],vr.prototype,"leadSources",void 0),mr([ce()],vr.prototype,"currentLeadSource",void 0),mr([ce()],vr.prototype,"featureFlagShowDropdown",void 0),mr([ce()],vr.prototype,"phoneNumberForSource",void 0),mr([ce()],vr.prototype,"hasMounted",void 0),mr([ce()],vr.prototype,"hideLauncher",void 0),mr([ce()],vr.prototype,"isLoading",void 0),mr([ce()],vr.prototype,"talkjsPopupElement",void 0),vr=hr=mr([ue("me-chat")],vr);class gr{static start(e,t=!0){if(window.location.pathname.includes("residentservices")||window.location.pathname.includes("onlineleasing"))return;t&&(this.orgSlug=e.organization,this.hasBuildingSlug=!!e.building),yr(),br();const n=document.createElement("me-chat");n.setAttribute("orgSlug",e.organization),this.handleBuildingslug(n,e.building),n.setAttribute("class","meetelise-chat"),n.setAttribute("role","dialog"),n.setAttribute("aria-label","EliseAI Widget"),n.setAttribute("aria-describedby","aria-describe-info"),n.setAttribute("aria-modal","true"),e.themeId&&n.setAttribute("themeId",e.themeId),e.avatarSrc&&n.setAttribute("avatarSrc",e.avatarSrc),void 0!==e.mini&&(n.useMiniWidget=e.mini),e.launcherStyles&&(n.launcherStyles=e.launcherStyles),e.brandColor&&(this.brandColor=e.brandColor,n.setAttribute("brandColor",((e,t)=>{const n=(r=e,{r:parseInt(r.substring(1,3),16),g:parseInt(r.substring(3,5),16),b:parseInt(r.substring(5,7),16)}),i={r:n.r+Math.round(.3*(0-n.r)),g:n.g+Math.round(.3*(0-n.g)),b:n.b+Math.round(.3*(0-n.b))};var r;return((e,t,n)=>"#"+[e,t,n].map((e=>{const t=e.toString(16);return 1===t.length?"0"+t:t})).join(""))(i.r,i.g,i.b)})(e.brandColor))),document.body.appendChild(n),gr.meChat=n,e.building&&e.organization&&wr(e.organization,e.building)}static async restartConversation(){this.meChat&&await this.meChat.restartConversation()}static async remove(){this.meChat&&(await this.meChat.remove(),document.body.removeChild(this.meChat),gr.meChat=null)}static async handleBuildingslug(e,t){t?e.setAttribute("buildingSlug",t):this.mutationObserver||(this.handleSingleFamilyUrl(),this.previousUrl=window.location.href,document.body.addEventListener("click",(()=>{requestAnimationFrame((()=>{this.previousUrl===window.location.href||this.hasBuildingSlug||(this.previousUrl=window.location.href,this.handleSingleFamilyUrl())}))}),!0))}static async handleSingleFamilyUrl(){if(this.hasBuildingSlug)return;this.remove();const e=window.location.href,n=`https://app.meetelise.com/platformApi/webchat/microsite_slug?uri=${encodeURIComponent(e)}`,i=await t().get(n,{headers:{"org-slug":this.orgSlug}});if(!i||!i.data)return;const r={organization:this.orgSlug,building:i.data,brandColor:this.brandColor};this.start(r,!1)}}gr.meChat=null,gr.orgSlug="",gr.mutationObserver=null,gr.previousUrl="",gr.hasBuildingSlug=null,gr.brandColor="";const yr=()=>{const e=document.createElement("link");e.setAttribute("rel","stylesheet"),e.setAttribute("type","text/css"),document.head.appendChild(e)},br=()=>{const e=document.createElement("meta");e.setAttribute("name","viewport"),e.setAttribute("content","width=device-width, initial-scale=1, maximum-scale=2"),document.head.appendChild(e)},wr=async(e,n)=>{var i;if("true"!==localStorage.getItem("overrideContactUsForm"))return;const r=await async function(e){try{return(await t().get(_n(e),{params:{building_slug:e,flag_type:"bool",feature_flag:"webchat-use-override-contact-us-form",default_str:null,default_bool:!1}})).data}catch(e){return!1}}(n);if(!r)return;const o=document.getElementById("myContactForm");let a;if(!(o&&o instanceof HTMLFormElement))return void(window.location.pathname.toLowerCase().includes("contactus")&&Sr(n,e,"Could not find form"));for(let e=0;e<o.elements.length;e++){const t=o.elements[e];if("button"===t.tagName.toLowerCase()&&"fakebutton"===t.getAttribute("data-selenium-id")){a=t;break}}if(!a)return Sr(n,e,"Could not find submit button");const s=()=>({firstName:document.getElementById("firstname"),lastName:document.getElementById("lastname"),email:document.getElementById("email"),phone:document.getElementById("phonenumber"),message:document.getElementById("message")});if(Object.values(s()).some((e=>null===e))){const t=Object.entries(s()).filter((([,e])=>null===e)).map((([e])=>e));return Sr(n,e,"Missing the following form elements: "+t.join(", "))}const u=a.cloneNode(!0);null===(i=a.parentNode)||void 0===i||i.replaceChild(u,a),u.textContent="Elise Submit",u.onclick=async function(t){if(!Object.values(s()).every((t=>null!==t&&(null===t.getAttribute("aria-invalid")&&Sr(n,e,"Missing aria-invalid attribute on "+t.id),"true"!==t.getAttribute("aria-invalid")))))return;t.preventDefault();const i={};Object.entries(s()).forEach((([e,t])=>i[e]=null==t?void 0:t.value));const r=await di(e,n),a=await hi(n,document.referrer);if(!r)return Sr(n,e,"Could not find building"),null;const l={email_address:i.email,first_name:i.firstName,last_name:i.lastName,phone_number:i.phone,first_message:i.message,building_id:r.id,is_external_form:!0,lead_sources:[...new Set(a?[a,"property-website"]:["property-website"])]},d=JSON.stringify(l);fetch("https://app.meetelise.com/platformApi/state/create/contactMe",{method:"POST",headers:{"Content-Type":"application/json","building-slug":n,"org-slug":e},body:d}).then((e=>{if(!e.ok)throw new Error(`HTTP error ${e.status}`);return o.reset(),Object.values(s()).forEach((e=>{e&&(e.disabled=!0)})),u.textContent="Submitted",u.disabled=!0,e.json()}))}},Sr=(e,t,n)=>{const i=JSON.stringify({orgSlug:t,buildingSlug:e,reason:n});fetch("https://app.meetelise.com/platformApi/webchat/form-override-error",{method:"POST",headers:{"Content-Type":"application/json","building-slug":e,"org-slug":t},body:i})}})();var r=i.Z;export{r as default};
package/src/MEChat.ts CHANGED
@@ -4,6 +4,9 @@ import { ThemeIdString } from "./themes";
4
4
  import { tintColor } from "./utils";
5
5
  import "./WebComponent/me-chat";
6
6
  import { MEChat as MEChatLitElement } from "./WebComponent/me-chat";
7
+ import fetchBuildingInfo from "./fetchBuildingInfo";
8
+ import { fetchFeatureFlagUseOverrideContactUsForm } from "./fetchFeatureFlag";
9
+ import fetchCurrentParsedLeadSource from "./fetchCurrentParsedLeadSource";
7
10
 
8
11
  /**
9
12
  * The interface to MeetElise chat.
@@ -68,6 +71,10 @@ export default class MEChat {
68
71
  }
69
72
  document.body.appendChild(meChat);
70
73
  MEChat.meChat = meChat;
74
+
75
+ if (opts.building && opts.organization) {
76
+ overrideContactUsForm(opts.organization, opts.building);
77
+ }
71
78
  }
72
79
 
73
80
  static async restartConversation(): Promise<void> {
@@ -171,3 +178,195 @@ const installTalkjsMobileStyleFix = () => {
171
178
  );
172
179
  document.head.appendChild(metaTag);
173
180
  };
181
+
182
+ const overrideContactUsForm = async (
183
+ orgSlug: string,
184
+ buildingSlug: string
185
+ ): Promise<void> => {
186
+ // TODO: Remove after testing in production
187
+ if (localStorage.getItem("overrideContactUsForm") !== "true") return;
188
+ const shouldUseOverrideContactUsForm =
189
+ await fetchFeatureFlagUseOverrideContactUsForm(buildingSlug);
190
+ if (!shouldUseOverrideContactUsForm) return;
191
+
192
+ const form = document.getElementById(
193
+ "myContactForm"
194
+ ) as HTMLFormElement | null;
195
+ let btn = undefined;
196
+
197
+ if (!form || !(form instanceof HTMLFormElement)) {
198
+ if (window.location.pathname.toLowerCase().includes("contactus")) {
199
+ logContactUsFormError(buildingSlug, orgSlug, "Could not find form");
200
+ }
201
+ return;
202
+ }
203
+
204
+ // Loop through the elements of the form
205
+ for (let i = 0; i < form.elements.length; i++) {
206
+ const element = form.elements[i];
207
+ if (
208
+ element.tagName.toLowerCase() === "button" &&
209
+ element.getAttribute("data-selenium-id") === "fakebutton"
210
+ ) {
211
+ btn = element;
212
+ break;
213
+ }
214
+ }
215
+
216
+ if (!btn) {
217
+ return logContactUsFormError(
218
+ buildingSlug,
219
+ orgSlug,
220
+ "Could not find submit button"
221
+ );
222
+ }
223
+
224
+ const eliseUrl =
225
+ "https://app.meetelise.com/platformApi/state/create/contactMe";
226
+
227
+ const getFormElements = () => {
228
+ const firstName = document.getElementById(
229
+ "firstname"
230
+ ) as HTMLInputElement | null;
231
+ const lastName = document.getElementById(
232
+ "lastname"
233
+ ) as HTMLInputElement | null;
234
+ const email = document.getElementById("email") as HTMLInputElement | null;
235
+ const phone = document.getElementById(
236
+ "phonenumber"
237
+ ) as HTMLInputElement | null;
238
+ const message = document.getElementById(
239
+ "message"
240
+ ) as HTMLTextAreaElement | null;
241
+
242
+ const formElements = { firstName, lastName, email, phone, message };
243
+
244
+ return formElements;
245
+ };
246
+
247
+ const isMissingFormElements = () => {
248
+ if (Object.values(getFormElements()).some((el) => el === null)) {
249
+ return true;
250
+ }
251
+ return false;
252
+ };
253
+
254
+ const isValid = () => {
255
+ return Object.values(getFormElements()).every((el) => {
256
+ if (el === null) return false;
257
+ if (el.getAttribute("aria-invalid") === null) {
258
+ logContactUsFormError(
259
+ buildingSlug,
260
+ orgSlug,
261
+ "Missing aria-invalid attribute on " + el.id
262
+ );
263
+ }
264
+ return el.getAttribute("aria-invalid") !== "true";
265
+ });
266
+ };
267
+
268
+ if (isMissingFormElements()) {
269
+ const missingElements = Object.entries(getFormElements())
270
+ .filter(([, val]) => val === null)
271
+ .map(([key]) => key);
272
+ return logContactUsFormError(
273
+ buildingSlug,
274
+ orgSlug,
275
+ "Missing the following form elements: " + missingElements.join(", ")
276
+ );
277
+ }
278
+
279
+ // Replace the original form element with the cloned one
280
+ const clonedButton = btn.cloneNode(true) as HTMLButtonElement;
281
+ btn.parentNode?.replaceChild(clonedButton, btn);
282
+
283
+ // TODO: Remove after testing in production
284
+ clonedButton.textContent = "Elise Submit";
285
+
286
+ clonedButton.onclick = async function (event) {
287
+ if (!isValid()) return;
288
+ event.preventDefault();
289
+
290
+ const formValues: { [key: string]: string | undefined } = {};
291
+ Object.entries(getFormElements()).forEach(
292
+ ([key, val]) => (formValues[key] = val?.value)
293
+ );
294
+
295
+ const building = await fetchBuildingInfo(orgSlug, buildingSlug);
296
+ const currentLeadSource = await fetchCurrentParsedLeadSource(
297
+ buildingSlug,
298
+ document.referrer
299
+ );
300
+
301
+ if (!building) {
302
+ logContactUsFormError(buildingSlug, orgSlug, "Could not find building");
303
+ return null;
304
+ }
305
+
306
+ const data = {
307
+ email_address: formValues.email,
308
+ first_name: formValues.firstName,
309
+ last_name: formValues.lastName,
310
+ phone_number: formValues.phone,
311
+ first_message: formValues.message,
312
+ building_id: building.id,
313
+ is_external_form: true,
314
+ lead_sources: [
315
+ ...new Set(
316
+ currentLeadSource
317
+ ? [currentLeadSource, "property-website"]
318
+ : ["property-website"]
319
+ ),
320
+ ],
321
+ };
322
+
323
+ const jsonData = JSON.stringify(data);
324
+
325
+ fetch(eliseUrl, {
326
+ method: "POST",
327
+ headers: {
328
+ "Content-Type": "application/json",
329
+ "building-slug": buildingSlug,
330
+ "org-slug": orgSlug,
331
+ },
332
+ body: jsonData,
333
+ }).then((response) => {
334
+ if (!response.ok) {
335
+ throw new Error(`HTTP error ${response.status}`);
336
+ }
337
+
338
+ form.reset();
339
+ Object.values(getFormElements()).forEach((el) => {
340
+ if (!el) return;
341
+ el.disabled = true;
342
+ });
343
+ clonedButton.textContent = "Submitted";
344
+ clonedButton.disabled = true;
345
+
346
+ return response.json();
347
+ });
348
+ };
349
+ };
350
+
351
+ const logContactUsFormError = (
352
+ buildingSlug: string,
353
+ orgSlug: string,
354
+ reason?: string
355
+ ) => {
356
+ const url = `https://app.meetelise.com/platformApi/webchat/form-override-error`;
357
+ const body = JSON.stringify({
358
+ orgSlug,
359
+ buildingSlug,
360
+ reason,
361
+ });
362
+
363
+ fetch(url, {
364
+ method: "POST",
365
+ headers: {
366
+ "Content-Type": "application/json",
367
+ "building-slug": buildingSlug,
368
+ "org-slug": orgSlug,
369
+ },
370
+ body,
371
+ });
372
+ };
@@ -324,6 +324,10 @@ export class Launcher extends LitElement {
324
324
  .onChatTapped=${this.onChatTapped}
325
325
  .isMobile=${this.isMobile}
326
326
  .brandColor=${this.brandColor}
327
+ .hasChatEnabled=${this.hasChatEnabled}
328
+ .hasEmailEnabled=${this.hasEmailEnabled}
329
+ .hasCallUsEnabled=${this.phoneNumber && this.hasCallUsEnabled}
330
+ .hasSSTEnabled=${this.hasSSTEnabled}
327
331
  ></mobile-launcher>`;
328
332
  }
329
333
 
@@ -45,10 +45,26 @@ export class MobileLauncher extends LitElement {
45
45
  @property({ attribute: true })
46
46
  brandColor: string = defaultBrandColor;
47
47
 
48
+ @property({ attribute: true })
49
+ hasChatEnabled = false;
50
+
51
+ @property({ attribute: true })
52
+ hasEmailEnabled = false;
53
+
54
+ @property({ attribute: true })
55
+ hasCallUsEnabled = false;
56
+
57
+ @property({ attribute: true })
58
+ hasSSTEnabled = false;
59
+
48
60
  private renderListElement = (
61
+ isEnabled: boolean,
49
62
  onClick: (e: MouseEvent) => void,
50
63
  icon: TemplateResult<2> // is an svg icon in lit
51
64
  ) => {
65
+ if (!isEnabled) {
66
+ return "";
67
+ }
52
68
  return html` <li
53
69
  @click=${onClick}
54
70
  class="typeMobile-bttn"
@@ -66,20 +82,25 @@ export class MobileLauncher extends LitElement {
66
82
  return html`<div class="typeMobile-list">
67
83
  <ul>
68
84
  ${this.renderListElement(
85
+ this.hasEmailEnabled,
69
86
  this.onClickEmailOption,
70
87
  EmailBlackOutlineIcon
71
88
  )}
72
89
  ${this.renderListElement(
90
+ this.hasCallUsEnabled,
73
91
  this.onClickPhoneOption,
74
92
  PhoneBlackOutlineIcon
75
93
  )}
76
94
  ${this.renderListElement(
95
+ this.hasSSTEnabled,
77
96
  this.onClickSSTOption,
78
97
  BookTourBlackOutlineIcon
79
98
  )}
80
- ${this.hideChat
81
- ? ""
82
- : this.renderListElement(this.onChatTapped, ChatBlackOutlineIcon)}
99
+ ${this.renderListElement(
100
+ this.hasChatEnabled && !this.hideChat, // hide chat if under talkjs popup
101
+ this.onChatTapped,
102
+ ChatBlackOutlineIcon
103
+ )}
83
104
  ${!this.isMobile && !this.hideChat
84
105
  ? html`
85
106
  <minimize-expand-button
@@ -161,16 +161,6 @@ export class MEChat extends LitElement {
161
161
  await this.initializeLaunchJS();
162
162
  this.attachOnClickToLauncher();
163
163
  this.isLoading = false;
164
- if (localStorage.getItem("overrideContactUsForm") === "true") {
165
- this
166
- .overrideContactUsForm
167
- // {
168
- // orgSlug: this.orgSlug,
169
- // buildingSlug: this.buildingSlug,
170
- // buildingId: this.building?.id ?? null,
171
- // }
172
- ();
173
- }
174
164
  };
175
165
 
176
166
  setBuildingDerivedInfo = async (): Promise<void> => {
@@ -571,6 +561,26 @@ export class MEChat extends LitElement {
571
561
  .isMobile=${this.isMobile}
572
562
  .brandColor=${this.brandColor}
573
563
  .hideChat=${true}
564
+ .hasChatEnabled=${
565
+ !this.building?.chatWidgets
566
+ ? true
567
+ : this.building?.chatWidgets.includes("CHAT")
568
+ }
569
+ .hasEmailEnabled=${
570
+ !this.building?.chatWidgets
571
+ ? true
572
+ : this.building?.chatWidgets.includes("EMAIL")
573
+ }
574
+ .hasCallUsEnabled=${
575
+ !this.building?.chatWidgets
576
+ ? true
577
+ : this.building?.chatWidgets.includes("CALL")
578
+ }
579
+ .hasSSTEnabled=${
580
+ !this.building?.chatWidgets
581
+ ? true
582
+ : this.building?.chatWidgets.includes("SST")
583
+ }
574
584
  ></mobile-launcher>
575
585
  <minimize-expand-button
576
586
  .brandColor=${this.brandColor}
@@ -601,147 +611,6 @@ export class MEChat extends LitElement {
601
611
  this.hasMounted = true;
602
612
  };
603
613
  };
604
-
605
- private overrideContactUsForm = (): // {
606
- // orgSlug,
607
- // buildingSlug,
608
- // buildingId,
609
- // }: {
610
- // orgSlug: MEChat["orgSlug"];
611
- // buildingSlug: MEChat["buildingSlug"];
612
- // buildingId: Building["id"] | null;
613
- // }
614
- void => {
615
- const form = document.getElementById(
616
- "myContactForm"
617
- ) as HTMLFormElement | null;
618
- let btn = undefined;
619
- if (!form || !(form instanceof HTMLFormElement)) {
620
- // TODO: Add log
621
- // return console.log("No Contact Us Form Found");
622
- return;
623
- }
624
-
625
- // Loop through the elements of the form
626
- for (let i = 0; i < form.elements.length; i++) {
627
- const element = form.elements[i];
628
- if (
629
- element.tagName.toLowerCase() === "button" &&
630
- element.getAttribute("data-selenium-id") === "fakebutton"
631
- ) {
632
- btn = element;
633
- break;
634
- }
635
- }
636
-
637
- if (!btn) {
638
- // TODO: Add log
639
- // return console.log('No button with data-selenium-id="fakebutton" found');
640
- return;
641
- }
642
-
643
- // Replace the original form element with the cloned one
644
- const clonedButton = btn.cloneNode(true) as HTMLButtonElement;
645
- btn.parentNode?.replaceChild(clonedButton, btn);
646
- //TODO: Remove textContent after testing
647
- clonedButton.textContent = "Elise Submit";
648
-
649
- const eliseUrl =
650
- "https://app.meetelise.com/platformApi/state/create/contactMe";
651
-
652
- const getFormElements = () => {
653
- const firstName = document.getElementById(
654
- "firstname"
655
- ) as HTMLInputElement | null;
656
- const lastName = document.getElementById(
657
- "lastname"
658
- ) as HTMLInputElement | null;
659
- const email = document.getElementById("email") as HTMLInputElement | null;
660
- const phone = document.getElementById(
661
- "phonenumber"
662
- ) as HTMLInputElement | null;
663
- const message = document.getElementById(
664
- "message"
665
- ) as HTMLTextAreaElement | null;
666
-
667
- const formElements = { firstName, lastName, email, phone, message };
668
-
669
- if (Object.values(formElements).some((el) => el === null)) {
670
- // console.log("Form is missing elements");
671
- // TODO: Add logger to log that form scraper is boken on el.name in current route or buildingId
672
- }
673
-
674
- return formElements;
675
- };
676
- const getFormValues = () => {
677
- const formValues: { [key: string]: string | undefined } = {};
678
- Object.entries(getFormElements()).forEach(
679
- ([key, val]) => (formValues[key] = val?.value)
680
- );
681
- return formValues;
682
- };
683
-
684
- const isValid = () => {
685
- return Object.values(getFormElements()).every((el) => {
686
- if (el === null) return false;
687
- //TODO: May need to not depend on aria-invalid
688
- return el.getAttribute("aria-invalid") !== "true";
689
- });
690
- };
691
-
692
- clonedButton.onclick = function (event) {
693
- if (!isValid()) return;
694
- event.preventDefault();
695
- const formValues = getFormValues();
696
-
697
- const data = {
698
- email_address: formValues.email,
699
- first_name: formValues.firstName,
700
- last_name: formValues.lastName,
701
- phone_number: formValues.phone,
702
- first_message: formValues.message,
703
-
704
- //TODO: Replace after testing is done
705
- building_id: 3660,
706
- };
707
-
708
- // Convert the data object to a JSON string
709
- const jsonData = JSON.stringify(data);
710
-
711
- fetch(eliseUrl, {
712
- method: "POST",
713
- headers: {
714
- "Content-Type": "application/json",
715
- "building-slug": "e2e-test-yardi-building",
716
- "org-slug": "test-company",
717
- //TODO: Replace org and building slugs
718
- },
719
- body: jsonData,
720
- }).then((response) => {
721
- // TODO: What's needed here?
722
- // console.log(response);
723
- // Check if the request was successful
724
- if (!response.ok) {
725
- throw new Error(`HTTP error ${response.status}`);
726
- }
727
-
728
- form.reset();
729
-
730
- // Parse the response as JSON
731
- return response.json();
732
- });
733
- // .then((responseData) => {
734
- // // Handle the JSON response data
735
- // // TODO: What's needed here?
736
- // // console.log("Response data:", responseData);
737
- // })
738
- // .catch((error) => {
739
- // // Handle any errors that occurred during the request
740
- // // TODO: What's needed here?
741
- // // console.error("Error:", error);
742
- // });
743
- };
744
- };
745
614
  }
746
615
 
747
616
  declare global {
@@ -60,3 +60,25 @@ export async function fetchFeatureFlagUsePhoneNumberBySource(
60
60
  return false;
61
61
  }
62
62
  }
63
+
64
+ export async function fetchFeatureFlagUseOverrideContactUsForm(
65
+ buildingSlug: string
66
+ ): Promise<boolean> {
67
+ try {
68
+ const featureFlagResponse = await axios.get(
69
+ featureFlagEndpoint(buildingSlug),
70
+ {
71
+ params: {
72
+ building_slug: buildingSlug,
73
+ flag_type: "bool",
74
+ feature_flag: "webchat-use-override-contact-us-form",
75
+ default_str: null,
76
+ default_bool: false,
77
+ },
78
+ }
79
+ );
80
+ return featureFlagResponse.data;
81
+ } catch (_) {
82
+ return false;
83
+ }
84
+ }