@clickview/lite 0.103.1 → 0.103.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.
- package/dist/.vite/manifest.json +271 -271
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{igSDXA6g.chunk.js → 1WHinyQW.chunk.js} +2 -2
- package/dist/scripts/{igSDXA6g.chunk.js.map → 1WHinyQW.chunk.js.map} +1 -1
- package/dist/scripts/{kMWvzbRv2.chunk.js → B1ag1ah72.chunk.js} +2 -2
- package/dist/scripts/{kMWvzbRv2.chunk.js.map → B1ag1ah72.chunk.js.map} +1 -1
- package/dist/scripts/{D2_GYzlb.chunk.js → B6Pc3q-u.chunk.js} +2 -2
- package/dist/scripts/{D2_GYzlb.chunk.js.map → B6Pc3q-u.chunk.js.map} +1 -1
- package/dist/scripts/{sCuSDiER2.chunk.js → BPbjSFkC2.chunk.js} +2 -2
- package/dist/scripts/{sCuSDiER2.chunk.js.map → BPbjSFkC2.chunk.js.map} +1 -1
- package/dist/scripts/{CNm_4jj62.chunk.js → BZFomoIH2.chunk.js} +2 -2
- package/dist/scripts/BZFomoIH2.chunk.js.map +1 -0
- package/dist/scripts/{CW_rYB-i2.chunk.js → BazdM9Ah2.chunk.js} +2 -2
- package/dist/scripts/{CW_rYB-i2.chunk.js.map → BazdM9Ah2.chunk.js.map} +1 -1
- package/dist/scripts/{BcPrUEuC2.chunk.js → CNPnPJMp2.chunk.js} +2 -2
- package/dist/scripts/{BcPrUEuC2.chunk.js.map → CNPnPJMp2.chunk.js.map} +1 -1
- package/dist/scripts/{Dd23z1_x2.chunk.js → CUp7_5gE2.chunk.js} +2 -2
- package/dist/scripts/{Dd23z1_x2.chunk.js.map → CUp7_5gE2.chunk.js.map} +1 -1
- package/dist/scripts/{C-zUHAyD.chunk.js → CajcIz6S.chunk.js} +2 -2
- package/dist/scripts/{C-zUHAyD.chunk.js.map → CajcIz6S.chunk.js.map} +1 -1
- package/dist/scripts/{Drx3PvJj.chunk.js → Cc9f2ux0.chunk.js} +2 -2
- package/dist/scripts/{Drx3PvJj.chunk.js.map → Cc9f2ux0.chunk.js.map} +1 -1
- package/dist/scripts/Cj_F4Lv92.chunk.js +2 -0
- package/dist/scripts/{C8l37H7t2.chunk.js.map → Cj_F4Lv92.chunk.js.map} +1 -1
- package/dist/scripts/{DFrz_upP2.chunk.js → CtBGtgb32.chunk.js} +2 -2
- package/dist/scripts/{DFrz_upP2.chunk.js.map → CtBGtgb32.chunk.js.map} +1 -1
- package/dist/scripts/{BpiZZWnJ2.chunk.js → CtWAorP42.chunk.js} +2 -2
- package/dist/scripts/{BpiZZWnJ2.chunk.js.map → CtWAorP42.chunk.js.map} +1 -1
- package/dist/scripts/{C3Qd_bbV2.chunk.js → D8mi6CVp2.chunk.js} +2 -2
- package/dist/scripts/{C3Qd_bbV2.chunk.js.map → D8mi6CVp2.chunk.js.map} +1 -1
- package/dist/scripts/{3K2h5K5-.chunk.js → DJfIirut.chunk.js} +2 -2
- package/dist/scripts/{3K2h5K5-.chunk.js.map → DJfIirut.chunk.js.map} +1 -1
- package/dist/scripts/{Cc63s6rS2.chunk.js → DaaQ5htA2.chunk.js} +2 -2
- package/dist/scripts/{Cc63s6rS2.chunk.js.map → DaaQ5htA2.chunk.js.map} +1 -1
- package/dist/scripts/{CHwPLUZK.chunk.js → DkFP4cXM.chunk.js} +2 -2
- package/dist/scripts/{CHwPLUZK.chunk.js.map → DkFP4cXM.chunk.js.map} +1 -1
- package/dist/scripts/{izXlxhJf.chunk.js → Dzy1nQk7.chunk.js} +2 -2
- package/dist/scripts/{izXlxhJf.chunk.js.map → Dzy1nQk7.chunk.js.map} +1 -1
- package/dist/scripts/{DGy8Ldlr.chunk.js → FIUOppmy.chunk.js} +2 -2
- package/dist/scripts/{DGy8Ldlr.chunk.js.map → FIUOppmy.chunk.js.map} +1 -1
- package/dist/scripts/{CPBvCqVK.chunk.js → H511PXuG.chunk.js} +2 -2
- package/dist/scripts/{CPBvCqVK.chunk.js.map → H511PXuG.chunk.js.map} +1 -1
- package/dist/scripts/{D8Op6EUa2.chunk.js → IYIY9hIU2.chunk.js} +2 -2
- package/dist/scripts/{D8Op6EUa2.chunk.js.map → IYIY9hIU2.chunk.js.map} +1 -1
- package/dist/scripts/{app-BHlllGhO.js → app-DvYKGw_S.js} +3 -3
- package/dist/scripts/{app-BHlllGhO.js.map → app-DvYKGw_S.js.map} +1 -1
- package/dist/scripts/{2HZlmQRs2.chunk.js → lJ6ZVpyv2.chunk.js} +2 -2
- package/dist/scripts/{2HZlmQRs2.chunk.js.map → lJ6ZVpyv2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/C8l37H7t2.chunk.js +0 -2
- package/dist/scripts/CNm_4jj62.chunk.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{n as t,t as n}from"./D8uRDrkd.chunk.js";import{_ as r,y as i}from"./BftnFbcr.chunk.js";import{n as a}from"./B785hxeE.chunk.js";import{t as o}from"./CQyJ7YGa.chunk.js";import{t as s}from"./e57H3T-k.chunk.js";import{t as c}from"./C2w0pmFW.chunk.js";import{t as l}from"./wrLrTezN.chunk.js";import{t as u}from"./BXTI9cmX.chunk.js";import{p as d,u as f}from"./BX0wDJmp.chunk.js";import{t as p}from"./CjA4Q5pm.chunk.js";import{U as m,l as ee,v as h,y as te,z as ne}from"./NlCAcBdo.chunk.js";import{t as g}from"./RjGIOTdP.chunk.js";import{t as _}from"./DTGfiG8Y.chunk.js";import{r as v,t as y}from"./oPIkfKWW2.chunk.js";import{t as re}from"./DZX1tZ-D2.chunk.js";import{n as ie}from"./BDwjs8qz2.chunk.js";import{t as b}from"./DQgG9njb.chunk.js";import{t as x}from"./DdsRCMkN.chunk.js";import{t as ae}from"./D_gWf2lC.chunk.js";import{t as oe}from"./CYEpX3hx.chunk.js";import{n as S}from"./CsF4wDV1.chunk.js";import{t as se}from"./BWaKdG0l.chunk.js";import{t as C}from"./PgzMrOyM.chunk.js";import{n as w}from"./BRcHS92O2.chunk.js";import{t as T}from"./Tr5-kahg2.chunk.js";import{t as E}from"./klg9VDIV2.chunk.js";import{n as D}from"./C0exjRXJ2.chunk.js";import{t as O}from"./Ci5E3nqm2.chunk.js";import{n as ce,t as le}from"./A8xLZrSw.chunk.js";import{t as ue}from"./BQKcAczf.chunk.js";import{t as de}from"./DR9DEoQL.chunk.js";import{n as k}from"./CpFtf-tI2.chunk.js";import{n as A}from"./OL3Z6Yp62.chunk.js";import{t as j}from"./C3q_xvci.chunk.js";import{t as M}from"./Bv4_l1OV.chunk.js";import{t as N}from"./dEqScqMh2.chunk.js";import{i as fe}from"./CXVBjdpb.chunk.js";import{t as pe}from"./CfkLy0le.chunk.js";import{t as me}from"./C4SwJrBy.chunk.js";import{n as he}from"./B-eFTZdx2.chunk.js";import{t as P}from"./DSuhq1Rt2.chunk.js";import{r as ge,t as _e}from"./C5uTRLOC2.chunk.js";import{t as ve}from"./CfwSprmF.chunk.js";import{t as ye}from"./CdYjo8_g.chunk.js";import{n as F}from"./jgL-hoCR2.chunk.js";import{n as be,t as xe}from"./D5WAilZl2.chunk.js";import{t as Se}from"./B_HsEzOv.chunk.js";import{t as Ce}from"./D7UO1XFN2.chunk.js";import{t as I}from"./CNm_4jj62.chunk.js";import{t as we}from"./tnBD84bg2.chunk.js";import{n as Te,t as L}from"./DFrz_upP2.chunk.js";import{t as Ee}from"./D0n6BTgT.chunk.js";import{t as De}from"./CLOak4u5.chunk.js";import{t as Oe}from"./DInbp0A6.chunk.js";import{t as ke}from"./C-mD9tw7.chunk.js";import{a as Ae,n as je,t as Me}from"./CuzqCIXw.chunk.js";import{t as R}from"./DcYW5Mhp.chunk.js";var z=e(c()),Ne=me(),Pe={logoContainer:`_logoContainer_vn3gg_1`},B=l(),Fe=`streamable.livestreamDetails`;function V(e){function r(){return`${p.diffBetween(e.endTime,e.startTime,`minutes`)}m`}function i(e){return I.convertUTCToTimezoneDate(e)}function a(e){return p.format(i(e),`h:mma`)}function o(e){return p.format(i(e),`Do MMMM`)}function c(e){return I.getTimezoneInfo(e).longGeneric}function l(){return g.getMergedPresentationAudienceString(e.audiences)?.name}let u=_e(e.companyName,ge);return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`div`,{className:`d-flex align-items-center mb-2`,children:[e.logoUrl&&(0,B.jsx)(O,{appLink:e.companyAppLink,children:(0,B.jsx)(`div`,{className:`${Pe.logoContainer} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background me-2`,children:(0,B.jsx)(P,{data:T.createUrl(e.logoUrl,{size:w.Small}),alt:e.companyName,className:!e.logoBgColour&&u,imageStyle:{backgroundColor:e.logoBgColour},preload:!0})})}),(0,B.jsxs)(`div`,{className:`d-flex flex-column justify-content-between`,children:[e.companyName&&(0,B.jsx)(O,{appLink:e.companyAppLink,className:`text-uppercase text-wrap d-block text-truncate mb-0`,title:e.companyName,children:e.companyName}),(0,B.jsx)(`h1`,{className:`h4 mb-0`,children:e.eventName})]})]}),(0,B.jsxs)(`div`,{className:`d-flex gap-2 mb-3`,children:[!!e.audiences?.length&&(0,B.jsx)(`div`,{className:`rounded-pill border border-dark px-2`,children:l()}),(0,B.jsx)(`div`,{className:`rounded-pill fw-semibold bg-dark text-white px-2`,children:(0,B.jsx)(`span`,{className:`align-middle`,children:r()})})]}),e.isPastLivestream&&(0,B.jsxs)(`div`,{className:`d-inline-block bg-light-green rounded-pill mb-3`,children:[(0,B.jsx)(n,{svg:Te}),(0,B.jsx)(`p`,{className:`d-inline ms-1 mb-0`,children:(0,B.jsx)(k,{namespace:Fe,phrase:`pastEvent`})})]}),!e.isPastLivestream&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`p`,{className:`mb-2`,children:[(0,B.jsx)(n,{svg:b,size:t.Small}),(0,B.jsx)(`span`,{className:`ms-1`,children:a(e.startTime)})]}),(0,B.jsxs)(`p`,{className:`mb-2`,children:[(0,B.jsx)(n,{svg:ve,size:t.Small}),(0,B.jsx)(`span`,{className:`ms-1`,children:o(e.startTime)})]}),(0,B.jsxs)(`p`,{className:`mb-3`,children:[(0,B.jsx)(n,{svg:ye,size:t.Small}),(0,B.jsx)(`span`,{className:`ms-1`,children:c(e.timezone)})]})]}),e.description&&(0,B.jsx)(`p`,{className:`mb-3 pre-wrap text-break`,dangerouslySetInnerHTML:{__html:s.sanitize(we.linkifyText(e.description))}})]})}function Ie(e,t){return{...e,custom:{...e?.custom,source:t.source},event:{...e?.event,conversion:t.conversion}}}function Le(){let e=A(S.BrazeClient);function t({user:t,additionalData:n,source:r,eventType:i,conversion:a,productType:o,callback:s}){let c=Ie(t,{source:r,conversion:a});e.setUserInit(c),e.logFormEvent({eventType:i,additionalData:n,callback:s,internalOptions:{subscriptionGroups:o}})}return{client:e,logFormSubmission:t}}var Re=function(e){return e.LivestreamBooking=`cv_product_livestream`,e}({}),ze=function(e){return e.LivestreamBooking=`Submit - Livestream Booking`,e}({});function Be(){let{accessPolicy:e,isLoaded:t}=v(),n=f(y.currentUser()),r=!!e?.metadata?.maxLiveBookings,i=f(n.data?.isAuthenticated&&r&&L.customerLifetimeBookingCount()),a=n.hasCompleted&&(!r||i.hasCompleted&&t),o=e?.metadata?.maxLiveBookings??2**53-1,s=i.data?.count??0;return{isLoaded:a,accessPolicy:e,bookingsUsed:s,totalBookingsAvailable:o,hasReachedBookingLimit:s>=o,hasBookingLimitations:r}}var H={logo:`_logo_igal3_1`,image:`_image_igal3_2`},U=`livestream.bookingError`;function Ve(e){return(0,B.jsxs)(`div`,{className:`d-flex flex-column justify-content-center`,children:[(0,B.jsx)(`div`,{className:`${H.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`,children:(0,B.jsx)(`img`,{className:H.image,src:C.Live.General.LOST_MESSAGE_BOTTLE})}),(0,B.jsx)(`h3`,{className:`text-center mb-3`,children:(0,B.jsx)(k,{namespace:U,phrase:`heading`})}),(0,B.jsx)(`p`,{className:`text-center mb-3`,children:(0,B.jsx)(k,{namespace:U,phrase:`description`})}),(0,B.jsx)(`button`,{className:`btn btn-dark`,onClick:e.onTryAgain,children:(0,B.jsx)(k,{namespace:U,phrase:`buttonLabel`})})]})}var W=`livestream.liveStreamBookingQuota`;function He(e){return(0,B.jsxs)(`div`,{className:`bg-light-blue rounded p-2 mt-3 d-flex flex-column gap-2`,role:`alert`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`strong`,{children:(0,B.jsx)(k,{namespace:W,phrase:`bookingQuota`})}),`\xA0`,(0,B.jsx)(k,{namespace:W,phrase:`bookingQuotaUsed`,options:{bookingQuota:e.max,bookingQuotaUsed:e.used}})]}),e.showUpgrade&&(0,B.jsxs)(`div`,{children:[(0,B.jsx)(k,{namespace:W,phrase:`bookingQuotaReached`}),`\xA0`,(0,B.jsx)(k,{namespace:W,phrase:`requestUpgradePrefix`}),`\xA0`,(0,B.jsx)(O,{className:`btn-link d-inline-block text-info`,appLink:e.upgradeAppLink,children:(0,B.jsx)(k,{namespace:W,phrase:`requestUpgrade`})}),`.`]})]})}var Ue={logo:`_logo_1uhpx_1`},G=`livestream.bookingSuccess`;function We(e){return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`${Ue.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`,children:(0,B.jsx)(P,{data:T.createUrl(e.livestream.company.logo?.url,{size:w.Small}),alt:e.livestream.company.name,preload:!0})}),(0,B.jsxs)(`div`,{className:`d-flex align-items-center justify-content-center mb-3 gap-1`,children:[(0,B.jsx)(n,{svg:j,className:`svg-container std text-success`}),(0,B.jsx)(`h1`,{className:`h3 mb-0 fw-semibold`,children:(0,B.jsx)(k,{namespace:G,phrase:`booked`})})]}),(0,B.jsx)(`div`,{className:`my-3`,children:(0,B.jsx)(V,{companyId:e.livestream.company.id,companyName:e.livestream.company.name,eventName:e.livestream.name,audiences:e.livestream.audiences,startTime:e.livestream.startDateTime,endTime:e.livestream.endDateTime})}),(0,B.jsx)(`p`,{children:(0,B.jsx)(k,{namespace:G,phrase:`emailReminder`})})]})}function K(e){return(0,B.jsx)(`div`,{className:`${e.className}`,style:e.coverImageUrl&&{backgroundImage:`url(${T._createUrl(e.coverImageUrl,{size:w.Large})})`}})}var q=e(Se()),J=`livestream.livestreamView`,Y=o.encloseNamespace(J),X=q.object({firstName:q.string().required(Y(`firstNameRequired`)),lastName:q.string().required(Y(`lastNameRequired`)),email:q.string().email(Y(`emailValid`)).required(Y(`emailRequired`)),attendees:q.string().required(Y(`attendeesRequired`))}),Ge=X.concat(q.object({schoolOrDistrict:q.string().required(Y(`schoolOrDistrictRequired`)),jobTitle:q.string().required(Y(`jobTitleRequired`)),phoneNumber:q.string().required(Y(`phoneNumberRequired`)).matches(/^[0-9]+$/,Y(`phoneNumberValid`))}));function Ke(e){let t=be(),[n,r]=z.useState({}),[i,a]=z.useState(!1);function o(){t.setFieldValue(`schoolOrDistrict`,``),t.setFieldValue(`country`,``),t.setFieldValue(`province`,``),t.setFieldValue(`prospectId`,``),f()}function s(e){r({...n,...e}),o()}function c(){r({}),o()}function l(e){r({...n,...e}),t.setFieldValue(`schoolOrDistrict`,e.schoolName),t.setFieldValue(`country`,e.country),t.setFieldValue(`province`,e.province),t.setFieldValue(`prospectId`,e.prospectId),f()}function u(){r({...n,prospectId:void 0,schoolName:void 0,schoolPostCode:void 0}),o()}function d(e){a(!0),t.setFieldValue(`schoolOrDistrict`,e),f()}function f(){window.setTimeout(()=>t.validateForm(),0)}return(0,B.jsxs)(fe,{children:[(0,B.jsxs)(`div`,{className:`row my-3`,children:[(0,B.jsx)(`div`,{className:`col-12 col-sm-6`,children:(0,B.jsx)(F,{label:Y(`firstName`),name:`firstName`,placeholder:Y(`firstNamePlaceholder`),value:t.values?.firstName,disabled:e.isAuthenticated,showRequiredStar:!e.isAuthenticated})}),(0,B.jsx)(`div`,{className:`col-12 col-sm-6`,children:(0,B.jsx)(F,{label:Y(`lastName`),name:`lastName`,placeholder:Y(`lastNamePlaceholder`),value:t.values?.lastName,disabled:e.isAuthenticated,showRequiredStar:!e.isAuthenticated})}),(0,B.jsx)(`div`,{className:`col-12`,children:(0,B.jsx)(F,{label:Y(`email`),name:`email`,placeholder:Y(`emailPlaceholder`),value:t.values?.email,disabled:e.isAuthenticated&&!!e.emailAddress,showRequiredStar:!e.isAuthenticated||!e.emailAddress})}),!e.isAuthenticated&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`col-12`,children:i?(0,B.jsx)(F,{label:Y(`schoolOrDistrict`),name:`schoolOrDistrict`,value:t.values?.schoolOrDistrict,showRequiredStar:!0,placeholder:Y(`schoolOrDistrictPlaceholder`),autoFocus:!0}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(Ae,{data:n,setData:s,clearData:c,labelClassName:`form-label`,geoLocation:{countryCode:`US`},googleMapsApiKey:e.googleMapsApiKey,required:!0,hideOnBlur:!0}),(0,B.jsx)(je,{data:n,setData:l,clearData:u,disabled:!n.schoolLocality,searchUrl:e.searchProspectsUrl,onClickNoSuggestions:d,required:!0,placeholder:!n.schoolLocality&&Y(`schoolPlaceholder`),hideOnBlur:!0})]})}),(0,B.jsx)(`div`,{className:`col-12`,children:(0,B.jsx)(Oe,{id:`job-title`,error:t.touched?.jobTitle&&t.errors?.jobTitle,countryCode:M.US,initialValue:t.values?.jobTitle,onChange:e=>t.setFieldValue(`jobTitle`,e,!1),labelClassName:`form-label`,isTertiary:!1,required:!0})})]}),(0,B.jsx)(`div`,{className:`col-12 col-sm-6 col-xl-4`,children:(0,B.jsx)(F,{type:`number`,label:Y(`attendees`),name:`attendees`,placeholder:Y(`attendeesPlaceholder`),min:1,value:t.values?.attendees,showRequiredStar:!0})}),!e.isAuthenticated&&(0,B.jsx)(`div`,{className:`col`,children:(0,B.jsx)(F,{label:Y(`phoneNumber`),name:`phoneNumber`,placeholder:Y(`phoneNumberPlaceholder`),value:t.values?.phoneNumber,showRequiredStar:!0})})]}),(0,B.jsx)(pe,{type:`submit`,className:`w-100`,variant:`dark`,showSpinner:e.showSpinner,disabled:!t.isValid,children:(0,B.jsx)(k,{namespace:J,phrase:`book`})})]})}function qe(e){return(0,B.jsx)(xe,{initialValues:e.initialValues,validationSchema:e.isAuthenticated?X:Ge,validateOnMount:!0,onSubmit:e.onSubmit,children:(0,B.jsx)(Ke,{emailAddress:e.emailAddress,isAuthenticated:e.isAuthenticated,showSpinner:e.showSpinner,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl})})}function Je(e,t){return{application:u.LIVESTREAMS,action:x.Livestreams.LIVESTREAM,args:[t,e?.id,s.slugify(e?.name)]}}var Z={noRecording:`_noRecording_uwnqe_1`,coverImage:`_coverImage_uwnqe_4`,popup:`_popup_uwnqe_10`,page:`_page_uwnqe_15`},Q=`livestream.livestreamView`,Ye=o.encloseNamespace(Q);function Xe(e){let t=!e.isAuthenticated&&!e.livestream.recording,n=e.bookingQuota.limitReached&&e.isAuthenticated&&!e.isStudent,r=!n&&!e.isPastLivestream&&!e.formStage&&e.isAuthenticated&&!e.isStudent,a={application:u.SIGN_UP,action:x.SignUp.SIGN_UP},o=i.getHref(i.getCurrentAppLink()),c={application:u.DEFAULT,action:x.Default.CHALLENGE,params:o===`/`?{}:{redirectUrl:o}},l={application:u.SIGN_UP,action:x.SignUp.UPGRADE},d={application:u.DASHBOARD,action:x.Dashboard.PARTNER_DASHBOARD,args:[e.presentationSlug,e.livestream.company.id,s.slugify(e.livestream.company.name)]};return(0,B.jsxs)(B.Fragment,{children:[!e.success&&!e.error&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(V,{logoUrl:e.livestream.company.logo?.url,logoBgColour:e.livestream.company.metadata?.colour,companyId:e.livestream.company.id,companyName:e.livestream.company.name,eventName:e.livestream.name,audiences:e.livestream.audiences,startTime:e.livestream.startDateTime,endTime:e.livestream.endDateTime,description:!e.formStage&&e.livestream.description,isPastLivestream:e.isPastLivestream,companyAppLink:d}),e.bookingQuota.showInfo&&(0,B.jsx)(He,{showUpgrade:n,max:e.bookingQuota.max,used:e.bookingQuota.used,upgradeAppLink:l}),e.formStage&&(0,B.jsx)(qe,{emailAddress:e.emailAddress,initialValues:e.initialValues,isAuthenticated:e.isAuthenticated,showSpinner:e.showSpinner,onSubmit:e.onSubmit,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl}),r&&(0,B.jsx)(`button`,{className:D(`btn btn-dark w-100`,{"mt-3":e.bookingQuota.showInfo}),onClick:()=>e.setFormStage(!0),children:(0,B.jsx)(k,{namespace:Q,phrase:`book`})}),e.isPastLivestream&&!e.livestream.recording&&(0,B.jsx)(`div`,{className:`${Z.noRecording} p-2 rounded`,children:(0,B.jsx)(k,{namespace:Q,phrase:`noRecording`})}),e.livestream.recording&&(0,B.jsx)(O,{appLink:{application:u.VIDEOS,action:x.Videos.PLAY_VIDEO,args:[e.presentationSlug,e.livestream.recording.id,s.slugify(e.livestream.recording.name)]},children:(0,B.jsx)(`button`,{className:`btn btn-outline-dark w-100`,children:(0,B.jsx)(k,{namespace:Q,phrase:`recording`})})}),t&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(O,{className:`mt-3 btn btn-dark w-100`,appLink:a,children:(0,B.jsx)(k,{namespace:Q,phrase:`signUpButton`})}),(0,B.jsxs)(`p`,{className:`mt-3 mb-0 text-center small text-secondary`,children:[(0,B.jsx)(k,{namespace:Q,phrase:`alreadyHaveAccount`}),(0,B.jsx)(O,{className:`info-link ms-1`,appLink:c,children:(0,B.jsx)(k,{namespace:Q,phrase:`signInButton`})})]})]})]}),e.success&&(0,B.jsx)(We,{livestream:e.livestream}),e.error&&(0,B.jsx)(Ve,{onTryAgain:e.onTryAgain})]})}function Ze(e){function t(){e.closePopup(),De.preventScrollTop();let t=E.getCurrentRoute().appLink;t.application===u.LIVESTREAMS&&t.action===x.Livestreams.LIVESTREAM&&i.trigger(E.getPreviousRoute()?.appLink)}return(0,B.jsxs)(N,{size:`xl`,bodyClassName:`rounded-3 overflow-hidden p-0`,closePopup:t,children:[(0,B.jsx)(`button`,{className:`btn-close position-absolute top-0 end-0 p-3`,onClick:t}),(0,B.jsxs)(`div`,{className:`row g-0`,children:[(0,B.jsx)(`div`,{className:`col-12 col-lg-6`,children:(0,B.jsx)(K,{className:`${Z.coverImage} ${Z.popup}`,coverImageUrl:e.livestream.company.cover?.url})}),(0,B.jsx)(`div`,{className:`col-12 col-lg p-4 m-lg-2`,children:(0,B.jsx)(Xe,{...e})})]})]})}function Qe(e){return(0,B.jsxs)(`div`,{className:`row g-0 px-3`,children:[(0,B.jsx)(`div`,{className:`col-12 col-md-6 col-lg-5`,children:(0,B.jsx)(K,{className:`${Z.coverImage} ${Z.page} rounded`,coverImageUrl:e.livestream.company.cover?.url})}),(0,B.jsx)(`div`,{className:`col-12 col-md px-md-3 pt-2 pt-md-0`,children:(0,B.jsx)(Xe,{...e})})]})}function $e(e){let t=f(ae.config()),n=d(),i=Le(),[o,s]=z.useState(!1),[c,l]=z.useState(!1),[u,g]=z.useState(!1),[_,v]=z.useState(!1),[b,x]=z.useState({firstName:``,lastName:``,email:``,attendees:``,schoolOrDistrict:``,jobTitle:``,phoneNumber:``,country:``,province:``,prospectId:``}),{createOrUpdateProfile:S}=Me(),C=Be(),w=f(y.currentUser()),T=f(L.livestream(e.id)),{hasPermissions:E}=ue(),D=E(a.StudentExperience);he({id:e.id,app:`livestreams`}),le({...ce.getDefaultMetadata({title:T.data?.name,description:T.data?.description,phraseContext:{phraseHandler:Ye,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:de.getCanonicalLink({customAppLink:Je(T.data,e.presentationSlug)}),allowIndexing:!0}),_isPopupUp:!e.fromPageLoad}),Ee(T),z.useEffect(()=>{!T.data||T.data?.status===ie.Published||r.throw(new se)},[T.data?.status]),z.useEffect(()=>{w.data?.isAuthenticated&&x({...b,firstName:w.data.givenName,lastName:w.data.familyName,email:w.data.email})},[w.data?.isAuthenticated]);async function O(e){if(C.hasBookingLimitations&&C.hasReachedBookingLimit){g(!0);return}try{v(!0),x(e),await n(L.createBooking({eventId:T.data.id,eventType:`Livestream`,firstName:e.firstName,lastName:e.lastName,email:e.email,attendees:e.attendees,status:1})),w.data?.isAuthenticated||S({email:e.email,firstName:e.firstName,lastName:e.lastName,phone:e.phoneNumber,countryCode:e.country}),j(m.Complete),M(e),l(!0)}catch{g(!0),s(!1)}finally{v(!1)}}function k(){g(!1),s(!0)}function A(){s(!0),j(m.Start)}function j(t){oe.logUserAction({id:T.data.id,name:T.data.name},{entity:ee.Livestream,actionType:ne.Submit,location:te.LivestreamBookingForm,descriptor:e.fromPageLoad?h.FullPage:h.Popup,workflowPhase:t})}async function M(e){let t=Re.LivestreamBooking;try{await n(R.createUser({email:e.email,source:t,instanceRegion:w.data?.instanceRegion,syncToCrm:!0}))}catch{}try{let r;e.prospectId&&(r=(await n(R.prospectLookups(e.prospectId)))?.find(e=>e.type===`crm_id`)?.externalId);let a={email:e.email,firstName:e.firstName,lastName:e.lastName,phone:e.phoneNumber,custom:{accountAddress:e?.province?{countryCode:e?.country,province:ke.parseProvince(e?.province||``)}:void 0,accountName:e.schoolOrDistrict,jobTitle:e.jobTitle,crmId:r||void 0}};i.logFormSubmission({eventType:Ne.StreamableFormEvent.LivestreamBookingFormSubmit,source:t,conversion:ze.LivestreamBooking,user:a,productType:`sl`})}catch(e){console.error(`Failed to log submission event to Braze`,e)}}if(!(T.hasCompleted&&C.isLoaded&&t.hasCompleted))return(0,B.jsx)(B.Fragment,{});let N={livestream:T.data,formStage:o,initialValues:b,isAuthenticated:w.data?.isAuthenticated,isStudent:D,success:c,error:u,isPastLivestream:p.isBefore(T.data.endDateTime,new Date),showSpinner:_,onSubmit:O,onTryAgain:k,setFormStage:A,googleMapsApiKey:t.data.googleMapsApiKey,searchProspectsUrl:re.safeUrlConcat(t.data.gatewayApiUrl,`/v1/search/prospects`),emailAddress:w.data?.email,presentationSlug:e.presentationSlug,bookingQuota:{showInfo:C.hasBookingLimitations,limitReached:C.hasReachedBookingLimit,used:C.bookingsUsed,max:C.totalBookingsAvailable}};return e.fromPageLoad?(0,B.jsx)(Qe,{...N}):(0,B.jsx)(Ze,{...N,closePopup:e.closePopup})}var $=Ce({[_.StreamableLearning]:e=>(0,B.jsx)($e,{id:e.id,fromPageLoad:e.fromPageLoad,closePopup:e.closePopup,presentationSlug:e.presentationSlug})});$.displayName=`BaseLivestreamView`;export{$ as BaseLivestreamView};
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{n as t,t as n}from"./D8uRDrkd.chunk.js";import{_ as r,y as i}from"./BftnFbcr.chunk.js";import{n as a}from"./B785hxeE.chunk.js";import{t as o}from"./CQyJ7YGa.chunk.js";import{t as s}from"./e57H3T-k.chunk.js";import{t as c}from"./C2w0pmFW.chunk.js";import{t as l}from"./wrLrTezN.chunk.js";import{t as u}from"./BXTI9cmX.chunk.js";import{p as d,u as f}from"./BX0wDJmp.chunk.js";import{t as p}from"./CjA4Q5pm.chunk.js";import{U as m,l as ee,v as h,y as te,z as ne}from"./NlCAcBdo.chunk.js";import{t as g}from"./RjGIOTdP.chunk.js";import{t as _}from"./DTGfiG8Y.chunk.js";import{r as v,t as y}from"./oPIkfKWW2.chunk.js";import{t as re}from"./DZX1tZ-D2.chunk.js";import{n as ie}from"./BDwjs8qz2.chunk.js";import{t as b}from"./DQgG9njb.chunk.js";import{t as x}from"./DdsRCMkN.chunk.js";import{t as ae}from"./D_gWf2lC.chunk.js";import{t as oe}from"./CYEpX3hx.chunk.js";import{n as S}from"./CsF4wDV1.chunk.js";import{t as se}from"./BWaKdG0l.chunk.js";import{t as C}from"./PgzMrOyM.chunk.js";import{n as w}from"./BRcHS92O2.chunk.js";import{t as T}from"./Tr5-kahg2.chunk.js";import{t as E}from"./klg9VDIV2.chunk.js";import{n as D}from"./C0exjRXJ2.chunk.js";import{t as O}from"./Ci5E3nqm2.chunk.js";import{n as ce,t as le}from"./A8xLZrSw.chunk.js";import{t as ue}from"./BQKcAczf.chunk.js";import{t as de}from"./DR9DEoQL.chunk.js";import{n as k}from"./CpFtf-tI2.chunk.js";import{n as A}from"./OL3Z6Yp62.chunk.js";import{t as j}from"./C3q_xvci.chunk.js";import{t as M}from"./Bv4_l1OV.chunk.js";import{t as N}from"./dEqScqMh2.chunk.js";import{i as fe}from"./CXVBjdpb.chunk.js";import{t as pe}from"./CfkLy0le.chunk.js";import{t as me}from"./C4SwJrBy.chunk.js";import{n as he}from"./B-eFTZdx2.chunk.js";import{t as P}from"./DSuhq1Rt2.chunk.js";import{r as ge,t as _e}from"./C5uTRLOC2.chunk.js";import{t as ve}from"./CfwSprmF.chunk.js";import{t as ye}from"./CdYjo8_g.chunk.js";import{n as F}from"./jgL-hoCR2.chunk.js";import{n as be,t as xe}from"./D5WAilZl2.chunk.js";import{t as Se}from"./B_HsEzOv.chunk.js";import{t as Ce}from"./D7UO1XFN2.chunk.js";import{t as I}from"./BZFomoIH2.chunk.js";import{t as we}from"./tnBD84bg2.chunk.js";import{n as Te,t as L}from"./CtBGtgb32.chunk.js";import{t as Ee}from"./D0n6BTgT.chunk.js";import{t as De}from"./CLOak4u5.chunk.js";import{t as Oe}from"./DInbp0A6.chunk.js";import{t as ke}from"./C-mD9tw7.chunk.js";import{a as Ae,n as je,t as Me}from"./CuzqCIXw.chunk.js";import{t as R}from"./DcYW5Mhp.chunk.js";var z=e(c()),Ne=me(),Pe={logoContainer:`_logoContainer_vn3gg_1`},B=l(),Fe=`streamable.livestreamDetails`;function V(e){function r(){return`${p.diffBetween(e.endTime,e.startTime,`minutes`)}m`}function i(e){return I.convertUTCToTimezoneDate(e)}function a(e){return p.format(i(e),`h:mma`)}function o(e){return p.format(i(e),`Do MMMM`)}function c(e){return I.getTimezoneInfo(e).longGeneric}function l(){return g.getMergedPresentationAudienceString(e.audiences)?.name}let u=_e(e.companyName,ge);return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`div`,{className:`d-flex align-items-center mb-2`,children:[e.logoUrl&&(0,B.jsx)(O,{appLink:e.companyAppLink,children:(0,B.jsx)(`div`,{className:`${Pe.logoContainer} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background me-2`,children:(0,B.jsx)(P,{data:T.createUrl(e.logoUrl,{size:w.Small}),alt:e.companyName,className:!e.logoBgColour&&u,imageStyle:{backgroundColor:e.logoBgColour},preload:!0})})}),(0,B.jsxs)(`div`,{className:`d-flex flex-column justify-content-between`,children:[e.companyName&&(0,B.jsx)(O,{appLink:e.companyAppLink,className:`text-uppercase text-wrap d-block text-truncate mb-0`,title:e.companyName,children:e.companyName}),(0,B.jsx)(`h1`,{className:`h4 mb-0`,children:e.eventName})]})]}),(0,B.jsxs)(`div`,{className:`d-flex gap-2 mb-3`,children:[!!e.audiences?.length&&(0,B.jsx)(`div`,{className:`rounded-pill border border-dark px-2`,children:l()}),(0,B.jsx)(`div`,{className:`rounded-pill fw-semibold bg-dark text-white px-2`,children:(0,B.jsx)(`span`,{className:`align-middle`,children:r()})})]}),e.isPastLivestream&&(0,B.jsxs)(`div`,{className:`d-inline-block bg-light-green rounded-pill mb-3`,children:[(0,B.jsx)(n,{svg:Te}),(0,B.jsx)(`p`,{className:`d-inline ms-1 mb-0`,children:(0,B.jsx)(k,{namespace:Fe,phrase:`pastEvent`})})]}),!e.isPastLivestream&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`p`,{className:`mb-2`,children:[(0,B.jsx)(n,{svg:b,size:t.Small}),(0,B.jsx)(`span`,{className:`ms-1`,children:a(e.startTime)})]}),(0,B.jsxs)(`p`,{className:`mb-2`,children:[(0,B.jsx)(n,{svg:ve,size:t.Small}),(0,B.jsx)(`span`,{className:`ms-1`,children:o(e.startTime)})]}),(0,B.jsxs)(`p`,{className:`mb-3`,children:[(0,B.jsx)(n,{svg:ye,size:t.Small}),(0,B.jsx)(`span`,{className:`ms-1`,children:c(e.timezone)})]})]}),e.description&&(0,B.jsx)(`p`,{className:`mb-3 pre-wrap text-break`,dangerouslySetInnerHTML:{__html:s.sanitize(we.linkifyText(e.description))}})]})}function Ie(e,t){return{...e,custom:{...e?.custom,source:t.source},event:{...e?.event,conversion:t.conversion}}}function Le(){let e=A(S.BrazeClient);function t({user:t,additionalData:n,source:r,eventType:i,conversion:a,productType:o,callback:s}){let c=Ie(t,{source:r,conversion:a});e.setUserInit(c),e.logFormEvent({eventType:i,additionalData:n,callback:s,internalOptions:{subscriptionGroups:o}})}return{client:e,logFormSubmission:t}}var Re=function(e){return e.LivestreamBooking=`cv_product_livestream`,e}({}),ze=function(e){return e.LivestreamBooking=`Submit - Livestream Booking`,e}({});function Be(){let{accessPolicy:e,isLoaded:t}=v(),n=f(y.currentUser()),r=!!e?.metadata?.maxLiveBookings,i=f(n.data?.isAuthenticated&&r&&L.customerLifetimeBookingCount()),a=n.hasCompleted&&(!r||i.hasCompleted&&t),o=e?.metadata?.maxLiveBookings??2**53-1,s=i.data?.count??0;return{isLoaded:a,accessPolicy:e,bookingsUsed:s,totalBookingsAvailable:o,hasReachedBookingLimit:s>=o,hasBookingLimitations:r}}var H={logo:`_logo_igal3_1`,image:`_image_igal3_2`},U=`livestream.bookingError`;function Ve(e){return(0,B.jsxs)(`div`,{className:`d-flex flex-column justify-content-center`,children:[(0,B.jsx)(`div`,{className:`${H.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`,children:(0,B.jsx)(`img`,{className:H.image,src:C.Live.General.LOST_MESSAGE_BOTTLE})}),(0,B.jsx)(`h3`,{className:`text-center mb-3`,children:(0,B.jsx)(k,{namespace:U,phrase:`heading`})}),(0,B.jsx)(`p`,{className:`text-center mb-3`,children:(0,B.jsx)(k,{namespace:U,phrase:`description`})}),(0,B.jsx)(`button`,{className:`btn btn-dark`,onClick:e.onTryAgain,children:(0,B.jsx)(k,{namespace:U,phrase:`buttonLabel`})})]})}var W=`livestream.liveStreamBookingQuota`;function He(e){return(0,B.jsxs)(`div`,{className:`bg-light-blue rounded p-2 mt-3 d-flex flex-column gap-2`,role:`alert`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`strong`,{children:(0,B.jsx)(k,{namespace:W,phrase:`bookingQuota`})}),`\xA0`,(0,B.jsx)(k,{namespace:W,phrase:`bookingQuotaUsed`,options:{bookingQuota:e.max,bookingQuotaUsed:e.used}})]}),e.showUpgrade&&(0,B.jsxs)(`div`,{children:[(0,B.jsx)(k,{namespace:W,phrase:`bookingQuotaReached`}),`\xA0`,(0,B.jsx)(k,{namespace:W,phrase:`requestUpgradePrefix`}),`\xA0`,(0,B.jsx)(O,{className:`btn-link d-inline-block text-info`,appLink:e.upgradeAppLink,children:(0,B.jsx)(k,{namespace:W,phrase:`requestUpgrade`})}),`.`]})]})}var Ue={logo:`_logo_1uhpx_1`},G=`livestream.bookingSuccess`;function We(e){return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`${Ue.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`,children:(0,B.jsx)(P,{data:T.createUrl(e.livestream.company.logo?.url,{size:w.Small}),alt:e.livestream.company.name,preload:!0})}),(0,B.jsxs)(`div`,{className:`d-flex align-items-center justify-content-center mb-3 gap-1`,children:[(0,B.jsx)(n,{svg:j,className:`svg-container std text-success`}),(0,B.jsx)(`h1`,{className:`h3 mb-0 fw-semibold`,children:(0,B.jsx)(k,{namespace:G,phrase:`booked`})})]}),(0,B.jsx)(`div`,{className:`my-3`,children:(0,B.jsx)(V,{companyId:e.livestream.company.id,companyName:e.livestream.company.name,eventName:e.livestream.name,audiences:e.livestream.audiences,startTime:e.livestream.startDateTime,endTime:e.livestream.endDateTime})}),(0,B.jsx)(`p`,{children:(0,B.jsx)(k,{namespace:G,phrase:`emailReminder`})})]})}function K(e){return(0,B.jsx)(`div`,{className:`${e.className}`,style:e.coverImageUrl&&{backgroundImage:`url(${T._createUrl(e.coverImageUrl,{size:w.Large})})`}})}var q=e(Se()),J=`livestream.livestreamView`,Y=o.encloseNamespace(J),X=q.object({firstName:q.string().required(Y(`firstNameRequired`)),lastName:q.string().required(Y(`lastNameRequired`)),email:q.string().email(Y(`emailValid`)).required(Y(`emailRequired`)),attendees:q.string().required(Y(`attendeesRequired`))}),Ge=X.concat(q.object({schoolOrDistrict:q.string().required(Y(`schoolOrDistrictRequired`)),jobTitle:q.string().required(Y(`jobTitleRequired`)),phoneNumber:q.string().required(Y(`phoneNumberRequired`)).matches(/^[0-9]+$/,Y(`phoneNumberValid`))}));function Ke(e){let t=be(),[n,r]=z.useState({}),[i,a]=z.useState(!1);function o(){t.setFieldValue(`schoolOrDistrict`,``),t.setFieldValue(`country`,``),t.setFieldValue(`province`,``),t.setFieldValue(`prospectId`,``),f()}function s(e){r({...n,...e}),o()}function c(){r({}),o()}function l(e){r({...n,...e}),t.setFieldValue(`schoolOrDistrict`,e.schoolName),t.setFieldValue(`country`,e.country),t.setFieldValue(`province`,e.province),t.setFieldValue(`prospectId`,e.prospectId),f()}function u(){r({...n,prospectId:void 0,schoolName:void 0,schoolPostCode:void 0}),o()}function d(e){a(!0),t.setFieldValue(`schoolOrDistrict`,e),f()}function f(){window.setTimeout(()=>t.validateForm(),0)}return(0,B.jsxs)(fe,{children:[(0,B.jsxs)(`div`,{className:`row my-3`,children:[(0,B.jsx)(`div`,{className:`col-12 col-sm-6`,children:(0,B.jsx)(F,{label:Y(`firstName`),name:`firstName`,placeholder:Y(`firstNamePlaceholder`),value:t.values?.firstName,disabled:e.isAuthenticated,showRequiredStar:!e.isAuthenticated})}),(0,B.jsx)(`div`,{className:`col-12 col-sm-6`,children:(0,B.jsx)(F,{label:Y(`lastName`),name:`lastName`,placeholder:Y(`lastNamePlaceholder`),value:t.values?.lastName,disabled:e.isAuthenticated,showRequiredStar:!e.isAuthenticated})}),(0,B.jsx)(`div`,{className:`col-12`,children:(0,B.jsx)(F,{label:Y(`email`),name:`email`,placeholder:Y(`emailPlaceholder`),value:t.values?.email,disabled:e.isAuthenticated&&!!e.emailAddress,showRequiredStar:!e.isAuthenticated||!e.emailAddress})}),!e.isAuthenticated&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`div`,{className:`col-12`,children:i?(0,B.jsx)(F,{label:Y(`schoolOrDistrict`),name:`schoolOrDistrict`,value:t.values?.schoolOrDistrict,showRequiredStar:!0,placeholder:Y(`schoolOrDistrictPlaceholder`),autoFocus:!0}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(Ae,{data:n,setData:s,clearData:c,labelClassName:`form-label`,geoLocation:{countryCode:`US`},googleMapsApiKey:e.googleMapsApiKey,required:!0,hideOnBlur:!0}),(0,B.jsx)(je,{data:n,setData:l,clearData:u,disabled:!n.schoolLocality,searchUrl:e.searchProspectsUrl,onClickNoSuggestions:d,required:!0,placeholder:!n.schoolLocality&&Y(`schoolPlaceholder`),hideOnBlur:!0})]})}),(0,B.jsx)(`div`,{className:`col-12`,children:(0,B.jsx)(Oe,{id:`job-title`,error:t.touched?.jobTitle&&t.errors?.jobTitle,countryCode:M.US,initialValue:t.values?.jobTitle,onChange:e=>t.setFieldValue(`jobTitle`,e,!1),labelClassName:`form-label`,isTertiary:!1,required:!0})})]}),(0,B.jsx)(`div`,{className:`col-12 col-sm-6 col-xl-4`,children:(0,B.jsx)(F,{type:`number`,label:Y(`attendees`),name:`attendees`,placeholder:Y(`attendeesPlaceholder`),min:1,value:t.values?.attendees,showRequiredStar:!0})}),!e.isAuthenticated&&(0,B.jsx)(`div`,{className:`col`,children:(0,B.jsx)(F,{label:Y(`phoneNumber`),name:`phoneNumber`,placeholder:Y(`phoneNumberPlaceholder`),value:t.values?.phoneNumber,showRequiredStar:!0})})]}),(0,B.jsx)(pe,{type:`submit`,className:`w-100`,variant:`dark`,showSpinner:e.showSpinner,disabled:!t.isValid,children:(0,B.jsx)(k,{namespace:J,phrase:`book`})})]})}function qe(e){return(0,B.jsx)(xe,{initialValues:e.initialValues,validationSchema:e.isAuthenticated?X:Ge,validateOnMount:!0,onSubmit:e.onSubmit,children:(0,B.jsx)(Ke,{emailAddress:e.emailAddress,isAuthenticated:e.isAuthenticated,showSpinner:e.showSpinner,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl})})}function Je(e,t){return{application:u.LIVESTREAMS,action:x.Livestreams.LIVESTREAM,args:[t,e?.id,s.slugify(e?.name)]}}var Z={noRecording:`_noRecording_uwnqe_1`,coverImage:`_coverImage_uwnqe_4`,popup:`_popup_uwnqe_10`,page:`_page_uwnqe_15`},Q=`livestream.livestreamView`,Ye=o.encloseNamespace(Q);function Xe(e){let t=!e.isAuthenticated&&!e.livestream.recording,n=e.bookingQuota.limitReached&&e.isAuthenticated&&!e.isStudent,r=!n&&!e.isPastLivestream&&!e.formStage&&e.isAuthenticated&&!e.isStudent,a={application:u.SIGN_UP,action:x.SignUp.SIGN_UP},o=i.getHref(i.getCurrentAppLink()),c={application:u.DEFAULT,action:x.Default.CHALLENGE,params:o===`/`?{}:{redirectUrl:o}},l={application:u.SIGN_UP,action:x.SignUp.UPGRADE},d={application:u.DASHBOARD,action:x.Dashboard.PARTNER_DASHBOARD,args:[e.presentationSlug,e.livestream.company.id,s.slugify(e.livestream.company.name)]};return(0,B.jsxs)(B.Fragment,{children:[!e.success&&!e.error&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(V,{logoUrl:e.livestream.company.logo?.url,logoBgColour:e.livestream.company.metadata?.colour,companyId:e.livestream.company.id,companyName:e.livestream.company.name,eventName:e.livestream.name,audiences:e.livestream.audiences,startTime:e.livestream.startDateTime,endTime:e.livestream.endDateTime,description:!e.formStage&&e.livestream.description,isPastLivestream:e.isPastLivestream,companyAppLink:d}),e.bookingQuota.showInfo&&(0,B.jsx)(He,{showUpgrade:n,max:e.bookingQuota.max,used:e.bookingQuota.used,upgradeAppLink:l}),e.formStage&&(0,B.jsx)(qe,{emailAddress:e.emailAddress,initialValues:e.initialValues,isAuthenticated:e.isAuthenticated,showSpinner:e.showSpinner,onSubmit:e.onSubmit,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl}),r&&(0,B.jsx)(`button`,{className:D(`btn btn-dark w-100`,{"mt-3":e.bookingQuota.showInfo}),onClick:()=>e.setFormStage(!0),children:(0,B.jsx)(k,{namespace:Q,phrase:`book`})}),e.isPastLivestream&&!e.livestream.recording&&(0,B.jsx)(`div`,{className:`${Z.noRecording} p-2 rounded`,children:(0,B.jsx)(k,{namespace:Q,phrase:`noRecording`})}),e.livestream.recording&&(0,B.jsx)(O,{appLink:{application:u.VIDEOS,action:x.Videos.PLAY_VIDEO,args:[e.presentationSlug,e.livestream.recording.id,s.slugify(e.livestream.recording.name)]},children:(0,B.jsx)(`button`,{className:`btn btn-outline-dark w-100`,children:(0,B.jsx)(k,{namespace:Q,phrase:`recording`})})}),t&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(O,{className:`mt-3 btn btn-dark w-100`,appLink:a,children:(0,B.jsx)(k,{namespace:Q,phrase:`signUpButton`})}),(0,B.jsxs)(`p`,{className:`mt-3 mb-0 text-center small text-secondary`,children:[(0,B.jsx)(k,{namespace:Q,phrase:`alreadyHaveAccount`}),(0,B.jsx)(O,{className:`info-link ms-1`,appLink:c,children:(0,B.jsx)(k,{namespace:Q,phrase:`signInButton`})})]})]})]}),e.success&&(0,B.jsx)(We,{livestream:e.livestream}),e.error&&(0,B.jsx)(Ve,{onTryAgain:e.onTryAgain})]})}function Ze(e){function t(){e.closePopup(),De.preventScrollTop();let t=E.getCurrentRoute().appLink;t.application===u.LIVESTREAMS&&t.action===x.Livestreams.LIVESTREAM&&i.trigger(E.getPreviousRoute()?.appLink)}return(0,B.jsxs)(N,{size:`xl`,bodyClassName:`rounded-3 overflow-hidden p-0`,closePopup:t,children:[(0,B.jsx)(`button`,{className:`btn-close position-absolute top-0 end-0 p-3`,onClick:t}),(0,B.jsxs)(`div`,{className:`row g-0`,children:[(0,B.jsx)(`div`,{className:`col-12 col-lg-6`,children:(0,B.jsx)(K,{className:`${Z.coverImage} ${Z.popup}`,coverImageUrl:e.livestream.company.cover?.url})}),(0,B.jsx)(`div`,{className:`col-12 col-lg p-4 m-lg-2`,children:(0,B.jsx)(Xe,{...e})})]})]})}function Qe(e){return(0,B.jsxs)(`div`,{className:`row g-0 px-3`,children:[(0,B.jsx)(`div`,{className:`col-12 col-md-6 col-lg-5`,children:(0,B.jsx)(K,{className:`${Z.coverImage} ${Z.page} rounded`,coverImageUrl:e.livestream.company.cover?.url})}),(0,B.jsx)(`div`,{className:`col-12 col-md px-md-3 pt-2 pt-md-0`,children:(0,B.jsx)(Xe,{...e})})]})}function $e(e){let t=f(ae.config()),n=d(),i=Le(),[o,s]=z.useState(!1),[c,l]=z.useState(!1),[u,g]=z.useState(!1),[_,v]=z.useState(!1),[b,x]=z.useState({firstName:``,lastName:``,email:``,attendees:``,schoolOrDistrict:``,jobTitle:``,phoneNumber:``,country:``,province:``,prospectId:``}),{createOrUpdateProfile:S}=Me(),C=Be(),w=f(y.currentUser()),T=f(L.livestream(e.id)),{hasPermissions:E}=ue(),D=E(a.StudentExperience);he({id:e.id,app:`livestreams`}),le({...ce.getDefaultMetadata({title:T.data?.name,description:T.data?.description,phraseContext:{phraseHandler:Ye,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:de.getCanonicalLink({customAppLink:Je(T.data,e.presentationSlug)}),allowIndexing:!0}),_isPopupUp:!e.fromPageLoad}),Ee(T),z.useEffect(()=>{!T.data||T.data?.status===ie.Published||r.throw(new se)},[T.data?.status]),z.useEffect(()=>{w.data?.isAuthenticated&&x({...b,firstName:w.data.givenName,lastName:w.data.familyName,email:w.data.email})},[w.data?.isAuthenticated]);async function O(e){if(C.hasBookingLimitations&&C.hasReachedBookingLimit){g(!0);return}try{v(!0),x(e),await n(L.createBooking({eventId:T.data.id,eventType:`Livestream`,firstName:e.firstName,lastName:e.lastName,email:e.email,attendees:e.attendees,status:1})),w.data?.isAuthenticated||S({email:e.email,firstName:e.firstName,lastName:e.lastName,phone:e.phoneNumber,countryCode:e.country}),j(m.Complete),M(e),l(!0)}catch{g(!0),s(!1)}finally{v(!1)}}function k(){g(!1),s(!0)}function A(){s(!0),j(m.Start)}function j(t){oe.logUserAction({id:T.data.id,name:T.data.name},{entity:ee.Livestream,actionType:ne.Submit,location:te.LivestreamBookingForm,descriptor:e.fromPageLoad?h.FullPage:h.Popup,workflowPhase:t})}async function M(e){let t=Re.LivestreamBooking;try{await n(R.createUser({email:e.email,source:t,instanceRegion:w.data?.instanceRegion,syncToCrm:!0}))}catch{}try{let r;e.prospectId&&(r=(await n(R.prospectLookups(e.prospectId)))?.find(e=>e.type===`crm_id`)?.externalId);let a={email:e.email,firstName:e.firstName,lastName:e.lastName,phone:e.phoneNumber,custom:{accountAddress:e?.province?{countryCode:e?.country,province:ke.parseProvince(e?.province||``)}:void 0,accountName:e.schoolOrDistrict,jobTitle:e.jobTitle,crmId:r||void 0}};i.logFormSubmission({eventType:Ne.StreamableFormEvent.LivestreamBookingFormSubmit,source:t,conversion:ze.LivestreamBooking,user:a,productType:`sl`})}catch(e){console.error(`Failed to log submission event to Braze`,e)}}if(!(T.hasCompleted&&C.isLoaded&&t.hasCompleted))return(0,B.jsx)(B.Fragment,{});let N={livestream:T.data,formStage:o,initialValues:b,isAuthenticated:w.data?.isAuthenticated,isStudent:D,success:c,error:u,isPastLivestream:p.isBefore(T.data.endDateTime,new Date),showSpinner:_,onSubmit:O,onTryAgain:k,setFormStage:A,googleMapsApiKey:t.data.googleMapsApiKey,searchProspectsUrl:re.safeUrlConcat(t.data.gatewayApiUrl,`/v1/search/prospects`),emailAddress:w.data?.email,presentationSlug:e.presentationSlug,bookingQuota:{showInfo:C.hasBookingLimitations,limitReached:C.hasReachedBookingLimit,used:C.bookingsUsed,max:C.totalBookingsAvailable}};return e.fromPageLoad?(0,B.jsx)(Qe,{...N}):(0,B.jsx)(Ze,{...N,closePopup:e.closePopup})}var $=Ce({[_.StreamableLearning]:e=>(0,B.jsx)($e,{id:e.id,fromPageLoad:e.fromPageLoad,closePopup:e.closePopup,presentationSlug:e.presentationSlug})});$.displayName=`BaseLivestreamView`;export{$ as BaseLivestreamView};
|
|
2
|
+
//# sourceMappingURL=1WHinyQW.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"igSDXA6g.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/streamable-learning/components/livestream-details/livestream-details.module.scss","../../../../libs/shared/src/apps/streamable-learning/components/livestream-details/LivestreamDetails.tsx","../../../../libs/shared/src/hooks/useBrazeClientService.ts","../../src/shared/enums/BrazeSource.ts","../../src/shared/enums/BrazeTopic.ts","../../src/shared/hooks/useBookingQuota.ts","../../src/apps/livestreams/components/livestream-booking-error/livestream-booking-error.module.scss","../../src/apps/livestreams/components/livestream-booking-error/LivestreamBookingError.tsx","../../src/apps/livestreams/components/livestream-booking-quota/LivestreamBookingQuota.tsx","../../src/apps/livestreams/components/livestream-booking-success/livestream-booking-success.module.scss","../../src/apps/livestreams/components/livestream-booking-success/LivestreamBookingSuccess.tsx","../../src/apps/livestreams/components/livestream-cover-image/LivestreamCoverImage.tsx","../../src/apps/livestreams/components/livestream-form/LivestreamForm.tsx","../../src/apps/livestreams/views/livestream/LivestreamViewUtils.ts","../../src/apps/livestreams/views/livestream/livestream/livestream.module.scss","../../src/apps/livestreams/views/livestream/livestream/LivestreamView.tsx","../../src/apps/livestreams/views/livestream/BaseLivestreamView.tsx"],"sourcesContent":[":local {\n .logoContainer {\n width: 3.75rem;\n height: 3.75rem;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { TimezoneHelper } from 'libs/shared/apps/streamable-learning/utils/TimezoneHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CalendarCheckSvg } from 'libs/shared/images/svg/objects/CalendarCheckSvg';\nimport { CalendarSvg } from 'libs/shared/images/svg/objects/CalendarSvg';\nimport { GlobeSvg } from 'libs/shared/images/svg/objects/GlobeSvg';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { Audience, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './livestream-details.module.scss';\n\nconst namespace = 'streamable.livestreamDetails';\n\ninterface LivestreamDetailsProps {\n logoUrl?: string;\n logoBgColour?: string;\n companyId?: string;\n companyName?: string;\n companyAppLink?: Core.AppLink;\n eventName: string;\n audiences?: Audience[];\n startTime: string;\n endTime: string;\n description?: string;\n isPastLivestream?: boolean;\n timezone?: string;\n}\n\nexport function LivestreamDetails(props: LivestreamDetailsProps) {\n function getDuration() {\n return `${DateHelper.diffBetween(props.endTime, props.startTime, 'minutes')}m`;\n }\n\n function getTimezoneDateTime(dateTime: string): Date {\n return TimezoneHelper.convertUTCToTimezoneDate(dateTime);\n }\n\n function getTime(time: string): string {\n return DateHelper.format(getTimezoneDateTime(time), 'h:mma');\n }\n\n function getDate(date: string): string {\n return DateHelper.format(getTimezoneDateTime(date), 'Do MMMM');\n }\n\n function getDisplayTimezone(timezone?: string): string {\n return TimezoneHelper.getTimezoneInfo(timezone).longGeneric;\n }\n\n function getMergedAudienceName(): string {\n return AudienceHelper.getMergedPresentationAudienceString(props.audiences as PresentationAudience[])?.name;\n }\n\n const logoFallbackBgClassName = getBgColorClass(props.companyName, BG_COLOUR_CLASS_NAMES);\n\n return (\n <>\n <div className='d-flex align-items-center mb-2'>\n {props.logoUrl && (\n <AppLink\n appLink={props.companyAppLink}\n >\n <div className={`${styles.logoContainer} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background me-2`}>\n <BaseImage\n data={ImageHelper.createUrl(props.logoUrl, { size: ImageSize.Small })}\n alt={props.companyName}\n className={!props.logoBgColour && logoFallbackBgClassName}\n imageStyle={{\n backgroundColor: props.logoBgColour\n }}\n preload\n />\n </div>\n </AppLink>\n\n )}\n <div className='d-flex flex-column justify-content-between'>\n {props.companyName &&\n <AppLink\n appLink={props.companyAppLink}\n className='text-uppercase text-wrap d-block text-truncate mb-0'\n title={props.companyName}\n >\n {props.companyName}\n </AppLink>\n }\n <h1 className='h4 mb-0'>{props.eventName}</h1>\n </div>\n </div>\n\n <div className='d-flex gap-2 mb-3'>\n {!!props.audiences?.length && (\n <div className='rounded-pill border border-dark px-2'>\n {getMergedAudienceName()}\n </div>\n )}\n <div className='rounded-pill fw-semibold bg-dark text-white px-2'>\n <span className='align-middle'>{getDuration()}</span>\n </div>\n </div>\n\n {props.isPastLivestream && (\n <div className='d-inline-block bg-light-green rounded-pill mb-3'>\n <SvgContainer svg={CalendarCheckSvg} />\n <p className='d-inline ms-1 mb-0'><Text namespace={namespace} phrase='pastEvent' /></p>\n </div>\n )}\n\n {!props.isPastLivestream && (\n <>\n <p className='mb-2'>\n <SvgContainer svg={TimerSvg} size={SvgContainerSize.Small} />\n <span className='ms-1'>{getTime(props.startTime)}</span>\n </p>\n <p className='mb-2'>\n <SvgContainer svg={CalendarSvg} size={SvgContainerSize.Small} />\n <span className='ms-1'>{getDate(props.startTime)}</span>\n </p>\n <p className='mb-3'>\n <SvgContainer svg={GlobeSvg} size={SvgContainerSize.Small} />\n <span className='ms-1'>{getDisplayTimezone(props.timezone)}</span>\n </p>\n </>\n )}\n\n {props.description && <p className='mb-3 pre-wrap text-break' dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(LinkifyHelper.linkifyText(props.description)) }} />}\n </>\n );\n}\n","import { type BrazeUser, type FormEventType } from '@clickview/braze-client';\n\nimport { useInstanceSafe } from 'libs/common/react/hooks/UseInstance';\n\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\nimport { BrazeClientService } from 'libs/shared/services/BrazeClientService';\n\ninterface HydrateUserDataOptions {\n conversion: string;\n source: string;\n}\n\nfunction hydrateUserData(user: BrazeUser, data: HydrateUserDataOptions): BrazeUser {\n return {\n ...user,\n custom: {\n ...user?.custom,\n source: data.source\n },\n event: {\n ...user?.event,\n conversion: data.conversion\n }\n };\n}\n\nexport interface LogFormSubmissionOptions<TConversion extends string, TSource extends string> {\n conversion: TConversion;\n source: TSource;\n eventType: FormEventType;\n user: BrazeUser;\n productType: 'cv' | 'sl';\n additionalData?: Record<string, any>;\n callback?: (success: boolean) => void;\n}\n\nexport function useBrazeClientService<TConversion extends string, TSource extends string>() {\n const braze = useInstanceSafe<BrazeClientService>(SharedServices.BrazeClient);\n\n function logFormSubmission({\n user,\n additionalData,\n source,\n eventType,\n conversion,\n productType,\n callback\n }: LogFormSubmissionOptions<TConversion, TSource>) {\n const brazeUser = hydrateUserData(user, {\n source,\n conversion\n });\n\n braze.setUserInit(brazeUser);\n \n braze.logFormEvent({\n eventType,\n additionalData,\n callback,\n internalOptions: {\n subscriptionGroups: productType\n }\n });\n }\n\n return {\n client: braze,\n logFormSubmission\n };\n}\n","export enum BrazeSource {\n LivestreamBooking = 'cv_product_livestream'\n}\n","export enum BrazeConversion {\n LivestreamBooking = 'Submit - Livestream Booking'\n}\n","import { Flight } from 'libs/common/react/index';\n\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAccessPolicy } from 'libs/shared/hooks/useAccessPolicy';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\n\nexport function useBookingQuota() {\n const { accessPolicy, isLoaded: accessPolicyLoaded } = useAccessPolicy();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hasBookingLimitations = !!accessPolicy?.metadata?.maxLiveBookings;\n\n const bookingCount = Flight.useBasicFetch<{ count: number }>(\n currentUser.data?.isAuthenticated &&\n hasBookingLimitations &&\n LivestreamRequests.customerLifetimeBookingCount()\n );\n\n const isLoaded = currentUser.hasCompleted\n && (hasBookingLimitations ?\n bookingCount.hasCompleted && accessPolicyLoaded :\n true\n );\n\n // Flat cap — no referral bonus (unlike streams).\n const totalBookingsAvailable = accessPolicy?.metadata?.maxLiveBookings ?? Number.MAX_SAFE_INTEGER;\n const bookingsUsed = bookingCount.data?.count ?? 0;\n const hasReachedBookingLimit = bookingsUsed >= totalBookingsAvailable;\n\n return {\n isLoaded,\n accessPolicy,\n bookingsUsed,\n totalBookingsAvailable,\n hasReachedBookingLimit,\n hasBookingLimitations\n };\n}\n",":local {\n .logo,\n .image {\n height: 9.25rem;\n width: 9.25rem;\n }\n}\n","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './livestream-booking-error.module.scss';\n\nconst namespace = 'livestream.bookingError';\n\ninterface LivestreamBookingErrorProps {\n onTryAgain: () => void;\n}\n\nexport function LivestreamBookingError(props: LivestreamBookingErrorProps) {\n return (\n <div className='d-flex flex-column justify-content-center'>\n <div\n className={`${styles.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`}\n >\n <img\n className={styles.image}\n src={ImageUrls.Live.General.LOST_MESSAGE_BOTTLE}\n />\n </div>\n <h3 className='text-center mb-3'><Text namespace={namespace} phrase='heading' /></h3>\n <p className='text-center mb-3'><Text namespace={namespace} phrase='description' /></p>\n <button className='btn btn-dark' onClick={props.onTryAgain}><Text namespace={namespace} phrase='buttonLabel' /></button>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'livestream.liveStreamBookingQuota';\n\ninterface LivestreamBookingQuotaProps {\n showUpgrade: boolean;\n upgradeAppLink: Core.AppLink;\n max: number;\n used: number;\n}\n\nexport function LivestreamBookingQuota(props: LivestreamBookingQuotaProps) {\n return (\n <div className='bg-light-blue rounded p-2 mt-3 d-flex flex-column gap-2' role='alert'>\n <div>\n <strong><Text namespace={namespace} phrase='bookingQuota' /></strong>\n \n <Text namespace={namespace} phrase='bookingQuotaUsed' options={{\n bookingQuota: props.max,\n bookingQuotaUsed: props.used\n }} />\n </div>\n {props.showUpgrade && (\n <div >\n <Text namespace={namespace} phrase='bookingQuotaReached' />\n \n <Text namespace={namespace} phrase='requestUpgradePrefix' />\n \n <AppLink\n className='btn-link d-inline-block text-info'\n appLink={props.upgradeAppLink}\n >\n <Text namespace={namespace} phrase='requestUpgrade' />\n </AppLink>\n .\n </div>\n )}\n </div>\n );\n}\n",":local {\n .logo {\n height: 9.25rem;\n width: 9.25rem;\n }\n}\n","import React from 'react';\n\nimport { LivestreamDetails } from 'libs/shared/apps/streamable-learning/components/livestream-details/LivestreamDetails';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CheckCircleSvg } from 'libs/shared/images/svg/status/CheckCircleSvg';\nimport { Livestream } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './livestream-booking-success.module.scss';\n\nconst namespace = 'livestream.bookingSuccess';\n\ninterface LivestreamBookingSuccessProps {\n livestream: Livestream;\n}\n\nexport function LivestreamBookingSuccess(props: LivestreamBookingSuccessProps) {\n return (\n <>\n <div\n className={`${styles.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`}\n >\n <BaseImage\n data={ImageHelper.createUrl(props.livestream.company.logo?.url, { size: ImageSize.Small })}\n alt={props.livestream.company.name}\n preload\n />\n </div>\n <div className='d-flex align-items-center justify-content-center mb-3 gap-1'>\n <SvgContainer svg={CheckCircleSvg} className='svg-container std text-success' />\n <h1 className='h3 mb-0 fw-semibold'><Text namespace={namespace} phrase='booked' /></h1>\n </div>\n <div className='my-3'>\n <LivestreamDetails\n companyId={props.livestream.company.id}\n companyName={props.livestream.company.name}\n eventName={props.livestream.name}\n audiences={props.livestream.audiences}\n startTime={props.livestream.startDateTime}\n endTime={props.livestream.endDateTime}\n />\n </div>\n <p><Text namespace={namespace} phrase='emailReminder' /></p>\n </>\n );\n}\n","import React from 'react';\n\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\ninterface LivestreamCoverImageProps {\n coverImageUrl: string;\n className?: string;\n}\n\nexport function LivestreamCoverImage(props: LivestreamCoverImageProps) {\n return (\n <div\n className={`${props.className}`}\n style={props.coverImageUrl && { backgroundImage: `url(${ImageHelper._createUrl(props.coverImageUrl, { size: ImageSize.Large })})` }}\n />\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { JobTitleInput } from 'libs/shared/apps/sign-up/components/steps/add-to-braze-step-item/JobTitleInput';\nimport { SearchLocalityInput } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchLocalityInput';\nimport { SearchSchoolInput } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchSchoolInput';\nimport { SearchSchoolData } from 'libs/shared/apps/sign-up/interfaces/SearchSchoolData';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\n\nconst namespace = 'livestream.livestreamView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst baseValidationSchema = Yup.object({\n firstName: Yup.string().required(getPhrase('firstNameRequired')),\n lastName: Yup.string().required(getPhrase('lastNameRequired')),\n email: Yup.string().email(getPhrase('emailValid')).required(getPhrase('emailRequired')),\n attendees: Yup.string().required(getPhrase('attendeesRequired'))\n});\n\nconst guestValidationSchema = baseValidationSchema.concat(Yup.object({\n schoolOrDistrict: Yup.string().required(getPhrase('schoolOrDistrictRequired')),\n jobTitle: Yup.string().required(getPhrase('jobTitleRequired')),\n phoneNumber: Yup.string().required(getPhrase('phoneNumberRequired')).matches(/^[0-9]+$/, getPhrase('phoneNumberValid'))\n}));\n\ninterface LivestreamFormFieldsProps {\n isAuthenticated: boolean;\n showSpinner: boolean;\n googleMapsApiKey: string;\n searchProspectsUrl: string;\n emailAddress: string;\n}\n\nfunction LivestreamFormFields(props: LivestreamFormFieldsProps) {\n const formikProps = useFormikContextWrapper<LivestreamBookingFormValues>();\n\n const [ searchSchoolData, setSearchSchoolData ] = React.useState<SearchSchoolData>({});\n const [ cantFindSchool, setCantFindSchool ] = React.useState<boolean>(false);\n\n function clearFormikSchoolData() {\n formikProps.setFieldValue('schoolOrDistrict', '');\n formikProps.setFieldValue('country', '');\n formikProps.setFieldValue('province', '');\n formikProps.setFieldValue('prospectId', '');\n triggerValidation();\n }\n\n function setLocalityData(data: SearchSchoolData): void {\n setSearchSchoolData({ ...searchSchoolData, ...data });\n clearFormikSchoolData();\n }\n\n function clearLocalityData(): void {\n setSearchSchoolData({});\n clearFormikSchoolData();\n }\n\n function setSchoolData(data: SearchSchoolData): void {\n setSearchSchoolData({ ...searchSchoolData, ...data });\n\n formikProps.setFieldValue('schoolOrDistrict', data.schoolName);\n formikProps.setFieldValue('country', data.country);\n formikProps.setFieldValue('province', data.province);\n formikProps.setFieldValue('prospectId', data.prospectId);\n\n triggerValidation();\n }\n\n function clearSchooldata(): void {\n setSearchSchoolData({\n ...searchSchoolData,\n prospectId: undefined,\n schoolName: undefined,\n schoolPostCode: undefined\n });\n clearFormikSchoolData();\n }\n\n function onClickNoSuggestions(name: string) {\n setCantFindSchool(true);\n\n formikProps.setFieldValue('schoolOrDistrict', name);\n\n triggerValidation();\n }\n\n // Forcing the form to validate needs to happen in a setTimeout to work — Formik quirk.\n function triggerValidation() {\n window.setTimeout(() => formikProps.validateForm(), 0);\n }\n\n return (\n <Form>\n <div className='row my-3'>\n <div className='col-12 col-sm-6'>\n <FormField\n label={getPhrase('firstName')}\n name='firstName'\n placeholder={getPhrase('firstNamePlaceholder')}\n value={formikProps.values?.firstName}\n disabled={props.isAuthenticated}\n showRequiredStar={!props.isAuthenticated}\n />\n </div>\n <div className='col-12 col-sm-6'>\n <FormField\n label={getPhrase('lastName')}\n name='lastName'\n placeholder={getPhrase('lastNamePlaceholder')}\n value={formikProps.values?.lastName}\n disabled={props.isAuthenticated}\n showRequiredStar={!props.isAuthenticated}\n />\n </div>\n <div className='col-12'>\n <FormField\n label={getPhrase('email')}\n name='email'\n placeholder={getPhrase('emailPlaceholder')}\n value={formikProps.values?.email}\n disabled={props.isAuthenticated && !!props.emailAddress}\n showRequiredStar={!props.isAuthenticated || !props.emailAddress}\n />\n </div>\n {!props.isAuthenticated &&\n <>\n <div className='col-12'>\n {!cantFindSchool ?\n <>\n <SearchLocalityInput\n data={searchSchoolData}\n setData={setLocalityData}\n clearData={clearLocalityData}\n labelClassName='form-label'\n geoLocation={{ countryCode: 'US' }}\n googleMapsApiKey={props.googleMapsApiKey}\n required\n hideOnBlur\n />\n <SearchSchoolInput\n data={searchSchoolData}\n setData={setSchoolData}\n clearData={clearSchooldata}\n disabled={!searchSchoolData.schoolLocality}\n searchUrl={props.searchProspectsUrl}\n onClickNoSuggestions={onClickNoSuggestions}\n required\n placeholder={!searchSchoolData.schoolLocality && getPhrase('schoolPlaceholder')}\n hideOnBlur\n />\n </> :\n <FormField\n label={getPhrase('schoolOrDistrict')}\n name='schoolOrDistrict'\n value={formikProps.values?.schoolOrDistrict}\n showRequiredStar={true}\n placeholder={getPhrase('schoolOrDistrictPlaceholder')}\n autoFocus\n />\n }\n </div>\n <div className='col-12'>\n <JobTitleInput\n id='job-title'\n error={formikProps.touched?.jobTitle && formikProps.errors?.jobTitle}\n countryCode={CountryCode.US}\n initialValue={formikProps.values?.jobTitle}\n onChange={jobTitle => formikProps.setFieldValue('jobTitle', jobTitle, false)}\n labelClassName='form-label'\n isTertiary={false}\n required\n />\n </div>\n </>\n }\n <div className='col-12 col-sm-6 col-xl-4'>\n <FormField\n type='number'\n label={getPhrase('attendees')}\n name='attendees'\n placeholder={getPhrase('attendeesPlaceholder')}\n min={1}\n value={formikProps.values?.attendees}\n showRequiredStar\n />\n </div>\n {!props.isAuthenticated && (\n <div className='col'>\n <FormField\n label={getPhrase('phoneNumber')}\n name='phoneNumber'\n placeholder={getPhrase('phoneNumberPlaceholder')}\n value={formikProps.values?.phoneNumber}\n showRequiredStar\n />\n </div>\n )}\n </div>\n <SpinnerButton type='submit' className='w-100' variant='dark' showSpinner={props.showSpinner} disabled={!formikProps.isValid} >\n <Text namespace={namespace} phrase='book' />\n </SpinnerButton>\n </Form>\n );\n}\n\nexport interface LivestreamBookingFormValues {\n firstName: string;\n lastName: string;\n email: string;\n attendees: string;\n schoolOrDistrict: string;\n jobTitle: string;\n phoneNumber: string;\n country: string;\n province: string;\n prospectId: string;\n}\n\ninterface LivestreamFormProps {\n initialValues: LivestreamBookingFormValues;\n isAuthenticated: boolean;\n showSpinner: boolean;\n onSubmit: (values: LivestreamBookingFormValues) => void;\n googleMapsApiKey: string;\n searchProspectsUrl: string;\n emailAddress: string;\n}\n\nexport function LivestreamForm(props: LivestreamFormProps) {\n return (\n <FormWrapper<LivestreamBookingFormValues>\n initialValues={props.initialValues}\n validationSchema={props.isAuthenticated ? baseValidationSchema : guestValidationSchema}\n validateOnMount={true}\n onSubmit={props.onSubmit}>\n <LivestreamFormFields\n emailAddress={props.emailAddress}\n isAuthenticated={props.isAuthenticated}\n showSpinner={props.showSpinner}\n googleMapsApiKey={props.googleMapsApiKey}\n searchProspectsUrl={props.searchProspectsUrl}\n />\n </FormWrapper>\n );\n}\n","import { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Livestream } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getLivestreamAppLink(\n livestream: Livestream,\n presentationSlug: string | null\n): Core.AppLink {\n return {\n application: AppChannels.LIVESTREAMS,\n action: Actions.Livestreams.LIVESTREAM,\n args: [ presentationSlug, livestream?.id, TextHelper.slugify(livestream?.name) ]\n };\n}\n","@import '~styles/utils/include-media';\n:local {\n .noRecording {\n background-color: $gray-100;\n }\n\n .coverImage {\n height: 100px;\n background-position: center 40%;\n background-size: cover;\n\n &.popup {\n @include media('>lg') {\n height: 100%;\n }\n }\n\n &.page {\n @include media('>md') {\n height: 100%;\n }\n }\n }\n}\n","import React from 'react';\nimport { type BrazeUser, StreamableFormEvent } from '@clickview/braze-client';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { useGetFetchAsync } from 'libs/common/react/flight';\nimport { Flight } from 'libs/common/react/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LivestreamBookingDescriptor, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ProspectLookup } from 'libs/shared/apps/sign-up/enums/ProspectLookup';\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { LivestreamDetails } from 'libs/shared/apps/streamable-learning/components/livestream-details/LivestreamDetails';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Popup, PopupProps } from 'libs/shared/components/popup/Popup';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurationStatusString } from 'libs/shared/enums/CurationStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { BrazeRequests } from 'libs/shared/flight-requests/BrazeRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBrazeClientService } from 'libs/shared/hooks/useBrazeClientService';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProfileApiClient } from 'libs/shared/hooks/UseProfileApiClient';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Livestream } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { BrazeSource } from 'shared/enums/BrazeSource';\nimport { BrazeConversion } from 'shared/enums/BrazeTopic';\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\nimport { useBookingQuota } from 'shared/hooks/useBookingQuota';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport {\n LivestreamBookingError\n} from 'apps/livestreams/components/livestream-booking-error/LivestreamBookingError';\nimport { LivestreamBookingQuota } from 'apps/livestreams/components/livestream-booking-quota/LivestreamBookingQuota';\nimport {\n LivestreamBookingSuccess\n} from 'apps/livestreams/components/livestream-booking-success/LivestreamBookingSuccess';\nimport {\n LivestreamCoverImage\n} from 'apps/livestreams/components/livestream-cover-image/LivestreamCoverImage';\nimport {\n LivestreamBookingFormValues,\n LivestreamForm\n} from 'apps/livestreams/components/livestream-form/LivestreamForm';\nimport {\n getLivestreamAppLink\n} from 'apps/livestreams/views/livestream/LivestreamViewUtils';\n\nimport styles from './livestream.module.scss';\n\nconst namespace = 'livestream.livestreamView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LivestreamBookingProps {\n livestream: Livestream;\n formStage: boolean;\n initialValues: LivestreamBookingFormValues;\n isAuthenticated: boolean;\n isStudent: boolean;\n success: boolean;\n error: boolean;\n isPastLivestream: boolean;\n showSpinner: boolean;\n onSubmit: (values: LivestreamBookingFormValues) => void;\n onTryAgain: () => void;\n setFormStage: React.Dispatch<React.SetStateAction<boolean>>;\n googleMapsApiKey: string;\n searchProspectsUrl: string;\n emailAddress: string;\n presentationSlug: string | null;\n bookingQuota: {\n showInfo: boolean,\n limitReached: boolean,\n used: number,\n max: number\n };\n}\n\nfunction LivestreamContent(props: LivestreamBookingProps) {\n const showAuthLinks = !props.isAuthenticated && !props.livestream.recording;\n const showUpgrade = props.bookingQuota.limitReached && props.isAuthenticated && !props.isStudent;\n const showBook =\n !showUpgrade &&\n !props.isPastLivestream &&\n !props.formStage &&\n (props.isAuthenticated && !props.isStudent);\n\n // \"Sign up to book\" opens the in-Lite sign-up popup (same path as the header CTA) so the\n // trial is created with the correct variant (clickview-live) and appLink (livestream:<id>),\n // both sourced from view-models the livestream page already populates (useDeepLinks).\n // No redirectUrl param here — those view-models drive the post-sign-up destination.\n const signUpLink = {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n\n const redirectUrl = Core.AppLinkHelper.getHref(Core.AppLinkHelper.getCurrentAppLink());\n\n const signInLink = {\n application: AppChannels.DEFAULT,\n action: Actions.Default.CHALLENGE,\n params: redirectUrl !== '/' ? { redirectUrl } : {}\n };\n\n const upgradeLink = {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.UPGRADE\n };\n\n const companyAppLink = {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.PARTNER_DASHBOARD,\n args: [ props.presentationSlug, props.livestream.company.id, TextHelper.slugify(props.livestream.company.name) ]\n };\n \n return (\n <>\n {!props.success && !props.error && (\n <>\n <LivestreamDetails\n logoUrl={props.livestream.company.logo?.url}\n logoBgColour={props.livestream.company.metadata?.colour}\n companyId={props.livestream.company.id}\n companyName={props.livestream.company.name}\n eventName={props.livestream.name}\n audiences={props.livestream.audiences}\n startTime={props.livestream.startDateTime}\n endTime={props.livestream.endDateTime}\n description={!props.formStage && props.livestream.description}\n isPastLivestream={props.isPastLivestream}\n companyAppLink={companyAppLink}\n />\n {props.bookingQuota.showInfo && (\n <LivestreamBookingQuota\n showUpgrade={showUpgrade}\n max={props.bookingQuota.max}\n used={props.bookingQuota.used}\n upgradeAppLink={upgradeLink}\n />\n )}\n {props.formStage && (\n <LivestreamForm\n emailAddress={props.emailAddress}\n initialValues={props.initialValues}\n isAuthenticated={props.isAuthenticated}\n showSpinner={props.showSpinner}\n onSubmit={props.onSubmit}\n googleMapsApiKey={props.googleMapsApiKey}\n searchProspectsUrl={props.searchProspectsUrl}\n />\n )}\n {showBook && (\n <button\n className={classNames('btn btn-dark w-100', { 'mt-3': props.bookingQuota.showInfo })}\n onClick={() => props.setFormStage(true)}\n >\n <Text namespace={namespace} phrase='book' />\n </button>\n )}\n {props.isPastLivestream && !props.livestream.recording &&\n <div className={`${styles.noRecording} p-2 rounded`}>\n <Text namespace={namespace} phrase='noRecording' />\n </div>\n }\n {props.livestream.recording &&\n <AppLink\n appLink={{\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [\n props.presentationSlug,\n props.livestream.recording.id,\n TextHelper.slugify(props.livestream.recording.name)\n ]\n }}>\n <button className='btn btn-outline-dark w-100'><Text namespace={namespace} phrase='recording' /></button>\n </AppLink>\n }\n\n {showAuthLinks &&\n <>\n <AppLink\n className='mt-3 btn btn-dark w-100'\n appLink={signUpLink}\n >\n <Text namespace={namespace} phrase='signUpButton' />\n </AppLink>\n <p className='mt-3 mb-0 text-center small text-secondary'>\n <Text namespace={namespace} phrase='alreadyHaveAccount' />\n <AppLink\n className='info-link ms-1'\n appLink={signInLink}\n >\n <Text namespace={namespace} phrase='signInButton' />\n </AppLink>\n </p>\n </>\n }\n </>\n )}\n {props.success && (\n <LivestreamBookingSuccess livestream={props.livestream} />\n )}\n {props.error && (\n <LivestreamBookingError onTryAgain={props.onTryAgain} />\n )}\n </>\n );\n}\n\ninterface LivestreamPopupProps extends LivestreamBookingProps {\n closePopup: () => void;\n}\n\nfunction LivestreamPopup(props: LivestreamPopupProps) {\n function onClose() {\n props.closePopup();\n\n ScrollHelper.preventScrollTop();\n\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n const isLivestreamAppLink =\n currentAppLink.application === AppChannels.LIVESTREAMS &&\n currentAppLink.action === Actions.Livestreams.LIVESTREAM;\n if (isLivestreamAppLink)\n Core.AppLinkHelper.trigger(ContextService.getPreviousRoute()?.appLink);\n }\n\n return (\n <Popup\n size='xl'\n bodyClassName='rounded-3 overflow-hidden p-0'\n closePopup={onClose}\n >\n <button className='btn-close position-absolute top-0 end-0 p-3' onClick={onClose} />\n\n <div className='row g-0'>\n <div className='col-12 col-lg-6'>\n <LivestreamCoverImage className={`${styles.coverImage} ${styles.popup}`} coverImageUrl={props.livestream.company.cover?.url} />\n </div>\n <div className='col-12 col-lg p-4 m-lg-2'>\n <LivestreamContent {...props} />\n </div>\n </div>\n </Popup>\n );\n}\n\ninterface LivestreamPageProps extends LivestreamBookingProps { }\n\nfunction LivestreamPage(props: LivestreamPageProps) {\n return (\n <div className='row g-0 px-3'>\n <div className='col-12 col-md-6 col-lg-5'>\n <LivestreamCoverImage className={`${styles.coverImage} ${styles.page} rounded`} coverImageUrl={props.livestream.company.cover?.url} />\n </div>\n <div className='col-12 col-md px-md-3 pt-2 pt-md-0'>\n <LivestreamContent {...props} />\n </div>\n </div>\n );\n}\n\ninterface LivestreamViewProps extends PopupProps {\n id: string;\n fromPageLoad: boolean;\n presentationSlug: string | null;\n}\n\nexport function LivestreamView(props: LivestreamViewProps) {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const fetchAsync = useGetFetchAsync();\n const braze = useBrazeClientService<BrazeConversion, BrazeSource>();\n const [ formStage, _setFormStage ] = React.useState(false);\n const [ success, setSuccess ] = React.useState(false);\n const [ error, setError ] = React.useState(false);\n const [ submitting, setSubmitting ] = React.useState(false);\n const [ initialValues, setInitialValues ] = React.useState<LivestreamBookingFormValues>({\n firstName: '',\n lastName: '',\n email: '',\n attendees: '',\n schoolOrDistrict: '',\n jobTitle: '',\n phoneNumber: '',\n country: '',\n province: '',\n prospectId: ''\n });\n\n const { createOrUpdateProfile } = useProfileApiClient();\n const bookingQuota = useBookingQuota();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const livestream = Flight.useBasicFetch<Livestream>(LivestreamRequests.livestream(props.id));\n\n const { hasPermissions } = usePermissions();\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n\n useDeepLinks({ id: props.id, app: 'livestreams' });\n\n const pageMetadata = PageMetadataHelper.getDefaultMetadata({\n title: livestream.data?.name,\n description: livestream.data?.description,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n customAppLink: getLivestreamAppLink(livestream.data, props.presentationSlug)\n }),\n allowIndexing: true\n });\n\n useSetPageMetadata({\n ...pageMetadata,\n _isPopupUp: !props.fromPageLoad\n });\n\n useHandleObjectError(livestream);\n\n React.useEffect(() => {\n if (!livestream.data || livestream.data?.status === CurationStatusString.Published) return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [livestream.data?.status]);\n\n React.useEffect(() => {\n if (!currentUser.data?.isAuthenticated) return;\n\n setInitialValues({\n ...initialValues,\n firstName: currentUser.data.givenName,\n lastName: currentUser.data.familyName,\n email: currentUser.data.email\n });\n }, [currentUser.data?.isAuthenticated]);\n\n async function onSubmit(values: LivestreamBookingFormValues) {\n if (bookingQuota.hasBookingLimitations && bookingQuota.hasReachedBookingLimit) {\n setError(true);\n return;\n }\n \n try {\n setSubmitting(true);\n setInitialValues(values);\n\n await fetchAsync(LivestreamRequests.createBooking({\n eventId: livestream.data.id,\n eventType: 'Livestream',\n firstName: values.firstName,\n lastName: values.lastName,\n email: values.email,\n attendees: values.attendees,\n status: 1\n }));\n\n if (!currentUser.data?.isAuthenticated) {\n createOrUpdateProfile({\n email: values.email,\n firstName: values.firstName,\n lastName: values.lastName,\n phone: values.phoneNumber,\n countryCode: values.country\n });\n }\n\n logAnalyticsEvent(WorkflowPhase.Complete);\n logBrazeEvent(values);\n\n setSuccess(true);\n } catch {\n setError(true);\n _setFormStage(false);\n } finally {\n setSubmitting(false);\n }\n }\n\n function onTryAgain() {\n setError(false);\n _setFormStage(true);\n }\n\n function setFormStage() {\n _setFormStage(true);\n logAnalyticsEvent(WorkflowPhase.Start);\n }\n\n function logAnalyticsEvent(workflowPhase: WorkflowPhase) {\n AnalyticsHelper.logUserAction({\n id: livestream.data.id,\n name: livestream.data.name\n }, {\n entity: EntityType.Livestream,\n actionType: UserAction.Submit,\n location: LocationContext.LivestreamBookingForm,\n descriptor: props.fromPageLoad ?\n LivestreamBookingDescriptor.FullPage :\n LivestreamBookingDescriptor.Popup,\n workflowPhase\n });\n }\n\n async function logBrazeEvent(values: LivestreamBookingFormValues) {\n const eventSource = BrazeSource.LivestreamBooking;\n \n try {\n await fetchAsync(BrazeRequests.createUser({\n email: values.email,\n source: eventSource,\n instanceRegion: currentUser.data?.instanceRegion,\n syncToCrm: true\n }));\n } catch {}\n \n try {\n let crmId: string;\n\n if (values.prospectId) {\n const prospectLookups = await fetchAsync<ProspectLookup[]>(BrazeRequests.prospectLookups(values.prospectId));\n crmId = prospectLookups?.find(l => l.type === 'crm_id')?.externalId;\n }\n\n const brazeUser: BrazeUser = {\n email: values.email,\n firstName: values.firstName,\n lastName: values.lastName,\n phone: values.phoneNumber,\n custom: {\n accountAddress: values?.province ? {\n countryCode: values?.country,\n province: BrazeHelper.parseProvince(values?.province || '')\n } : undefined,\n accountName: values.schoolOrDistrict,\n jobTitle: values.jobTitle,\n crmId: crmId || undefined\n }\n };\n\n braze.logFormSubmission({\n eventType: StreamableFormEvent.LivestreamBookingFormSubmit,\n source: eventSource,\n conversion: BrazeConversion.LivestreamBooking,\n user: brazeUser,\n productType: 'sl'\n });\n } catch (err) {\n console.error('Failed to log submission event to Braze', err);\n }\n }\n\n const hasLoaded = (\n livestream.hasCompleted &&\n bookingQuota.isLoaded &&\n config.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n const livestreamBookingProps: LivestreamBookingProps = {\n livestream: livestream.data,\n formStage,\n initialValues,\n isAuthenticated: currentUser.data?.isAuthenticated,\n isStudent,\n success,\n error,\n isPastLivestream: DateHelper.isBefore(livestream.data.endDateTime, new Date()),\n showSpinner: submitting,\n onSubmit,\n onTryAgain,\n setFormStage,\n googleMapsApiKey: config.data.googleMapsApiKey,\n searchProspectsUrl: UrlHelper.safeUrlConcat(config.data.gatewayApiUrl, '/v1/search/prospects'),\n emailAddress: currentUser.data?.email,\n presentationSlug: props.presentationSlug,\n bookingQuota: {\n showInfo: bookingQuota.hasBookingLimitations,\n limitReached: bookingQuota.hasReachedBookingLimit,\n used: bookingQuota.bookingsUsed,\n max: bookingQuota.totalBookingsAvailable\n }\n };\n\n if (props.fromPageLoad) {\n return (\n <LivestreamPage {...livestreamBookingProps} />\n );\n }\n\n return <LivestreamPopup {...livestreamBookingProps} closePopup={props.closePopup} />;\n}\n","import React from 'react';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\n\nimport { createPresentationDispatcherView } from 'shared/utils/createPresentationDispatcherView';\n\nimport {\n LivestreamView\n} from 'apps/livestreams/views/livestream/livestream/LivestreamView';\n\ninterface LivestreamRouteProps {\n presentationSlug: string | null;\n id: string;\n fromPageLoad: boolean;\n closePopup: () => void;\n}\n\nexport const BaseLivestreamView = createPresentationDispatcherView<LivestreamRouteProps>({\n [PresentationType.StreamableLearning]: ctx => (\n <LivestreamView\n id={ctx.id}\n fromPageLoad={ctx.fromPageLoad}\n closePopup={ctx.closePopup}\n presentationSlug={ctx.presentationSlug}\n />\n )\n});\n\nBaseLivestreamView.displayName = 'BaseLivestreamView';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"1WHinyQW.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/streamable-learning/components/livestream-details/livestream-details.module.scss","../../../../libs/shared/src/apps/streamable-learning/components/livestream-details/LivestreamDetails.tsx","../../../../libs/shared/src/hooks/useBrazeClientService.ts","../../src/shared/enums/BrazeSource.ts","../../src/shared/enums/BrazeTopic.ts","../../src/shared/hooks/useBookingQuota.ts","../../src/apps/livestreams/components/livestream-booking-error/livestream-booking-error.module.scss","../../src/apps/livestreams/components/livestream-booking-error/LivestreamBookingError.tsx","../../src/apps/livestreams/components/livestream-booking-quota/LivestreamBookingQuota.tsx","../../src/apps/livestreams/components/livestream-booking-success/livestream-booking-success.module.scss","../../src/apps/livestreams/components/livestream-booking-success/LivestreamBookingSuccess.tsx","../../src/apps/livestreams/components/livestream-cover-image/LivestreamCoverImage.tsx","../../src/apps/livestreams/components/livestream-form/LivestreamForm.tsx","../../src/apps/livestreams/views/livestream/LivestreamViewUtils.ts","../../src/apps/livestreams/views/livestream/livestream/livestream.module.scss","../../src/apps/livestreams/views/livestream/livestream/LivestreamView.tsx","../../src/apps/livestreams/views/livestream/BaseLivestreamView.tsx"],"sourcesContent":[":local {\n .logoContainer {\n width: 3.75rem;\n height: 3.75rem;\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { TimezoneHelper } from 'libs/shared/apps/streamable-learning/utils/TimezoneHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CalendarCheckSvg } from 'libs/shared/images/svg/objects/CalendarCheckSvg';\nimport { CalendarSvg } from 'libs/shared/images/svg/objects/CalendarSvg';\nimport { GlobeSvg } from 'libs/shared/images/svg/objects/GlobeSvg';\nimport { TimerSvg } from 'libs/shared/images/svg/status/TimerSvg';\nimport { Audience, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './livestream-details.module.scss';\n\nconst namespace = 'streamable.livestreamDetails';\n\ninterface LivestreamDetailsProps {\n logoUrl?: string;\n logoBgColour?: string;\n companyId?: string;\n companyName?: string;\n companyAppLink?: Core.AppLink;\n eventName: string;\n audiences?: Audience[];\n startTime: string;\n endTime: string;\n description?: string;\n isPastLivestream?: boolean;\n timezone?: string;\n}\n\nexport function LivestreamDetails(props: LivestreamDetailsProps) {\n function getDuration() {\n return `${DateHelper.diffBetween(props.endTime, props.startTime, 'minutes')}m`;\n }\n\n function getTimezoneDateTime(dateTime: string): Date {\n return TimezoneHelper.convertUTCToTimezoneDate(dateTime);\n }\n\n function getTime(time: string): string {\n return DateHelper.format(getTimezoneDateTime(time), 'h:mma');\n }\n\n function getDate(date: string): string {\n return DateHelper.format(getTimezoneDateTime(date), 'Do MMMM');\n }\n\n function getDisplayTimezone(timezone?: string): string {\n return TimezoneHelper.getTimezoneInfo(timezone).longGeneric;\n }\n\n function getMergedAudienceName(): string {\n return AudienceHelper.getMergedPresentationAudienceString(props.audiences as PresentationAudience[])?.name;\n }\n\n const logoFallbackBgClassName = getBgColorClass(props.companyName, BG_COLOUR_CLASS_NAMES);\n\n return (\n <>\n <div className='d-flex align-items-center mb-2'>\n {props.logoUrl && (\n <AppLink\n appLink={props.companyAppLink}\n >\n <div className={`${styles.logoContainer} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background me-2`}>\n <BaseImage\n data={ImageHelper.createUrl(props.logoUrl, { size: ImageSize.Small })}\n alt={props.companyName}\n className={!props.logoBgColour && logoFallbackBgClassName}\n imageStyle={{\n backgroundColor: props.logoBgColour\n }}\n preload\n />\n </div>\n </AppLink>\n\n )}\n <div className='d-flex flex-column justify-content-between'>\n {props.companyName &&\n <AppLink\n appLink={props.companyAppLink}\n className='text-uppercase text-wrap d-block text-truncate mb-0'\n title={props.companyName}\n >\n {props.companyName}\n </AppLink>\n }\n <h1 className='h4 mb-0'>{props.eventName}</h1>\n </div>\n </div>\n\n <div className='d-flex gap-2 mb-3'>\n {!!props.audiences?.length && (\n <div className='rounded-pill border border-dark px-2'>\n {getMergedAudienceName()}\n </div>\n )}\n <div className='rounded-pill fw-semibold bg-dark text-white px-2'>\n <span className='align-middle'>{getDuration()}</span>\n </div>\n </div>\n\n {props.isPastLivestream && (\n <div className='d-inline-block bg-light-green rounded-pill mb-3'>\n <SvgContainer svg={CalendarCheckSvg} />\n <p className='d-inline ms-1 mb-0'><Text namespace={namespace} phrase='pastEvent' /></p>\n </div>\n )}\n\n {!props.isPastLivestream && (\n <>\n <p className='mb-2'>\n <SvgContainer svg={TimerSvg} size={SvgContainerSize.Small} />\n <span className='ms-1'>{getTime(props.startTime)}</span>\n </p>\n <p className='mb-2'>\n <SvgContainer svg={CalendarSvg} size={SvgContainerSize.Small} />\n <span className='ms-1'>{getDate(props.startTime)}</span>\n </p>\n <p className='mb-3'>\n <SvgContainer svg={GlobeSvg} size={SvgContainerSize.Small} />\n <span className='ms-1'>{getDisplayTimezone(props.timezone)}</span>\n </p>\n </>\n )}\n\n {props.description && <p className='mb-3 pre-wrap text-break' dangerouslySetInnerHTML={{ __html: TextHelper.sanitize(LinkifyHelper.linkifyText(props.description)) }} />}\n </>\n );\n}\n","import { type BrazeUser, type FormEventType } from '@clickview/braze-client';\n\nimport { useInstanceSafe } from 'libs/common/react/hooks/UseInstance';\n\nimport { SharedServices } from 'libs/shared/constants/SharedServices';\nimport { BrazeClientService } from 'libs/shared/services/BrazeClientService';\n\ninterface HydrateUserDataOptions {\n conversion: string;\n source: string;\n}\n\nfunction hydrateUserData(user: BrazeUser, data: HydrateUserDataOptions): BrazeUser {\n return {\n ...user,\n custom: {\n ...user?.custom,\n source: data.source\n },\n event: {\n ...user?.event,\n conversion: data.conversion\n }\n };\n}\n\nexport interface LogFormSubmissionOptions<TConversion extends string, TSource extends string> {\n conversion: TConversion;\n source: TSource;\n eventType: FormEventType;\n user: BrazeUser;\n productType: 'cv' | 'sl';\n additionalData?: Record<string, any>;\n callback?: (success: boolean) => void;\n}\n\nexport function useBrazeClientService<TConversion extends string, TSource extends string>() {\n const braze = useInstanceSafe<BrazeClientService>(SharedServices.BrazeClient);\n\n function logFormSubmission({\n user,\n additionalData,\n source,\n eventType,\n conversion,\n productType,\n callback\n }: LogFormSubmissionOptions<TConversion, TSource>) {\n const brazeUser = hydrateUserData(user, {\n source,\n conversion\n });\n\n braze.setUserInit(brazeUser);\n \n braze.logFormEvent({\n eventType,\n additionalData,\n callback,\n internalOptions: {\n subscriptionGroups: productType\n }\n });\n }\n\n return {\n client: braze,\n logFormSubmission\n };\n}\n","export enum BrazeSource {\n LivestreamBooking = 'cv_product_livestream'\n}\n","export enum BrazeConversion {\n LivestreamBooking = 'Submit - Livestream Booking'\n}\n","import { Flight } from 'libs/common/react/index';\n\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAccessPolicy } from 'libs/shared/hooks/useAccessPolicy';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\n\nexport function useBookingQuota() {\n const { accessPolicy, isLoaded: accessPolicyLoaded } = useAccessPolicy();\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const hasBookingLimitations = !!accessPolicy?.metadata?.maxLiveBookings;\n\n const bookingCount = Flight.useBasicFetch<{ count: number }>(\n currentUser.data?.isAuthenticated &&\n hasBookingLimitations &&\n LivestreamRequests.customerLifetimeBookingCount()\n );\n\n const isLoaded = currentUser.hasCompleted\n && (hasBookingLimitations ?\n bookingCount.hasCompleted && accessPolicyLoaded :\n true\n );\n\n // Flat cap — no referral bonus (unlike streams).\n const totalBookingsAvailable = accessPolicy?.metadata?.maxLiveBookings ?? Number.MAX_SAFE_INTEGER;\n const bookingsUsed = bookingCount.data?.count ?? 0;\n const hasReachedBookingLimit = bookingsUsed >= totalBookingsAvailable;\n\n return {\n isLoaded,\n accessPolicy,\n bookingsUsed,\n totalBookingsAvailable,\n hasReachedBookingLimit,\n hasBookingLimitations\n };\n}\n",":local {\n .logo,\n .image {\n height: 9.25rem;\n width: 9.25rem;\n }\n}\n","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './livestream-booking-error.module.scss';\n\nconst namespace = 'livestream.bookingError';\n\ninterface LivestreamBookingErrorProps {\n onTryAgain: () => void;\n}\n\nexport function LivestreamBookingError(props: LivestreamBookingErrorProps) {\n return (\n <div className='d-flex flex-column justify-content-center'>\n <div\n className={`${styles.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`}\n >\n <img\n className={styles.image}\n src={ImageUrls.Live.General.LOST_MESSAGE_BOTTLE}\n />\n </div>\n <h3 className='text-center mb-3'><Text namespace={namespace} phrase='heading' /></h3>\n <p className='text-center mb-3'><Text namespace={namespace} phrase='description' /></p>\n <button className='btn btn-dark' onClick={props.onTryAgain}><Text namespace={namespace} phrase='buttonLabel' /></button>\n </div>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'livestream.liveStreamBookingQuota';\n\ninterface LivestreamBookingQuotaProps {\n showUpgrade: boolean;\n upgradeAppLink: Core.AppLink;\n max: number;\n used: number;\n}\n\nexport function LivestreamBookingQuota(props: LivestreamBookingQuotaProps) {\n return (\n <div className='bg-light-blue rounded p-2 mt-3 d-flex flex-column gap-2' role='alert'>\n <div>\n <strong><Text namespace={namespace} phrase='bookingQuota' /></strong>\n \n <Text namespace={namespace} phrase='bookingQuotaUsed' options={{\n bookingQuota: props.max,\n bookingQuotaUsed: props.used\n }} />\n </div>\n {props.showUpgrade && (\n <div >\n <Text namespace={namespace} phrase='bookingQuotaReached' />\n \n <Text namespace={namespace} phrase='requestUpgradePrefix' />\n \n <AppLink\n className='btn-link d-inline-block text-info'\n appLink={props.upgradeAppLink}\n >\n <Text namespace={namespace} phrase='requestUpgrade' />\n </AppLink>\n .\n </div>\n )}\n </div>\n );\n}\n",":local {\n .logo {\n height: 9.25rem;\n width: 9.25rem;\n }\n}\n","import React from 'react';\n\nimport { LivestreamDetails } from 'libs/shared/apps/streamable-learning/components/livestream-details/LivestreamDetails';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { CheckCircleSvg } from 'libs/shared/images/svg/status/CheckCircleSvg';\nimport { Livestream } from 'libs/shared/interfaces';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\nimport styles from './livestream-booking-success.module.scss';\n\nconst namespace = 'livestream.bookingSuccess';\n\ninterface LivestreamBookingSuccessProps {\n livestream: Livestream;\n}\n\nexport function LivestreamBookingSuccess(props: LivestreamBookingSuccessProps) {\n return (\n <>\n <div\n className={`${styles.logo} rounded-circle flex-shrink-0 overflow-hidden partial-loading-background mx-auto mb-3`}\n >\n <BaseImage\n data={ImageHelper.createUrl(props.livestream.company.logo?.url, { size: ImageSize.Small })}\n alt={props.livestream.company.name}\n preload\n />\n </div>\n <div className='d-flex align-items-center justify-content-center mb-3 gap-1'>\n <SvgContainer svg={CheckCircleSvg} className='svg-container std text-success' />\n <h1 className='h3 mb-0 fw-semibold'><Text namespace={namespace} phrase='booked' /></h1>\n </div>\n <div className='my-3'>\n <LivestreamDetails\n companyId={props.livestream.company.id}\n companyName={props.livestream.company.name}\n eventName={props.livestream.name}\n audiences={props.livestream.audiences}\n startTime={props.livestream.startDateTime}\n endTime={props.livestream.endDateTime}\n />\n </div>\n <p><Text namespace={namespace} phrase='emailReminder' /></p>\n </>\n );\n}\n","import React from 'react';\n\nimport { ImageSize } from 'libs/shared/enums/Images';\nimport { ImageHelper } from 'libs/shared/utils/ImageHelper';\n\ninterface LivestreamCoverImageProps {\n coverImageUrl: string;\n className?: string;\n}\n\nexport function LivestreamCoverImage(props: LivestreamCoverImageProps) {\n return (\n <div\n className={`${props.className}`}\n style={props.coverImageUrl && { backgroundImage: `url(${ImageHelper._createUrl(props.coverImageUrl, { size: ImageSize.Large })})` }}\n />\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\nimport * as Yup from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { JobTitleInput } from 'libs/shared/apps/sign-up/components/steps/add-to-braze-step-item/JobTitleInput';\nimport { SearchLocalityInput } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchLocalityInput';\nimport { SearchSchoolInput } from 'libs/shared/apps/sign-up/components/steps/search-school-step-item/SearchSchoolInput';\nimport { SearchSchoolData } from 'libs/shared/apps/sign-up/interfaces/SearchSchoolData';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CountryCode } from 'libs/shared/enums/CountryCode';\n\nconst namespace = 'livestream.livestreamView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst baseValidationSchema = Yup.object({\n firstName: Yup.string().required(getPhrase('firstNameRequired')),\n lastName: Yup.string().required(getPhrase('lastNameRequired')),\n email: Yup.string().email(getPhrase('emailValid')).required(getPhrase('emailRequired')),\n attendees: Yup.string().required(getPhrase('attendeesRequired'))\n});\n\nconst guestValidationSchema = baseValidationSchema.concat(Yup.object({\n schoolOrDistrict: Yup.string().required(getPhrase('schoolOrDistrictRequired')),\n jobTitle: Yup.string().required(getPhrase('jobTitleRequired')),\n phoneNumber: Yup.string().required(getPhrase('phoneNumberRequired')).matches(/^[0-9]+$/, getPhrase('phoneNumberValid'))\n}));\n\ninterface LivestreamFormFieldsProps {\n isAuthenticated: boolean;\n showSpinner: boolean;\n googleMapsApiKey: string;\n searchProspectsUrl: string;\n emailAddress: string;\n}\n\nfunction LivestreamFormFields(props: LivestreamFormFieldsProps) {\n const formikProps = useFormikContextWrapper<LivestreamBookingFormValues>();\n\n const [ searchSchoolData, setSearchSchoolData ] = React.useState<SearchSchoolData>({});\n const [ cantFindSchool, setCantFindSchool ] = React.useState<boolean>(false);\n\n function clearFormikSchoolData() {\n formikProps.setFieldValue('schoolOrDistrict', '');\n formikProps.setFieldValue('country', '');\n formikProps.setFieldValue('province', '');\n formikProps.setFieldValue('prospectId', '');\n triggerValidation();\n }\n\n function setLocalityData(data: SearchSchoolData): void {\n setSearchSchoolData({ ...searchSchoolData, ...data });\n clearFormikSchoolData();\n }\n\n function clearLocalityData(): void {\n setSearchSchoolData({});\n clearFormikSchoolData();\n }\n\n function setSchoolData(data: SearchSchoolData): void {\n setSearchSchoolData({ ...searchSchoolData, ...data });\n\n formikProps.setFieldValue('schoolOrDistrict', data.schoolName);\n formikProps.setFieldValue('country', data.country);\n formikProps.setFieldValue('province', data.province);\n formikProps.setFieldValue('prospectId', data.prospectId);\n\n triggerValidation();\n }\n\n function clearSchooldata(): void {\n setSearchSchoolData({\n ...searchSchoolData,\n prospectId: undefined,\n schoolName: undefined,\n schoolPostCode: undefined\n });\n clearFormikSchoolData();\n }\n\n function onClickNoSuggestions(name: string) {\n setCantFindSchool(true);\n\n formikProps.setFieldValue('schoolOrDistrict', name);\n\n triggerValidation();\n }\n\n // Forcing the form to validate needs to happen in a setTimeout to work — Formik quirk.\n function triggerValidation() {\n window.setTimeout(() => formikProps.validateForm(), 0);\n }\n\n return (\n <Form>\n <div className='row my-3'>\n <div className='col-12 col-sm-6'>\n <FormField\n label={getPhrase('firstName')}\n name='firstName'\n placeholder={getPhrase('firstNamePlaceholder')}\n value={formikProps.values?.firstName}\n disabled={props.isAuthenticated}\n showRequiredStar={!props.isAuthenticated}\n />\n </div>\n <div className='col-12 col-sm-6'>\n <FormField\n label={getPhrase('lastName')}\n name='lastName'\n placeholder={getPhrase('lastNamePlaceholder')}\n value={formikProps.values?.lastName}\n disabled={props.isAuthenticated}\n showRequiredStar={!props.isAuthenticated}\n />\n </div>\n <div className='col-12'>\n <FormField\n label={getPhrase('email')}\n name='email'\n placeholder={getPhrase('emailPlaceholder')}\n value={formikProps.values?.email}\n disabled={props.isAuthenticated && !!props.emailAddress}\n showRequiredStar={!props.isAuthenticated || !props.emailAddress}\n />\n </div>\n {!props.isAuthenticated &&\n <>\n <div className='col-12'>\n {!cantFindSchool ?\n <>\n <SearchLocalityInput\n data={searchSchoolData}\n setData={setLocalityData}\n clearData={clearLocalityData}\n labelClassName='form-label'\n geoLocation={{ countryCode: 'US' }}\n googleMapsApiKey={props.googleMapsApiKey}\n required\n hideOnBlur\n />\n <SearchSchoolInput\n data={searchSchoolData}\n setData={setSchoolData}\n clearData={clearSchooldata}\n disabled={!searchSchoolData.schoolLocality}\n searchUrl={props.searchProspectsUrl}\n onClickNoSuggestions={onClickNoSuggestions}\n required\n placeholder={!searchSchoolData.schoolLocality && getPhrase('schoolPlaceholder')}\n hideOnBlur\n />\n </> :\n <FormField\n label={getPhrase('schoolOrDistrict')}\n name='schoolOrDistrict'\n value={formikProps.values?.schoolOrDistrict}\n showRequiredStar={true}\n placeholder={getPhrase('schoolOrDistrictPlaceholder')}\n autoFocus\n />\n }\n </div>\n <div className='col-12'>\n <JobTitleInput\n id='job-title'\n error={formikProps.touched?.jobTitle && formikProps.errors?.jobTitle}\n countryCode={CountryCode.US}\n initialValue={formikProps.values?.jobTitle}\n onChange={jobTitle => formikProps.setFieldValue('jobTitle', jobTitle, false)}\n labelClassName='form-label'\n isTertiary={false}\n required\n />\n </div>\n </>\n }\n <div className='col-12 col-sm-6 col-xl-4'>\n <FormField\n type='number'\n label={getPhrase('attendees')}\n name='attendees'\n placeholder={getPhrase('attendeesPlaceholder')}\n min={1}\n value={formikProps.values?.attendees}\n showRequiredStar\n />\n </div>\n {!props.isAuthenticated && (\n <div className='col'>\n <FormField\n label={getPhrase('phoneNumber')}\n name='phoneNumber'\n placeholder={getPhrase('phoneNumberPlaceholder')}\n value={formikProps.values?.phoneNumber}\n showRequiredStar\n />\n </div>\n )}\n </div>\n <SpinnerButton type='submit' className='w-100' variant='dark' showSpinner={props.showSpinner} disabled={!formikProps.isValid} >\n <Text namespace={namespace} phrase='book' />\n </SpinnerButton>\n </Form>\n );\n}\n\nexport interface LivestreamBookingFormValues {\n firstName: string;\n lastName: string;\n email: string;\n attendees: string;\n schoolOrDistrict: string;\n jobTitle: string;\n phoneNumber: string;\n country: string;\n province: string;\n prospectId: string;\n}\n\ninterface LivestreamFormProps {\n initialValues: LivestreamBookingFormValues;\n isAuthenticated: boolean;\n showSpinner: boolean;\n onSubmit: (values: LivestreamBookingFormValues) => void;\n googleMapsApiKey: string;\n searchProspectsUrl: string;\n emailAddress: string;\n}\n\nexport function LivestreamForm(props: LivestreamFormProps) {\n return (\n <FormWrapper<LivestreamBookingFormValues>\n initialValues={props.initialValues}\n validationSchema={props.isAuthenticated ? baseValidationSchema : guestValidationSchema}\n validateOnMount={true}\n onSubmit={props.onSubmit}>\n <LivestreamFormFields\n emailAddress={props.emailAddress}\n isAuthenticated={props.isAuthenticated}\n showSpinner={props.showSpinner}\n googleMapsApiKey={props.googleMapsApiKey}\n searchProspectsUrl={props.searchProspectsUrl}\n />\n </FormWrapper>\n );\n}\n","import { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Livestream } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function getLivestreamAppLink(\n livestream: Livestream,\n presentationSlug: string | null\n): Core.AppLink {\n return {\n application: AppChannels.LIVESTREAMS,\n action: Actions.Livestreams.LIVESTREAM,\n args: [ presentationSlug, livestream?.id, TextHelper.slugify(livestream?.name) ]\n };\n}\n","@import '~styles/utils/include-media';\n:local {\n .noRecording {\n background-color: $gray-100;\n }\n\n .coverImage {\n height: 100px;\n background-position: center 40%;\n background-size: cover;\n\n &.popup {\n @include media('>lg') {\n height: 100%;\n }\n }\n\n &.page {\n @include media('>md') {\n height: 100%;\n }\n }\n }\n}\n","import React from 'react';\nimport { type BrazeUser, StreamableFormEvent } from '@clickview/braze-client';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { ScrollHelper } from 'libs/common/backbone/utils/ScrollHelper';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { useGetFetchAsync } from 'libs/common/react/flight';\nimport { Flight } from 'libs/common/react/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LivestreamBookingDescriptor, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ProspectLookup } from 'libs/shared/apps/sign-up/enums/ProspectLookup';\nimport { BrazeHelper } from 'libs/shared/apps/sign-up/helpers/BrazeHelper';\nimport { LivestreamDetails } from 'libs/shared/apps/streamable-learning/components/livestream-details/LivestreamDetails';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Popup, PopupProps } from 'libs/shared/components/popup/Popup';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { CurationStatusString } from 'libs/shared/enums/CurationStatus';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { BrazeRequests } from 'libs/shared/flight-requests/BrazeRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useBrazeClientService } from 'libs/shared/hooks/useBrazeClientService';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProfileApiClient } from 'libs/shared/hooks/UseProfileApiClient';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, Livestream } from 'libs/shared/interfaces';\nimport { ContextService } from 'libs/shared/services/ContextService';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { BrazeSource } from 'shared/enums/BrazeSource';\nimport { BrazeConversion } from 'shared/enums/BrazeTopic';\nimport { LivestreamRequests } from 'shared/flight-requests/LivestreamRequests';\nimport { useBookingQuota } from 'shared/hooks/useBookingQuota';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\n\nimport {\n LivestreamBookingError\n} from 'apps/livestreams/components/livestream-booking-error/LivestreamBookingError';\nimport { LivestreamBookingQuota } from 'apps/livestreams/components/livestream-booking-quota/LivestreamBookingQuota';\nimport {\n LivestreamBookingSuccess\n} from 'apps/livestreams/components/livestream-booking-success/LivestreamBookingSuccess';\nimport {\n LivestreamCoverImage\n} from 'apps/livestreams/components/livestream-cover-image/LivestreamCoverImage';\nimport {\n LivestreamBookingFormValues,\n LivestreamForm\n} from 'apps/livestreams/components/livestream-form/LivestreamForm';\nimport {\n getLivestreamAppLink\n} from 'apps/livestreams/views/livestream/LivestreamViewUtils';\n\nimport styles from './livestream.module.scss';\n\nconst namespace = 'livestream.livestreamView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface LivestreamBookingProps {\n livestream: Livestream;\n formStage: boolean;\n initialValues: LivestreamBookingFormValues;\n isAuthenticated: boolean;\n isStudent: boolean;\n success: boolean;\n error: boolean;\n isPastLivestream: boolean;\n showSpinner: boolean;\n onSubmit: (values: LivestreamBookingFormValues) => void;\n onTryAgain: () => void;\n setFormStage: React.Dispatch<React.SetStateAction<boolean>>;\n googleMapsApiKey: string;\n searchProspectsUrl: string;\n emailAddress: string;\n presentationSlug: string | null;\n bookingQuota: {\n showInfo: boolean,\n limitReached: boolean,\n used: number,\n max: number\n };\n}\n\nfunction LivestreamContent(props: LivestreamBookingProps) {\n const showAuthLinks = !props.isAuthenticated && !props.livestream.recording;\n const showUpgrade = props.bookingQuota.limitReached && props.isAuthenticated && !props.isStudent;\n const showBook =\n !showUpgrade &&\n !props.isPastLivestream &&\n !props.formStage &&\n (props.isAuthenticated && !props.isStudent);\n\n // \"Sign up to book\" opens the in-Lite sign-up popup (same path as the header CTA) so the\n // trial is created with the correct variant (clickview-live) and appLink (livestream:<id>),\n // both sourced from view-models the livestream page already populates (useDeepLinks).\n // No redirectUrl param here — those view-models drive the post-sign-up destination.\n const signUpLink = {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n\n const redirectUrl = Core.AppLinkHelper.getHref(Core.AppLinkHelper.getCurrentAppLink());\n\n const signInLink = {\n application: AppChannels.DEFAULT,\n action: Actions.Default.CHALLENGE,\n params: redirectUrl !== '/' ? { redirectUrl } : {}\n };\n\n const upgradeLink = {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.UPGRADE\n };\n\n const companyAppLink = {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.PARTNER_DASHBOARD,\n args: [ props.presentationSlug, props.livestream.company.id, TextHelper.slugify(props.livestream.company.name) ]\n };\n \n return (\n <>\n {!props.success && !props.error && (\n <>\n <LivestreamDetails\n logoUrl={props.livestream.company.logo?.url}\n logoBgColour={props.livestream.company.metadata?.colour}\n companyId={props.livestream.company.id}\n companyName={props.livestream.company.name}\n eventName={props.livestream.name}\n audiences={props.livestream.audiences}\n startTime={props.livestream.startDateTime}\n endTime={props.livestream.endDateTime}\n description={!props.formStage && props.livestream.description}\n isPastLivestream={props.isPastLivestream}\n companyAppLink={companyAppLink}\n />\n {props.bookingQuota.showInfo && (\n <LivestreamBookingQuota\n showUpgrade={showUpgrade}\n max={props.bookingQuota.max}\n used={props.bookingQuota.used}\n upgradeAppLink={upgradeLink}\n />\n )}\n {props.formStage && (\n <LivestreamForm\n emailAddress={props.emailAddress}\n initialValues={props.initialValues}\n isAuthenticated={props.isAuthenticated}\n showSpinner={props.showSpinner}\n onSubmit={props.onSubmit}\n googleMapsApiKey={props.googleMapsApiKey}\n searchProspectsUrl={props.searchProspectsUrl}\n />\n )}\n {showBook && (\n <button\n className={classNames('btn btn-dark w-100', { 'mt-3': props.bookingQuota.showInfo })}\n onClick={() => props.setFormStage(true)}\n >\n <Text namespace={namespace} phrase='book' />\n </button>\n )}\n {props.isPastLivestream && !props.livestream.recording &&\n <div className={`${styles.noRecording} p-2 rounded`}>\n <Text namespace={namespace} phrase='noRecording' />\n </div>\n }\n {props.livestream.recording &&\n <AppLink\n appLink={{\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [\n props.presentationSlug,\n props.livestream.recording.id,\n TextHelper.slugify(props.livestream.recording.name)\n ]\n }}>\n <button className='btn btn-outline-dark w-100'><Text namespace={namespace} phrase='recording' /></button>\n </AppLink>\n }\n\n {showAuthLinks &&\n <>\n <AppLink\n className='mt-3 btn btn-dark w-100'\n appLink={signUpLink}\n >\n <Text namespace={namespace} phrase='signUpButton' />\n </AppLink>\n <p className='mt-3 mb-0 text-center small text-secondary'>\n <Text namespace={namespace} phrase='alreadyHaveAccount' />\n <AppLink\n className='info-link ms-1'\n appLink={signInLink}\n >\n <Text namespace={namespace} phrase='signInButton' />\n </AppLink>\n </p>\n </>\n }\n </>\n )}\n {props.success && (\n <LivestreamBookingSuccess livestream={props.livestream} />\n )}\n {props.error && (\n <LivestreamBookingError onTryAgain={props.onTryAgain} />\n )}\n </>\n );\n}\n\ninterface LivestreamPopupProps extends LivestreamBookingProps {\n closePopup: () => void;\n}\n\nfunction LivestreamPopup(props: LivestreamPopupProps) {\n function onClose() {\n props.closePopup();\n\n ScrollHelper.preventScrollTop();\n\n const currentAppLink = ContextService.getCurrentRoute().appLink;\n const isLivestreamAppLink =\n currentAppLink.application === AppChannels.LIVESTREAMS &&\n currentAppLink.action === Actions.Livestreams.LIVESTREAM;\n if (isLivestreamAppLink)\n Core.AppLinkHelper.trigger(ContextService.getPreviousRoute()?.appLink);\n }\n\n return (\n <Popup\n size='xl'\n bodyClassName='rounded-3 overflow-hidden p-0'\n closePopup={onClose}\n >\n <button className='btn-close position-absolute top-0 end-0 p-3' onClick={onClose} />\n\n <div className='row g-0'>\n <div className='col-12 col-lg-6'>\n <LivestreamCoverImage className={`${styles.coverImage} ${styles.popup}`} coverImageUrl={props.livestream.company.cover?.url} />\n </div>\n <div className='col-12 col-lg p-4 m-lg-2'>\n <LivestreamContent {...props} />\n </div>\n </div>\n </Popup>\n );\n}\n\ninterface LivestreamPageProps extends LivestreamBookingProps { }\n\nfunction LivestreamPage(props: LivestreamPageProps) {\n return (\n <div className='row g-0 px-3'>\n <div className='col-12 col-md-6 col-lg-5'>\n <LivestreamCoverImage className={`${styles.coverImage} ${styles.page} rounded`} coverImageUrl={props.livestream.company.cover?.url} />\n </div>\n <div className='col-12 col-md px-md-3 pt-2 pt-md-0'>\n <LivestreamContent {...props} />\n </div>\n </div>\n );\n}\n\ninterface LivestreamViewProps extends PopupProps {\n id: string;\n fromPageLoad: boolean;\n presentationSlug: string | null;\n}\n\nexport function LivestreamView(props: LivestreamViewProps) {\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const fetchAsync = useGetFetchAsync();\n const braze = useBrazeClientService<BrazeConversion, BrazeSource>();\n const [ formStage, _setFormStage ] = React.useState(false);\n const [ success, setSuccess ] = React.useState(false);\n const [ error, setError ] = React.useState(false);\n const [ submitting, setSubmitting ] = React.useState(false);\n const [ initialValues, setInitialValues ] = React.useState<LivestreamBookingFormValues>({\n firstName: '',\n lastName: '',\n email: '',\n attendees: '',\n schoolOrDistrict: '',\n jobTitle: '',\n phoneNumber: '',\n country: '',\n province: '',\n prospectId: ''\n });\n\n const { createOrUpdateProfile } = useProfileApiClient();\n const bookingQuota = useBookingQuota();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const livestream = Flight.useBasicFetch<Livestream>(LivestreamRequests.livestream(props.id));\n\n const { hasPermissions } = usePermissions();\n const isStudent = hasPermissions(PermissionName.StudentExperience);\n\n useDeepLinks({ id: props.id, app: 'livestreams' });\n\n const pageMetadata = PageMetadataHelper.getDefaultMetadata({\n title: livestream.data?.name,\n description: livestream.data?.description,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n customAppLink: getLivestreamAppLink(livestream.data, props.presentationSlug)\n }),\n allowIndexing: true\n });\n\n useSetPageMetadata({\n ...pageMetadata,\n _isPopupUp: !props.fromPageLoad\n });\n\n useHandleObjectError(livestream);\n\n React.useEffect(() => {\n if (!livestream.data || livestream.data?.status === CurationStatusString.Published) return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [livestream.data?.status]);\n\n React.useEffect(() => {\n if (!currentUser.data?.isAuthenticated) return;\n\n setInitialValues({\n ...initialValues,\n firstName: currentUser.data.givenName,\n lastName: currentUser.data.familyName,\n email: currentUser.data.email\n });\n }, [currentUser.data?.isAuthenticated]);\n\n async function onSubmit(values: LivestreamBookingFormValues) {\n if (bookingQuota.hasBookingLimitations && bookingQuota.hasReachedBookingLimit) {\n setError(true);\n return;\n }\n \n try {\n setSubmitting(true);\n setInitialValues(values);\n\n await fetchAsync(LivestreamRequests.createBooking({\n eventId: livestream.data.id,\n eventType: 'Livestream',\n firstName: values.firstName,\n lastName: values.lastName,\n email: values.email,\n attendees: values.attendees,\n status: 1\n }));\n\n if (!currentUser.data?.isAuthenticated) {\n createOrUpdateProfile({\n email: values.email,\n firstName: values.firstName,\n lastName: values.lastName,\n phone: values.phoneNumber,\n countryCode: values.country\n });\n }\n\n logAnalyticsEvent(WorkflowPhase.Complete);\n logBrazeEvent(values);\n\n setSuccess(true);\n } catch {\n setError(true);\n _setFormStage(false);\n } finally {\n setSubmitting(false);\n }\n }\n\n function onTryAgain() {\n setError(false);\n _setFormStage(true);\n }\n\n function setFormStage() {\n _setFormStage(true);\n logAnalyticsEvent(WorkflowPhase.Start);\n }\n\n function logAnalyticsEvent(workflowPhase: WorkflowPhase) {\n AnalyticsHelper.logUserAction({\n id: livestream.data.id,\n name: livestream.data.name\n }, {\n entity: EntityType.Livestream,\n actionType: UserAction.Submit,\n location: LocationContext.LivestreamBookingForm,\n descriptor: props.fromPageLoad ?\n LivestreamBookingDescriptor.FullPage :\n LivestreamBookingDescriptor.Popup,\n workflowPhase\n });\n }\n\n async function logBrazeEvent(values: LivestreamBookingFormValues) {\n const eventSource = BrazeSource.LivestreamBooking;\n \n try {\n await fetchAsync(BrazeRequests.createUser({\n email: values.email,\n source: eventSource,\n instanceRegion: currentUser.data?.instanceRegion,\n syncToCrm: true\n }));\n } catch {}\n \n try {\n let crmId: string;\n\n if (values.prospectId) {\n const prospectLookups = await fetchAsync<ProspectLookup[]>(BrazeRequests.prospectLookups(values.prospectId));\n crmId = prospectLookups?.find(l => l.type === 'crm_id')?.externalId;\n }\n\n const brazeUser: BrazeUser = {\n email: values.email,\n firstName: values.firstName,\n lastName: values.lastName,\n phone: values.phoneNumber,\n custom: {\n accountAddress: values?.province ? {\n countryCode: values?.country,\n province: BrazeHelper.parseProvince(values?.province || '')\n } : undefined,\n accountName: values.schoolOrDistrict,\n jobTitle: values.jobTitle,\n crmId: crmId || undefined\n }\n };\n\n braze.logFormSubmission({\n eventType: StreamableFormEvent.LivestreamBookingFormSubmit,\n source: eventSource,\n conversion: BrazeConversion.LivestreamBooking,\n user: brazeUser,\n productType: 'sl'\n });\n } catch (err) {\n console.error('Failed to log submission event to Braze', err);\n }\n }\n\n const hasLoaded = (\n livestream.hasCompleted &&\n bookingQuota.isLoaded &&\n config.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n const livestreamBookingProps: LivestreamBookingProps = {\n livestream: livestream.data,\n formStage,\n initialValues,\n isAuthenticated: currentUser.data?.isAuthenticated,\n isStudent,\n success,\n error,\n isPastLivestream: DateHelper.isBefore(livestream.data.endDateTime, new Date()),\n showSpinner: submitting,\n onSubmit,\n onTryAgain,\n setFormStage,\n googleMapsApiKey: config.data.googleMapsApiKey,\n searchProspectsUrl: UrlHelper.safeUrlConcat(config.data.gatewayApiUrl, '/v1/search/prospects'),\n emailAddress: currentUser.data?.email,\n presentationSlug: props.presentationSlug,\n bookingQuota: {\n showInfo: bookingQuota.hasBookingLimitations,\n limitReached: bookingQuota.hasReachedBookingLimit,\n used: bookingQuota.bookingsUsed,\n max: bookingQuota.totalBookingsAvailable\n }\n };\n\n if (props.fromPageLoad) {\n return (\n <LivestreamPage {...livestreamBookingProps} />\n );\n }\n\n return <LivestreamPopup {...livestreamBookingProps} closePopup={props.closePopup} />;\n}\n","import React from 'react';\n\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\n\nimport { createPresentationDispatcherView } from 'shared/utils/createPresentationDispatcherView';\n\nimport {\n LivestreamView\n} from 'apps/livestreams/views/livestream/livestream/LivestreamView';\n\ninterface LivestreamRouteProps {\n presentationSlug: string | null;\n id: string;\n fromPageLoad: boolean;\n closePopup: () => void;\n}\n\nexport const BaseLivestreamView = createPresentationDispatcherView<LivestreamRouteProps>({\n [PresentationType.StreamableLearning]: ctx => (\n <LivestreamView\n id={ctx.id}\n fromPageLoad={ctx.fromPageLoad}\n closePopup={ctx.closePopup}\n presentationSlug={ctx.presentationSlug}\n />\n )\n});\n\nBaseLivestreamView.displayName = 'BaseLivestreamView';\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{h as t}from"./BftnFbcr.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{f as a}from"./BX0wDJmp.chunk.js";import{t as o}from"./CXnhm0VS2.chunk.js";import{t as s}from"./BlGyXBAH2.chunk.js";import{t as c}from"./D5hXaTvs.chunk.js";import{t as l}from"./DXk5ikZM.chunk.js";import{t as u}from"./BVeF-Kak.chunk.js";import{n as d,t as f}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{h as t}from"./BftnFbcr.chunk.js";import{t as n}from"./CQyJ7YGa.chunk.js";import{t as r}from"./C2w0pmFW.chunk.js";import{t as i}from"./wrLrTezN.chunk.js";import{f as a}from"./BX0wDJmp.chunk.js";import{t as o}from"./CXnhm0VS2.chunk.js";import{t as s}from"./BlGyXBAH2.chunk.js";import{t as c}from"./D5hXaTvs.chunk.js";import{t as l}from"./DXk5ikZM.chunk.js";import{t as u}from"./BVeF-Kak.chunk.js";import{n as d,t as f}from"./CajcIz6S.chunk.js";var p=e(r());function m(e){let n=p.useMemo(()=>new t,[]);p.useEffect(()=>{!e||!e.length||e.forEach(e=>n.useSync(e))},[]);function r(e){n&&n.useSync(e)}function i(e){if(n)return n.goSync(e)}return{push:r,execute:i}}var h=n.encloseNamespace(`shared.useInfiniteWidgetFetch`);function g(e){let t=a(),n=o(),{ref:r,inView:i}=s(),c=m(e.resultsTransformers??[]),d=m(e.widgetItemTransformers??[]);function f(n){return t(e.getRequest(n))}function g(e,t){if(e===1)return l(t);n.error(h(`error`))}function _(e){return[e]}let v=u(i&&e.getRequest,i&&f,g,_,e.infiniteFetch&&e.getCursor);function y(t){if(!t||!t.length)return;let n=c.execute(t);return e.widgetItemTransformers?.length?n.map(e=>d.execute(e)):n}let b=y(v.items);return p.useEffect(()=>{!v.hasFirstPageCompleted||!b||!e.onLoadWidgetsTriggers?.length||!b.length||e.onLoadWidgetsTriggers.forEach(e=>e(b))},[v.hasFirstPageCompleted,b]),p.useEffect(()=>{if(v.hasFirstPageCompleted){if(!b){e.setIsEmpty?.(!0);return}if(Array.isArray(b)&&!b.length){e.setIsEmpty?.(!0);return}e.isEmptyPredicate&&e.setIsEmpty?.(e.isEmptyPredicate(b))}},[v.hasFirstPageCompleted,e.isEmptyPredicate]),{widgets:b,isEmpty:!b?.length,showLoading:!v.hasFirstPageCompleted,showInfiniteScrollFooter:e.infiniteFetch&&(v.hasMore||v.isFetching),isFetching:v.isFetching,nextCursor:v.nextCursor,fetchNext:f,partialLoadingRef:r}}var _=i();function v(e){let{isEmpty:t,widgets:n,partialLoadingRef:r,showLoading:i,fetchNext:a,isFetching:o,nextCursor:s,showInfiniteScrollFooter:l}=g({getRequest:e.getRequest,getCursor:e.getCursor,setIsEmpty:e.setIsEmpty,isEmptyPredicate:e.isEmptyPredicate,item:e.item,infiniteFetch:e.infiniteFetch,resultsTransformers:e.resultsTransformers,onLoadWidgetsTriggers:e.onLoadWidgetsTriggers,widgetItemTransformers:e.widgetItemTransformers}),u=d[e.item.templateId],m=u.partialLoading;return!u||!i&&t?(0,_.jsx)(_.Fragment,{}):i?(0,_.jsx)(`div`,{ref:r,className:`py-2`,children:(0,_.jsx)(m,{name:e.item.name,description:e.item?.description,predicate:e?.getPartialLoadingPredicate})}):(0,_.jsx)(_.Fragment,{children:n.map((t,r)=>{let i=r===n.length-1;return(0,_.jsxs)(p.Fragment,{children:[(0,_.jsx)(f,{id:t.id,widgetIndex:e.item.index,dashboardTarget:e.dashboardTarget,appLinks:e.appLinks,appLinkOptions:e.appLinkOptions,audiences:e.audiences,content:e.getContent?.(t)??t.content.data,templateId:t.templateId,widgetTypeId:t.widgetId,currentUser:e.currentUser,commonVideoProps:e.commonVideoProps,availablePresentations:e.availablePresentations,presentation:e.presentation,analyticsData:e.analyticsData,imageCdnUrl:e.imageCdnUrl,imageUrls:e.imageUrls,resourceThumbnailFallbackImageUrl:e.resourceThumbnailFallbackImageUrl,lazyLoad:e.lazyLoad,name:e.getName(t),hasPermissions:e.hasPermissions,hasLocalPermissions:e.hasLocalPermissions,getSelectedItems:e.getSelectedItems,metadata:e.getWidgetMetadata(t),seeMoreLink:e.getSeeMoreAppLink?.(t),badgeComponent:e.getBadgeComponent?.(t),getAnalyticsData:e.getAnalyticsData&&(n=>e.getAnalyticsData(t,e.index,n)),className:e.getWidgetClassName?.(t),headingElementRef:e.headingElementRef,hasTableOfContents:e.hasTableOfContents,isScrollToTargetWidget:e.isScrollToTargetWidget,isBot:e.isBot,isEditing:e.isEditing,curriculums:e.curriculums,contentType:e.contentType,settings:null,settingsHash:e.settingsHash,description:null,isPreviewing:e.isPreviewing??!1,onClickRemoveItem:null,onClickSearchAllVideos:e.onClickSearchAllVideos}),l&&i&&(0,_.jsx)(c,{isFetching:o,fetchNext:a,fetchOnScroll:!0,nextCursor:s})]},`${t.widgetId}-${t.templateId}-${r}`)})})}export{v as t};
|
|
2
|
+
//# sourceMappingURL=B1ag1ah72.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kMWvzbRv2.chunk.js","names":[],"sources":["../../../../libs/shared/src/hooks/useTransformer.tsx","../../../../libs/shared/src/components/widgets/curated-widgets/hooks/useInfiniteWidgetFetch.ts","../../../../libs/shared/src/components/widgets/curated-widgets/InfiniteWidgetContainerView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Middleware, type MiddlewareFunctionSync } from 'libs/common/backbone/core';\n\nexport type UseTransformerFunc<T> = (options: T) => T;\n\nexport function useTransformer<T>(transformations?: MiddlewareFunctionSync<T>[]) {\n const middleware = React.useMemo(() => new Middleware<T>(), []);\n\n React.useEffect(() => {\n if (!transformations || !transformations.length)\n return;\n\n transformations.forEach(fn => middleware.useSync(fn));\n }, []);\n\n function push(fn: MiddlewareFunctionSync<T>): void {\n if (!middleware)\n return;\n\n middleware.useSync(fn);\n }\n\n function execute(options: T): T {\n if (!middleware)\n return;\n \n return middleware.goSync(options);\n }\n \n return {\n push,\n execute\n };\n}\n","import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useTransformer, UseTransformerFunc } from 'libs/shared/hooks/useTransformer';\nimport { BaseWidget } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.useInfiniteWidgetFetch';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UseInfiniteWidgetFetchOptions<TItem, TWidget> {\n item: TItem;\n infiniteFetch: boolean;\n getRequest: (cursor?: string) => Flight.Request;\n getCursor: (widget: TWidget) => string;\n setIsEmpty?: (isEmpty: boolean) => void;\n isEmptyPredicate?: (items: TWidget[]) => boolean;\n \n resultsTransformers?: Array<UseTransformerFunc<TWidget[]>>;\n widgetItemTransformers?: Array<UseTransformerFunc<TWidget>>;\n onLoadWidgetsTriggers?: Array<(data: TWidget[]) => void>;\n}\n\nexport function useInfiniteWidgetFetch<\n TItem extends BaseWidget,\n TWidget extends BaseWidget\n>(options: UseInfiniteWidgetFetchOptions<TItem, TWidget>) {\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n const { ref: partialLoadingRef, inView } = useLazyLoad();\n const resultsTransformers = useTransformer<TWidget[]>(options.resultsTransformers ?? []);\n const widgetItemTransformers = useTransformer<TWidget>(options.widgetItemTransformers ?? []);\n \n function fetchNext(cursor?: string) {\n return fetch(options.getRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(getPhrase('error'));\n }\n \n function getItems(response: TWidget) {\n return [response];\n }\n \n const fetchResults = useInfiniteList<TWidget, TWidget>(\n inView && options.getRequest,\n inView && fetchNext,\n onError,\n getItems,\n options.infiniteFetch && options.getCursor\n );\n\n function transformResults(data: TWidget[]): TWidget[] {\n if (!data || !data.length)\n return;\n\n const results = resultsTransformers.execute(data);\n\n if (!options.widgetItemTransformers?.length)\n return results;\n\n const transformedResults = results.map(item => widgetItemTransformers.execute(item));\n\n return transformedResults;\n }\n\n /**\n * This is an array of widgets because technically we can have same widget type id\n * but different template id. This is the case the search series widget.\n */\n const items = transformResults(fetchResults.items);\n\n /**\n * Side effects below\n */\n\n React.useEffect(() => {\n if (!fetchResults.hasFirstPageCompleted || !items)\n return;\n\n if (!options.onLoadWidgetsTriggers?.length || !items.length)\n return;\n\n options.onLoadWidgetsTriggers.forEach(onLoad => onLoad(items));\n }, [ fetchResults.hasFirstPageCompleted, items ]);\n\n React.useEffect(() => {\n if (!fetchResults.hasFirstPageCompleted)\n return;\n\n if (!items) {\n options.setIsEmpty?.(true);\n return;\n }\n\n if (Array.isArray(items) && !items.length) {\n options.setIsEmpty?.(true);\n return;\n }\n\n if (!options.isEmptyPredicate)\n return;\n\n /**\n * For some reason our widget data structure is different for different dashboard targets.\n * Since it is inconsistent we can use the custom isEmptyPredicate check if the default\n * check above does not handle the use case.\n */\n options.setIsEmpty?.(options.isEmptyPredicate(items));\n }, [ fetchResults.hasFirstPageCompleted, options.isEmptyPredicate ]);\n\n const isEmpty = !items?.length;\n const showLoading = !fetchResults.hasFirstPageCompleted;\n const showInfiniteScrollFooter = options.infiniteFetch && (fetchResults.hasMore || fetchResults.isFetching);\n\n return {\n widgets: items,\n isEmpty,\n showLoading,\n showInfiniteScrollFooter,\n isFetching: fetchResults.isFetching,\n nextCursor: fetchResults.nextCursor,\n fetchNext,\n partialLoadingRef\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTemplateConfig } from 'libs/shared/constants/WidgetTemplateConfig';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { type HasLocalPermissionsFunc, type HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { UseTransformerFunc } from 'libs/shared/hooks/useTransformer';\nimport { type BaseObject, BaseWidget, CalendarEventContentType, type CurrentUser, CurriculumData, DashboardTargetType, type Presentation, type PresentationAudience, WidgetMetadata } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { useInfiniteWidgetFetch } from './hooks/useInfiniteWidgetFetch';\n\ntype InferredWidgetTemplateProps = {\n appLinks: any,\n appLinkOptions?: any\n};\n\n/**\n * Props for InfiniteWidgetContainerView component\n *\n * @template TItem - The type of the widget item (extends BaseWidget)\n * @template TWidget - The type of individual widget content (extends BaseWidget)\n * @template TWidgetTemplateProps - The widget template props type for type-safe appLinks and appLinkOptions\n *\n * Use TWidgetTemplateProps to get type safety for specific dashboard targets:\n * @example\n * // For Search dashboard with type safety:\n * import { AllSearchWidgetTemplates } from './WidgetProps';\n *\n * <InfiniteWidgetContainerView<MyItem, MyWidget, AllSearchWidgetTemplates>\n * dashboardTarget={DashboardTargetType.Search}\n * appLinks={searchAppLinks} // Typed as AllSearchWidgetTemplates['appLinks']\n * appLinkOptions={searchAppLinkOptions} // Typed as AllSearchWidgetTemplates['appLinkOptions']\n * // ... other props\n * />\n */\ninterface InfiniteWidgetContainerViewProps<\n TItem,\n TWidget,\n TWidgetTemplateProps extends InferredWidgetTemplateProps = AllWidgetTemplateProps\n> {\n index: number;\n item: TItem;\n /**\n * If set to false will only fetch the first page\n */\n infiniteFetch: boolean;\n\n currentUser?: CurrentUser;\n audiences: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\n dashboardTarget?: DashboardTargetType;\n availablePresentations?: Presentation[];\n presentation?: Presentation;\n\n analyticsData?: HashObject;\n imageCdnUrl?: string;\n imageUrls?: AllWidgetTemplateProps['imageUrls'];\n resourceThumbnailFallbackImageUrl?: string;\n lazyLoad?: boolean;\n\n headingElementRef?: React.MutableRefObject<Set<Element>>;\n hasTableOfContents?: boolean;\n isScrollToTargetWidget?: boolean;\n isBot?: boolean;\n isPreviewing?: boolean;\n isEditing?: boolean;\n curriculums?: CurriculumData;\n contentType?: CalendarEventContentType;\n\n /**\n * App links - type is determined by TWidgetTemplateProps generic parameter\n * Defaults to AllWidgetTemplateProps['appLinks'] if not specified\n */\n appLinks: TWidgetTemplateProps['appLinks'];\n\n /**\n * App link options - type is determined by TWidgetTemplateProps generic parameter\n * Defaults to AllWidgetTemplateProps['appLinkOptions'] if not specified\n */\n appLinkOptions?: TWidgetTemplateProps['appLinkOptions'];\n\n settingsHash?: SettingsHash;\n hasPermissions: HasPermissionsFunc;\n getName: (widget: TWidget) => string;\n getPartialLoadingPredicate?: () => boolean;\n hasLocalPermissions: HasLocalPermissionsFunc;\n getWidgetClassName?: (widget: TWidget) => string;\n getBadgeComponent?: (widget: TWidget) => JSX.Element;\n getSeeMoreAppLink?: (widget: TWidget) => Core.AppLink;\n getSelectedItems: (type: WidgetTypeId) => BaseObject[];\n getWidgetMetadata: (widget: TWidget) => Partial<WidgetMetadata>;\n getAnalyticsData?: (widget: TWidget, yIndex: number, xIndex: number) => HashObject;\n \n getCursor: (widget: TWidget) => string;\n getRequest: (cursor?: string) => Flight.Request;\n setIsEmpty?: (isEmpty: boolean) => void;\n getContent?: (widget: TWidget) => BaseObject[];\n\n /**\n * A predicate to determine if the widget is empty. \n * This is used to determine if the widget should be displayed as empty. \n * If not provided, the widget will be displayed as empty if the content is empty. \n * Only to be used if the widget data structure is inconsistent for different dashboard targets. \n */\n isEmptyPredicate?: (items: TWidget[]) => boolean;\n \n /**\n * Array of transformers to be applied to results before rendering\n */\n resultsTransformers?: Array<UseTransformerFunc<TWidget[]>>;\n /**\n * Array of transformers to be applied to each widget item before rendering\n */\n widgetItemTransformers?: Array<UseTransformerFunc<TWidget>>;\n /**\n * Array of callbacks to be executed when widget is first loaded\n */\n onLoadWidgetsTriggers?: Array<(data: TWidget[]) => void>;\n onClickSearchAllVideos?: () => void;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function InfiniteWidgetContainerView<\n TItem extends BaseWidget = BaseWidget,\n TWidget extends BaseWidget = BaseWidget,\n TWidgetTemplateProps extends InferredWidgetTemplateProps = AllWidgetTemplateProps\n>(props: InfiniteWidgetContainerViewProps<TItem, TWidget, TWidgetTemplateProps>): JSX.Element {\n const {\n isEmpty,\n widgets,\n partialLoadingRef,\n showLoading,\n fetchNext,\n isFetching,\n nextCursor,\n showInfiniteScrollFooter\n } = useInfiniteWidgetFetch({\n getRequest: props.getRequest,\n getCursor: props.getCursor,\n setIsEmpty: props.setIsEmpty,\n isEmptyPredicate: props.isEmptyPredicate,\n item: props.item,\n infiniteFetch: props.infiniteFetch,\n resultsTransformers: props.resultsTransformers,\n onLoadWidgetsTriggers: props.onLoadWidgetsTriggers,\n widgetItemTransformers: props.widgetItemTransformers\n });\n\n const template = WidgetTemplateConfig[props.item.templateId];\n const PartialTemplate = template.partialLoading;\n\n if (!template || !showLoading && isEmpty)\n return <></>;\n\n if (showLoading) {\n return (\n <div ref={partialLoadingRef} className='py-2'>\n <PartialTemplate\n name={props.item.name}\n description={props.item?.description}\n predicate={props?.getPartialLoadingPredicate}\n />\n </div>\n );\n }\n\n return (\n <>\n {widgets.map((widget, index) => {\n const isLastItem = index === widgets.length - 1;\n return (\n <React.Fragment key={`${widget.widgetId}-${widget.templateId}-${index}`}>\n <WidgetContainerView\n id={widget.id}\n widgetIndex={props.item.index}\n dashboardTarget={props.dashboardTarget}\n\n appLinks={props.appLinks}\n appLinkOptions={props.appLinkOptions}\n audiences={props.audiences}\n content={props.getContent?.(widget) ?? widget.content.data}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n currentUser={props.currentUser}\n commonVideoProps={props.commonVideoProps}\n availablePresentations={props.availablePresentations}\n presentation={props.presentation}\n\n analyticsData={props.analyticsData}\n imageCdnUrl={props.imageCdnUrl}\n imageUrls={props.imageUrls}\n resourceThumbnailFallbackImageUrl={props.resourceThumbnailFallbackImageUrl}\n lazyLoad={props.lazyLoad}\n\n name={props.getName(widget)}\n hasPermissions={props.hasPermissions}\n hasLocalPermissions={props.hasLocalPermissions}\n getSelectedItems={props.getSelectedItems}\n metadata={props.getWidgetMetadata(widget)}\n seeMoreLink={props.getSeeMoreAppLink?.(widget)}\n badgeComponent={props.getBadgeComponent?.(widget)}\n getAnalyticsData={\n props.getAnalyticsData && (xIndex => props.getAnalyticsData(widget, props.index, xIndex))\n }\n className={props.getWidgetClassName?.(widget)}\n\n headingElementRef={props.headingElementRef}\n hasTableOfContents={props.hasTableOfContents}\n isScrollToTargetWidget={props.isScrollToTargetWidget}\n isBot={props.isBot}\n isEditing={props.isEditing}\n curriculums={props.curriculums}\n contentType={props.contentType}\n\n settings={null}\n settingsHash={props.settingsHash}\n description={null}\n isPreviewing={props.isPreviewing ?? false}\n onClickRemoveItem={null}\n onClickSearchAllVideos={props.onClickSearchAllVideos}\n />\n {showInfiniteScrollFooter && isLastItem && (\n <InfiniteScrollFooter\n isFetching={isFetching}\n fetchNext={fetchNext}\n fetchOnScroll\n nextCursor={nextCursor}\n />\n )}\n </React.Fragment>\n );\n })}\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"B1ag1ah72.chunk.js","names":[],"sources":["../../../../libs/shared/src/hooks/useTransformer.tsx","../../../../libs/shared/src/components/widgets/curated-widgets/hooks/useInfiniteWidgetFetch.ts","../../../../libs/shared/src/components/widgets/curated-widgets/InfiniteWidgetContainerView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Middleware, type MiddlewareFunctionSync } from 'libs/common/backbone/core';\n\nexport type UseTransformerFunc<T> = (options: T) => T;\n\nexport function useTransformer<T>(transformations?: MiddlewareFunctionSync<T>[]) {\n const middleware = React.useMemo(() => new Middleware<T>(), []);\n\n React.useEffect(() => {\n if (!transformations || !transformations.length)\n return;\n\n transformations.forEach(fn => middleware.useSync(fn));\n }, []);\n\n function push(fn: MiddlewareFunctionSync<T>): void {\n if (!middleware)\n return;\n\n middleware.useSync(fn);\n }\n\n function execute(options: T): T {\n if (!middleware)\n return;\n \n return middleware.goSync(options);\n }\n \n return {\n push,\n execute\n };\n}\n","import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList } from 'libs/shared/hooks/UseInfiniteList';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useTransformer, UseTransformerFunc } from 'libs/shared/hooks/useTransformer';\nimport { BaseWidget } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.useInfiniteWidgetFetch';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface UseInfiniteWidgetFetchOptions<TItem, TWidget> {\n item: TItem;\n infiniteFetch: boolean;\n getRequest: (cursor?: string) => Flight.Request;\n getCursor: (widget: TWidget) => string;\n setIsEmpty?: (isEmpty: boolean) => void;\n isEmptyPredicate?: (items: TWidget[]) => boolean;\n \n resultsTransformers?: Array<UseTransformerFunc<TWidget[]>>;\n widgetItemTransformers?: Array<UseTransformerFunc<TWidget>>;\n onLoadWidgetsTriggers?: Array<(data: TWidget[]) => void>;\n}\n\nexport function useInfiniteWidgetFetch<\n TItem extends BaseWidget,\n TWidget extends BaseWidget\n>(options: UseInfiniteWidgetFetchOptions<TItem, TWidget>) {\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n const { ref: partialLoadingRef, inView } = useLazyLoad();\n const resultsTransformers = useTransformer<TWidget[]>(options.resultsTransformers ?? []);\n const widgetItemTransformers = useTransformer<TWidget>(options.widgetItemTransformers ?? []);\n \n function fetchNext(cursor?: string) {\n return fetch(options.getRequest(cursor));\n }\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(getPhrase('error'));\n }\n \n function getItems(response: TWidget) {\n return [response];\n }\n \n const fetchResults = useInfiniteList<TWidget, TWidget>(\n inView && options.getRequest,\n inView && fetchNext,\n onError,\n getItems,\n options.infiniteFetch && options.getCursor\n );\n\n function transformResults(data: TWidget[]): TWidget[] {\n if (!data || !data.length)\n return;\n\n const results = resultsTransformers.execute(data);\n\n if (!options.widgetItemTransformers?.length)\n return results;\n\n const transformedResults = results.map(item => widgetItemTransformers.execute(item));\n\n return transformedResults;\n }\n\n /**\n * This is an array of widgets because technically we can have same widget type id\n * but different template id. This is the case the search series widget.\n */\n const items = transformResults(fetchResults.items);\n\n /**\n * Side effects below\n */\n\n React.useEffect(() => {\n if (!fetchResults.hasFirstPageCompleted || !items)\n return;\n\n if (!options.onLoadWidgetsTriggers?.length || !items.length)\n return;\n\n options.onLoadWidgetsTriggers.forEach(onLoad => onLoad(items));\n }, [ fetchResults.hasFirstPageCompleted, items ]);\n\n React.useEffect(() => {\n if (!fetchResults.hasFirstPageCompleted)\n return;\n\n if (!items) {\n options.setIsEmpty?.(true);\n return;\n }\n\n if (Array.isArray(items) && !items.length) {\n options.setIsEmpty?.(true);\n return;\n }\n\n if (!options.isEmptyPredicate)\n return;\n\n /**\n * For some reason our widget data structure is different for different dashboard targets.\n * Since it is inconsistent we can use the custom isEmptyPredicate check if the default\n * check above does not handle the use case.\n */\n options.setIsEmpty?.(options.isEmptyPredicate(items));\n }, [ fetchResults.hasFirstPageCompleted, options.isEmptyPredicate ]);\n\n const isEmpty = !items?.length;\n const showLoading = !fetchResults.hasFirstPageCompleted;\n const showInfiniteScrollFooter = options.infiniteFetch && (fetchResults.hasMore || fetchResults.isFetching);\n\n return {\n widgets: items,\n isEmpty,\n showLoading,\n showInfiniteScrollFooter,\n isFetching: fetchResults.isFetching,\n nextCursor: fetchResults.nextCursor,\n fetchNext,\n partialLoadingRef\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { Flight } from 'libs/common/react/index';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTemplateConfig } from 'libs/shared/constants/WidgetTemplateConfig';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { type HasLocalPermissionsFunc, type HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { UseTransformerFunc } from 'libs/shared/hooks/useTransformer';\nimport { type BaseObject, BaseWidget, CalendarEventContentType, type CurrentUser, CurriculumData, DashboardTargetType, type Presentation, type PresentationAudience, WidgetMetadata } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\n\nimport { useInfiniteWidgetFetch } from './hooks/useInfiniteWidgetFetch';\n\ntype InferredWidgetTemplateProps = {\n appLinks: any,\n appLinkOptions?: any\n};\n\n/**\n * Props for InfiniteWidgetContainerView component\n *\n * @template TItem - The type of the widget item (extends BaseWidget)\n * @template TWidget - The type of individual widget content (extends BaseWidget)\n * @template TWidgetTemplateProps - The widget template props type for type-safe appLinks and appLinkOptions\n *\n * Use TWidgetTemplateProps to get type safety for specific dashboard targets:\n * @example\n * // For Search dashboard with type safety:\n * import { AllSearchWidgetTemplates } from './WidgetProps';\n *\n * <InfiniteWidgetContainerView<MyItem, MyWidget, AllSearchWidgetTemplates>\n * dashboardTarget={DashboardTargetType.Search}\n * appLinks={searchAppLinks} // Typed as AllSearchWidgetTemplates['appLinks']\n * appLinkOptions={searchAppLinkOptions} // Typed as AllSearchWidgetTemplates['appLinkOptions']\n * // ... other props\n * />\n */\ninterface InfiniteWidgetContainerViewProps<\n TItem,\n TWidget,\n TWidgetTemplateProps extends InferredWidgetTemplateProps = AllWidgetTemplateProps\n> {\n index: number;\n item: TItem;\n /**\n * If set to false will only fetch the first page\n */\n infiniteFetch: boolean;\n\n currentUser?: CurrentUser;\n audiences: PresentationAudience[];\n commonVideoProps: CommonVideoProps;\n dashboardTarget?: DashboardTargetType;\n availablePresentations?: Presentation[];\n presentation?: Presentation;\n\n analyticsData?: HashObject;\n imageCdnUrl?: string;\n imageUrls?: AllWidgetTemplateProps['imageUrls'];\n resourceThumbnailFallbackImageUrl?: string;\n lazyLoad?: boolean;\n\n headingElementRef?: React.MutableRefObject<Set<Element>>;\n hasTableOfContents?: boolean;\n isScrollToTargetWidget?: boolean;\n isBot?: boolean;\n isPreviewing?: boolean;\n isEditing?: boolean;\n curriculums?: CurriculumData;\n contentType?: CalendarEventContentType;\n\n /**\n * App links - type is determined by TWidgetTemplateProps generic parameter\n * Defaults to AllWidgetTemplateProps['appLinks'] if not specified\n */\n appLinks: TWidgetTemplateProps['appLinks'];\n\n /**\n * App link options - type is determined by TWidgetTemplateProps generic parameter\n * Defaults to AllWidgetTemplateProps['appLinkOptions'] if not specified\n */\n appLinkOptions?: TWidgetTemplateProps['appLinkOptions'];\n\n settingsHash?: SettingsHash;\n hasPermissions: HasPermissionsFunc;\n getName: (widget: TWidget) => string;\n getPartialLoadingPredicate?: () => boolean;\n hasLocalPermissions: HasLocalPermissionsFunc;\n getWidgetClassName?: (widget: TWidget) => string;\n getBadgeComponent?: (widget: TWidget) => JSX.Element;\n getSeeMoreAppLink?: (widget: TWidget) => Core.AppLink;\n getSelectedItems: (type: WidgetTypeId) => BaseObject[];\n getWidgetMetadata: (widget: TWidget) => Partial<WidgetMetadata>;\n getAnalyticsData?: (widget: TWidget, yIndex: number, xIndex: number) => HashObject;\n \n getCursor: (widget: TWidget) => string;\n getRequest: (cursor?: string) => Flight.Request;\n setIsEmpty?: (isEmpty: boolean) => void;\n getContent?: (widget: TWidget) => BaseObject[];\n\n /**\n * A predicate to determine if the widget is empty. \n * This is used to determine if the widget should be displayed as empty. \n * If not provided, the widget will be displayed as empty if the content is empty. \n * Only to be used if the widget data structure is inconsistent for different dashboard targets. \n */\n isEmptyPredicate?: (items: TWidget[]) => boolean;\n \n /**\n * Array of transformers to be applied to results before rendering\n */\n resultsTransformers?: Array<UseTransformerFunc<TWidget[]>>;\n /**\n * Array of transformers to be applied to each widget item before rendering\n */\n widgetItemTransformers?: Array<UseTransformerFunc<TWidget>>;\n /**\n * Array of callbacks to be executed when widget is first loaded\n */\n onLoadWidgetsTriggers?: Array<(data: TWidget[]) => void>;\n onClickSearchAllVideos?: () => void;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function InfiniteWidgetContainerView<\n TItem extends BaseWidget = BaseWidget,\n TWidget extends BaseWidget = BaseWidget,\n TWidgetTemplateProps extends InferredWidgetTemplateProps = AllWidgetTemplateProps\n>(props: InfiniteWidgetContainerViewProps<TItem, TWidget, TWidgetTemplateProps>): JSX.Element {\n const {\n isEmpty,\n widgets,\n partialLoadingRef,\n showLoading,\n fetchNext,\n isFetching,\n nextCursor,\n showInfiniteScrollFooter\n } = useInfiniteWidgetFetch({\n getRequest: props.getRequest,\n getCursor: props.getCursor,\n setIsEmpty: props.setIsEmpty,\n isEmptyPredicate: props.isEmptyPredicate,\n item: props.item,\n infiniteFetch: props.infiniteFetch,\n resultsTransformers: props.resultsTransformers,\n onLoadWidgetsTriggers: props.onLoadWidgetsTriggers,\n widgetItemTransformers: props.widgetItemTransformers\n });\n\n const template = WidgetTemplateConfig[props.item.templateId];\n const PartialTemplate = template.partialLoading;\n\n if (!template || !showLoading && isEmpty)\n return <></>;\n\n if (showLoading) {\n return (\n <div ref={partialLoadingRef} className='py-2'>\n <PartialTemplate\n name={props.item.name}\n description={props.item?.description}\n predicate={props?.getPartialLoadingPredicate}\n />\n </div>\n );\n }\n\n return (\n <>\n {widgets.map((widget, index) => {\n const isLastItem = index === widgets.length - 1;\n return (\n <React.Fragment key={`${widget.widgetId}-${widget.templateId}-${index}`}>\n <WidgetContainerView\n id={widget.id}\n widgetIndex={props.item.index}\n dashboardTarget={props.dashboardTarget}\n\n appLinks={props.appLinks}\n appLinkOptions={props.appLinkOptions}\n audiences={props.audiences}\n content={props.getContent?.(widget) ?? widget.content.data}\n templateId={widget.templateId}\n widgetTypeId={widget.widgetId}\n currentUser={props.currentUser}\n commonVideoProps={props.commonVideoProps}\n availablePresentations={props.availablePresentations}\n presentation={props.presentation}\n\n analyticsData={props.analyticsData}\n imageCdnUrl={props.imageCdnUrl}\n imageUrls={props.imageUrls}\n resourceThumbnailFallbackImageUrl={props.resourceThumbnailFallbackImageUrl}\n lazyLoad={props.lazyLoad}\n\n name={props.getName(widget)}\n hasPermissions={props.hasPermissions}\n hasLocalPermissions={props.hasLocalPermissions}\n getSelectedItems={props.getSelectedItems}\n metadata={props.getWidgetMetadata(widget)}\n seeMoreLink={props.getSeeMoreAppLink?.(widget)}\n badgeComponent={props.getBadgeComponent?.(widget)}\n getAnalyticsData={\n props.getAnalyticsData && (xIndex => props.getAnalyticsData(widget, props.index, xIndex))\n }\n className={props.getWidgetClassName?.(widget)}\n\n headingElementRef={props.headingElementRef}\n hasTableOfContents={props.hasTableOfContents}\n isScrollToTargetWidget={props.isScrollToTargetWidget}\n isBot={props.isBot}\n isEditing={props.isEditing}\n curriculums={props.curriculums}\n contentType={props.contentType}\n\n settings={null}\n settingsHash={props.settingsHash}\n description={null}\n isPreviewing={props.isPreviewing ?? false}\n onClickRemoveItem={null}\n onClickSearchAllVideos={props.onClickSearchAllVideos}\n />\n {showInfiniteScrollFooter && isLastItem && (\n <InfiniteScrollFooter\n isFetching={isFetching}\n fetchNext={fetchNext}\n fetchOnScroll\n nextCursor={nextCursor}\n />\n )}\n </React.Fragment>\n );\n })}\n </>\n );\n}\n"],"mappings":"sfAMA,SAAgB,EAAkB,EAA+C,CAC/E,IAAM,EAAA,EAAmB,YAAc,IAAI,EAAiB,CAAC,CAAC,EAE9D,EAAM,cAAgB,CAChB,CAAC,GAAmB,CAAC,EAAgB,QAGzC,EAAgB,QAAQ,GAAM,EAAW,QAAQ,CAAE,CAAC,CACtD,EAAG,CAAC,CAAC,EAEL,SAAS,EAAK,EAAqC,CAC5C,GAGL,EAAW,QAAQ,CAAE,CACvB,CAEA,SAAS,EAAQ,EAAe,CACzB,KAGL,OAAO,EAAW,OAAO,CAAO,CAClC,CAEA,MAAO,CACL,OACA,SACF,CACF,CCpBA,IAAM,EAAY,EAAgB,iBAAiB,+BAAS,EAe5D,SAAgB,EAGd,EAAwD,CACxD,IAAM,EAAQ,EAAmB,EAC3B,EAAS,EAAU,EACnB,CAAE,IAAK,EAAmB,UAAW,EAAY,EACjD,EAAsB,EAA0B,EAAQ,qBAAuB,CAAC,CAAC,EACjF,EAAyB,EAAwB,EAAQ,wBAA0B,CAAC,CAAC,EAE3F,SAAS,EAAU,EAAiB,CAClC,OAAO,EAAM,EAAQ,WAAW,CAAM,CAAC,CACzC,CAEA,SAAS,EAAQ,EAAoB,EAA8B,CACjE,GAAI,IAAe,EACjB,OAAO,EAAgB,CAAU,EAEnC,EAAO,MAAM,EAAU,OAAO,CAAC,CACjC,CAEA,SAAS,EAAS,EAAmB,CACnC,MAAO,CAAC,CAAQ,CAClB,CAEA,IAAM,EAAe,EACnB,GAAU,EAAQ,WAClB,GAAU,EACV,EACA,EACA,EAAQ,eAAiB,EAAQ,SACnC,EAEA,SAAS,EAAiB,EAA4B,CACpD,GAAI,CAAC,GAAQ,CAAC,EAAK,OACjB,OAEF,IAAM,EAAU,EAAoB,QAAQ,CAAI,EAOhD,OALK,EAAQ,wBAAwB,OAGV,EAAQ,IAAI,GAAQ,EAAuB,QAAQ,CAAI,CAE3E,EAJE,CAKX,CAMA,IAAM,EAAQ,EAAiB,EAAa,KAAK,EA6CjD,OAvCA,EAAM,cAAgB,CAChB,CAAC,EAAa,uBAAyB,CAAC,GAGxC,CAAC,EAAQ,uBAAuB,QAAU,CAAC,EAAM,QAGrD,EAAQ,sBAAsB,QAAQ,GAAU,EAAO,CAAK,CAAC,CAC/D,EAAG,CAAE,EAAa,sBAAuB,CAAM,CAAC,EAEhD,EAAM,cAAgB,CACf,KAAa,sBAGlB,IAAI,CAAC,EAAO,CACV,EAAQ,aAAa,EAAI,EACzB,MACF,CAEA,GAAI,MAAM,QAAQ,CAAK,GAAK,CAAC,EAAM,OAAQ,CACzC,EAAQ,aAAa,EAAI,EACzB,MACF,CAEK,EAAQ,kBAQb,EAAQ,aAAa,EAAQ,iBAAiB,CAAK,CAAC,CAfpD,CAgBF,EAAG,CAAE,EAAa,sBAAuB,EAAQ,gBAAiB,CAAC,EAM5D,CACL,QAAS,EACT,QAAA,CANe,GAAO,OAOtB,YAAA,CANmB,EAAa,sBAOhC,yBAN+B,EAAQ,gBAAkB,EAAa,SAAW,EAAa,YAO9F,WAAY,EAAa,WACzB,WAAY,EAAa,WACzB,YACA,mBACF,CACF,WCJA,SAAgB,EAId,EAA4F,CAC5F,GAAM,CACJ,UACA,UACA,oBACA,cACA,YACA,aACA,aACA,4BACE,EAAuB,CACzB,WAAY,EAAM,WAClB,UAAW,EAAM,UACjB,WAAY,EAAM,WAClB,iBAAkB,EAAM,iBACxB,KAAM,EAAM,KACZ,cAAe,EAAM,cACrB,oBAAqB,EAAM,oBAC3B,sBAAuB,EAAM,sBAC7B,uBAAwB,EAAM,sBAChC,CAAC,EAEK,EAAW,EAAqB,EAAM,KAAK,YAC3C,EAAkB,EAAS,eAiBjC,MAfI,CAAC,GAAY,CAAC,GAAe,GACxB,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,EAET,GAEA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAK,EAAmB,UAAU,iBACrC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAM,EAAM,KAAK,KACjB,YAAa,EAAM,MAAM,YACzB,UAAW,GAAO,0BACnB,CAAA,CACE,CAAA,GAKP,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAA,SACG,EAAQ,KAAK,EAAQ,IAAU,CAC9B,IAAM,EAAa,IAAU,EAAQ,OAAS,EAC9C,OACE,EAAA,EAAA,KAAA,CAAA,EAAO,SAAP,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAI,EAAO,GACX,YAAa,EAAM,KAAK,MACxB,gBAAiB,EAAM,gBAEvB,SAAU,EAAM,SAChB,eAAgB,EAAM,eACtB,UAAW,EAAM,UACjB,QAAS,EAAM,aAAa,CAAM,GAAK,EAAO,QAAQ,KACtD,WAAY,EAAO,WACnB,aAAc,EAAO,SACrB,YAAa,EAAM,YACnB,iBAAkB,EAAM,iBACxB,uBAAwB,EAAM,uBAC9B,aAAc,EAAM,aAEpB,cAAe,EAAM,cACrB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,kCAAmC,EAAM,kCACzC,SAAU,EAAM,SAEhB,KAAM,EAAM,QAAQ,CAAM,EAC1B,eAAgB,EAAM,eACtB,oBAAqB,EAAM,oBAC3B,iBAAkB,EAAM,iBACxB,SAAU,EAAM,kBAAkB,CAAM,EACxC,YAAa,EAAM,oBAAoB,CAAM,EAC7C,eAAgB,EAAM,oBAAoB,CAAM,EAChD,iBACE,EAAM,mBAAqB,GAAU,EAAM,iBAAiB,EAAQ,EAAM,MAAO,CAAM,GAEzF,UAAW,EAAM,qBAAqB,CAAM,EAE5C,kBAAmB,EAAM,kBACzB,mBAAoB,EAAM,mBAC1B,uBAAwB,EAAM,uBAC9B,MAAO,EAAM,MACb,UAAW,EAAM,UACjB,YAAa,EAAM,YACnB,YAAa,EAAM,YAEnB,SAAU,KACV,aAAc,EAAM,aACpB,YAAa,KACb,aAAc,EAAM,cAAgB,GACpC,kBAAmB,KACnB,uBAAwB,EAAM,sBAC/B,CAAA,EACA,GAA4B,IAC3B,EAAA,EAAA,IAAA,CAAC,EAAD,CACc,aACD,YACX,cAAA,GACY,YACb,CAAA,CAEW,CAAA,EA1DK,GAAG,EAAO,SAAS,GAAG,EAAO,WAAW,GAAG,GA0DhD,CAEpB,CAAC,CACD,CAAA,CAEN"}
|