@clickview/streamable-learning 0.48.0-rc.0 → 0.48.0
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 +650 -650
- package/dist/bundles.json +1 -1
- package/dist/css/DU3tPCD_.chunk.css +12 -0
- package/dist/en.json +1 -1
- package/dist/scripts/{CeWjJPIz.chunk.js → BIisq8ZO.chunk.js} +2 -2
- package/dist/scripts/{CeWjJPIz.chunk.js.map → BIisq8ZO.chunk.js.map} +1 -1
- package/dist/scripts/{DxsW8K0n2.chunk.js → BWU6_pPN2.chunk.js} +2 -2
- package/dist/scripts/{DxsW8K0n2.chunk.js.map → BWU6_pPN2.chunk.js.map} +1 -1
- package/dist/scripts/{BMjES83N2.chunk.js → BcZFo9Vw2.chunk.js} +2 -2
- package/dist/scripts/{BMjES83N2.chunk.js.map → BcZFo9Vw2.chunk.js.map} +1 -1
- package/dist/scripts/Bd2bbHru.chunk.js +1 -0
- package/dist/scripts/{0xQRFMBY.chunk.js → BfNy0Hvk.chunk.js} +2 -2
- package/dist/scripts/{0xQRFMBY.chunk.js.map → BfNy0Hvk.chunk.js.map} +1 -1
- package/dist/scripts/{C9UjF0q6.chunk.js → BivP7X20.chunk.js} +2 -2
- package/dist/scripts/{C9UjF0q6.chunk.js.map → BivP7X20.chunk.js.map} +1 -1
- package/dist/scripts/{DrDQfaFN2.chunk.js → BjbY4Fbp2.chunk.js} +3 -3
- package/dist/scripts/{DrDQfaFN2.chunk.js.map → BjbY4Fbp2.chunk.js.map} +1 -1
- package/dist/scripts/{awemA_vU2.chunk.js → BmxcE73n2.chunk.js} +2 -2
- package/dist/scripts/{awemA_vU2.chunk.js.map → BmxcE73n2.chunk.js.map} +1 -1
- package/dist/scripts/{BMl02f_62.chunk.js → BnEMhkEE2.chunk.js} +2 -2
- package/dist/scripts/{BMl02f_62.chunk.js.map → BnEMhkEE2.chunk.js.map} +1 -1
- package/dist/scripts/{DmfbtOlu.chunk.js → Buc8GegC.chunk.js} +2 -2
- package/dist/scripts/{DmfbtOlu.chunk.js.map → Buc8GegC.chunk.js.map} +1 -1
- package/dist/scripts/{DvL3J2BU.chunk.js → Byczy1lS.chunk.js} +2 -2
- package/dist/scripts/{DvL3J2BU.chunk.js.map → Byczy1lS.chunk.js.map} +1 -1
- package/dist/scripts/{BV74ZRR22.chunk.js → C2itEpvc2.chunk.js} +2 -2
- package/dist/scripts/{BV74ZRR22.chunk.js.map → C2itEpvc2.chunk.js.map} +1 -1
- package/dist/scripts/{UAcFqQzZ.chunk.js → CEFKXxac.chunk.js} +2 -2
- package/dist/scripts/{UAcFqQzZ.chunk.js.map → CEFKXxac.chunk.js.map} +1 -1
- package/dist/scripts/{B7if0Lk52.chunk.js → CEYjJAp52.chunk.js} +2 -2
- package/dist/scripts/{B7if0Lk52.chunk.js.map → CEYjJAp52.chunk.js.map} +1 -1
- package/dist/scripts/{B1jitqYS2.chunk.js → CJSc4YDq2.chunk.js} +2 -2
- package/dist/scripts/{B1jitqYS2.chunk.js.map → CJSc4YDq2.chunk.js.map} +1 -1
- package/dist/scripts/{JtFbyaXc.chunk.js → CKUA5J3R.chunk.js} +2 -2
- package/dist/scripts/{JtFbyaXc.chunk.js.map → CKUA5J3R.chunk.js.map} +1 -1
- package/dist/scripts/{DNO0KpY72.chunk.js → CYrzupmS2.chunk.js} +2 -2
- package/dist/scripts/{DNO0KpY72.chunk.js.map → CYrzupmS2.chunk.js.map} +1 -1
- package/dist/scripts/{E9tNds1l.chunk.js → CcGYZb9f.chunk.js} +2 -2
- package/dist/scripts/{E9tNds1l.chunk.js.map → CcGYZb9f.chunk.js.map} +1 -1
- package/dist/scripts/{CibcLNJP2.chunk.js → CeQGaFi-2.chunk.js} +2 -2
- package/dist/scripts/{CibcLNJP2.chunk.js.map → CeQGaFi-2.chunk.js.map} +1 -1
- package/dist/scripts/{BqO6i89w2.chunk.js → Cr3Blj6H2.chunk.js} +2 -2
- package/dist/scripts/{BqO6i89w2.chunk.js.map → Cr3Blj6H2.chunk.js.map} +1 -1
- package/dist/scripts/{D0vsmyva.chunk.js → CxCkwLio.chunk.js} +2 -2
- package/dist/scripts/{D0vsmyva.chunk.js.map → CxCkwLio.chunk.js.map} +1 -1
- package/dist/scripts/{CvqqZmNo2.chunk.js → Cxj75Dqe2.chunk.js} +2 -2
- package/dist/scripts/{CvqqZmNo2.chunk.js.map → Cxj75Dqe2.chunk.js.map} +1 -1
- package/dist/scripts/{CcDgbmw52.chunk.js → D-VNmhoM2.chunk.js} +2 -2
- package/dist/scripts/{CcDgbmw52.chunk.js.map → D-VNmhoM2.chunk.js.map} +1 -1
- package/dist/scripts/{DAvXFgC62.chunk.js → D2FqnK9m2.chunk.js} +2 -2
- package/dist/scripts/{DAvXFgC62.chunk.js.map → D2FqnK9m2.chunk.js.map} +1 -1
- package/dist/scripts/{lokG7Sha2.chunk.js → D3sdyN2Q2.chunk.js} +2 -2
- package/dist/scripts/{lokG7Sha2.chunk.js.map → D3sdyN2Q2.chunk.js.map} +1 -1
- package/dist/scripts/{KCdpQ8qv2.chunk.js → D6IzS-bj2.chunk.js} +2 -2
- package/dist/scripts/{KCdpQ8qv2.chunk.js.map → D6IzS-bj2.chunk.js.map} +1 -1
- package/dist/scripts/{CPkKuTSK2.chunk.js → D8g6nOG92.chunk.js} +2 -2
- package/dist/scripts/{CPkKuTSK2.chunk.js.map → D8g6nOG92.chunk.js.map} +1 -1
- package/dist/scripts/{Bkv1Tbyu.chunk.js → DCKKwz9L.chunk.js} +2 -2
- package/dist/scripts/{Bkv1Tbyu.chunk.js.map → DCKKwz9L.chunk.js.map} +1 -1
- package/dist/scripts/{CeI-LCE-.chunk.js → DL4UFxRK.chunk.js} +2 -2
- package/dist/scripts/{CeI-LCE-.chunk.js.map → DL4UFxRK.chunk.js.map} +1 -1
- package/dist/scripts/{DLp7yHzT2.chunk.js → DLofRa642.chunk.js} +2 -2
- package/dist/scripts/{DLp7yHzT2.chunk.js.map → DLofRa642.chunk.js.map} +1 -1
- package/dist/scripts/{BSjm_rCE.chunk.js → DMZ--ok1.chunk.js} +2 -2
- package/dist/scripts/{BSjm_rCE.chunk.js.map → DMZ--ok1.chunk.js.map} +1 -1
- package/dist/scripts/{CikSQKH-.chunk.js → DQFcbMMk.chunk.js} +2 -2
- package/dist/scripts/{CikSQKH-.chunk.js.map → DQFcbMMk.chunk.js.map} +1 -1
- package/dist/scripts/{XnBhLH-02.chunk.js → DVeqPzBe2.chunk.js} +2 -2
- package/dist/scripts/{XnBhLH-02.chunk.js.map → DVeqPzBe2.chunk.js.map} +1 -1
- package/dist/scripts/{Clh6wBrg.chunk.js → DWerltCT.chunk.js} +2 -2
- package/dist/scripts/{Clh6wBrg.chunk.js.map → DWerltCT.chunk.js.map} +1 -1
- package/dist/scripts/{i2-k6ULv2.chunk.js → DatscYpA2.chunk.js} +2 -2
- package/dist/scripts/{i2-k6ULv2.chunk.js.map → DatscYpA2.chunk.js.map} +1 -1
- package/dist/scripts/{BXT8nHry2.chunk.js → DkaGC5IU2.chunk.js} +2 -2
- package/dist/scripts/{BXT8nHry2.chunk.js.map → DkaGC5IU2.chunk.js.map} +1 -1
- package/dist/scripts/{BoxedFO8.chunk.js → DqZWSPDJ.chunk.js} +2 -2
- package/dist/scripts/{BoxedFO8.chunk.js.map → DqZWSPDJ.chunk.js.map} +1 -1
- package/dist/scripts/{CoYNU7We2.chunk.js → Dql-1E6g2.chunk.js} +2 -2
- package/dist/scripts/{CoYNU7We2.chunk.js.map → Dql-1E6g2.chunk.js.map} +1 -1
- package/dist/scripts/{DNNNPLMp.chunk.js → DuBHin02.chunk.js} +2 -2
- package/dist/scripts/{DNNNPLMp.chunk.js.map → DuBHin02.chunk.js.map} +1 -1
- package/dist/scripts/{CK6c6uHp2.chunk.js → QMuFwiiF2.chunk.js} +2 -2
- package/dist/scripts/{CK6c6uHp2.chunk.js.map → QMuFwiiF2.chunk.js.map} +1 -1
- package/dist/scripts/{NV4_mMU8.chunk.js → U_sIlzAD.chunk.js} +2 -2
- package/dist/scripts/{NV4_mMU8.chunk.js.map → U_sIlzAD.chunk.js.map} +1 -1
- package/dist/scripts/{m9QbGES0.chunk.js → WLyOm9Lj.chunk.js} +2 -2
- package/dist/scripts/{m9QbGES0.chunk.js.map → WLyOm9Lj.chunk.js.map} +1 -1
- package/dist/scripts/{DlQrdOls.chunk.js → Ymq7JLkU.chunk.js} +2 -2
- package/dist/scripts/{DlQrdOls.chunk.js.map → Ymq7JLkU.chunk.js.map} +1 -1
- package/dist/scripts/{app-B1XBsz23.js → app-gjHxcZG3.js} +4 -4
- package/dist/scripts/app-gjHxcZG3.js.map +1 -0
- package/dist/scripts/{DIHDe4Sg.chunk.js → djRnI462.chunk.js} +2 -2
- package/dist/scripts/{DIHDe4Sg.chunk.js.map → djRnI462.chunk.js.map} +1 -1
- package/dist/scripts/{BDliRFoa.chunk.js → e2K2YU7z.chunk.js} +2 -2
- package/dist/scripts/{BDliRFoa.chunk.js.map → e2K2YU7z.chunk.js.map} +1 -1
- package/dist/scripts/{CpFOQcL7.chunk.js → fnfhCa1P.chunk.js} +2 -2
- package/dist/scripts/{CpFOQcL7.chunk.js.map → fnfhCa1P.chunk.js.map} +1 -1
- package/dist/scripts/{Dd8r1SE32.chunk.js → iyIL3kim2.chunk.js} +2 -2
- package/dist/scripts/{Dd8r1SE32.chunk.js.map → iyIL3kim2.chunk.js.map} +1 -1
- package/dist/scripts/{BKbKu9Rp.chunk.js → kfFYr9dc.chunk.js} +2 -2
- package/dist/scripts/{BKbKu9Rp.chunk.js.map → kfFYr9dc.chunk.js.map} +1 -1
- package/dist/scripts/{CwI-7tep2.chunk.js → kts5xiiM2.chunk.js} +2 -2
- package/dist/scripts/{CwI-7tep2.chunk.js.map → kts5xiiM2.chunk.js.map} +1 -1
- package/dist/scripts/{D8_5yfHY2.chunk.js → lLAYbgAy2.chunk.js} +2 -2
- package/dist/scripts/{D8_5yfHY2.chunk.js.map → lLAYbgAy2.chunk.js.map} +1 -1
- package/dist/scripts/{CXNve4Wq2.chunk.js → p9ukva5a2.chunk.js} +2 -2
- package/dist/scripts/{CXNve4Wq2.chunk.js.map → p9ukva5a2.chunk.js.map} +1 -1
- package/dist/scripts/{BCdnm1Nn.chunk.js → wOeN2ls0.chunk.js} +2 -2
- package/dist/scripts/{BCdnm1Nn.chunk.js.map → wOeN2ls0.chunk.js.map} +1 -1
- package/dist/scripts/{DMq5Gp-U2.chunk.js → zp2BHOp82.chunk.js} +2 -2
- package/dist/scripts/{DMq5Gp-U2.chunk.js.map → zp2BHOp82.chunk.js.map} +1 -1
- package/dist/scripts/{CmrPRojb.chunk.js → zyVwH8JF.chunk.js} +2 -2
- package/dist/scripts/{CmrPRojb.chunk.js.map → zyVwH8JF.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/D5Jnyjf8.chunk.js +0 -1
- package/dist/scripts/app-B1XBsz23.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{gt as e}from"./Dp9qJj1C.chunk.js";import{t}from"./BJvPfCvt.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{C as r,dt as i,l as a,lt as o,m as s,n as c,ut as l}from"./Dun43GrB.chunk.js";import{t as u}from"./CFXUbsBS.chunk.js";import{n as d,t as f}from"./Ca1QPe-q2.chunk.js";import{n as p}from"./iuoIcGAm2.chunk.js";import{Z as m}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{gt as e}from"./Dp9qJj1C.chunk.js";import{t}from"./BJvPfCvt.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{C as r,dt as i,l as a,lt as o,m as s,n as c,ut as l}from"./Dun43GrB.chunk.js";import{t as u}from"./CFXUbsBS.chunk.js";import{n as d,t as f}from"./Ca1QPe-q2.chunk.js";import{n as p}from"./iuoIcGAm2.chunk.js";import{Z as m}from"./app-gjHxcZG3.js";import{t as h}from"./DXfGdqxs.chunk.js";import{r as g}from"./B-6uVsUw2.chunk.js";import{t as _}from"./CyxOxJjg2.chunk.js";import{t as v}from"./iyIL3kim2.chunk.js";import{t as y}from"./Bt57Tmef2.chunk.js";import{t as b}from"./DrgVCnQA2.chunk.js";var x={cellDate:`_cellDate_vp37w_1`,label:`_label_vp37w_13`,isHovering:`_isHovering_vp37w_16`,numberWrapper:`_numberWrapper_vp37w_19`},S=e(l()),C=o(),w=n.encloseNamespace(`specialEventCalendar.calendarCellDate`);function T(e){let t=u.isSame(m.convertUTCToTimezoneDate(new Date().toISOString(),e.timezone||null),e.date,`day`),n=`${x.cellDate} d-flex flex-nowrap`;t&&(n+=` bg-dark text-white`),e.hasEvent?n+=` text-white`:e.notCurrentMonth&&!e.isHovering&&(n+=` text-secondary`),e.className&&(n+=` ${e.className}`);let[r,i]=p({delay:250});return(0,C.jsxs)(`div`,{className:`${n} ${i?x.isHovering:``}`,ref:r,children:[(0,C.jsx)(`div`,{className:`${x.numberWrapper} d-flex text-center justify-content-center align-items-center flex-shrink-0`,children:u.format(e.date,`D`)}),t&&(0,C.jsx)(`div`,{className:`${x.label} justify-content-start align-items-center`,children:w(`today`)})]})}var E={sliderDot:`_sliderDot_umrgt_1`,sm:`_sm_umrgt_6`,active:`_active_umrgt_10`,dotContainer:`_dotContainer_umrgt_13`,defaultCursor:`_defaultCursor_umrgt_16`};function D(e){function t(t,n){t.stopPropagation(),t.preventDefault(),e.onSliderDotClick(n)}function n(t,n){let r=`${E.sliderDot} rounded-3`;return t&&(r+=` ${E.active}`),e.size===`sm`&&(r+=` ${E.sm}`),e.isDisabled?.(n)&&(r+=` pointer-events-none ${E.defaultCursor}`),r}return(0,C.jsx)(`div`,{className:`${e.className} w-100 d-flex justify-content-around`,children:(0,C.jsx)(`div`,{className:`${E.dotContainer} d-flex`,children:[...Array(e.sliderLength)].map((r,i)=>(0,C.jsx)(d,{className:n(i===e.sliderStep,i),onClick:e=>t?.(e,i)},i))})})}var O={hardcodedCover:`_hardcodedCover_1kbjb_1`,tag:`_tag_1kbjb_1`,date:`_date_1kbjb_1`,backgroundImage:`_backgroundImage_1kbjb_1`,eventCard:`_eventCard_1kbjb_1`,wrapper:`_wrapper_1kbjb_5`,left:`_left_1kbjb_5`,right:`_right_1kbjb_8`,noAnimation:`_noAnimation_1kbjb_22`,cover:`_cover_1kbjb_25`,tagWrap:`_tagWrap_1kbjb_35`,appear:`_appear_1kbjb_46`,displayDate:`_displayDate_1kbjb_49`,title:`_title_1kbjb_53`,titleText:`_titleText_1kbjb_56`,circle:`_circle_1kbjb_71`,active:`_active_1kbjb_78`,arrow:`_arrow_1kbjb_90`,bottomBar:`_bottomBar_1kbjb_108`,bottomPlaceholder:`_bottomPlaceholder_1kbjb_112`,multiEventFilter:`_multiEventFilter_1kbjb_126`};k.defaultProps={responsiveText:!0};function k(e){let{sliderStep:n,setSliderStep:o}=e,l=e.fadePastEvents?V(e.eventsOnDay):e.eventsOnDay,p=e.eventsOnDay.length>1,m=l.find((e,t)=>t===n)||l[0],x=!!m.endDate,w=e.getBackgroundColor?.(m.content),E=e.getHardCodedEvent?.(m.content),k=e.getIconUrl?.(m.content),A=e.getCoverUrl?.(m.content),j=m.content.status===b.ComingSoon,[M,N]=S.useState(e.hasInitialized?O.appear:``);S.useEffect(()=>{if(!e.hasInitialized){let t=Math.floor(Math.random()*600+400);window.setTimeout(()=>{N(O.appear),window.setTimeout(()=>{e.setHasInitialized(!0)},400)},t)}},[e.hasInitialized]),S.useEffect(()=>{e.isHovering&&e.setHoveredEvent(m)},[e.isHovering,m]),S.useEffect(()=>()=>{e.isHovering&&e.hoveredEvent?.specialEventId===m.specialEventId&&e.setHoveredEvent(null)},[e.isHovering,e.hoveredEvent,m]);function P(){return p?e.getEventsListAppLink?.():j?null:e.getTopicAppLink?.(m.content,i.slugify(m.name))}function F(){let t={date:u.format(e.date,`YYYY-MM-DD`),presentationId:e.presentationId,eventCount:e.eventsOnDay.length};return p?(t.eventId=e.eventsOnDay.map(e=>e.specialEventId).join(`,`),t.topicId=e.eventsOnDay.map(e=>e.content.id).join(`,`)):(t.eventId=m.specialEventId,t.topicId=m.content.id,t.eventStatus=m.content.status),t}let I=F(),L={actionType:r.Click,entity:a.SpecialEvent,location:s.CalendarDay};function R(e){return u.format(e,`YYYY-MM-DD`)}function z(){return`${e.className} ${M} `+[E?`${O.hardcodedCover} position-absolute`:O.backgroundImage,k?`my-auto`:O.cover,j?O.comingSoon:``,e.hasInitialized?O.noAnimation:``,e.isHovering?`rounded-3`:``,e.isMultiEventDate?O.multiEventFilter:``,`company`in m.content?`rounded-circle`:``].join(` `)}function B(e){return`startDateTime`in e.content?u.isBefore(e.content.startDateTime,new Date):!1}function V(e){return e.sort((e,t)=>!B(e)&&B(t)?1:B(e)&&!B(t)?-1:0)}return(0,C.jsx)(`div`,{onClick:()=>{j&&c.logUserAction(I,L)},children:(0,C.jsxs)(f,{appLink:P(),analyticsOptions:L,analyticsData:I,className:`position-absolute top-0 start-0 h-100 w-100 text-shadow ${O.wrapper}`,labelledBy:`calendarEvent`,children:[(0,C.jsx)(`div`,{className:`${O.tagWrap} p-1`,children:j&&(0,C.jsx)(_,{className:`justify-content-center p-0 rounded-circle ${O.tag} ${M}`,onlyIcon:!0})}),!e.hideDay&&(0,C.jsx)(T,{date:e.date,notCurrentMonth:e.notCurrentMonth,className:`${O.date} ${M}`,isHovering:e.isHovering,timezone:e.timezone,hasEvent:!0}),(0,C.jsxs)(`div`,{style:{backgroundColor:w},className:`position-absolute d-flex flex-column justify-content-end align-items-center text-white px-1 pt-2 pb-1 ${O.eventCard} ${M} ${e.isHovering?`rounded-3`:``} ${e.isMultiEventDate?O.multiEventFilter:``} ${e.className} ${!e.isHovering&&B(m)?`opacity-50`:``}`,children:[k&&(0,C.jsx)(y,{src:k,alt:m.content.name,className:z()}),A&&!k&&(0,C.jsx)(`div`,{style:{backgroundImage:`url('${A}')`},className:z()}),x&&(0,C.jsx)(`div`,{className:`${O.displayDate}`,children:v.getDisplayDate(m.startDate,m.endDate)}),(0,C.jsx)(`div`,{className:`text-center ${O.title} ${p?`mb-1`:`mb-2`}`,children:(0,C.jsx)(`p`,{id:`calendarEvent`,className:`${e.responsiveText?O.titleText:``} ${e.isHovering?`mb-0`:`clamp-2`} h6`,title:m.name,children:m.name})}),p&&n!==0&&(0,C.jsx)(`div`,{className:`position-absolute bg-white rounded-circle ${O.left}`,children:(0,C.jsx)(d,{onClick:t=>{t.stopPropagation(),t.preventDefault(),o(e=>e-1),c.logUserAction({date:R(e.date),action:`previous`,eventCount:e.eventsOnDay.length},L)},children:(0,C.jsx)(t,{svg:h,className:`d-inline-block svg-container text-dark ${O.arrow}`})})}),p&&n!==e.eventsOnDay.length-1&&(0,C.jsx)(`div`,{className:`position-absolute bg-white rounded-circle ${O.right}`,children:(0,C.jsx)(d,{onClick:t=>{t.stopPropagation(),t.preventDefault(),o(e=>e+1),c.logUserAction({date:R(e.date),action:`next`,eventCount:e.eventsOnDay.length},L)},children:(0,C.jsx)(t,{svg:g,className:`d-inline-block svg-container text-dark ${O.arrow}`})})}),p&&(0,C.jsx)(`div`,{className:`d-flex ${O.bottomBar} ${p?``:O.bottomPlaceholder}`,children:(0,C.jsx)(D,{sliderStep:n,sliderLength:e.eventsOnDay.length,size:`sm`,className:`${e.isHovering?`mb-2`:`mb-1`}`,onSliderDotClick:t=>{o(t),c.logUserAction({date:R(e.date),action:`jump`,eventCount:e.eventsOnDay.length},L)}})})]})]})})}var A={cell:`_cell_34fbn_1`,multiEventCell:`_multiEventCell_34fbn_4`,fadeIn:`_fadeIn_34fbn_1`};function j(e){let t=S.useMemo(()=>e.hoveredEvent?.endDate&&!u.isSame(e.date,e.hoveredEvent?.startDate)&&u.isBetween(u.format(e.date,`YYYY-MM-DD`),e.hoveredEvent?.startDate,e.hoveredEvent?.endDate),[e.hoveredEvent]),n=e.hoveredEvent?e.getBackgroundColor?.(e.hoveredEvent.content):null;return(0,C.jsxs)(`div`,{className:`${A.cell} fw-semibold`,children:[!e.hideDay&&(0,C.jsx)(T,{date:e.date,notCurrentMonth:e.notCurrentMonth,timezone:e.timezone}),t&&!e.isHovering&&(0,C.jsx)(`div`,{style:{backgroundColor:n},className:A.multiEventCell}),e.eventsOnDay?.length>0&&(0,C.jsx)(k,{...e,isMultiEventDate:t&&!e.isHovering})]})}export{j as t};
|
|
2
|
+
//# sourceMappingURL=BmxcE73n2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awemA_vU2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/calendar/components/calendar-cell-date/calendar-cell-date.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-cell-date/CalendarCellDate.tsx","../../../../libs/shared/src/components/slider-dots/slider-dots.module.scss","../../../../libs/shared/src/components/slider-dots/SliderDots.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-events/calendar-events.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-events/CalendarEvents.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-day/calendar-day.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-day/CalendarDay.tsx"],"sourcesContent":[":local {\n .cellDate {\n z-index: 100;\n position: absolute;\n top: map-get($spacers, 1);\n left: map-get($spacers, 1);\n width: 2rem;\n height: 2rem;\n border-radius: 2rem;\n line-height: 0;\n transition: width 150ms ease-in !important;\n overflow: hidden;\n .label{\n display: flex;\n }\n &.isHovering {\n width: 5.18rem;\n }\n }\n\n .numberWrapper {\n width: 2rem;\n height: 2rem;\n border-radius: 2rem;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { TimezoneHelper } from 'libs/shared/apps/streamable-learning/utils/TimezoneHelper';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\n\nimport styles from './calendar-cell-date.module.scss';\n\nconst namespace = 'specialEventCalendar.calendarCellDate';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CalendarCellDateProps {\n date: Date;\n notCurrentMonth: boolean;\n hasEvent?: boolean;\n className?: string;\n isHovering?: boolean;\n timezone?: Timezone;\n}\n\nexport function CalendarCellDate(props: CalendarCellDateProps): JSX.Element {\n const isToday = DateHelper.isSame(\n TimezoneHelper.convertUTCToTimezoneDate(new Date().toISOString(), props.timezone || null),\n props.date,\n 'day'\n );\n\n let dateClassName = `${styles.cellDate} d-flex flex-nowrap`;\n if (isToday)\n dateClassName += ' bg-dark text-white';\n if (props.hasEvent)\n dateClassName += ' text-white';\n else if (props.notCurrentMonth && !props.isHovering)\n dateClassName += ' text-secondary';\n if (props.className)\n dateClassName += ` ${props.className}`;\n \n const numberClassName = 'd-flex text-center justify-content-center align-items-center flex-shrink-0';\n const [ ref, isHovering ] = useHoverIntent<HTMLDivElement>({ delay: 250 });\n\n return (\n <div className={`${dateClassName} ${isHovering ? styles.isHovering : ''}`} ref={ref}>\n <div className={`${styles.numberWrapper} ${numberClassName}`}>\n {DateHelper.format(props.date, 'D')}\n </div>\n {isToday && (\n <div className={`${styles.label} justify-content-start align-items-center`}>\n {getPhrase('today')}\n </div>\n )}\n </div>\n );\n}\n",":local {\n .sliderDot {\n width: 0.5rem;\n height: 0.5rem;\n background-color: $gray-400;\n\n &.sm {\n width: 0.3125rem;\n height: 0.3125rem;\n }\n\n &.active {\n background-color: $blue;\n }\n }\n\n .dotContainer {\n gap: 0.625rem;\n }\n \n .defaultCursor {\n cursor: initial !important;\n }\n}","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './slider-dots.module.scss';\n\ninterface SliderDotsProps {\n sliderStep: number;\n sliderLength: number;\n onSliderDotClick: (i: number) => void;\n isDisabled?: (indicatorIndex: number) => boolean;\n\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function SliderDots(props: SliderDotsProps) {\n function onSliderDotClick(e: MouseEvent, i: number) {\n e.stopPropagation();\n e.preventDefault();\n props.onSliderDotClick(i);\n }\n\n function getSliderDotClassName(active: boolean, index: number) {\n let className = `${styles.sliderDot} rounded-3`;\n\n if (active)\n className += ` ${styles.active}`;\n\n if (props.size === 'sm')\n className += ` ${styles.sm}`;\n\n if (props.isDisabled?.(index))\n className += ` pointer-events-none ${styles.defaultCursor}`;\n\n return className;\n }\n \n return (\n <div className={`${props.className} w-100 d-flex justify-content-around`}>\n <div className={`${styles.dotContainer} d-flex`}>\n {[...Array(props.sliderLength)].map((_, i) => {\n const active = i === props.sliderStep;\n\n return (\n <DivButton\n key={i}\n className={getSliderDotClassName(active, i)}\n onClick={e => onSliderDotClick?.(e, i)}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n $button-bottom: 2.15rem;\n $circle-size: map-get($spacers, 1);\n \n %fade-in {\n opacity: 0;\n transition: opacity 400ms ease-in;\n }\n\n %slider-on-hover {\n display: none;\n &:hover{\n display: block;\n }\n }\n\n .wrapper {\n &:hover{\n .left {\n display: block;\n }\n .right {\n display: block;\n }\n }\n }\n\n .eventCard {\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n @extend %fade-in;\n //fall-back color\n background-color: $gray-900;\n\n }\n .backgroundImage {\n height: 4.5rem;\n width: 4.5rem;\n \n @extend %fade-in;\n &.noAnimation {\n transition: none;\n }\n &.cover{\n top:0;\n left:0;\n width: 100%;\n height: 100%;\n z-index: 1;\n background-repeat: no-repeat;\n background-position: 0 0 !important;\n background-size: cover;\n }\n }\n \n .date {\n @extend %fade-in;\n }\n\n .tagWrap {\n z-index: 4;\n position: absolute;\n right: 0;\n }\n\n .tag {\n @extend %fade-in;\n width: 2rem;\n height: 2rem;\n top: map-get($spacers, 1);\n right: map-get($spacers, 1);\n }\n\n .appear {\n opacity: 1;\n }\n\n .displayDate {\n font-size: 0.625rem;\n z-index: 2;\n }\n\n .title {\n z-index: 2;\n }\n\n $title-font-size: clamp(0.75rem, 1.25vw, 1rem);\n .titleText {\n font-size: $title-font-size;\n padding-bottom: calc($title-font-size * 0.05) !important;\n\n @include media('<=sm') {\n @include clamp(1);\n }\n }\n\n .circle {\n width: $circle-size;\n height: $circle-size;\n border-radius: 50%;\n background-color: $gray-400;\n z-index: 2;\n\n &.active {\n background-color: $blue;\n }\n\n &:not(:last-child) {\n margin-right: map-get($spacers, 2);\n }\n }\n\n .left {\n left: map-get($spacers, 1);\n bottom: 50%;\n transform: translateY(50%);\n z-index: 2;\n .arrow {\n padding-right: 0.1rem;\n }\n display: none;\n\n }\n .right {\n right: map-get($spacers, 1);\n bottom: 50%;\n transform: translateY(50%);\n z-index: 2;\n .arrow {\n padding-left: 0.1rem;\n }\n display: none;\n\n }\n .bottomBar {\n z-index: 3;\n margin-top: 0.125rem;\n }\n .bottomPlaceholder {\n visibility: hidden;\n }\n\n .hardcodedCover {\n top:0;\n left:0;\n width: 100%;\n height: 100%;\n z-index: 1;\n background-size: 100%;\n @extend %fade-in;\n &.noAnimation {\n transition: none;\n }\n }\n\n .multiEventFilter {\n &::before {\n content: '';\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: rgba(255, 255, 255, 0.4);\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CalendarCellDate } from 'libs/shared/apps/calendar/components/calendar-cell-date/CalendarCellDate';\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { CalendarCellProps } from 'libs/shared/apps/calendar/interfaces/CalendarCellProps';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { HoverableProps } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { SliderDots } from 'libs/shared/components/slider-dots/SliderDots';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport styles from './calendar-events.module.scss';\n\ntype CalendarEventsProps = HoverableProps & CalendarCellProps;\n\nCalendarEvents.defaultProps = {\n responsiveText: true\n};\n\nexport function CalendarEvents(props: CalendarEventsProps): JSX.Element {\n const { sliderStep, setSliderStep } = props;\n\n const sortedEventsOnDay = props.fadePastEvents ? sortPastEvents(props.eventsOnDay) : props.eventsOnDay;\n const multiEvents = props.eventsOnDay.length > 1;\n const displayedEvent = sortedEventsOnDay.find((e, idx) => idx === sliderStep) || sortedEventsOnDay[0];\n const multiDayEvent = !!displayedEvent.endDate;\n\n const backgroundColor = props.getBackgroundColor?.(displayedEvent.content);\n\n const hardCodedEvent = props.getHardCodedEvent?.(displayedEvent.content);\n\n const iconUrl = props.getIconUrl?.(displayedEvent.content);\n const coverUrl = props.getCoverUrl?.(displayedEvent.content);\n\n const isComingSoon = displayedEvent.content.status === ClassificationStatus.ComingSoon;\n\n const [ className, setClassName ] = React.useState(!props.hasInitialized ? '' : styles.appear);\n\n React.useEffect(() => {\n if (!props.hasInitialized) {\n // a random number between 400 and 1000\n const randomNumber = Math.floor(Math.random() * 600 + 400);\n window.setTimeout(() => {\n setClassName(styles.appear);\n window.setTimeout(() => {\n props.setHasInitialized(true);\n }, 400);\n }, randomNumber);\n }\n }, [props.hasInitialized]);\n\n React.useEffect(() => {\n if (props.isHovering) {\n props.setHoveredEvent(displayedEvent);\n }\n }, [ props.isHovering, displayedEvent ]);\n\n React.useEffect(() => {\n return () => {\n if (props.isHovering && props.hoveredEvent?.specialEventId === displayedEvent.specialEventId) {\n props.setHoveredEvent(null);\n }\n };\n }, [ props.isHovering, props.hoveredEvent, displayedEvent ]);\n\n function getAppLink(): Core.AppLink {\n if (multiEvents)\n return props.getEventsListAppLink?.();\n\n if (isComingSoon)\n return null;\n\n return props.getTopicAppLink?.(displayedEvent.content, TextHelper.slugify(displayedEvent.name));\n }\n\n function getAnalyticsData() {\n const analyticsData: HashObject = {\n date: DateHelper.format(props.date, 'YYYY-MM-DD'),\n presentationId: props.presentationId,\n eventCount: props.eventsOnDay.length\n };\n\n if (multiEvents) {\n analyticsData.eventId = props.eventsOnDay.map(e => e.specialEventId).join(',');\n analyticsData.topicId = props.eventsOnDay.map(e => e.content.id).join(',');\n } else {\n analyticsData.eventId = displayedEvent.specialEventId;\n analyticsData.topicId = displayedEvent.content.id;\n analyticsData.eventStatus = displayedEvent.content.status;\n }\n return analyticsData;\n }\n\n const analyticsData = getAnalyticsData();\n\n const analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.SpecialEvent,\n location: LocationContext.CalendarDay\n };\n\n function formatAnalyticDataDate(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n }\n\n function getBgImageClassName(): string {\n const defaultClassName = `${props.className} ${className} `;\n\n const classes = [\n hardCodedEvent ? `${styles.hardcodedCover} position-absolute` : styles.backgroundImage,\n iconUrl ? 'my-auto' : styles.cover,\n isComingSoon ? styles.comingSoon : '',\n props.hasInitialized ? styles.noAnimation : '',\n props.isHovering ? `rounded-3` : '',\n props.isMultiEventDate ? styles.multiEventFilter : '',\n 'company' in displayedEvent.content ? 'rounded-circle' : ''\n ];\n\n return defaultClassName + classes.join(' ');\n }\n\n function isPastEvent(event: CalendarEvent<CalendarEventContent>) {\n if ('startDateTime' in event.content) {\n return DateHelper.isBefore(event.content.startDateTime, new Date());\n }\n return false;\n }\n\n function sortPastEvents(events: CalendarEvent<CalendarEventContent>[]) {\n return events.sort((a, b) => {\n if (!isPastEvent(a) && isPastEvent(b)) {\n return 1;\n }\n\n if (isPastEvent(a) && !isPastEvent(b)) {\n return -1;\n }\n\n return 0;\n });\n }\n\n return (\n <div onClick={() => {\n if (isComingSoon)\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }}>\n <AppLink\n appLink={getAppLink()}\n analyticsOptions={analyticsOptions}\n analyticsData={analyticsData}\n className={`position-absolute top-0 start-0 h-100 w-100 text-shadow ${styles.wrapper}`}\n labelledBy='calendarEvent'\n >\n <div className={`${styles.tagWrap} p-1`}>\n {isComingSoon && (\n <ComingSoonTag className={`justify-content-center p-0 rounded-circle ${styles.tag} ${className}`} onlyIcon />\n )}\n </div>\n {!props.hideDay && (\n <CalendarCellDate\n date={props.date}\n notCurrentMonth={props.notCurrentMonth}\n className={`${styles.date} ${className}`}\n isHovering={props.isHovering}\n timezone={props.timezone}\n hasEvent\n />\n )}\n\n <div\n style={{ backgroundColor } }\n className={`position-absolute d-flex flex-column justify-content-end align-items-center text-white px-1 pt-2 pb-1 ${styles.eventCard} ${className} ${props.isHovering ? 'rounded-3' : ''} ${props.isMultiEventDate ? styles.multiEventFilter : ''} ${props.className} ${!props.isHovering && isPastEvent(displayedEvent) ? 'opacity-50' : ''}`}\n >\n {iconUrl && <LazyImage src={iconUrl} alt={displayedEvent.content.name} className={getBgImageClassName()} />}\n\n {coverUrl && !iconUrl && (\n <div\n style={{ backgroundImage: `url('${coverUrl}')` }}\n className={getBgImageClassName()}\n />\n )}\n\n {multiDayEvent && (\n <div className={`${styles.displayDate}`}>\n {SpecialEventHelper.getDisplayDate(displayedEvent.startDate, displayedEvent.endDate)}\n </div>\n )}\n <div className={`text-center ${styles.title} ${multiEvents ? 'mb-1' : 'mb-2'}`}>\n <p id='calendarEvent' className={`${props.responsiveText ? styles.titleText : ''} ${props.isHovering ? 'mb-0' : 'clamp-2'} h6`} title={displayedEvent.name}>{displayedEvent.name}</p>\n </div>\n\n {(multiEvents && sliderStep !== 0) && (\n <div className={`position-absolute bg-white rounded-circle ${styles.left}`}>\n <DivButton\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setSliderStep(s => s - 1);\n AnalyticsHelper.logUserAction({ date: formatAnalyticDataDate(props.date), action: 'previous', eventCount: props.eventsOnDay.length }, analyticsOptions);\n }}>\n <SvgContainer\n svg={ChevronLeftSvg}\n className={`d-inline-block svg-container text-dark ${styles.arrow}`}\n />\n </DivButton>\n </div>\n )}\n\n {multiEvents && sliderStep !== props.eventsOnDay.length - 1 && (\n <div className={`position-absolute bg-white rounded-circle ${styles.right}`}>\n <DivButton\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setSliderStep(s => s + 1);\n AnalyticsHelper.logUserAction({ date: formatAnalyticDataDate(props.date), action: 'next', eventCount: props.eventsOnDay.length }, analyticsOptions);\n }}>\n <SvgContainer\n svg={ChevronRightSvg}\n className={`d-inline-block svg-container text-dark ${styles.arrow}`}\n />\n </DivButton>\n </div>\n )}\n\n {multiEvents && (\n <div className={`d-flex ${styles.bottomBar} ${multiEvents ? '' : styles.bottomPlaceholder}`}>\n <SliderDots\n sliderStep={sliderStep}\n sliderLength={props.eventsOnDay.length}\n size='sm'\n className={`${props.isHovering ? 'mb-2' : 'mb-1'}`}\n onSliderDotClick={i => {\n setSliderStep(i);\n AnalyticsHelper.logUserAction({ date: formatAnalyticDataDate(props.date), action: 'jump', eventCount: props.eventsOnDay.length }, analyticsOptions);\n }}\n />\n </div>\n )}\n </div>\n </AppLink>\n </div>\n );\n}\n",":local {\n .cell {\n padding-bottom: 100%;\n }\n\n .multiEventCell {\n height: 100%;\n width: 100%;\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0.25;\n z-index: 100;\n animation: fadeIn 0.8s ease-in;\n }\n @keyframes :local(fadeIn) {\n 0% {\n opacity: 0.1;\n }\n 20% {\n opacity: 0.25;\n }\n }\n}","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarCellDate } from 'libs/shared/apps/calendar/components/calendar-cell-date/CalendarCellDate';\nimport { CalendarEvents } from 'libs/shared/apps/calendar/components/calendar-events/CalendarEvents';\nimport { CalendarCellProps } from 'libs/shared/apps/calendar/interfaces/CalendarCellProps';\nimport { HoverableProps } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\n\nimport styles from './calendar-day.module.scss';\n\ntype CalendarDayProps = HoverableProps & CalendarCellProps;\n\nexport function CalendarDay(props: CalendarDayProps) {\n const isMultiEventDate = React.useMemo(\n () =>\n props.hoveredEvent?.endDate &&\n !DateHelper.isSame(props.date, props.hoveredEvent?.startDate) &&\n DateHelper.isBetween(\n DateHelper.format(props.date, 'YYYY-MM-DD'),\n props.hoveredEvent?.startDate,\n props.hoveredEvent?.endDate\n ),\n [props.hoveredEvent]\n );\n const backgroundColor = props.hoveredEvent ? props.getBackgroundColor?.(props.hoveredEvent.content) : null;\n\n return (\n <div className={`${styles.cell} fw-semibold`}>\n {!props.hideDay && (\n <CalendarCellDate\n date={props.date}\n notCurrentMonth={props.notCurrentMonth}\n timezone={props.timezone}\n />\n )}\n {isMultiEventDate && !props.isHovering && (\n <div style={{ backgroundColor }} className={styles.multiEventCell}></div>\n )}\n {props.eventsOnDay?.length > 0 && (\n <CalendarEvents {...props}\n isMultiEventDate={isMultiEventDate && !props.isHovering}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BmxcE73n2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/calendar/components/calendar-cell-date/calendar-cell-date.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-cell-date/CalendarCellDate.tsx","../../../../libs/shared/src/components/slider-dots/slider-dots.module.scss","../../../../libs/shared/src/components/slider-dots/SliderDots.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-events/calendar-events.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-events/CalendarEvents.tsx","../../../../libs/shared/src/apps/calendar/components/calendar-day/calendar-day.module.scss","../../../../libs/shared/src/apps/calendar/components/calendar-day/CalendarDay.tsx"],"sourcesContent":[":local {\n .cellDate {\n z-index: 100;\n position: absolute;\n top: map-get($spacers, 1);\n left: map-get($spacers, 1);\n width: 2rem;\n height: 2rem;\n border-radius: 2rem;\n line-height: 0;\n transition: width 150ms ease-in !important;\n overflow: hidden;\n .label{\n display: flex;\n }\n &.isHovering {\n width: 5.18rem;\n }\n }\n\n .numberWrapper {\n width: 2rem;\n height: 2rem;\n border-radius: 2rem;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Timezone } from 'libs/shared/apps/streamable-learning/constants/Timezones';\nimport { TimezoneHelper } from 'libs/shared/apps/streamable-learning/utils/TimezoneHelper';\nimport { useHoverIntent } from 'libs/shared/hooks/UseHover';\n\nimport styles from './calendar-cell-date.module.scss';\n\nconst namespace = 'specialEventCalendar.calendarCellDate';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CalendarCellDateProps {\n date: Date;\n notCurrentMonth: boolean;\n hasEvent?: boolean;\n className?: string;\n isHovering?: boolean;\n timezone?: Timezone;\n}\n\nexport function CalendarCellDate(props: CalendarCellDateProps): JSX.Element {\n const isToday = DateHelper.isSame(\n TimezoneHelper.convertUTCToTimezoneDate(new Date().toISOString(), props.timezone || null),\n props.date,\n 'day'\n );\n\n let dateClassName = `${styles.cellDate} d-flex flex-nowrap`;\n if (isToday)\n dateClassName += ' bg-dark text-white';\n if (props.hasEvent)\n dateClassName += ' text-white';\n else if (props.notCurrentMonth && !props.isHovering)\n dateClassName += ' text-secondary';\n if (props.className)\n dateClassName += ` ${props.className}`;\n \n const numberClassName = 'd-flex text-center justify-content-center align-items-center flex-shrink-0';\n const [ ref, isHovering ] = useHoverIntent<HTMLDivElement>({ delay: 250 });\n\n return (\n <div className={`${dateClassName} ${isHovering ? styles.isHovering : ''}`} ref={ref}>\n <div className={`${styles.numberWrapper} ${numberClassName}`}>\n {DateHelper.format(props.date, 'D')}\n </div>\n {isToday && (\n <div className={`${styles.label} justify-content-start align-items-center`}>\n {getPhrase('today')}\n </div>\n )}\n </div>\n );\n}\n",":local {\n .sliderDot {\n width: 0.5rem;\n height: 0.5rem;\n background-color: $gray-400;\n\n &.sm {\n width: 0.3125rem;\n height: 0.3125rem;\n }\n\n &.active {\n background-color: $blue;\n }\n }\n\n .dotContainer {\n gap: 0.625rem;\n }\n \n .defaultCursor {\n cursor: initial !important;\n }\n}","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './slider-dots.module.scss';\n\ninterface SliderDotsProps {\n sliderStep: number;\n sliderLength: number;\n onSliderDotClick: (i: number) => void;\n isDisabled?: (indicatorIndex: number) => boolean;\n\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport function SliderDots(props: SliderDotsProps) {\n function onSliderDotClick(e: MouseEvent, i: number) {\n e.stopPropagation();\n e.preventDefault();\n props.onSliderDotClick(i);\n }\n\n function getSliderDotClassName(active: boolean, index: number) {\n let className = `${styles.sliderDot} rounded-3`;\n\n if (active)\n className += ` ${styles.active}`;\n\n if (props.size === 'sm')\n className += ` ${styles.sm}`;\n\n if (props.isDisabled?.(index))\n className += ` pointer-events-none ${styles.defaultCursor}`;\n\n return className;\n }\n \n return (\n <div className={`${props.className} w-100 d-flex justify-content-around`}>\n <div className={`${styles.dotContainer} d-flex`}>\n {[...Array(props.sliderLength)].map((_, i) => {\n const active = i === props.sliderStep;\n\n return (\n <DivButton\n key={i}\n className={getSliderDotClassName(active, i)}\n onClick={e => onSliderDotClick?.(e, i)}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","@import '~styles/utils/mixins';\n@import '~styles/utils/include-media';\n:local {\n $button-bottom: 2.15rem;\n $circle-size: map-get($spacers, 1);\n \n %fade-in {\n opacity: 0;\n transition: opacity 400ms ease-in;\n }\n\n %slider-on-hover {\n display: none;\n &:hover{\n display: block;\n }\n }\n\n .wrapper {\n &:hover{\n .left {\n display: block;\n }\n .right {\n display: block;\n }\n }\n }\n\n .eventCard {\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n @extend %fade-in;\n //fall-back color\n background-color: $gray-900;\n\n }\n .backgroundImage {\n height: 4.5rem;\n width: 4.5rem;\n \n @extend %fade-in;\n &.noAnimation {\n transition: none;\n }\n &.cover{\n top:0;\n left:0;\n width: 100%;\n height: 100%;\n z-index: 1;\n background-repeat: no-repeat;\n background-position: 0 0 !important;\n background-size: cover;\n }\n }\n \n .date {\n @extend %fade-in;\n }\n\n .tagWrap {\n z-index: 4;\n position: absolute;\n right: 0;\n }\n\n .tag {\n @extend %fade-in;\n width: 2rem;\n height: 2rem;\n top: map-get($spacers, 1);\n right: map-get($spacers, 1);\n }\n\n .appear {\n opacity: 1;\n }\n\n .displayDate {\n font-size: 0.625rem;\n z-index: 2;\n }\n\n .title {\n z-index: 2;\n }\n\n $title-font-size: clamp(0.75rem, 1.25vw, 1rem);\n .titleText {\n font-size: $title-font-size;\n padding-bottom: calc($title-font-size * 0.05) !important;\n\n @include media('<=sm') {\n @include clamp(1);\n }\n }\n\n .circle {\n width: $circle-size;\n height: $circle-size;\n border-radius: 50%;\n background-color: $gray-400;\n z-index: 2;\n\n &.active {\n background-color: $blue;\n }\n\n &:not(:last-child) {\n margin-right: map-get($spacers, 2);\n }\n }\n\n .left {\n left: map-get($spacers, 1);\n bottom: 50%;\n transform: translateY(50%);\n z-index: 2;\n .arrow {\n padding-right: 0.1rem;\n }\n display: none;\n\n }\n .right {\n right: map-get($spacers, 1);\n bottom: 50%;\n transform: translateY(50%);\n z-index: 2;\n .arrow {\n padding-left: 0.1rem;\n }\n display: none;\n\n }\n .bottomBar {\n z-index: 3;\n margin-top: 0.125rem;\n }\n .bottomPlaceholder {\n visibility: hidden;\n }\n\n .hardcodedCover {\n top:0;\n left:0;\n width: 100%;\n height: 100%;\n z-index: 1;\n background-size: 100%;\n @extend %fade-in;\n &.noAnimation {\n transition: none;\n }\n }\n\n .multiEventFilter {\n &::before {\n content: '';\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n left: 0;\n background: rgba(255, 255, 255, 0.4);\n }\n }\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, EntityType, HashObject, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { CalendarCellDate } from 'libs/shared/apps/calendar/components/calendar-cell-date/CalendarCellDate';\nimport { ComingSoonTag } from 'libs/shared/apps/calendar/components/coming-soon-tag/ComingSoonTag';\nimport { CalendarCellProps } from 'libs/shared/apps/calendar/interfaces/CalendarCellProps';\nimport { SpecialEventHelper } from 'libs/shared/apps/calendar/utils/SpecialEventHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { HoverableProps } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { LazyImage } from 'libs/shared/components/lazy-image/LazyImage';\nimport { SliderDots } from 'libs/shared/components/slider-dots/SliderDots';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ClassificationStatus } from 'libs/shared/enums/ClassificationStatus';\nimport { ChevronLeftSvg } from 'libs/shared/images/svg/arrows/ChevronLeftSvg';\nimport { ChevronRightSvg } from 'libs/shared/images/svg/arrows/ChevronRightSvg';\nimport { CalendarEvent, CalendarEventContent } from 'libs/shared/interfaces';\n\nimport styles from './calendar-events.module.scss';\n\ntype CalendarEventsProps = HoverableProps & CalendarCellProps;\n\nCalendarEvents.defaultProps = {\n responsiveText: true\n};\n\nexport function CalendarEvents(props: CalendarEventsProps): JSX.Element {\n const { sliderStep, setSliderStep } = props;\n\n const sortedEventsOnDay = props.fadePastEvents ? sortPastEvents(props.eventsOnDay) : props.eventsOnDay;\n const multiEvents = props.eventsOnDay.length > 1;\n const displayedEvent = sortedEventsOnDay.find((e, idx) => idx === sliderStep) || sortedEventsOnDay[0];\n const multiDayEvent = !!displayedEvent.endDate;\n\n const backgroundColor = props.getBackgroundColor?.(displayedEvent.content);\n\n const hardCodedEvent = props.getHardCodedEvent?.(displayedEvent.content);\n\n const iconUrl = props.getIconUrl?.(displayedEvent.content);\n const coverUrl = props.getCoverUrl?.(displayedEvent.content);\n\n const isComingSoon = displayedEvent.content.status === ClassificationStatus.ComingSoon;\n\n const [ className, setClassName ] = React.useState(!props.hasInitialized ? '' : styles.appear);\n\n React.useEffect(() => {\n if (!props.hasInitialized) {\n // a random number between 400 and 1000\n const randomNumber = Math.floor(Math.random() * 600 + 400);\n window.setTimeout(() => {\n setClassName(styles.appear);\n window.setTimeout(() => {\n props.setHasInitialized(true);\n }, 400);\n }, randomNumber);\n }\n }, [props.hasInitialized]);\n\n React.useEffect(() => {\n if (props.isHovering) {\n props.setHoveredEvent(displayedEvent);\n }\n }, [ props.isHovering, displayedEvent ]);\n\n React.useEffect(() => {\n return () => {\n if (props.isHovering && props.hoveredEvent?.specialEventId === displayedEvent.specialEventId) {\n props.setHoveredEvent(null);\n }\n };\n }, [ props.isHovering, props.hoveredEvent, displayedEvent ]);\n\n function getAppLink(): Core.AppLink {\n if (multiEvents)\n return props.getEventsListAppLink?.();\n\n if (isComingSoon)\n return null;\n\n return props.getTopicAppLink?.(displayedEvent.content, TextHelper.slugify(displayedEvent.name));\n }\n\n function getAnalyticsData() {\n const analyticsData: HashObject = {\n date: DateHelper.format(props.date, 'YYYY-MM-DD'),\n presentationId: props.presentationId,\n eventCount: props.eventsOnDay.length\n };\n\n if (multiEvents) {\n analyticsData.eventId = props.eventsOnDay.map(e => e.specialEventId).join(',');\n analyticsData.topicId = props.eventsOnDay.map(e => e.content.id).join(',');\n } else {\n analyticsData.eventId = displayedEvent.specialEventId;\n analyticsData.topicId = displayedEvent.content.id;\n analyticsData.eventStatus = displayedEvent.content.status;\n }\n return analyticsData;\n }\n\n const analyticsData = getAnalyticsData();\n\n const analyticsOptions: AnalyticsOptions = {\n actionType: UserAction.Click,\n entity: EntityType.SpecialEvent,\n location: LocationContext.CalendarDay\n };\n\n function formatAnalyticDataDate(date: Date): string {\n return DateHelper.format(date, 'YYYY-MM-DD');\n }\n\n function getBgImageClassName(): string {\n const defaultClassName = `${props.className} ${className} `;\n\n const classes = [\n hardCodedEvent ? `${styles.hardcodedCover} position-absolute` : styles.backgroundImage,\n iconUrl ? 'my-auto' : styles.cover,\n isComingSoon ? styles.comingSoon : '',\n props.hasInitialized ? styles.noAnimation : '',\n props.isHovering ? `rounded-3` : '',\n props.isMultiEventDate ? styles.multiEventFilter : '',\n 'company' in displayedEvent.content ? 'rounded-circle' : ''\n ];\n\n return defaultClassName + classes.join(' ');\n }\n\n function isPastEvent(event: CalendarEvent<CalendarEventContent>) {\n if ('startDateTime' in event.content) {\n return DateHelper.isBefore(event.content.startDateTime, new Date());\n }\n return false;\n }\n\n function sortPastEvents(events: CalendarEvent<CalendarEventContent>[]) {\n return events.sort((a, b) => {\n if (!isPastEvent(a) && isPastEvent(b)) {\n return 1;\n }\n\n if (isPastEvent(a) && !isPastEvent(b)) {\n return -1;\n }\n\n return 0;\n });\n }\n\n return (\n <div onClick={() => {\n if (isComingSoon)\n AnalyticsHelper.logUserAction(analyticsData, analyticsOptions);\n }}>\n <AppLink\n appLink={getAppLink()}\n analyticsOptions={analyticsOptions}\n analyticsData={analyticsData}\n className={`position-absolute top-0 start-0 h-100 w-100 text-shadow ${styles.wrapper}`}\n labelledBy='calendarEvent'\n >\n <div className={`${styles.tagWrap} p-1`}>\n {isComingSoon && (\n <ComingSoonTag className={`justify-content-center p-0 rounded-circle ${styles.tag} ${className}`} onlyIcon />\n )}\n </div>\n {!props.hideDay && (\n <CalendarCellDate\n date={props.date}\n notCurrentMonth={props.notCurrentMonth}\n className={`${styles.date} ${className}`}\n isHovering={props.isHovering}\n timezone={props.timezone}\n hasEvent\n />\n )}\n\n <div\n style={{ backgroundColor } }\n className={`position-absolute d-flex flex-column justify-content-end align-items-center text-white px-1 pt-2 pb-1 ${styles.eventCard} ${className} ${props.isHovering ? 'rounded-3' : ''} ${props.isMultiEventDate ? styles.multiEventFilter : ''} ${props.className} ${!props.isHovering && isPastEvent(displayedEvent) ? 'opacity-50' : ''}`}\n >\n {iconUrl && <LazyImage src={iconUrl} alt={displayedEvent.content.name} className={getBgImageClassName()} />}\n\n {coverUrl && !iconUrl && (\n <div\n style={{ backgroundImage: `url('${coverUrl}')` }}\n className={getBgImageClassName()}\n />\n )}\n\n {multiDayEvent && (\n <div className={`${styles.displayDate}`}>\n {SpecialEventHelper.getDisplayDate(displayedEvent.startDate, displayedEvent.endDate)}\n </div>\n )}\n <div className={`text-center ${styles.title} ${multiEvents ? 'mb-1' : 'mb-2'}`}>\n <p id='calendarEvent' className={`${props.responsiveText ? styles.titleText : ''} ${props.isHovering ? 'mb-0' : 'clamp-2'} h6`} title={displayedEvent.name}>{displayedEvent.name}</p>\n </div>\n\n {(multiEvents && sliderStep !== 0) && (\n <div className={`position-absolute bg-white rounded-circle ${styles.left}`}>\n <DivButton\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setSliderStep(s => s - 1);\n AnalyticsHelper.logUserAction({ date: formatAnalyticDataDate(props.date), action: 'previous', eventCount: props.eventsOnDay.length }, analyticsOptions);\n }}>\n <SvgContainer\n svg={ChevronLeftSvg}\n className={`d-inline-block svg-container text-dark ${styles.arrow}`}\n />\n </DivButton>\n </div>\n )}\n\n {multiEvents && sliderStep !== props.eventsOnDay.length - 1 && (\n <div className={`position-absolute bg-white rounded-circle ${styles.right}`}>\n <DivButton\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n setSliderStep(s => s + 1);\n AnalyticsHelper.logUserAction({ date: formatAnalyticDataDate(props.date), action: 'next', eventCount: props.eventsOnDay.length }, analyticsOptions);\n }}>\n <SvgContainer\n svg={ChevronRightSvg}\n className={`d-inline-block svg-container text-dark ${styles.arrow}`}\n />\n </DivButton>\n </div>\n )}\n\n {multiEvents && (\n <div className={`d-flex ${styles.bottomBar} ${multiEvents ? '' : styles.bottomPlaceholder}`}>\n <SliderDots\n sliderStep={sliderStep}\n sliderLength={props.eventsOnDay.length}\n size='sm'\n className={`${props.isHovering ? 'mb-2' : 'mb-1'}`}\n onSliderDotClick={i => {\n setSliderStep(i);\n AnalyticsHelper.logUserAction({ date: formatAnalyticDataDate(props.date), action: 'jump', eventCount: props.eventsOnDay.length }, analyticsOptions);\n }}\n />\n </div>\n )}\n </div>\n </AppLink>\n </div>\n );\n}\n",":local {\n .cell {\n padding-bottom: 100%;\n }\n\n .multiEventCell {\n height: 100%;\n width: 100%;\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0.25;\n z-index: 100;\n animation: fadeIn 0.8s ease-in;\n }\n @keyframes :local(fadeIn) {\n 0% {\n opacity: 0.1;\n }\n 20% {\n opacity: 0.25;\n }\n }\n}","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { CalendarCellDate } from 'libs/shared/apps/calendar/components/calendar-cell-date/CalendarCellDate';\nimport { CalendarEvents } from 'libs/shared/apps/calendar/components/calendar-events/CalendarEvents';\nimport { CalendarCellProps } from 'libs/shared/apps/calendar/interfaces/CalendarCellProps';\nimport { HoverableProps } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\n\nimport styles from './calendar-day.module.scss';\n\ntype CalendarDayProps = HoverableProps & CalendarCellProps;\n\nexport function CalendarDay(props: CalendarDayProps) {\n const isMultiEventDate = React.useMemo(\n () =>\n props.hoveredEvent?.endDate &&\n !DateHelper.isSame(props.date, props.hoveredEvent?.startDate) &&\n DateHelper.isBetween(\n DateHelper.format(props.date, 'YYYY-MM-DD'),\n props.hoveredEvent?.startDate,\n props.hoveredEvent?.endDate\n ),\n [props.hoveredEvent]\n );\n const backgroundColor = props.hoveredEvent ? props.getBackgroundColor?.(props.hoveredEvent.content) : null;\n\n return (\n <div className={`${styles.cell} fw-semibold`}>\n {!props.hideDay && (\n <CalendarCellDate\n date={props.date}\n notCurrentMonth={props.notCurrentMonth}\n timezone={props.timezone}\n />\n )}\n {isMultiEventDate && !props.isHovering && (\n <div style={{ backgroundColor }} className={styles.multiEventCell}></div>\n )}\n {props.eventsOnDay?.length > 0 && (\n <CalendarEvents {...props}\n isMultiEventDate={isMultiEventDate && !props.isHovering}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./Dp9qJj1C.chunk.js";import{lt as e,ut as t}from"./Dun43GrB.chunk.js";import{l as n}from"./BQ5XMoHG.chunk.js";import{t as r}from"./BVWg3YHX.chunk.js";import{t as i}from"./DjIdG9LL2.chunk.js";import{s as a,t as o}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import"./Dp9qJj1C.chunk.js";import{lt as e,ut as t}from"./Dun43GrB.chunk.js";import{l as n}from"./BQ5XMoHG.chunk.js";import{t as r}from"./BVWg3YHX.chunk.js";import{t as i}from"./DjIdG9LL2.chunk.js";import{s as a,t as o}from"./QMuFwiiF2.chunk.js";import{t as s}from"./CoualKDX.chunk.js";import{q as c}from"./app-gjHxcZG3.js";import{t as l}from"./BRiYVLuz.chunk.js";import{t as u}from"./DL4UFxRK.chunk.js";import{n as d,t as f}from"./BivP7X20.chunk.js";import{t as p}from"./CUOEhUTb2.chunk.js";t();var m={partialHeading:`_partialHeading_n7dp5_1`},h=e();function g(){return(0,h.jsxs)(`div`,{className:`px-3`,children:[(0,h.jsx)(`div`,{className:`partial-loading-background mb-2 ${m.partialHeading}`}),(0,h.jsx)(d,{})]})}function _(e){let{commonVideoProps:t}=u(),d=n(c.streamablePresentation()),m=n(f.dashboardWidgetContent(e.widgetId)),_=n(d.data&&l.presentationAudiences(r.StreamableLearning,d.data.id)),v=p(`video-list`);return i({title:m.data?.name}),d.hasCompleted&&m.hasCompleted&&_.hasCompleted?(0,h.jsx)(a.Provider,{value:{getVideoActions:v},children:(0,h.jsxs)(`div`,{className:`px-3`,children:[(0,h.jsx)(`h1`,{className:`h2 mb-2`,children:m.data.name}),(0,h.jsx)(o,{videos:m.data.content,getVideoAppLink:s.videoType,presentationAudiences:_.data,getPreviewQuestionsAppLink:()=>null,hasPermissions:()=>!1,commonVideoProps:t})]})}):(0,h.jsx)(g,{})}export{_ as DashboardWidgetView};
|
|
2
|
+
//# sourceMappingURL=BnEMhkEE2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"BnEMhkEE2.chunk.js","names":[],"sources":["../../src/apps/dashboard/views/dashboard-widget/partial-loading/partial-dashboard-widget.module.scss","../../src/apps/dashboard/views/dashboard-widget/partial-loading/PartialDashboardWidget.tsx","../../src/apps/dashboard/views/dashboard-widget/DashboardWidgetView.tsx"],"sourcesContent":[":local {\n .partialHeading {\n height: 2.375rem;\n width: 10rem;\n }\n}","import React from 'react';\n\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\n\nimport styles from './partial-dashboard-widget.module.scss';\n\nexport function PartialDashboardWidget(): JSX.Element {\n return (\n <div className='px-3'>\n <div className={`partial-loading-background mb-2 ${styles.partialHeading}`} />\n <PartialVideoList />\n </div>\n );\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CuratedWidget, CuratedWidgetData, Presentation, PresentationAudience, Video } from 'libs/shared/interfaces';\n\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useStreamableVideoActions } from 'shared/hooks/useStreamableVideoActions';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\n\nimport { PartialDashboardWidget } from 'apps/dashboard/views/dashboard-widget/partial-loading/PartialDashboardWidget';\n\ninterface DashboardWidgetViewProps {\n widgetId: string;\n}\n\nexport function DashboardWidgetView(props: DashboardWidgetViewProps): JSX.Element {\n const { commonVideoProps } = useCommonVideoProps();\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const widget = Flight.useBasicFetch<CuratedWidget<CuratedWidgetData, Video[]>>(\n DashboardRequests.dashboardWidgetContent(props.widgetId)\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n presentation.data &&\n AudienceRequests.presentationAudiences(PresentationType.StreamableLearning, presentation.data.id)\n );\n\n const getVideoActions = useStreamableVideoActions('video-list');\n\n useSetPageMetadata({ title: widget.data?.name });\n\n const hasLoaded = (\n presentation.hasCompleted &&\n widget.hasCompleted &&\n audiences.hasCompleted\n );\n\n if (!hasLoaded)\n return <PartialDashboardWidget />;\n\n return (\n <VideoActionsContext.Provider value={{ getVideoActions }}>\n <div className='px-3'>\n <h1 className='h2 mb-2'>{widget.data.name}</h1>\n <VideoList\n videos={widget.data.content}\n getVideoAppLink={StreamableAppLinks.videoType}\n presentationAudiences={audiences.data}\n getPreviewQuestionsAppLink={() => null}\n hasPermissions={() => false}\n commonVideoProps={commonVideoProps}\n />\n </div>\n </VideoActionsContext.Provider>\n );\n}\n"],"mappings":"uiBCMA,SAAgB,GAAsC,CACpD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,mCAAmC,EAAO,iBAAoB,CAAA,EAC9E,EAAA,EAAA,KAAC,EAAD,EAAoB,CAAA,CAAA,GCa1B,SAAgB,EAAoB,EAA8C,CAChF,GAAM,CAAE,oBAAqB,GAAqB,CAE5C,EAAe,EACnB,EAAqB,wBAAwB,CAC9C,CAEK,EAAS,EACb,EAAkB,uBAAuB,EAAM,SAAS,CACzD,CAEK,EAAY,EAChB,EAAa,MACb,EAAiB,sBAAsB,EAAiB,mBAAoB,EAAa,KAAK,GAAG,CAClG,CAEK,EAAkB,EAA0B,aAAa,CAa/D,OAXA,EAAmB,CAAE,MAAO,EAAO,MAAM,KAAM,CAAC,CAG9C,EAAa,cACb,EAAO,cACP,EAAU,cAOV,EAAA,EAAA,KAAC,EAAoB,SAArB,CAA8B,MAAO,CAAE,kBAAiB,WACtD,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,mBAAW,EAAO,KAAK,KAAU,CAAA,EAC/C,EAAA,EAAA,KAAC,EAAD,CACE,OAAQ,EAAO,KAAK,QACpB,gBAAiB,EAAmB,UACpC,sBAAuB,EAAU,KACjC,+BAAkC,KAClC,mBAAsB,GACJ,mBAClB,CAAA,CACE,GACuB,CAAA,EAfxB,EAAA,EAAA,KAAC,EAAD,EAA0B,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{h as e,p as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{n as r,t as i}from"./Xo0rk19-.chunk.js";import{et as a}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{h as e,p as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{n as r,t as i}from"./Xo0rk19-.chunk.js";import{et as a}from"./app-gjHxcZG3.js";var o=`shared.privateResourceError`,s=class extends r{constructor(){super(n.getPhrase(o,`title`))}get name(){return`PrivateResourceError`}get heading(){return n.getPhrase(o,`heading`)}get description(){return n.getPhrase(o,`description`)}},c=`shared.regionLockedResourceError`,l=class extends r{constructor(){super(n.getPhrase(c,`title`))}get name(){return`RegionLockedResourceError`}get heading(){return n.getPhrase(c,`heading`)}get description(){return n.getPhrase(c,`description`)}},u={notFound:i,forbidden:{rating:s,yearLevel:s,region:l,privacy:s},badRequest:a,internalServerError:a};function d(n,r={},i={}){if(!n)return;let o;o=typeof n==`number`?n:n.status;let s={...u,...r};if(o&&t.isStatusCodeError(o)){if(o===e.InternalServer){i.internalServerError||t.throw(new a);return}if(o===e.NotFound){i.notFound||t.throw(new s.notFound);return}if(o===e.Forbidden){i.forbidden||t.throw(new s.forbidden.privacy);return}i.badRequest||t.throw(new s.badRequest)}}export{l as n,d as t};
|
|
2
|
+
//# sourceMappingURL=Buc8GegC.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"Buc8GegC.chunk.js","names":[],"sources":["../../../../libs/shared/src/errors/general/private-resource/PrivateResourceError.ts","../../../../libs/shared/src/errors/general/region-locked-resource/RegionLockedResourceError.ts","../../../../libs/shared/src/errors/handlers/HttpErrorHandlers.ts"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nconst namespace = 'shared.privateResourceError';\n\nexport class PrivateResourceError extends ErrorPageError {\n constructor() {\n super(LanguageService.getPhrase(namespace, 'title'));\n }\n\n // @ts-ignore\n public get name(): string {\n return 'PrivateResourceError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n}\n","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\n\nconst namespace = 'shared.regionLockedResourceError';\n\nexport class RegionLockedResourceError extends ErrorPageError {\n constructor() {\n super(LanguageService.getPhrase(namespace, 'title'));\n }\n\n // @ts-ignore\n public get name(): string {\n return 'RegionLockedResourceError';\n }\n\n // @ts-ignore\n public get heading(): string {\n return LanguageService.getPhrase(namespace, 'heading');\n }\n\n // @ts-ignore\n public get description(): string {\n return LanguageService.getPhrase(namespace, 'description');\n }\n}\n","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError,\n yearLevel?: new (description: string) => BaseError,\n region?: new () => BaseError,\n privacy?: new (video?: VideoTypes) => BaseError\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}\n"],"mappings":"6KAIA,IAAM,EAAY,8BAEL,EAAb,cAA0C,CAAe,CACvD,aAAc,CACZ,MAAM,EAAgB,UAAU,EAAW,QAAQ,CAAC,CAItD,IAAW,MAAe,CACxB,MAAO,uBAIT,IAAW,SAAkB,CAC3B,OAAO,EAAgB,UAAU,EAAW,UAAU,CAIxD,IAAW,aAAsB,CAC/B,OAAO,EAAgB,UAAU,EAAW,cAAc,GCnBxD,EAAY,mCAEL,EAAb,cAA+C,CAAe,CAC5D,aAAc,CACZ,MAAM,EAAgB,UAAU,EAAW,QAAQ,CAAC,CAItD,IAAW,MAAe,CACxB,MAAO,4BAIT,IAAW,SAAkB,CAC3B,OAAO,EAAgB,UAAU,EAAW,UAAU,CAIxD,IAAW,aAAsB,CAC/B,OAAO,EAAgB,UAAU,EAAW,cAAc,GCIxD,EAA8B,CAClC,SAAU,EACV,UAAW,CACT,OAAQ,EACR,UAAW,EACX,OAAQ,EACR,QAAS,EACV,CACD,WAAY,EACZ,oBAAqB,EACtB,CAED,SAAgB,EACd,EACA,EAA+B,EAAE,CAKjC,EAAgC,EAAE,CAC5B,CACN,GAAI,CAAC,EACH,OAEF,IAAI,EAEJ,AAGE,EAHE,OAAO,GAAU,SACN,EAEA,EAAK,OAGpB,IAAM,EAAW,CACf,GAAG,EACH,GAAG,EACJ,CAEI,MAGD,EAAkB,kBAAkB,EAAW,CAGnD,IAAI,IAAe,EAAW,eAAgB,CACvC,EAAU,qBACb,EAAiB,MAAM,IAAI,EAAmB,CAChD,OAGF,GAAI,IAAe,EAAW,SAAU,CACjC,EAAU,UACb,EAAiB,MAAM,IAAI,EAAS,SAAW,CACjD,OAGF,GAAI,IAAe,EAAW,UAAW,CAKlC,EAAU,WACb,EAAiB,MAAM,IAAI,EAAS,UAAU,QAAU,CAC1D,OAGG,EAAU,YACb,EAAiB,MAAM,IAAI,EAAS,WAAa"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{gt as e}from"./Dp9qJj1C.chunk.js";import{v as t}from"./BJvPfCvt.chunk.js";import{M as n,lt as r,n as i,ut as a}from"./Dun43GrB.chunk.js";import{t as o}from"./B7tm2CBz.chunk.js";import{t as s}from"./B8R4YVaF2.chunk.js";import{i as c,w as l}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{gt as e}from"./Dp9qJj1C.chunk.js";import{v as t}from"./BJvPfCvt.chunk.js";import{M as n,lt as r,n as i,ut as a}from"./Dun43GrB.chunk.js";import{t as o}from"./B7tm2CBz.chunk.js";import{t as s}from"./B8R4YVaF2.chunk.js";import{i as c,w as l}from"./app-gjHxcZG3.js";import{n as u,t as d}from"./B-6uVsUw2.chunk.js";import{n as f}from"./Bt57Tmef2.chunk.js";import{a as p,i as m,n as h,r as g,t as _}from"./kfFYr9dc.chunk.js";import{t as v}from"./DuBHin02.chunk.js";import{t as y}from"./CE7XVl4t.chunk.js";var b=e(a());function x(e,t,n=[]){let r,i=()=>{e(),window.clearTimeout(r),r=window.setTimeout(t,100)};b.useEffect(()=>(window.addEventListener(`resize`,t?i:e),()=>window.removeEventListener(`resize`,t?i:e)),[...n])}var S=(e,t,n)=>()=>{e.container.current&&(e.container.current.style.transition=``),t({type:_.Resize,payload:{elementRefs:e,mediaQuery:n}})},C=e=>()=>{e.current&&(e.current.style.transition=`transform .4s ease-in-out`)},w=(e,t,n,r,i)=>a=>{let o=a.clientX,s=r;s||(s={...t,initialMouseX:o},i(s),e.current.style.transition=``),n({type:_.Drag,payload:{widgetSnapshot:s,currentMouseX:o}})},T=(e,t)=>()=>{e.current.style.transition=`transform .4s ease-in-out`,t(null)};function E(e){return e===l.XS?200:e===l.SM||e===l.MD?350:500}var D={offset:0,containerLeftPosition:null,containerRightPosition:null,firstElementPosition:null,lastElementPosition:null,hideLeftButton:!0,hideRightButton:!0,maxSlideDistance:0,leftOffsetLimit:null},O=e=>{let{container:t,lastElement:n}=e.elementRefs;if(!t?.current||!n?.current)return D;let r=t.current.getBoundingClientRect(),i=r.left,a=r.right,o=i,s=n.current.getBoundingClientRect().right,c=a-s;return{...D,containerLeftPosition:i,containerRightPosition:a,firstElementPosition:o,lastElementPosition:s,hideRightButton:s<a,leftOffsetLimit:c,maxSlideDistance:E(e.mediaQuery)}},k=e=>({...O({...e,...e.elementRefs}),maxSlideDistance:E(e.mediaQuery)}),A=e=>{let{firstElementPosition:t,lastElementPosition:n,maxSlideDistance:r,offset:i,containerRightPosition:a}=e,o=n-a>=r?r:n-a;return{firstElementPosition:t-o,lastElementPosition:n-o,offset:i-o,hideRightButton:n-o===a,hideLeftButton:!1}},j=e=>{let{containerLeftPosition:t,firstElementPosition:n,lastElementPosition:r,maxSlideDistance:i,offset:a}=e,o=n+i<=t,s=o?i:Math.abs(a);return{firstElementPosition:n+s,lastElementPosition:r+s,offset:a+s,hideLeftButton:!o||n+s===t,hideRightButton:!1}},M=(e,t)=>{let{widgetSnapshot:n,currentMouseX:r}=t;if(n.hideLeftButton&&n.hideRightButton)return{};let i=n.initialMouseX-r,a=n.offset-i,o=n.firstElementPosition-i,s=n.lastElementPosition-i,c=!1,l=!1;return o>e.containerLeftPosition&&(a=0,o=e.containerLeftPosition,s=e.lastElementPosition,c=!0),s<=e.containerRightPosition&&(a=e.leftOffsetLimit,o=e.containerLeftPosition-Math.abs(e.leftOffsetLimit),s=n.containerRightPosition,l=!0),{offset:a,firstElementPosition:o,lastElementPosition:s,hideLeftButton:c,hideRightButton:l}};function N(e,t){switch(t.type){case _.Init:return{...e,...O(t.payload)};case _.Resize:return{...e,...k(t.payload)};case _.Next:return{...e,...A(e)};case _.Previous:return{...e,...j(e)};case _.Drag:return{...e,...M(e,t.payload)};default:return e}}var P={itemSpacing:`_itemSpacing_1j5ri_1`,header:`_header_1j5ri_4`,mobileScroll:`_mobileScroll_1j5ri_8`,leftGradient:`_leftGradient_1j5ri_16`,leftGradientNoPadding:`_leftGradientNoPadding_1j5ri_19`,leftButton:`_leftButton_1j5ri_22`,leftButtonNoPadding:`_leftButtonNoPadding_1j5ri_25`,rightGradient:`_rightGradient_1j5ri_28`,rightGradientNoPadding:`_rightGradientNoPadding_1j5ri_31`,rightButton:`_rightButton_1j5ri_34`,rightButtonNoPadding:`_rightButtonNoPadding_1j5ri_37`},F=r();I.defaultProps={heading:``,description:``,childComponentProps:{}};function I(e){let{childComponent:r,staticChildren:a,getWidgetItemAnalyticsData:l=()=>{}}=e,[y,E]=b.useReducer(N,D),[O,k]=b.useState(null),A={container:b.useRef(null),firstElement:b.useRef(null),lastElement:b.useRef(null)},j=v(),M=c.isTabletOrMobile(),{dynamicAttributes:I,focusNext:R,focusPrev:z,onFocusWidget:B,onBlurWidget:V}=m({type:`dynamic`,state:y,containerRef:A.container,mediaQuery:j});x(S(A,E,j),C(A.container),[j]);let{ref:H,inView:U}=f({prevent:!e.lazyLoad}),W=e.collection;!e.collection&&t.isFunction(e.fetch)&&(W=e.fetch(U).data),b.useEffect(()=>{!W||n.isEmpty(W)||E({type:_.Init,payload:{elementRefs:A,mediaQuery:j}})},[W]);function G(){if(!W)return;let t=a?.filter(e=>e.position===`start`)??[],n=a?.filter(e=>e.position===`end`)??[],i=W.map((i,a)=>{let c;i===o.first(W)&&t?.length&&(c=A.firstElement),i===o.last(W)&&!n?.length&&(c=A.lastElement);let u=a+1===W.length;return(0,F.jsx)(`li`,{id:i.id,ref:c,onFocus:()=>B(a),onBlur:()=>V(),className:`${P.itemSpacing} ${e.childClassName||``} ${u&&M?`pe-4`:``}`,...I[i.id],children:(0,F.jsx)(r,{getChildAppLink:e.getChildAppLink,data:i,getSubtitle:e.getSubtitle,analyticsData:{itemIndex:a,...e.analyticsData,...l(i)},analyticsOptions:{...e?.analyticsOptions,...s.getSliderItemAnalyticsOptions()},...e.childComponentProps})},i.id)});return t.length&&(i=[...t.map((t,n)=>{let r=t.component;return(0,F.jsx)(`li`,{ref:n===0?A.firstElement:null,className:`${P.itemSpacing} ${e.childClassName||``}`,children:(0,F.jsx)(r,{})},`first-widget-component:${n}`)}),...i]),n.length&&(i=[...i,...n.map((t,r)=>{let i=t.component;return(0,F.jsx)(`li`,{ref:r===n.length-1?A.lastElement:null,className:`${P.itemSpacing} ${e.childClassName||``}`,children:(0,F.jsx)(i,{})},`end-widget-component:${r}`)})]),(0,F.jsx)(F.Fragment,{children:i})}let K=b.useMemo(G,[W,I,y.offset,j,...e.widgetDataDeps||[]]);if(W&&!W.length&&!a?.length)return(0,F.jsx)(F.Fragment,{});if(!W||n.isEmpty(W))return(0,F.jsx)(`div`,{ref:H,children:(0,F.jsx)(L,{partialLoadingComponent:e.partialLoadingComponent,partialLoadingOptions:e.partialLoadingOptions})});let q=t=>({...e.analyticsData,id:e.id,name:e.heading,direction:t===_.Next?`right`:`left`}),J=M||e.hideButtons;return(0,F.jsxs)(`div`,{className:`${e.noNegativePadding?``:`mx-n4`}`,children:[(0,F.jsx)(`div`,{className:`px-4 ${P.header}`,children:(0,F.jsx)(p,{name:e.heading,description:e.description,appLink:e.headingAppLink,showSeeMoreLink:!!e.headingAppLink})}),(0,F.jsx)(`div`,{className:`position-relative`,children:(0,F.jsx)(`div`,{className:`${e.noNegativePadding?``:`px-4`} py-3 my-n3 position-relative ${M?P.mobileScroll:`overflow-hidden-x`}`,children:(0,F.jsxs)(`div`,{className:`position-relative ${e.hideButtons?`overflow-hidden-x`:``}`,children:[!J&&(0,F.jsx)(d,{direction:u.Left,onClick:()=>{z(),E({type:_.Previous}),i.logUserAction(q(_.Previous),s.getSliderAnalyticsOptions())},leftButtonClassName:`${P.leftButton} ${e.noNegativePadding?P.leftButtonNoPadding:``}`,leftGradientClassName:`${P.leftGradient} ${e.noNegativePadding?P.leftGradientNoPadding:``}`,hide:y.hideLeftButton,useGradientBackdrop:!0}),(0,F.jsx)(h,{position:y.offset,positionType:g.Pixels,onDrag:w(A.container,y,E,O,k),onDragEnd:T(A.container,k),ref:A.container,children:K}),!J&&(0,F.jsx)(d,{direction:u.Right,onClick:()=>{R(),E({type:_.Next}),i.logUserAction(q(_.Next),s.getSliderAnalyticsOptions())},hide:y.hideRightButton,rightButtonClassName:`${P.rightButton} ${e.noNegativePadding?P.rightButtonNoPadding:``}`,rightGradientClassName:`${P.rightGradient} ${e.noNegativePadding?P.rightGradientNoPadding:``}`,useGradientBackdrop:!0})]})})})]})}var L=e=>{let{partialLoadingComponent:t,partialLoadingOptions:n}=e;return(0,F.jsx)(`div`,{className:`d-flex flex-nowrap overflow-hidden`,children:y.getPartialLoadingItems(n).map((e,n)=>(0,F.jsx)(t,{},n))})};export{L as n,x as r,I as t};
|
|
2
|
+
//# sourceMappingURL=Byczy1lS.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DvL3J2BU.chunk.js","names":[],"sources":["../../../../libs/shared/src/hooks/UseResizeListener.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetEventHandlers.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetReducer.tsx","../../../../libs/shared/src/components/widgets/dynamic-widget/dynamic-widget.module.scss","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidget.tsx"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Hook function for listening to scroll events\n * @param onResize - gets called on resize.\n * @param onResizeEnd (optional) - gets called 100ms after the last resize event. Timer restarts everytime the callback\n * runs so that endCallback only fires after a stretch of resize events.\n * @param dependencies - values from the component (e.g. state, props and functions) that are used \n * inside the effect hook.\n */\nexport function useResizeListener(onResize: () => void, onResizeEnd?: () => void, dependencies: any[] = []): void {\n let resizeTimeout: number;\n\n const onResizeModified = () => {\n onResize();\n\n window.clearTimeout(resizeTimeout);\n resizeTimeout = window.setTimeout(onResizeEnd, 100);\n };\n\n React.useEffect(() => {\n window.addEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n return () => window.removeEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n }, [...dependencies]);\n}\n","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nimport { DynamicWidgetState } from './DynamicWidgetReducer';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\n/**\n * Resize events\n */\nexport const getResizeHandler = (\n elementRefs: SlidingListRefs,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n mediaQuery: MediaQueryStrings\n) => () => {\n if (elementRefs.container.current)\n elementRefs.container.current.style.transition = '';\n\n dispatch({\n type: WidgetInteraction.Resize,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n};\n\nexport const getResizeEndHandler = (containerRef: React.MutableRefObject<HTMLUListElement>) => () => {\n if (containerRef.current)\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n};\n\nexport const getDragHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n widgetState: DynamicWidgetState,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n widgetSnapshot: WidgetSnapshot,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => (event: React.DragEvent<HTMLUListElement>): void => {\n const mouseX = event.clientX;\n\n let snapshot = widgetSnapshot;\n\n if (!snapshot) {\n snapshot = { ...widgetState, initialMouseX: mouseX };\n setWidgetSnapshot(snapshot);\n containerRef.current.style.transition = '';\n }\n\n dispatch({\n type: WidgetInteraction.Drag,\n payload: {\n widgetSnapshot: snapshot,\n currentMouseX: mouseX\n }\n });\n};\n\nexport const getDragEndHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => () => {\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n setWidgetSnapshot(null);\n};\n","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nexport interface DynamicWidgetState {\n /**\n * X-position argument for `translate3d()` to determine where the slider is positioned.\n */\n offset: number;\n\n /**\n * Left position of the slider container.\n * Set on `Init`, and updated on `Resize`.\n * Used for calculations on `Previous`, or for dragging to the right.\n */\n containerLeftPosition: number;\n\n /**\n * Right position of the slider container.\n * Set on Init, and updated on Resize.\n * Used for calculations on `Next`, or for dragging to the left.\n */\n containerRightPosition: number;\n\n /**\n * The position of the left edge of the very first element in the slider list.\n * Initially this will always be equal to `containerLeftPosition`.\n */\n firstElementPosition: number;\n\n /**\n * The position of the right edge of the very last element in the slider list.\n */\n lastElementPosition: number;\n\n /**\n * True when `firstElementPosition === containerLeftPosition`.\n */\n hideLeftButton: boolean;\n\n /**\n * True when `lastElementPositon === containerRightPosition`.\n */\n hideRightButton: boolean;\n\n /**\n * When clicking left or right, this number is the max distance in pixels that the slider.\n * will move.\n * Default 300.\n * Can only be set once on `Init` action.\n */\n maxSlideDistance: number;\n\n /**\n * This is calculated on `Init`, and is the lowest number the `offset` state can ever be.\n * This is needed for the `Drag` event, as the `Drag` event can only calculate whole numbers.\n * 99% of the time, the leftOffsetLimit is a very specific decimal number, so we calculate it\n * on `Init` and reference it on `Drag` events when necessary.\n */\n leftOffsetLimit: number;\n}\n\nfunction getMaxSlideDistance(mediaQuery: MediaQueryStrings): number {\n if (mediaQuery === MediaQueryStrings.XS)\n return 200;\n\n if (mediaQuery === MediaQueryStrings.SM || mediaQuery === MediaQueryStrings.MD)\n return 350;\n\n return 500;\n}\n\n/**\n * `null` values are initialized in the `Init` action. This is dispatched\n * later, because it uses JQuery elements that aren't immediately available\n * when `useReducer` is called.\n */\nexport const initialSliderState: DynamicWidgetState = {\n offset: 0,\n containerLeftPosition: null,\n containerRightPosition: null,\n firstElementPosition: null,\n lastElementPosition: null,\n hideLeftButton: true,\n hideRightButton: true,\n maxSlideDistance: 0,\n leftOffsetLimit: null\n};\n\ninterface InitPayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onInit = (payload: InitPayload): DynamicWidgetState => {\n const { container, lastElement } = payload.elementRefs;\n\n if (!container?.current || !lastElement?.current)\n return initialSliderState;\n\n const containerRect = container.current.getBoundingClientRect();\n const containerLeftPosition = containerRect.left;\n const containerRightPosition = containerRect.right;\n\n const firstElementPosition = containerLeftPosition;\n const lastElementPosition = lastElement.current.getBoundingClientRect().right;\n const leftOffsetLimit = containerRightPosition - lastElementPosition;\n\n return {\n ...initialSliderState,\n containerLeftPosition,\n containerRightPosition,\n firstElementPosition,\n lastElementPosition,\n hideRightButton: lastElementPosition < containerRightPosition,\n leftOffsetLimit,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\ninterface ResizePayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onResize = (payload: ResizePayload): DynamicWidgetState => {\n const initialState = onInit({\n ...payload,\n ...payload.elementRefs\n });\n\n return {\n ...initialState,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\nconst onNext = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { firstElementPosition, lastElementPosition, maxSlideDistance, offset, containerRightPosition } = prevState;\n\n /**\n * The distance in pixels that the slider will move along the x-axis.\n * This will be the `maxSlideDistance` constant value, or if that value is too large we calculate\n * the remaining overflowing space and only slide by that amount.\n */\n const slideDistance = lastElementPosition - containerRightPosition >= maxSlideDistance ?\n maxSlideDistance :\n lastElementPosition - containerRightPosition;\n\n return {\n firstElementPosition: firstElementPosition - slideDistance,\n lastElementPosition: lastElementPosition - slideDistance,\n offset: offset - slideDistance,\n hideRightButton: lastElementPosition - slideDistance === containerRightPosition,\n hideLeftButton: false\n };\n};\n\nconst onPrevious = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { containerLeftPosition, firstElementPosition, lastElementPosition, maxSlideDistance, offset } = prevState;\n\n const fullSlide = firstElementPosition + maxSlideDistance <= containerLeftPosition;\n const slideDistance = fullSlide ? maxSlideDistance : Math.abs(offset);\n\n return {\n firstElementPosition: firstElementPosition + slideDistance,\n lastElementPosition: lastElementPosition + slideDistance,\n offset: offset + slideDistance,\n hideLeftButton: !fullSlide || firstElementPosition + slideDistance === containerLeftPosition,\n hideRightButton: false\n };\n};\n\nconst onDrag = (prevState: DynamicWidgetState, payload: any): Partial<DynamicWidgetState> => {\n const { widgetSnapshot, currentMouseX } = payload;\n\n // Disable dragging if the slider isn't long enough\n if (widgetSnapshot.hideLeftButton && widgetSnapshot.hideRightButton)\n return {};\n\n // The distance from the initial `MouseDown` event x-coordinate, to the present x-coordinate\n const dragDistance = widgetSnapshot.initialMouseX - currentMouseX;\n\n let offset = widgetSnapshot.offset - dragDistance;\n let firstElementPosition = widgetSnapshot.firstElementPosition - dragDistance;\n let lastElementPosition = widgetSnapshot.lastElementPosition - dragDistance;\n let hideLeftButton = false;\n let hideRightButton = false;\n\n if (firstElementPosition > prevState.containerLeftPosition) {\n offset = 0;\n firstElementPosition = prevState.containerLeftPosition;\n lastElementPosition = prevState.lastElementPosition;\n hideLeftButton = true;\n }\n\n if (lastElementPosition <= prevState.containerRightPosition) {\n offset = prevState.leftOffsetLimit;\n firstElementPosition = prevState.containerLeftPosition - Math.abs(prevState.leftOffsetLimit);\n lastElementPosition = widgetSnapshot.containerRightPosition;\n hideRightButton = true;\n }\n\n return {\n offset,\n firstElementPosition,\n lastElementPosition,\n hideLeftButton,\n hideRightButton\n };\n};\n\nexport function DynamicWidgetReducer(\n prevState: DynamicWidgetState,\n action: ReducerActions<WidgetInteraction>\n): DynamicWidgetState {\n switch (action.type) {\n case WidgetInteraction.Init:\n return {\n ...prevState,\n ...onInit(action.payload)\n };\n\n case WidgetInteraction.Resize:\n return {\n ...prevState,\n ...onResize(action.payload)\n };\n\n case WidgetInteraction.Next:\n return {\n ...prevState,\n ...onNext(prevState)\n };\n\n case WidgetInteraction.Previous:\n return {\n ...prevState,\n ...onPrevious(prevState)\n };\n\n case WidgetInteraction.Drag:\n return {\n ...prevState,\n ...onDrag(prevState, action.payload)\n };\n\n default:\n return prevState;\n }\n}\n",":local {\n .itemSpacing {\n &:not(:last-child) {\n margin-right: map-get($spacers, 2);\n }\n }\n\n .header {\n z-index: 1;\n position: relative;\n }\n\n .mobileScroll {\n overflow-x: scroll;\n -ms-overflow-style: none;\n scrollbar-width: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n .leftGradient {\n left: -2rem;\n }\n\n .leftGradientNoPadding {\n left: 0;\n }\n\n .leftButton {\n left: -1.3rem;\n }\n\n .leftButtonNoPadding {\n left: 0.1rem;\n }\n\n .rightGradient {\n right: -2rem;\n }\n\n .rightGradientNoPadding {\n right: 0;\n }\n\n .rightButton {\n right: -1.3rem;\n }\n\n .rightButtonNoPadding {\n right: 0.5rem;\n }\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { useWidgetKeyboard } from 'libs/shared/components/widgets/hooks/useWidgetKeyboard';\nimport { SlidingListContainer } from 'libs/shared/components/widgets/sliding-list/SlidingListContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\nimport { PartialLoadingHelper, PartialLoadingOptions } from 'libs/shared/utils/PartialLoadingHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { getDragEndHandler, getDragHandler, getResizeEndHandler, getResizeHandler } from './DynamicWidgetEventHandlers';\nimport { DynamicWidgetReducer, DynamicWidgetState, initialSliderState } from './DynamicWidgetReducer';\n\nimport styles from './dynamic-widget.module.scss';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\ninterface StaticChild {\n position: 'start' | 'end';\n component: React.ElementType;\n}\n\ninterface DynamicWidgetProps {\n id?: string;\n childComponent: React.ElementType;\n childComponentProps?: any;\n partialLoadingComponent: React.ElementType;\n partialLoadingOptions?: PartialLoadingOptions;\n\n widgetDataDeps?: (any)[];\n getChildAppLink?: (data: any) => Core.AppLink;\n\n staticChildren?: StaticChild[];\n collection?: BaseObject[];\n fetch?: (...args: any[]) => any;\n lazyLoad?: boolean;\n\n heading?: string;\n headingAppLink?: Core.AppLink;\n description?: string;\n getSubtitle?: (data: any) => string;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n getWidgetItemAnalyticsData?: (data: any) => HashObject;\n hideButtons?: boolean;\n childClassName?: string;\n // set to true if the widget get cut off by the container\n noNegativePadding?: boolean;\n}\n\nDynamicWidget.defaultProps = {\n heading: '',\n description: '',\n childComponentProps: {}\n};\n\nexport function DynamicWidget(props: DynamicWidgetProps): JSX.Element {\n const { childComponent: WidgetItemComponent, staticChildren, getWidgetItemAnalyticsData = () => {} } = props;\n\n const [ state, dispatch ] = React.useReducer(DynamicWidgetReducer, initialSliderState);\n\n // A snapshot of the widget state is captured on the very first `Drag` event as a point of reference\n const [ widgetSnapshot, setWidgetSnapshot ] = React.useState<WidgetSnapshot>(null);\n\n const elementRefs: SlidingListRefs = {\n container: React.useRef(null),\n firstElement: React.useRef(null),\n lastElement: React.useRef(null)\n };\n\n const mediaQuery = useGetMediaQueryString();\n const isTouchScreen = UserAgentHelper.isTabletOrMobile();\n \n const { dynamicAttributes, focusNext, focusPrev, onFocusWidget, onBlurWidget } = useWidgetKeyboard({ type: 'dynamic', state, containerRef: elementRefs.container, mediaQuery });\n\n useResizeListener(\n getResizeHandler(elementRefs, dispatch, mediaQuery),\n getResizeEndHandler(elementRefs.container),\n [mediaQuery]\n );\n\n const { ref, inView } = useLazyLoad({ prevent: !props.lazyLoad });\n\n let widgetData = props.collection;\n\n if (!props.collection && FunctionHelper.isFunction(props.fetch)) {\n const request = props.fetch(inView);\n widgetData = request.data;\n }\n\n /**\n * Once the widget data has been set, we can initialize the reducer. This is because\n * the reducer depends on the refs being set, but they don't get set until the markup has been loaded.\n */\n React.useEffect(() => {\n if (!widgetData || ObjectHelper.isEmpty(widgetData))\n return;\n\n dispatch({\n type: WidgetInteraction.Init,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n }, [widgetData]);\n\n function getWidgetItems(): JSX.Element {\n if (!widgetData)\n return;\n\n const firstChildren = staticChildren?.filter(child => child.position === 'start') ?? [];\n const lastChildren = staticChildren?.filter(child => child.position === 'end') ?? [];\n\n let items = widgetData.map((widgetItem, index) => {\n let itemRef: React.MutableRefObject<HTMLLIElement>;\n\n if (widgetItem === ArrayHelper.first(widgetData) && firstChildren?.length)\n itemRef = elementRefs.firstElement;\n\n if (widgetItem === ArrayHelper.last(widgetData) && !lastChildren?.length)\n itemRef = elementRefs.lastElement;\n\n const isLast = index + 1 === widgetData.length;\n\n return (\n <li\n id={widgetItem.id}\n key={widgetItem.id}\n ref={itemRef}\n onFocus={() => onFocusWidget(index)}\n onBlur={() => onBlurWidget()}\n className={`${styles.itemSpacing} ${props.childClassName || ''} ${(isLast && isTouchScreen) ? 'pe-4' : ''}`}\n {...dynamicAttributes[widgetItem.id]}\n >\n <WidgetItemComponent\n getChildAppLink={props.getChildAppLink}\n data={widgetItem}\n getSubtitle={props.getSubtitle}\n analyticsData={{\n itemIndex: index,\n ...props.analyticsData,\n ...getWidgetItemAnalyticsData(widgetItem)\n }}\n analyticsOptions={{ ...props?.analyticsOptions, ...WidgetHelper.getSliderItemAnalyticsOptions() }}\n {...props.childComponentProps}\n />\n </li>\n );\n });\n\n if (firstChildren.length) {\n items = [\n ...firstChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`first-widget-component:${i}`}\n ref={i === 0 ? elementRefs.firstElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n }),\n ...items\n ];\n }\n\n if (lastChildren.length) {\n items = [\n ...items,\n ...lastChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`end-widget-component:${i}`}\n ref={i === lastChildren.length - 1 ? elementRefs.lastElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n })\n ];\n }\n\n return <>{items}</>;\n }\n const widgetItems = React.useMemo(getWidgetItems, [\n widgetData, dynamicAttributes, state.offset, mediaQuery, ...props.widgetDataDeps || []\n ]);\n\n if (widgetData && !widgetData.length && !staticChildren?.length)\n return <></>;\n\n if (!widgetData || ObjectHelper.isEmpty(widgetData)) {\n return (\n <div ref={ref}>\n <PartialDynamicWidget\n partialLoadingComponent={props.partialLoadingComponent}\n partialLoadingOptions={props.partialLoadingOptions}\n />\n </div>\n );\n }\n\n const getSliderAnalyticsData = (type: WidgetInteraction) => ({\n ...props.analyticsData,\n id: props.id,\n name: props.heading,\n direction: type === WidgetInteraction.Next ? 'right' : 'left'\n });\n\n const hideButtons = isTouchScreen || props.hideButtons;\n\n return (\n <div className={`${props.noNegativePadding ? '' : 'mx-n4'}`}>\n <div className={`px-4 ${styles.header}`}>\n <WidgetHeader\n name={props.heading}\n description={props.description}\n appLink={props.headingAppLink}\n showSeeMoreLink={!!props.headingAppLink}\n />\n </div>\n\n <div className='position-relative'>\n <div className={`${props.noNegativePadding ? '' : 'px-4' } py-3 my-n3 position-relative ${isTouchScreen ? styles.mobileScroll : 'overflow-hidden-x'}`}>\n <div className={`position-relative ${props.hideButtons ? 'overflow-hidden-x' : ''}`}>\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => {\n focusPrev();\n\n dispatch({ type: WidgetInteraction.Previous });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Previous),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n leftButtonClassName={`${styles.leftButton} ${props.noNegativePadding ? styles.leftButtonNoPadding : ''}`}\n leftGradientClassName={`${styles.leftGradient} ${props.noNegativePadding ? styles.leftGradientNoPadding : ''}`}\n hide={state.hideLeftButton}\n useGradientBackdrop\n />\n )}\n\n <SlidingListContainer\n position={state.offset}\n positionType={CssMeasurement.Pixels}\n onDrag={getDragHandler(elementRefs.container, state, dispatch, widgetSnapshot, setWidgetSnapshot)}\n onDragEnd={getDragEndHandler(elementRefs.container, setWidgetSnapshot)}\n ref={elementRefs.container}\n >\n {widgetItems}\n </SlidingListContainer>\n\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => {\n focusNext();\n\n dispatch({ type: WidgetInteraction.Next });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Next),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n hide={state.hideRightButton}\n rightButtonClassName={`${styles.rightButton} ${props.noNegativePadding ? styles.rightButtonNoPadding : ''}`}\n rightGradientClassName={`${styles.rightGradient} ${props.noNegativePadding ? styles.rightGradientNoPadding : ''}`}\n useGradientBackdrop\n />\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ntype PartialDynamicWidgetProps = Pick<DynamicWidgetProps, 'partialLoadingComponent'> & {\n partialLoadingOptions?: PartialLoadingOptions\n};\n\nexport const PartialDynamicWidget = (props: PartialDynamicWidgetProps) => {\n const { partialLoadingComponent: Component, partialLoadingOptions } = props;\n\n return (\n <div className='d-flex flex-nowrap overflow-hidden'>\n {PartialLoadingHelper.getPartialLoadingItems(partialLoadingOptions).map((item, idx) => <Component key={idx} />)}\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Byczy1lS.chunk.js","names":[],"sources":["../../../../libs/shared/src/hooks/UseResizeListener.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetEventHandlers.ts","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidgetReducer.tsx","../../../../libs/shared/src/components/widgets/dynamic-widget/dynamic-widget.module.scss","../../../../libs/shared/src/components/widgets/dynamic-widget/DynamicWidget.tsx"],"sourcesContent":["import * as React from 'react';\n\n/**\n * Hook function for listening to scroll events\n * @param onResize - gets called on resize.\n * @param onResizeEnd (optional) - gets called 100ms after the last resize event. Timer restarts everytime the callback\n * runs so that endCallback only fires after a stretch of resize events.\n * @param dependencies - values from the component (e.g. state, props and functions) that are used \n * inside the effect hook.\n */\nexport function useResizeListener(onResize: () => void, onResizeEnd?: () => void, dependencies: any[] = []): void {\n let resizeTimeout: number;\n\n const onResizeModified = () => {\n onResize();\n\n window.clearTimeout(resizeTimeout);\n resizeTimeout = window.setTimeout(onResizeEnd, 100);\n };\n\n React.useEffect(() => {\n window.addEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n return () => window.removeEventListener('resize', onResizeEnd ? onResizeModified : onResize);\n }, [...dependencies]);\n}\n","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nimport { DynamicWidgetState } from './DynamicWidgetReducer';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\n/**\n * Resize events\n */\nexport const getResizeHandler = (\n elementRefs: SlidingListRefs,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n mediaQuery: MediaQueryStrings\n) => () => {\n if (elementRefs.container.current)\n elementRefs.container.current.style.transition = '';\n\n dispatch({\n type: WidgetInteraction.Resize,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n};\n\nexport const getResizeEndHandler = (containerRef: React.MutableRefObject<HTMLUListElement>) => () => {\n if (containerRef.current)\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n};\n\nexport const getDragHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n widgetState: DynamicWidgetState,\n dispatch: React.Dispatch<ReducerActions<WidgetInteraction>>,\n widgetSnapshot: WidgetSnapshot,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => (event: React.DragEvent<HTMLUListElement>): void => {\n const mouseX = event.clientX;\n\n let snapshot = widgetSnapshot;\n\n if (!snapshot) {\n snapshot = { ...widgetState, initialMouseX: mouseX };\n setWidgetSnapshot(snapshot);\n containerRef.current.style.transition = '';\n }\n\n dispatch({\n type: WidgetInteraction.Drag,\n payload: {\n widgetSnapshot: snapshot,\n currentMouseX: mouseX\n }\n });\n};\n\nexport const getDragEndHandler = (\n containerRef: React.MutableRefObject<HTMLUListElement>,\n setWidgetSnapshot: React.Dispatch<WidgetSnapshot>\n) => () => {\n containerRef.current.style.transition = 'transform .4s ease-in-out';\n setWidgetSnapshot(null);\n};\n","import { ReducerActions } from 'libs/common/react/interfaces';\n\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\n\nexport interface DynamicWidgetState {\n /**\n * X-position argument for `translate3d()` to determine where the slider is positioned.\n */\n offset: number;\n\n /**\n * Left position of the slider container.\n * Set on `Init`, and updated on `Resize`.\n * Used for calculations on `Previous`, or for dragging to the right.\n */\n containerLeftPosition: number;\n\n /**\n * Right position of the slider container.\n * Set on Init, and updated on Resize.\n * Used for calculations on `Next`, or for dragging to the left.\n */\n containerRightPosition: number;\n\n /**\n * The position of the left edge of the very first element in the slider list.\n * Initially this will always be equal to `containerLeftPosition`.\n */\n firstElementPosition: number;\n\n /**\n * The position of the right edge of the very last element in the slider list.\n */\n lastElementPosition: number;\n\n /**\n * True when `firstElementPosition === containerLeftPosition`.\n */\n hideLeftButton: boolean;\n\n /**\n * True when `lastElementPositon === containerRightPosition`.\n */\n hideRightButton: boolean;\n\n /**\n * When clicking left or right, this number is the max distance in pixels that the slider.\n * will move.\n * Default 300.\n * Can only be set once on `Init` action.\n */\n maxSlideDistance: number;\n\n /**\n * This is calculated on `Init`, and is the lowest number the `offset` state can ever be.\n * This is needed for the `Drag` event, as the `Drag` event can only calculate whole numbers.\n * 99% of the time, the leftOffsetLimit is a very specific decimal number, so we calculate it\n * on `Init` and reference it on `Drag` events when necessary.\n */\n leftOffsetLimit: number;\n}\n\nfunction getMaxSlideDistance(mediaQuery: MediaQueryStrings): number {\n if (mediaQuery === MediaQueryStrings.XS)\n return 200;\n\n if (mediaQuery === MediaQueryStrings.SM || mediaQuery === MediaQueryStrings.MD)\n return 350;\n\n return 500;\n}\n\n/**\n * `null` values are initialized in the `Init` action. This is dispatched\n * later, because it uses JQuery elements that aren't immediately available\n * when `useReducer` is called.\n */\nexport const initialSliderState: DynamicWidgetState = {\n offset: 0,\n containerLeftPosition: null,\n containerRightPosition: null,\n firstElementPosition: null,\n lastElementPosition: null,\n hideLeftButton: true,\n hideRightButton: true,\n maxSlideDistance: 0,\n leftOffsetLimit: null\n};\n\ninterface InitPayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onInit = (payload: InitPayload): DynamicWidgetState => {\n const { container, lastElement } = payload.elementRefs;\n\n if (!container?.current || !lastElement?.current)\n return initialSliderState;\n\n const containerRect = container.current.getBoundingClientRect();\n const containerLeftPosition = containerRect.left;\n const containerRightPosition = containerRect.right;\n\n const firstElementPosition = containerLeftPosition;\n const lastElementPosition = lastElement.current.getBoundingClientRect().right;\n const leftOffsetLimit = containerRightPosition - lastElementPosition;\n\n return {\n ...initialSliderState,\n containerLeftPosition,\n containerRightPosition,\n firstElementPosition,\n lastElementPosition,\n hideRightButton: lastElementPosition < containerRightPosition,\n leftOffsetLimit,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\ninterface ResizePayload {\n elementRefs: SlidingListRefs;\n mediaQuery: MediaQueryStrings;\n}\n\nconst onResize = (payload: ResizePayload): DynamicWidgetState => {\n const initialState = onInit({\n ...payload,\n ...payload.elementRefs\n });\n\n return {\n ...initialState,\n maxSlideDistance: getMaxSlideDistance(payload.mediaQuery)\n };\n};\n\nconst onNext = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { firstElementPosition, lastElementPosition, maxSlideDistance, offset, containerRightPosition } = prevState;\n\n /**\n * The distance in pixels that the slider will move along the x-axis.\n * This will be the `maxSlideDistance` constant value, or if that value is too large we calculate\n * the remaining overflowing space and only slide by that amount.\n */\n const slideDistance = lastElementPosition - containerRightPosition >= maxSlideDistance ?\n maxSlideDistance :\n lastElementPosition - containerRightPosition;\n\n return {\n firstElementPosition: firstElementPosition - slideDistance,\n lastElementPosition: lastElementPosition - slideDistance,\n offset: offset - slideDistance,\n hideRightButton: lastElementPosition - slideDistance === containerRightPosition,\n hideLeftButton: false\n };\n};\n\nconst onPrevious = (prevState: DynamicWidgetState): Partial<DynamicWidgetState> => {\n const { containerLeftPosition, firstElementPosition, lastElementPosition, maxSlideDistance, offset } = prevState;\n\n const fullSlide = firstElementPosition + maxSlideDistance <= containerLeftPosition;\n const slideDistance = fullSlide ? maxSlideDistance : Math.abs(offset);\n\n return {\n firstElementPosition: firstElementPosition + slideDistance,\n lastElementPosition: lastElementPosition + slideDistance,\n offset: offset + slideDistance,\n hideLeftButton: !fullSlide || firstElementPosition + slideDistance === containerLeftPosition,\n hideRightButton: false\n };\n};\n\nconst onDrag = (prevState: DynamicWidgetState, payload: any): Partial<DynamicWidgetState> => {\n const { widgetSnapshot, currentMouseX } = payload;\n\n // Disable dragging if the slider isn't long enough\n if (widgetSnapshot.hideLeftButton && widgetSnapshot.hideRightButton)\n return {};\n\n // The distance from the initial `MouseDown` event x-coordinate, to the present x-coordinate\n const dragDistance = widgetSnapshot.initialMouseX - currentMouseX;\n\n let offset = widgetSnapshot.offset - dragDistance;\n let firstElementPosition = widgetSnapshot.firstElementPosition - dragDistance;\n let lastElementPosition = widgetSnapshot.lastElementPosition - dragDistance;\n let hideLeftButton = false;\n let hideRightButton = false;\n\n if (firstElementPosition > prevState.containerLeftPosition) {\n offset = 0;\n firstElementPosition = prevState.containerLeftPosition;\n lastElementPosition = prevState.lastElementPosition;\n hideLeftButton = true;\n }\n\n if (lastElementPosition <= prevState.containerRightPosition) {\n offset = prevState.leftOffsetLimit;\n firstElementPosition = prevState.containerLeftPosition - Math.abs(prevState.leftOffsetLimit);\n lastElementPosition = widgetSnapshot.containerRightPosition;\n hideRightButton = true;\n }\n\n return {\n offset,\n firstElementPosition,\n lastElementPosition,\n hideLeftButton,\n hideRightButton\n };\n};\n\nexport function DynamicWidgetReducer(\n prevState: DynamicWidgetState,\n action: ReducerActions<WidgetInteraction>\n): DynamicWidgetState {\n switch (action.type) {\n case WidgetInteraction.Init:\n return {\n ...prevState,\n ...onInit(action.payload)\n };\n\n case WidgetInteraction.Resize:\n return {\n ...prevState,\n ...onResize(action.payload)\n };\n\n case WidgetInteraction.Next:\n return {\n ...prevState,\n ...onNext(prevState)\n };\n\n case WidgetInteraction.Previous:\n return {\n ...prevState,\n ...onPrevious(prevState)\n };\n\n case WidgetInteraction.Drag:\n return {\n ...prevState,\n ...onDrag(prevState, action.payload)\n };\n\n default:\n return prevState;\n }\n}\n",":local {\n .itemSpacing {\n &:not(:last-child) {\n margin-right: map-get($spacers, 2);\n }\n }\n\n .header {\n z-index: 1;\n position: relative;\n }\n\n .mobileScroll {\n overflow-x: scroll;\n -ms-overflow-style: none;\n scrollbar-width: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n .leftGradient {\n left: -2rem;\n }\n\n .leftGradientNoPadding {\n left: 0;\n }\n\n .leftButton {\n left: -1.3rem;\n }\n\n .leftButtonNoPadding {\n left: 0.1rem;\n }\n\n .rightGradient {\n right: -2rem;\n }\n\n .rightGradientNoPadding {\n right: 0;\n }\n\n .rightButton {\n right: -1.3rem;\n }\n\n .rightButtonNoPadding {\n right: 0.5rem;\n }\n}","import * as React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { WidgetHeader } from 'libs/shared/components/widgets/curated-widgets/components/header/WidgetHeader';\nimport { useWidgetKeyboard } from 'libs/shared/components/widgets/hooks/useWidgetKeyboard';\nimport { SlidingListContainer } from 'libs/shared/components/widgets/sliding-list/SlidingListContainer';\nimport { WidgetButton, WidgetButtonDirection } from 'libs/shared/components/widgets/widget-button/WidgetButton';\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { WidgetInteraction } from 'libs/shared/enums/WidgetInteraction';\nimport { useGetMediaQueryString } from 'libs/shared/hooks/UseGetMediaQueryString';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { SlidingListRefs } from 'libs/shared/interfaces/SlidingListRefs';\nimport { PartialLoadingHelper, PartialLoadingOptions } from 'libs/shared/utils/PartialLoadingHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport { getDragEndHandler, getDragHandler, getResizeEndHandler, getResizeHandler } from './DynamicWidgetEventHandlers';\nimport { DynamicWidgetReducer, DynamicWidgetState, initialSliderState } from './DynamicWidgetReducer';\n\nimport styles from './dynamic-widget.module.scss';\n\ninterface WidgetSnapshot extends DynamicWidgetState {\n initialMouseX: number;\n}\n\ninterface StaticChild {\n position: 'start' | 'end';\n component: React.ElementType;\n}\n\ninterface DynamicWidgetProps {\n id?: string;\n childComponent: React.ElementType;\n childComponentProps?: any;\n partialLoadingComponent: React.ElementType;\n partialLoadingOptions?: PartialLoadingOptions;\n\n widgetDataDeps?: (any)[];\n getChildAppLink?: (data: any) => Core.AppLink;\n\n staticChildren?: StaticChild[];\n collection?: BaseObject[];\n fetch?: (...args: any[]) => any;\n lazyLoad?: boolean;\n\n heading?: string;\n headingAppLink?: Core.AppLink;\n description?: string;\n getSubtitle?: (data: any) => string;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n getWidgetItemAnalyticsData?: (data: any) => HashObject;\n hideButtons?: boolean;\n childClassName?: string;\n // set to true if the widget get cut off by the container\n noNegativePadding?: boolean;\n}\n\nDynamicWidget.defaultProps = {\n heading: '',\n description: '',\n childComponentProps: {}\n};\n\nexport function DynamicWidget(props: DynamicWidgetProps): JSX.Element {\n const { childComponent: WidgetItemComponent, staticChildren, getWidgetItemAnalyticsData = () => {} } = props;\n\n const [ state, dispatch ] = React.useReducer(DynamicWidgetReducer, initialSliderState);\n\n // A snapshot of the widget state is captured on the very first `Drag` event as a point of reference\n const [ widgetSnapshot, setWidgetSnapshot ] = React.useState<WidgetSnapshot>(null);\n\n const elementRefs: SlidingListRefs = {\n container: React.useRef(null),\n firstElement: React.useRef(null),\n lastElement: React.useRef(null)\n };\n\n const mediaQuery = useGetMediaQueryString();\n const isTouchScreen = UserAgentHelper.isTabletOrMobile();\n \n const { dynamicAttributes, focusNext, focusPrev, onFocusWidget, onBlurWidget } = useWidgetKeyboard({ type: 'dynamic', state, containerRef: elementRefs.container, mediaQuery });\n\n useResizeListener(\n getResizeHandler(elementRefs, dispatch, mediaQuery),\n getResizeEndHandler(elementRefs.container),\n [mediaQuery]\n );\n\n const { ref, inView } = useLazyLoad({ prevent: !props.lazyLoad });\n\n let widgetData = props.collection;\n\n if (!props.collection && FunctionHelper.isFunction(props.fetch)) {\n const request = props.fetch(inView);\n widgetData = request.data;\n }\n\n /**\n * Once the widget data has been set, we can initialize the reducer. This is because\n * the reducer depends on the refs being set, but they don't get set until the markup has been loaded.\n */\n React.useEffect(() => {\n if (!widgetData || ObjectHelper.isEmpty(widgetData))\n return;\n\n dispatch({\n type: WidgetInteraction.Init,\n payload: {\n elementRefs,\n mediaQuery\n }\n });\n }, [widgetData]);\n\n function getWidgetItems(): JSX.Element {\n if (!widgetData)\n return;\n\n const firstChildren = staticChildren?.filter(child => child.position === 'start') ?? [];\n const lastChildren = staticChildren?.filter(child => child.position === 'end') ?? [];\n\n let items = widgetData.map((widgetItem, index) => {\n let itemRef: React.MutableRefObject<HTMLLIElement>;\n\n if (widgetItem === ArrayHelper.first(widgetData) && firstChildren?.length)\n itemRef = elementRefs.firstElement;\n\n if (widgetItem === ArrayHelper.last(widgetData) && !lastChildren?.length)\n itemRef = elementRefs.lastElement;\n\n const isLast = index + 1 === widgetData.length;\n\n return (\n <li\n id={widgetItem.id}\n key={widgetItem.id}\n ref={itemRef}\n onFocus={() => onFocusWidget(index)}\n onBlur={() => onBlurWidget()}\n className={`${styles.itemSpacing} ${props.childClassName || ''} ${(isLast && isTouchScreen) ? 'pe-4' : ''}`}\n {...dynamicAttributes[widgetItem.id]}\n >\n <WidgetItemComponent\n getChildAppLink={props.getChildAppLink}\n data={widgetItem}\n getSubtitle={props.getSubtitle}\n analyticsData={{\n itemIndex: index,\n ...props.analyticsData,\n ...getWidgetItemAnalyticsData(widgetItem)\n }}\n analyticsOptions={{ ...props?.analyticsOptions, ...WidgetHelper.getSliderItemAnalyticsOptions() }}\n {...props.childComponentProps}\n />\n </li>\n );\n });\n\n if (firstChildren.length) {\n items = [\n ...firstChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`first-widget-component:${i}`}\n ref={i === 0 ? elementRefs.firstElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n }),\n ...items\n ];\n }\n\n if (lastChildren.length) {\n items = [\n ...items,\n ...lastChildren.map((child, i) => {\n const Component = child.component;\n\n return (\n <li\n key={`end-widget-component:${i}`}\n ref={i === lastChildren.length - 1 ? elementRefs.lastElement : null}\n className={`${styles.itemSpacing} ${props.childClassName || ''}`}\n >\n <Component />\n </li>\n );\n })\n ];\n }\n\n return <>{items}</>;\n }\n const widgetItems = React.useMemo(getWidgetItems, [\n widgetData, dynamicAttributes, state.offset, mediaQuery, ...props.widgetDataDeps || []\n ]);\n\n if (widgetData && !widgetData.length && !staticChildren?.length)\n return <></>;\n\n if (!widgetData || ObjectHelper.isEmpty(widgetData)) {\n return (\n <div ref={ref}>\n <PartialDynamicWidget\n partialLoadingComponent={props.partialLoadingComponent}\n partialLoadingOptions={props.partialLoadingOptions}\n />\n </div>\n );\n }\n\n const getSliderAnalyticsData = (type: WidgetInteraction) => ({\n ...props.analyticsData,\n id: props.id,\n name: props.heading,\n direction: type === WidgetInteraction.Next ? 'right' : 'left'\n });\n\n const hideButtons = isTouchScreen || props.hideButtons;\n\n return (\n <div className={`${props.noNegativePadding ? '' : 'mx-n4'}`}>\n <div className={`px-4 ${styles.header}`}>\n <WidgetHeader\n name={props.heading}\n description={props.description}\n appLink={props.headingAppLink}\n showSeeMoreLink={!!props.headingAppLink}\n />\n </div>\n\n <div className='position-relative'>\n <div className={`${props.noNegativePadding ? '' : 'px-4' } py-3 my-n3 position-relative ${isTouchScreen ? styles.mobileScroll : 'overflow-hidden-x'}`}>\n <div className={`position-relative ${props.hideButtons ? 'overflow-hidden-x' : ''}`}>\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Left}\n onClick={() => {\n focusPrev();\n\n dispatch({ type: WidgetInteraction.Previous });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Previous),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n leftButtonClassName={`${styles.leftButton} ${props.noNegativePadding ? styles.leftButtonNoPadding : ''}`}\n leftGradientClassName={`${styles.leftGradient} ${props.noNegativePadding ? styles.leftGradientNoPadding : ''}`}\n hide={state.hideLeftButton}\n useGradientBackdrop\n />\n )}\n\n <SlidingListContainer\n position={state.offset}\n positionType={CssMeasurement.Pixels}\n onDrag={getDragHandler(elementRefs.container, state, dispatch, widgetSnapshot, setWidgetSnapshot)}\n onDragEnd={getDragEndHandler(elementRefs.container, setWidgetSnapshot)}\n ref={elementRefs.container}\n >\n {widgetItems}\n </SlidingListContainer>\n\n {!hideButtons && (\n <WidgetButton\n direction={WidgetButtonDirection.Right}\n onClick={() => {\n focusNext();\n\n dispatch({ type: WidgetInteraction.Next });\n AnalyticsHelper.logUserAction(\n getSliderAnalyticsData(WidgetInteraction.Next),\n WidgetHelper.getSliderAnalyticsOptions()\n );\n }}\n hide={state.hideRightButton}\n rightButtonClassName={`${styles.rightButton} ${props.noNegativePadding ? styles.rightButtonNoPadding : ''}`}\n rightGradientClassName={`${styles.rightGradient} ${props.noNegativePadding ? styles.rightGradientNoPadding : ''}`}\n useGradientBackdrop\n />\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ntype PartialDynamicWidgetProps = Pick<DynamicWidgetProps, 'partialLoadingComponent'> & {\n partialLoadingOptions?: PartialLoadingOptions\n};\n\nexport const PartialDynamicWidget = (props: PartialDynamicWidgetProps) => {\n const { partialLoadingComponent: Component, partialLoadingOptions } = props;\n\n return (\n <div className='d-flex flex-nowrap overflow-hidden'>\n {PartialLoadingHelper.getPartialLoadingItems(partialLoadingOptions).map((item, idx) => <Component key={idx} />)}\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{lt as r,ut as i}from"./Dun43GrB.chunk.js";import{t as a}from"./B-OL6Vs7.chunk.js";import{d as o,l as s}from"./BQ5XMoHG.chunk.js";import{n as c}from"./CAEQvGr_.chunk.js";import{t as l}from"./ibuOpDkQ.chunk.js";import{t as u}from"./CxwN2xIE.chunk.js";import{t as d}from"./DeldjYRc.chunk.js";import{t as f}from"./BYYiNmLB.chunk.js";import{t as p}from"./Ca1QPe-q2.chunk.js";import{i as m,t as h}from"./ClfNVaoj2.chunk.js";import{n as g}from"./D7d5XFW82.chunk.js";import{n as _,t as v}from"./DjIdG9LL2.chunk.js";import{t as y}from"./iTHYgnO8.chunk.js";import{t as b}from"./DIVzVtlg.chunk.js";import{D as x,I as S,X as C,z as ee}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{gt as e,v as t}from"./Dp9qJj1C.chunk.js";import{t as n}from"./ImQRQGZr.chunk.js";import{lt as r,ut as i}from"./Dun43GrB.chunk.js";import{t as a}from"./B-OL6Vs7.chunk.js";import{d as o,l as s}from"./BQ5XMoHG.chunk.js";import{n as c}from"./CAEQvGr_.chunk.js";import{t as l}from"./ibuOpDkQ.chunk.js";import{t as u}from"./CxwN2xIE.chunk.js";import{t as d}from"./DeldjYRc.chunk.js";import{t as f}from"./BYYiNmLB.chunk.js";import{t as p}from"./Ca1QPe-q2.chunk.js";import{i as m,t as h}from"./ClfNVaoj2.chunk.js";import{n as g}from"./D7d5XFW82.chunk.js";import{n as _,t as v}from"./DjIdG9LL2.chunk.js";import{t as y}from"./iTHYgnO8.chunk.js";import{t as b}from"./DIVzVtlg.chunk.js";import{D as x,I as S,X as C,z as ee}from"./app-gjHxcZG3.js";import{t as w}from"./BlQ4coEt.chunk.js";import{a as T,i as E,r as D,t as O}from"./wOeN2ls0.chunk.js";import{t as k}from"./BlBCp_pE.chunk.js";import{t as te}from"./BOTX-kIq.chunk.js";import{a as ne,c as A,i as re,l as ie,n as ae,o as j,r as M,s as N,t as P}from"./D8g6nOG92.chunk.js";var F=w(),I=e(i(),1),L={image:`_image_13xy1_1`},R=r(),z=`default.contactUsError`,B=n.encloseNamespace(z);function V({className:e=``,onTryAgain:t}){return(0,R.jsxs)(y,{className:e,children:[(0,R.jsx)(y.Image,{className:L.image,src:f.General.LOST_MESSAGE_BOTTLE}),(0,R.jsx)(y.Heading,{className:`w-100`,children:(0,R.jsx)(g,{namespace:z,phrase:`errorHeading`})}),(0,R.jsx)(y.Info,{className:`w-100`,children:(0,R.jsx)(g,{namespace:z,phrase:`errorMessage`})}),(0,R.jsx)(y.Cta,{text:B(`buttonLabel`),className:`btn btn-dark w-100`,onClick:t})]})}var H=e(D(),1),U=`default.contactUsForm`,W=n.encloseNamespace(U),G=H.object({firstName:H.string().required(W(`firstNameRequired`)),lastName:H.string().required(W(`lastNameRequired`)),email:H.string().email(W(`emailValid`)).required(W(`emailRequired`)),jobTitle:H.string().required(W(`jobTitleRequired`)),phoneNumber:H.string().required(W(`phoneNumberRequired`)).matches(/^[0-9]+$/,W(`phoneNumberValid`)),schoolOrDistrict:H.string().required(W(`schoolOrDistrictRequired`))});function K(e){return(0,R.jsx)(E,{initialValues:e.initialValues,validateOnMount:!0,validationSchema:G,onSubmit:e.onSubmit,children:(0,R.jsx)(q,{showSpinner:e.showSpinner,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl})})}function q(e){let{showSpinner:t,googleMapsApiKey:n,searchProspectsUrl:r}=e,i=T(),[a,o]=I.useState({}),[s,c]=I.useState(!1);function l(){i.setFieldValue(`schoolOrDistrict`,``),i.setFieldValue(`country`,``),i.setFieldValue(`province`,``),i.setFieldValue(`prospectId`,``),v()}function u(e){o({...a,...e}),l()}function d(){o({}),l()}function f(e){o({...a,...e}),i.setFieldValue(`schoolOrDistrict`,e.schoolName),i.setFieldValue(`country`,e.country),i.setFieldValue(`province`,e.province),i.setFieldValue(`prospectId`,e.prospectId),v()}function p(){o({...a,prospectId:void 0,schoolName:void 0,schoolPostCode:void 0}),l()}function _(e){c(!0),i.setFieldValue(`schoolOrDistrict`,e),v()}function v(){window.setTimeout(()=>i.validateForm(),0)}return(0,R.jsxs)(m,{children:[(0,R.jsx)(O,{label:W(`firstName`),name:`firstName`,value:i.values?.firstName,showRequiredStar:!0,placeholder:W(`firstNamePlaceholder`)}),(0,R.jsx)(O,{label:W(`lastName`),name:`lastName`,value:i.values?.lastName,showRequiredStar:!0,placeholder:W(`lastNamePlaceholder`)}),(0,R.jsx)(O,{label:W(`email`),name:`email`,value:i.values?.email,showRequiredStar:!0,placeholder:W(`emailPlaceholder`)}),s?(0,R.jsx)(O,{label:W(`schoolOrDistrict`),name:`schoolOrDistrict`,value:i.values?.schoolOrDistrict,showRequiredStar:!0,placeholder:W(`schoolOrDistrictPlaceholder`),autoFocus:!0}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(ae,{data:a,setData:u,clearData:d,labelClassName:`form-label`,geoLocation:{countryCode:`US`},googleMapsApiKey:n,required:!0,hideOnBlur:!0}),(0,R.jsx)(P,{data:a,setData:f,clearData:p,disabled:!a.schoolLocality,searchUrl:r,onClickNoSuggestions:_,required:!0,placeholder:!a.schoolLocality&&W(`schoolPlaceholder`),hideOnBlur:!0})]}),(0,R.jsx)(M,{id:`job-title`,error:i.touched?.jobTitle&&i.errors?.jobTitle,countryCode:b.US,initialValue:i.values?.jobTitle,onChange:e=>i.setFieldValue(`jobTitle`,e,!1),labelClassName:`form-label`,isTertiary:!1,required:!0}),(0,R.jsx)(O,{label:W(`phoneNumber`),name:`phoneNumber`,value:i.values?.phoneNumber,showRequiredStar:!0,placeholder:W(`phoneNumberPlaceholder`)}),(0,R.jsx)(h,{type:`submit`,className:`w-100 mt-3`,variant:`dark`,showSpinner:t,disabled:!i.isValid,children:(0,R.jsx)(g,{namespace:U,phrase:`contactUsButton`})})]})}var oe={image:`_image_13xy1_1`},J=`default.contactUsSuccess`,se=n.encloseNamespace(J);function ce({className:e=``,onClose:t}){return(0,R.jsxs)(y,{className:e,children:[(0,R.jsx)(y.Image,{className:oe.image,src:f.General.EMAIL_SENT}),(0,R.jsx)(y.Heading,{className:`w-100`,children:(0,R.jsx)(g,{namespace:J,phrase:`successHeading`})}),(0,R.jsx)(y.Info,{className:`w-100`,children:(0,R.jsx)(g,{namespace:J,phrase:`successMessage`})}),t&&(0,R.jsx)(y.Cta,{text:se(`buttonLabel`),className:`btn btn-dark w-100`,onClick:t})]})}var Y={logo:`_logo_c400r_1`,pageContainer:`_pageContainer_c400r_5`},X=`default.contactUs`,Z=n.encloseNamespace(X);function Q(e){return(0,R.jsxs)(R.Fragment,{children:[e.formStage===`data-entry`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`h1`,{className:`h2 text-center`,children:(0,R.jsx)(g,{namespace:X,phrase:`contactUsHeading`})}),(0,R.jsx)(`p`,{className:`text-center mb-3`,children:(0,R.jsx)(g,{namespace:X,phrase:`contactUsDescription`})}),(0,R.jsx)(K,{initialValues:e.initialFormValues,showSpinner:e.submitting,onSubmit:e.onSubmit,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl}),e.showSignIn&&(0,R.jsx)(p,{className:`d-flex justify-content-center align-items-center mt-3 text-info`,appLink:{application:a.DEFAULT,action:d.Default.CHALLENGE,params:e.loginParams},children:(0,R.jsx)(g,{namespace:X,phrase:`signInLink`})})]}),e.formStage===`error`&&(0,R.jsx)(V,{onTryAgain:e.onTryAgain}),e.formStage===`success`&&(0,R.jsx)(ce,{onClose:e.closePopup})]})}function le(e){return v(_.getDefaultMetadata({title:Z(`title`),phraseContext:{phraseHandler:Z,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:k.getCanonicalLink(),allowIndexing:!0,product:S.PRODUCT_NAME})),(0,R.jsx)(`div`,{className:`${Y.pageContainer} bg-white mt-4 mx-4 mx-sm-auto p-3 mb-3 border border-gray-400 rounded-3 shadow-sm`,children:(0,R.jsx)(Q,{formStage:e.formStage,initialFormValues:e.initialFormValues,loginParams:e.loginParams,onSubmit:e.onSubmit,onTryAgain:e.onTryAgain,submitting:e.submitting,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl,showSignIn:e.showSignIn})})}function $(e){function t(){e.closePopup(),te.preventScrollTop()}return(0,R.jsxs)(ee,{title:Z(`title`),closePopup:t,bodyClassName:`p-5`,hideTitle:!0,children:[(0,R.jsx)(`button`,{className:`btn-close position-absolute top-0 end-0 p-3`,onClick:t}),(0,R.jsx)(`div`,{className:`${Y.logo} position-absolute top-0 start-0 m-3`,children:(0,R.jsx)(x,{})}),(0,R.jsx)(Q,{formStage:e.formStage,initialFormValues:e.initialFormValues,loginParams:e.loginParams,onSubmit:e.onSubmit,onTryAgain:e.onTryAgain,submitting:e.submitting,closePopup:t,googleMapsApiKey:e.googleMapsApiKey,searchProspectsUrl:e.searchProspectsUrl,showSignIn:e.showSignIn})]})}function ue(e){let n=o(),r=s(C.config()),i=s(l.currentUser()),a=re(),[d,f]=I.useState(`data-entry`),[p,m]=I.useState(!1),[h,g]=I.useState({firstName:``,lastName:``,email:``,schoolOrDistrict:``,jobTitle:``,phoneNumber:``,country:``,province:``,prospectId:``}),{createOrUpdateProfile:_}=N(),v=t.getHref(u.getCurrentRoute().appLink),y=v===`/`?{}:{redirectUrl:v};I.useEffect(()=>{i.data?.isAuthenticated&&g({...h,firstName:i.data.givenName,lastName:i.data.familyName,email:i.data.email})},[i.data?.isAuthenticated]);async function b(e){try{m(!0),g(e);let t=await n(A.checkEmail(e.email)),r;e.prospectId&&(r=(await n(A.prospectLookups(e.prospectId)))?.find(e=>e.type===`crm_id`)?.externalId);let i={email:e.email,firstName:e.firstName,lastName:e.lastName,phone:e.phoneNumber,custom:{accountAddress:e?.province?{countryCode:e?.country,province:ie.parseProvince(e?.province||``)}:void 0,accountName:e.schoolOrDistrict,jobTitle:e.jobTitle,syncToCrm:t?.users?.length?void 0:!0,crmId:r||void 0}};_({email:e.email,firstName:e.firstName,lastName:e.lastName,phone:e.phoneNumber,countryCode:e.country}),a.logFormSubmission({user:i,eventType:F.StreamableFormEvent.ContactUsFormSubmit,source:ne.ContactUs,conversion:j.ContactUs,productType:`sl`}),f(`success`)}catch(e){console.warn(e),f(`error`)}finally{m(!1)}}function x(){f(`data-entry`)}if(!r.hasCompleted||!i.hasCompleted)return(0,R.jsx)(R.Fragment,{});let S={formStage:d,initialFormValues:h,submitting:p,loginParams:y,onSubmit:b,onTryAgain:x,closePopup:e.closePopup,googleMapsApiKey:r.data.googleMapsApiKey,searchProspectsUrl:c.safeUrlConcat(r.data.gatewayApiUrl,`/v1/search/prospects`),showSignIn:!i.data.isAuthenticated};return e.fromPageLoad?(0,R.jsx)(le,{...S}):(0,R.jsx)($,{...S})}export{ue as ContactUsView};
|
|
2
|
+
//# sourceMappingURL=C2itEpvc2.chunk.js.map
|