@maestro_io/maestro-web-sdk 5.2.0 → 5.2.1
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/10.maestro-web-sdk.esm.js +1 -1
- package/dist/10.maestro-web-sdk.esm.js.map +1 -1
- package/dist/11.maestro-web-sdk.esm.js +1 -1
- package/dist/11.maestro-web-sdk.esm.js.map +1 -1
- package/dist/12.maestro-web-sdk.esm.js +1 -1
- package/dist/12.maestro-web-sdk.esm.js.map +1 -1
- package/dist/13.maestro-web-sdk.esm.js +1 -1
- package/dist/13.maestro-web-sdk.esm.js.map +1 -1
- package/dist/14.maestro-web-sdk.esm.js +1 -1
- package/dist/14.maestro-web-sdk.esm.js.map +1 -1
- package/dist/15.maestro-web-sdk.esm.js +1 -1
- package/dist/15.maestro-web-sdk.esm.js.map +1 -1
- package/dist/16.maestro-web-sdk.esm.js +1 -1
- package/dist/16.maestro-web-sdk.esm.js.map +1 -1
- package/dist/17.maestro-web-sdk.esm.js +1 -1
- package/dist/17.maestro-web-sdk.esm.js.map +1 -1
- package/dist/18.maestro-web-sdk.esm.js +1 -1
- package/dist/18.maestro-web-sdk.esm.js.map +1 -1
- package/dist/19.maestro-web-sdk.esm.js +1 -1
- package/dist/19.maestro-web-sdk.esm.js.map +1 -1
- package/dist/20.maestro-web-sdk.esm.js +1 -1
- package/dist/20.maestro-web-sdk.esm.js.map +1 -1
- package/dist/21.maestro-web-sdk.esm.js +1 -1
- package/dist/21.maestro-web-sdk.esm.js.map +1 -1
- package/dist/22.maestro-web-sdk.esm.js +1 -1
- package/dist/22.maestro-web-sdk.esm.js.map +1 -1
- package/dist/23.maestro-web-sdk.esm.js +1 -1
- package/dist/23.maestro-web-sdk.esm.js.map +1 -1
- package/dist/24.maestro-web-sdk.esm.js +1 -1
- package/dist/24.maestro-web-sdk.esm.js.map +1 -1
- package/dist/25.maestro-web-sdk.esm.js +1 -1
- package/dist/25.maestro-web-sdk.esm.js.map +1 -1
- package/dist/26.maestro-web-sdk.esm.js +1 -1
- package/dist/26.maestro-web-sdk.esm.js.map +1 -1
- package/dist/27.maestro-web-sdk.esm.js +1 -1
- package/dist/27.maestro-web-sdk.esm.js.map +1 -1
- package/dist/28.maestro-web-sdk.esm.js +1 -1
- package/dist/28.maestro-web-sdk.esm.js.map +1 -1
- package/dist/29.maestro-web-sdk.esm.js +1 -1
- package/dist/29.maestro-web-sdk.esm.js.map +1 -1
- package/dist/3.maestro-web-sdk.esm.js +1 -1
- package/dist/3.maestro-web-sdk.esm.js.map +1 -1
- package/dist/30.maestro-web-sdk.esm.js +1 -1
- package/dist/30.maestro-web-sdk.esm.js.map +1 -1
- package/dist/31.maestro-web-sdk.esm.js +1 -1
- package/dist/31.maestro-web-sdk.esm.js.map +1 -1
- package/dist/32.maestro-web-sdk.esm.js +1 -1
- package/dist/32.maestro-web-sdk.esm.js.map +1 -1
- package/dist/33.maestro-web-sdk.esm.js +1 -1
- package/dist/33.maestro-web-sdk.esm.js.map +1 -1
- package/dist/34.maestro-web-sdk.esm.js +1 -1
- package/dist/34.maestro-web-sdk.esm.js.map +1 -1
- package/dist/35.maestro-web-sdk.esm.js +1 -1
- package/dist/35.maestro-web-sdk.esm.js.map +1 -1
- package/dist/36.maestro-web-sdk.esm.js +1 -1
- package/dist/36.maestro-web-sdk.esm.js.map +1 -1
- package/dist/37.maestro-web-sdk.esm.js +1 -1
- package/dist/37.maestro-web-sdk.esm.js.map +1 -1
- package/dist/38.maestro-web-sdk.esm.js +1 -1
- package/dist/38.maestro-web-sdk.esm.js.map +1 -1
- package/dist/39.maestro-web-sdk.esm.js +1 -1
- package/dist/39.maestro-web-sdk.esm.js.map +1 -1
- package/dist/6.maestro-web-sdk.esm.js +1 -1
- package/dist/7.maestro-web-sdk.esm.js +1 -1
- package/dist/8.maestro-web-sdk.esm.js +1 -1
- package/dist/8.maestro-web-sdk.esm.js.map +1 -1
- package/dist/9.maestro-web-sdk.esm.js +1 -1
- package/dist/maestro-web-sdk.esm.js +2 -2
- package/dist/maestro-web-sdk.umd.js +2 -2
- package/dist/maestro-web-sdk.umd.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/src/modules/espn/bets/services/BetsService.js +5 -5
- package/dist/src/modules/espn/fantasy/services/FantasyService.js +3 -0
- package/dist/src/modules/espn/fantasy/view/FantasyView.js +2 -1
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.FantasyPolling.d.ts +1 -1
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.FantasyPolling.js +10 -7
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.d.ts +1 -1
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.LeagueManagerPolling.js +10 -7
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.TournamentPolling.d.ts +1 -1
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.TournamentPolling.js +10 -7
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.d.ts +1 -0
- package/dist/src/modules/espn/fantasy/view-model/FantasyViewModel.js +42 -32
- package/dist/src/modules/espn/shop/services/ShopService.js +1 -1
- package/dist/src/modules/espn/stats/services/StatsService.js +2 -2
- package/dist/src/modules/fox/multi-view/services/MultiViewService.d.ts +20 -15
- package/dist/src/modules/fox/multi-view/services/MultiViewService.js +6 -3
- package/dist/src/modules/fox/multi-view/types.d.ts +20 -0
- package/dist/src/modules/fox/multi-view/view/BuildYourOwn/BuildYourOwn.d.ts +7 -0
- package/dist/src/modules/fox/multi-view/view/BuildYourOwn/BuildYourOwn.js +99 -0
- package/dist/src/modules/fox/multi-view/view/BuildYourOwn/index.d.ts +2 -0
- package/dist/src/modules/fox/multi-view/view/BuildYourOwn/index.js +2 -0
- package/dist/src/modules/fox/multi-view/view/CuratedMultiview/CuratedMultiviews.js +2 -1
- package/dist/src/modules/fox/multi-view/view/FoxMultiView.js +3 -0
- package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/BuildYourOwnTabs.d.ts +8 -0
- package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/BuildYourOwnTabs.js +30 -0
- package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/index.d.ts +2 -0
- package/dist/src/modules/fox/multi-view/view/components/BuildYourOwnTabs/index.js +2 -0
- package/dist/src/modules/fox/multi-view/view/components/CustomMultiviewStreamsCard/CustomMultiviewStreamsCard.d.ts +2 -6
- package/dist/src/modules/fox/multi-view/view/components/curated-multiview-card/CuratedMultiviewCard.js +27 -7
- package/dist/src/modules/fox/multi-view/view-model/MultiViewViewModel.d.ts +25 -4
- package/dist/src/modules/fox/multi-view/view-model/MultiViewViewModel.js +196 -15
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{104:function(e,t,a){"use strict";a.d(t,"a",(function(){return i})),a.d(t,"b",(function(){return r}));const i=e=>e.toLowerCase().trim().replace(/[\s\W-]+/g,"-").replace(/^-+|-+$/g,"");function r(e){let t=0;for(let a=0;a<e.length;a++){t=(t<<5)-t+e.charCodeAt(a),t&=t}return t}},125:function(e,t,a){"use strict";a.r(t),a.d(t,"BuilderPanelViewModel",(function(){return o}));var i=a(3),r=a(34),n=a(4),s=a(104);function l(e,t,a){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class o extends r.a{constructor(e,t){super(),l(this,"sections",new i.a([])),l(this,"expandedCardIds",new i.a(new Set)),l(this,"isDataLoading",new i.a(!1)),l(this,"hasEverSuccessfullyLoaded",new i.a(!1)),l(this,"analyticsService",null),l(this,"lastResponseHash",null),l(this,"initialized",!1),this.analyticsService=t||null,e&&this.parseBlockData(e)}async init(e){this.analyticsService&&await this.trackPanelView(),this.parseBlockData(e),this.initialized=!0}cleanup(){this.sections.value=[],this.expandedCardIds.value=new Set,this.lastResponseHash=null,this.initialized=!1}updatePanelConfig(e){this.parseBlockData(e)}async trackPanelView(){try{this.analyticsService}catch(e){Object(n.a)(e,{tags:{component:"BuilderPanelViewModel",method:"trackPanelView"}})}}parseBlockData(e){try{if(this.isDataLoading.value=!0,this.setError(null),!e)throw new Error("Panel config is required");if(!e.block_data)throw new Error("block_data is missing from panel config");const t=e.block_data;if(!t.sections)throw new Error("sections array is missing from block_data");if(!Array.isArray(t.sections))throw new Error("sections must be an array");const a=Object(s.b)(JSON.stringify(t.sections));if(a===this.lastResponseHash)return void(this.isDataLoading.value=!1);this.sections.value=this.parseSections(t.sections),this.lastResponseHash=a,this.hasEverSuccessfullyLoaded.value=!0,this.isDataLoading.value=!1}catch(t){const a=t instanceof Error?t.message:"Failed to parse block data";this.setError(a),this.isDataLoading.value=!1,Object(n.a)(t,{tags:{component:"BuilderPanelViewModel",method:"parseBlockData"},extra:{panelConfig:e}})}}toggleCardExpanded(e){const t=new Set(this.expandedCardIds.value);t.has(e)?t.delete(e):t.add(e),this.expandedCardIds.value=t}collapseAllCards(){this.expandedCardIds.value=new Set}parsePadding(e){var t,a,i,r;const n=8,s=8,l=8,o=8;return{top:null!==(t=null==e?void 0:e.top)&&void 0!==t?t:n,right:null!==(a=null==e?void 0:e.right)&&void 0!==a?a:s,bottom:null!==(i=null==e?void 0:e.bottom)&&void 0!==i?i:l,left:null!==(r=null==e?void 0:e.left)&&void 0!==r?r:o}}parseHeader(e){var t,a,i;return{content:null!==(t=null==e?void 0:e.content)&&void 0!==t?t:"",enabled:null!==(a=null==e?void 0:e.enabled)&&void 0!==a&&a,type:null!==(i=null==e?void 0:e.type)&&void 0!==i?i:"text",alt:null==e?void 0:e.alt}}parseSectionSettings(e){var t,a,i,r;return{backgroundColor:null!==(t=null==e?void 0:e.background_color)&&void 0!==t?t:"transparent",header:this.parseHeader(null==e?void 0:e.header),padding:this.parsePadding(null==e?void 0:e.padding),spacing:null!==(a=null==e?void 0:e.spacing)&&void 0!==a?a:8,sticky:null!==(i=null==e?void 0:e.sticky)&&void 0!==i&&i,textAlignment:null!==(r=null==e?void 0:e.text_alignment)&&void 0!==r?r:"left"}}parseSimpleCard(e){var t,a,i,r;return{id:e.id,type:"simple",title:null!==(t=e.title)&&void 0!==t?t:"",image:{url:null!==(a=null===(i=e.image)||void 0===i?void 0:i.url)&&void 0!==a?a:"",alt:null===(r=e.image)||void 0===r?void 0:r.alt}}}parseExpandableCard(e){var t,a,i;return{id:e.id,type:"expandable",title:null!==(t=e.title)&&void 0!==t?t:"",collapsedState:{cards:Array.isArray(null===(a=e.collapsed_state)||void 0===a?void 0:a.cards)?e.collapsed_state.cards.map(e=>this.parseSimpleCard(e)):[]},expandedState:{cards:Array.isArray(null===(i=e.expanded_state)||void 0===i?void 0:i.cards)?e.expanded_state.cards.map(e=>this.parseSimpleCard(e)):[]},settings:e.settings?this.parseSectionSettings(e.settings):void 0}}parseCard(e){if(!e||!e.id)throw new Error("Card must have an id");return"expandable"===e.type?this.parseExpandableCard(e):this.parseSimpleCard(e)}parseSection(e){var t;if(!e||!e.id)throw new Error("Section must have an id");return{id:e.id,title:null!==(t=e.title)&&void 0!==t?t:"",cards:Array.isArray(e.cards)?e.cards.map(e=>this.parseCard(e)):[],settings:this.parseSectionSettings(e.settings)}}parseSections(e){if(!Array.isArray(e))throw new Error("Sections must be an array");return e.map(e=>this.parseSection(e))}}}}]);
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{104:function(t,e,i){"use strict";i.d(e,"a",(function(){return s})),i.d(e,"b",(function(){return a}));const s=t=>t.toLowerCase().trim().replace(/[\s\W-]+/g,"-").replace(/^-+|-+$/g,"");function a(t){let e=0;for(let i=0;i<t.length;i++){e=(e<<5)-e+t.charCodeAt(i),e&=e}return e}},246:function(t,e,i){"use strict";i.r(e),i.d(e,"MultiViewViewModel",(function(){return p}));var s=i(34),a=i(3),r=i(104);const n={2:{layoutId:"LR",description:"Two equal-sized windows side by side",positions:{L:{w:.4766,h:.4766,x:.259,y:.5},R:{w:.4766,h:.4766,x:.7409,y:.5}},name:"50/50",windowCount:2,positionsOrder:["L","R"]},3:{layoutId:"TLTRB",description:"Three equal-sized windows in T layout",positions:{B:{w:.458,h:.458,x:.5,y:.266},TL:{w:.458,h:.458,x:.268,y:.7335},TR:{w:.458,h:.458,x:.732,y:.7335}},name:"Triple T",windowCount:3,positionsOrder:["TL","TR","B"]},4:{layoutId:"TLTRBLBR",description:"Four equal-sized windows in 2x2 grid",positions:{BL:{w:.4766,h:.4766,x:.259,y:.257},BR:{w:.4766,h:.4766,x:.741,y:.257},TL:{w:.4766,h:.4766,x:.259,y:.743},TR:{w:.4766,h:.4766,x:.741,y:.743}},name:"2x2 Grid",windowCount:4,positionsOrder:["TL","TR","BL","BR"]}};var o=i(35);function l(t,e,i){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,e||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}var u=class{constructor(){l(this,"networkManager",void 0),l(this,"productAPI",null),this.networkManager=new o.b}getLayouts(){return this.productAPI?this.networkManager.externalApiRequest({endpoint:"https://qa-mvlm.api.shared.digitalvideoplatform.com/mvlm/v1/layouts",headers:this.productAPI.headers}):null}setProductAPIData(t){this.productAPI=t}pollCuratedMultiviews(t,e,i){return this.productAPI?this.networkManager.pollExternalApiRequest({endpoint:this.productAPI.url,interval:t,method:this.productAPI.method,headers:this.productAPI.headers,onData:e,onError:i}):null}getOrCreateCustomMultiview(t,e={}){return this.networkManager.externalApiRequest({endpoint:"https://qa-mvlm.api.shared.digitalvideoplatform.com/mvlm/v1/mvlisting",method:o.a.POST,data:t,headers:e})}},d=i(15),c=i(4),h=i(8);function v(t,e,i){return(e=function(t){var e=function(t,e){if("object"!=typeof t||!t)return t;var i=t[Symbol.toPrimitive];if(void 0!==i){var s=i.call(t,e||"default");if("object"!=typeof s)return s;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:e+""}(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}class p extends s.a{constructor(t,e,i){super(),v(this,"_layouts",new a.a([])),v(this,"_isPolling",new a.a(!1)),v(this,"service",void 0),v(this,"delegate",void 0),v(this,"eventId",void 0),v(this,"analyticsService",void 0),v(this,"isDataLoading",new a.a(!1)),v(this,"pollingTask",null),v(this,"pollingInterval",3e4),v(this,"items",new a.a([])),v(this,"hasEverSuccessfullyLoaded",new a.a(!1)),v(this,"onAuthError",void 0),v(this,"_selectedLayoutId",new a.a(null)),v(this,"lastResponseHash",null),this.eventId=t,this.delegate=e,this.analyticsService=i,this.service=new u}getLayouts(){return this._layouts.value}getIsPolling(){return this._isPolling}getIsDataLoading(){return this.isDataLoading}getEventId(){return this.eventId}updateBuildYourOwnItem(t){this.items.value=this.items.value.map(e=>"build-your-own"===e.type?t(e):e)}calculateElapsedTime(t){const e=Math.floor((Date.now()-new Date(t).getTime())/6e4);return e<0?"":e+"'"}buildStreamsFromItems(t){return t.filter(t=>!0===t.is_multiview_eligible).map(t=>{var e,i,s;const a=[{id:t.entity_id||"",name:"Main Broadcast",isActive:!0}];if(t.associated_listings&&Array.isArray(t.associated_listings))for(const e of t.associated_listings)a.push({id:e.entity_id||"",name:e.title||"",isActive:!1});const r=null!==(e=t.location)&&void 0!==e&&e.city&&null!==(i=t.location)&&void 0!==i&&i.state?`${t.location.city}, ${t.location.state}`:void 0,n=t.start_time?this.calculateElapsedTime(t.start_time):void 0;return{listing:{id:t.entity_id||"",description:t.title||"",backgroundImage:(null===(s=t.images)||void 0===s?void 0:s.series_list)||"",type:t.type||"unknown"},totalCameras:a.length,activeCameraCount:a.filter(t=>t.isActive).length,currentTime:n,location:r,cameras:a}})}mergeStreams(t,e){const i=new Map(t.map(t=>[t.listing.id,t]));return e.map(t=>{const e=i.get(t.listing.id);if(!e)return t;const s=new Map(e.cameras.map(t=>[t.id,t.isActive])),a=t.cameras.map(t=>({...t,isActive:s.has(t.id)?s.get(t.id):t.isActive})),r=a.filter(t=>t.isActive).length;return{...t,cameras:a,activeCameraCount:r}})}getLayoutsObservable(){return this._layouts}getSelectedLayoutId(){return this._selectedLayoutId}onSelectLayout(t){this._layouts.value.find(e=>e.layoutId===t)&&(this._selectedLayoutId.value=t)}onToggleCamera(t,e){this.updateBuildYourOwnItem(i=>({...i,streams:i.streams.map(i=>{if(i.listing.id!==t)return i;const s=i.cameras.map(t=>t.id===e?{...t,isActive:!t.isActive}:t),a=s.filter(t=>t.isActive).length;return{...i,cameras:s,activeCameraCount:a}})}))}notifyProductAPIUnauthorized(t){if(401!==t.statusCode)return;const e={code:t.statusCode,message:t.message||"Not authorized",success:!1,data:t.data};this.onAuthError&&this.onAuthError(e)}async trackPanelView(){try{await this.analyticsService.panelView("foxMultiView")}catch(t){Object(c.a)(t,{context:"MultiViewViewModel.trackPanelView"}),console.error("[MULTIVIEW] Error tracking panel view:",t)}}async init(){try{await this.trackPanelView(),await this.fetchLayouts();const t=this.getPanelConfigInterval();t&&(this.pollingInterval=t),this.refreshPolling()}catch(t){const e=t instanceof Error?t.message:"Failed to initialize MultiView";this.setError(e),console.error("[MultiViewViewModel] Initialization error:",t)}}async fetchLayouts(){if(!this.getLayouts().length)try{this.isDataLoading.value=!0;const t=await this.service.getLayouts();t&&t.length>0?this._layouts.value=t:this._layouts.value=Object.values(n)}catch(t){if(console.log("[MultiViewViewModel] Error fetching layouts:",t),t instanceof d.a)return void this.notifyProductAPIUnauthorized(t);0===this._layouts.value.length&&(this._layouts.value=Object.values(n))}finally{this.isDataLoading.value=!1}}async setDataToPanel(t){try{(t=>!(!t||"object"!=typeof t)&&("string"==typeof t.url&&t.url.length>0&&"string"==typeof t.method&&Object.values(o.a).includes(t.method)&&null!==t.headers&&"object"==typeof t.headers&&!Array.isArray(t.headers)&&(!t.callback||"function"==typeof t.callback)))(t.productAPIRequest)&&(this.service.setProductAPIData(t.productAPIRequest),this.onAuthError=t.productAPIRequest.callback,await this.fetchLayouts(),this.refreshPolling())}catch(t){const e=t instanceof Error?t.message:"Failed to set panel data";console.error("[MultiViewViewModel] Error setting panel data:",t),this.hasEverSuccessfullyLoaded.value||this.setError(e)}}async onSelectCustomMultiview(t){try{this.setLoading(!0),this.setError(null);const e=await this.service.getOrCreateCustomMultiview(t);this.delegate&&this.delegate.onPanelEvent({type:"fox-multiview:custom-multiview",payload:e.multiviewId})}catch(t){const e=t instanceof Error?t.message:"Failed to select custom multiview";throw this.setError(e),console.error("[MultiViewViewModel] Error selecting multiview:",t),t}finally{this.setLoading(!1)}}cleanup(){this.stopPolling(),this.hasEverSuccessfullyLoaded.value=!1,this._selectedLayoutId.value=null,this.lastResponseHash=null}onSelectCuratedMultiview(t){if(t.isSelected)return;const e=n[t.listings.length];if(!e)return;const i={childListings:t.listings.map((t,i)=>({callsign:t.type,listingId:t.id,position:e.positions[e.positionsOrder[i]]})),multiviewID:t.id};this.delegate.onPanelEvent({type:"fox-multiview:new-multiview",payload:i})}updatePollingInterval(){const t=this.getPanelConfigInterval();t&&t!==this.pollingInterval&&(this.pollingInterval=t,this.refreshPolling())}getPanelConfigInterval(){var t,e,i,s,a;const r=null===(t=h.default.getPageConfig())||void 0===t||null===(e=t.panels)||void 0===e||null===(i=e.find(t=>"foxMultiView"===t.panel_type))||void 0===i||null===(s=i.renderer)||void 0===s||null===(a=s.block_data)||void 0===a?void 0:a.product_api_polling_interval;if(null==r)return null;const n=parseInt(String(r),10);return Number.isFinite(n)&&n>0?1e3*n:null}stopPolling(){this.pollingTask&&(this.pollingTask.stop(),this.pollingTask=null),this.isDataLoading.value&&(this.isDataLoading.value=!1)}refreshPolling(){this.stopPolling(),this.pollingTask=this.service.pollCuratedMultiviews(this.pollingInterval,t=>{this.updatePollingInterval(),this.processCuratedMultiviewData(t)},t=>{console.error("[MultiViewViewModel] Error polling data:",t),t instanceof d.a&&this.notifyProductAPIUnauthorized(t),this.hasEverSuccessfullyLoaded.value||this.setError(t instanceof Error?t.message:"Failed to load data")})}processCuratedMultiviewData(t){if(!t||!t.status||!t.data)return;if(!Array.isArray(t.data.items))return;const e=Object(r.b)(JSON.stringify(t));if(this.lastResponseHash===e)return void console.log("[MULTIVIEW] Response hash unchanged - skipping update");this.lastResponseHash=e;const i=[];for(const e of t.data.items){const t=[];if(e.is_multiview){var s;if(e.multiview_metadata&&Array.isArray(e.multiview_metadata))for(const i of e.multiview_metadata){var a;let s=e.title||"";i.is_sportingevent&&i.left_team&&i.right_team&&i.left_team.abbreviation&&i.right_team.abbreviation&&(s=`${i.left_team.abbreviation} vs ${i.right_team.abbreviation}`),t.push({id:i.entity_id||"",description:s,backgroundImage:(null===(a=i.images)||void 0===a?void 0:a.series_list)||"",type:i.type||"unknown"})}else t.push({id:e.entity_id||"",description:e.title||"",backgroundImage:(null===(s=e.images)||void 0===s?void 0:s.still)||"",type:e.type||"unknown"});i.push({id:e.entity_id||"",isSelected:this.eventId===e.entity_id,listings:t})}}const n=[...this.items.value],o=n.findIndex(t=>"curated-multiviews"===t.type);0===i.length?-1!==o&&n.splice(o,1):-1!==o?n[o]={type:"curated-multiviews",items:i}:n.unshift({type:"curated-multiviews",items:i});const l=this.buildStreamsFromItems(t.data.items),u=n.findIndex(t=>"build-your-own"===t.type);if(-1!==u){const t=n[u],e=this.mergeStreams(t.streams,l);n[u]={type:"build-your-own",streams:e}}else n.push({type:"build-your-own",streams:l});this.items.value=n,this.hasEverSuccessfullyLoaded.value||(this.hasEverSuccessfullyLoaded.value=!0,this.error.value&&this.setError(null))}async clearTabLoadFailure(){this.setError(null),this.hasEverSuccessfullyLoaded.value=!1,await this.fetchLayouts(),this.refreshPolling()}}}}]);
|
|
2
2
|
//# sourceMappingURL=14.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/helpers/strings.ts","webpack:///./src/modules/maestro/builder/view-model/BuilderPanelViewModel.ts"],"names":["slugify","str","toLowerCase","trim","replace","stringHashCode","hash","i","length","charCodeAt","BuilderPanelViewModel","ViewModel","constructor","panelConfig","analyticsService","super","_defineProperty","Observable","Set","this","parseBlockData","trackPanelView","initialized","cleanup","sections","value","expandedCardIds","lastResponseHash","updatePanelConfig","error","captureException","tags","component","method","isDataLoading","setError","Error","block_data","blockData","Array","isArray","responseHash","JSON","stringify","parseSections","hasEverSuccessfullyLoaded","errorMessage","message","extra","toggleCardExpanded","cardId","currentExpandedIds","has","delete","add","collapseAllCards","parsePadding","raw","_raw$top","_raw$right","_raw$bottom","_raw$left","DEFAULT_PADDING","top","right","bottom","left","parseHeader","_raw$content","_raw$enabled","_raw$type","content","enabled","type","alt","parseSectionSettings","_raw$background_color","_raw$spacing","_raw$sticky","_raw$text_alignment","backgroundColor","background_color","header","padding","spacing","sticky","textAlignment","text_alignment","parseSimpleCard","_raw$title","_raw$image$url","_raw$image","_raw$image2","id","title","image","url","parseExpandableCard","_raw$title2","_raw$collapsed_state","_raw$expanded_state","collapsedState","cards","collapsed_state","map","card","expandedState","expanded_state","settings","undefined","parseCard","parseSection","_raw$title3","rawSections","section"],"mappings":"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","file":"14.maestro-web-sdk.esm.js","sourcesContent":["export const slugify = (str: string) =>\n str\n .toLowerCase()\n .trim()\n .replace(/[\\s\\W-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\nexport function stringHashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","import { Observable } from '../../../../helpers/Observable';\nimport { ViewModel } from '../../../../view-models/ViewModel';\nimport { captureException } from '@/sentry';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\nimport { stringHashCode } from '@/helpers/strings';\nimport {\n ICard,\n IExpandableCard,\n ISection,\n ISectionSettings,\n ISimpleCard,\n} from '../types';\n\ninterface IBlockData {\n sections: any[];\n}\n\ninterface IPanelConfig {\n block_data?: IBlockData;\n id: string;\n panel_name: string;\n panel_type: string;\n icon_name?: string;\n}\n\nexport class BuilderPanelViewModel extends ViewModel {\n public sections = new Observable<ISection[]>([]);\n public expandedCardIds = new Observable<Set<string>>(new Set());\n public isDataLoading = new Observable<boolean>(false);\n public hasEverSuccessfullyLoaded = new Observable<boolean>(false);\n\n private analyticsService: AnalyticsService | null = null;\n private lastResponseHash: number | null = null;\n initialized = false;\n\n constructor(panelConfig?: IPanelConfig, analyticsService?: AnalyticsService) {\n super();\n this.analyticsService = analyticsService || null;\n\n if (panelConfig) {\n this.parseBlockData(panelConfig);\n }\n }\n\n async init(panelConfig: IPanelConfig): Promise<void> {\n if (this.analyticsService) {\n await this.trackPanelView();\n }\n this.parseBlockData(panelConfig);\n this.initialized = true;\n }\n\n cleanup(): void {\n this.sections.value = [];\n this.expandedCardIds.value = new Set();\n this.lastResponseHash = null;\n this.initialized = false;\n }\n\n updatePanelConfig(panelConfig: IPanelConfig): void {\n this.parseBlockData(panelConfig);\n }\n\n private async trackPanelView(): Promise<void> {\n try {\n if (this.analyticsService) {\n // TODO: Add builder to MaestroPanelType analytics before enabling\n // await this.analyticsService.panelView('builderBlockPanel');\n }\n } catch (error) {\n captureException(error, {\n tags: {\n component: 'BuilderPanelViewModel',\n method: 'trackPanelView',\n },\n });\n }\n }\n\n private parseBlockData(panelConfig: IPanelConfig): void {\n try {\n this.isDataLoading.value = true;\n this.setError(null);\n\n if (!panelConfig) {\n throw new Error('Panel config is required');\n }\n\n if (!panelConfig.block_data) {\n throw new Error('block_data is missing from panel config');\n }\n\n const blockData = panelConfig.block_data;\n\n if (!blockData.sections) {\n throw new Error('sections array is missing from block_data');\n }\n\n if (!Array.isArray(blockData.sections)) {\n throw new Error('sections must be an array');\n }\n\n const responseHash = stringHashCode(JSON.stringify(blockData.sections));\n if (responseHash === this.lastResponseHash) {\n this.isDataLoading.value = false;\n return;\n }\n\n // Parse the raw config into properly typed sections with camelCase\n this.sections.value = this.parseSections(blockData.sections);\n this.lastResponseHash = responseHash;\n this.hasEverSuccessfullyLoaded.value = true;\n this.isDataLoading.value = false;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to parse block data';\n this.setError(errorMessage);\n this.isDataLoading.value = false;\n\n captureException(error, {\n tags: {\n component: 'BuilderPanelViewModel',\n method: 'parseBlockData',\n },\n extra: {\n panelConfig,\n },\n });\n }\n }\n\n toggleCardExpanded(cardId: string): void {\n const currentExpandedIds = new Set(this.expandedCardIds.value);\n\n if (currentExpandedIds.has(cardId)) {\n currentExpandedIds.delete(cardId);\n } else {\n currentExpandedIds.add(cardId);\n }\n\n this.expandedCardIds.value = currentExpandedIds;\n }\n\n collapseAllCards(): void {\n this.expandedCardIds.value = new Set();\n }\n\n private parsePadding(raw: any) {\n const DEFAULT_PADDING = { top: 8, right: 8, bottom: 8, left: 8 };\n return {\n top: raw?.top ?? DEFAULT_PADDING.top,\n right: raw?.right ?? DEFAULT_PADDING.right,\n bottom: raw?.bottom ?? DEFAULT_PADDING.bottom,\n left: raw?.left ?? DEFAULT_PADDING.left,\n };\n }\n\n private parseHeader(raw: any) {\n return {\n content: raw?.content ?? '',\n enabled: raw?.enabled ?? false,\n type: (raw?.type ?? 'text') as 'text' | 'image',\n alt: raw?.alt,\n };\n }\n\n private parseSectionSettings(raw: any): ISectionSettings {\n return {\n backgroundColor: raw?.background_color ?? 'transparent',\n header: this.parseHeader(raw?.header),\n padding: this.parsePadding(raw?.padding),\n spacing: raw?.spacing ?? 8,\n sticky: raw?.sticky ?? false,\n textAlignment: raw?.text_alignment ?? 'left',\n };\n }\n\n private parseSimpleCard(raw: any): ISimpleCard {\n return {\n id: raw.id,\n type: 'simple',\n title: raw.title ?? '',\n image: {\n url: raw.image?.url ?? '',\n alt: raw.image?.alt,\n },\n };\n }\n\n private parseExpandableCard(raw: any): IExpandableCard {\n return {\n id: raw.id,\n type: 'expandable',\n title: raw.title ?? '',\n collapsedState: {\n cards: Array.isArray(raw.collapsed_state?.cards)\n ? raw.collapsed_state.cards.map((card: any) =>\n this.parseSimpleCard(card)\n )\n : [],\n },\n expandedState: {\n cards: Array.isArray(raw.expanded_state?.cards)\n ? raw.expanded_state.cards.map((card: any) =>\n this.parseSimpleCard(card)\n )\n : [],\n },\n settings: raw.settings\n ? this.parseSectionSettings(raw.settings)\n : undefined,\n };\n }\n\n private parseCard(raw: any): ICard {\n if (!raw || !raw.id) {\n throw new Error('Card must have an id');\n }\n\n if (raw.type === 'expandable') {\n return this.parseExpandableCard(raw);\n }\n\n return this.parseSimpleCard(raw);\n }\n\n private parseSection(raw: any): ISection {\n if (!raw || !raw.id) {\n throw new Error('Section must have an id');\n }\n\n return {\n id: raw.id,\n title: raw.title ?? '',\n cards: Array.isArray(raw.cards)\n ? raw.cards.map((card: any) => this.parseCard(card))\n : [],\n settings: this.parseSectionSettings(raw.settings),\n };\n }\n\n private parseSections(rawSections: any[]): ISection[] {\n if (!Array.isArray(rawSections)) {\n throw new Error('Sections must be an array');\n }\n\n return rawSections.map((section: any) => this.parseSection(section));\n }\n}\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/helpers/strings.ts","webpack:///./src/modules/fox/multi-view/types.ts","webpack:///./src/modules/fox/multi-view/services/MultiViewService.ts","webpack:///./src/modules/fox/multi-view/view-model/MultiViewViewModel.ts"],"names":["slugify","str","toLowerCase","trim","replace","stringHashCode","hash","i","length","charCodeAt","DEFAULT_LAYOUTS_BY_LISTINGS_QUANTITY","2","layoutId","description","positions","L","w","h","x","y","R","name","windowCount","positionsOrder","3","B","TL","TR","4","BL","BR","MultiViewService","constructor","_defineProperty","this","networkManager","NetworkManager","getLayouts","productAPI","externalApiRequest","endpoint","headers","setProductAPIData","pollCuratedMultiviews","interval","onData","onError","pollExternalApiRequest","url","method","getOrCreateCustomMultiview","config","HttpMethod","POST","data","MultiViewViewModel","ViewModel","eventId","delegate","analyticsService","super","Observable","service","_layouts","value","getIsPolling","_isPolling","getIsDataLoading","isDataLoading","getEventId","updateBuildYourOwnItem","updater","items","map","type","calculateElapsedTime","startTime","elapsedMinutes","Math","floor","Date","now","getTime","buildStreamsFromItems","filter","item","is_multiview_eligible","_item$location","_item$location2","_item$images","cameras","id","entity_id","isActive","associated_listings","Array","isArray","al","push","title","location","city","state","undefined","currentTime","start_time","listing","backgroundImage","images","series_list","totalCameras","activeCameraCount","c","mergeStreams","existing","incoming","existingMap","Map","s","newStream","prev","get","prevCameraMap","has","getLayoutsObservable","getSelectedLayoutId","_selectedLayoutId","onSelectLayout","find","l","onToggleCamera","streamId","cameraId","streams","stream","notifyProductAPIUnauthorized","error","statusCode","payload","code","message","success","onAuthError","panelView","captureException","context","console","trackPanelView","fetchLayouts","panelConfigInterval","getPanelConfigInterval","pollingInterval","refreshPolling","errorMessage","Error","setError","layouts","Object","values","log","AuthError","includes","callback","isProductAPIValid","productAPIRequest","hasEverSuccessfullyLoaded","params","setLoading","response","onPanelEvent","multiviewId","cleanup","stopPolling","lastResponseHash","onSelectCuratedMultiview","isSelected","layout","listings","childListings","listingIndex","callsign","listingId","position","multiviewID","updatePollingInterval","_SDK$getPageConfig","_SDK$getPageConfig$pa","_SDK$getPageConfig$pa2","_SDK$getPageConfig$pa3","_SDK$getPageConfig$pa4","intervalInSeconds","SDK","getPageConfig","panels","p","panel_type","renderer","block_data","product_api_polling_interval","parsedInterval","parseInt","String","Number","isFinite","pollingTask","stop","processCuratedMultiviewData","status","responseHash","JSON","stringify","curatedMultiviewItem","is_multiview","_item$images2","multiview_metadata","mv","_mv$images","is_sportingevent","left_team","right_team","abbreviation","still","newItems","existingCuratedMultiviewIndex","findIndex","splice","unshift","newStreams","existingByoIndex","existingByo","mergedStreams"],"mappings":"2FAAA,oEAAO,MAAMA,EAAWC,GACtBA,EACGC,cACAC,OACAC,QAAQ,YAAa,KACrBA,QAAQ,WAAY,IAElB,SAASC,EAAeJ,GAC7B,IAAIK,EAAO,EACX,IAAK,IAAIC,EAAI,EAAGA,EAAIN,EAAIO,OAAQD,IAAK,CAEnCD,GAAQA,GAAQ,GAAKA,EADRL,EAAIQ,WAAWF,GAE5BD,GAAcA,EAEhB,OAAOA,I,uHC6DF,MAAMI,EAGT,CACFC,EAAG,CACDC,SAAU,KACVC,YAAa,uCACbC,UAAW,CACTC,EAAG,CACDC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,IAELC,EAAG,CACDJ,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KAGPE,KAAM,QACNC,YAAa,EACbC,eAAgB,CAAC,IAAK,MAExBC,EAAG,CACDZ,SAAU,QACVC,YAAa,wCACbC,UAAW,CACTW,EAAG,CACDT,EAAG,KACHC,EAAG,KACHC,EAAG,GACHC,EAAG,MAELO,GAAI,CACFV,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,OAELQ,GAAI,CACFX,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,QAGPE,KAAM,WACNC,YAAa,EACbC,eAAgB,CAAC,KAAM,KAAM,MAE/BK,EAAG,CACDhB,SAAU,WACVC,YAAa,uCACbC,UAAW,CACTe,GAAI,CACFb,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MAELW,GAAI,CACFd,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MAELO,GAAI,CACFV,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MAELQ,GAAI,CACFX,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OAGPE,KAAM,WACNC,YAAa,EACbC,eAAgB,CAAC,KAAM,KAAM,KAAM,Q,ycCexBQ,MApFf,MAIEC,cAAcC,EAAA,8BAAAA,EAAA,kBAF8B,MAG1CC,KAAKC,eAAiB,IAAIC,IAQ5BC,aACE,OAAKH,KAAKI,WAIHJ,KAAKC,eAAeI,mBAAsC,CAC/DC,SAAU,sEACVC,QAASP,KAAKI,WAAWG,UALlB,KAcXC,kBAAkBJ,GAChBJ,KAAKI,WAAaA,EAYpBK,sBACEC,EACAC,EACAC,GAEA,OAAKZ,KAAKI,WAIHJ,KAAKC,eAAeY,uBAAuB,CAChDP,SAAUN,KAAKI,WAAWU,IAC1BJ,WACAK,OAAQf,KAAKI,WAAWW,OACxBR,QAASP,KAAKI,WAAWG,QACzBI,SACAC,YATO,KAuBXI,2BACEC,EACAV,EAAkC,IAElC,OAAOP,KAAKC,eAAeI,mBAA6C,CACtEC,SAAU,wEACVS,OAAQG,IAAWC,KACnBC,KAAMH,EACNV,c,mdC9HC,MAAMc,UAA2BC,IAgBtCxB,YACEyB,EACAC,EACAC,GAEAC,QAAQ3B,EAAA,gBApBS,IAAI4B,IAA8B,KAAG5B,EAAA,kBACnC,IAAI4B,KAAoB,IAAM5B,EAAA,uBAAAA,EAAA,wBAAAA,EAAA,uBAAAA,EAAA,gCAAAA,EAAA,qBAK5B,IAAI4B,KAAoB,IAAM5B,EAAA,mBACF,MAAIA,EAAA,uBA5BxB,KA6B2BA,EAAA,aAClD,IAAI4B,IAA4B,KAAG5B,EAAA,iCACP,IAAI4B,KAAoB,IAAM5B,EAAA,2BAAAA,EAAA,yBAEtC,IAAI4B,IAA0B,OAAK5B,EAAA,wBACrB,MAQxCC,KAAKuB,QAAUA,EACfvB,KAAKwB,SAAWA,EAChBxB,KAAKyB,iBAAmBA,EACxBzB,KAAK4B,QAAU,IAAI/B,EAGrBM,aACE,OAAOH,KAAK6B,SAASC,MAGvBC,eACE,OAAO/B,KAAKgC,WAGdC,mBACE,OAAOjC,KAAKkC,cAGdC,aACE,OAAOnC,KAAKuB,QAGNa,uBACNC,GAEArC,KAAKsC,MAAMR,MAAQ9B,KAAKsC,MAAMR,MAAMS,IAAKlE,GAC5B,mBAAXA,EAAEmE,KAA4BH,EAAQhE,GAAyBA,GAI3DoE,qBAAqBC,GAC3B,MAAMC,EAAiBC,KAAKC,OACzBC,KAAKC,MAAQ,IAAID,KAAKJ,GAAWM,WAAa,KAEjD,OAAIL,EAAiB,EAAU,GACrBA,EAAH,IAGDM,sBACNX,GAEA,OAAOA,EACJY,OAAQC,IAAwC,IAA/BA,EAAKC,uBACtBb,IAAKY,IAAS,IAAAE,EAAAC,EAAAC,EACb,MAAMC,EAAU,CACd,CACEC,GAAIN,EAAKO,WAAa,GACtBvE,KAAM,iBACNwE,UAAU,IAId,GACER,EAAKS,qBACLC,MAAMC,QAAQX,EAAKS,qBAEnB,IAAK,MAAMG,KAAMZ,EAAKS,oBACpBJ,EAAQQ,KAAK,CACXP,GAAIM,EAAGL,WAAa,GACpBvE,KAAM4E,EAAGE,OAAS,GAClBN,UAAU,IAKhB,MAAMO,EACS,QAAbb,EAAAF,EAAKe,gBAAQ,IAAAb,GAAbA,EAAec,MAAqB,QAAjBb,EAAIH,EAAKe,gBAAQ,IAAAZ,GAAbA,EAAec,MAClC,GAAGjB,EAAKe,SAASC,SAAShB,EAAKe,SAASE,aACxCC,EAEAC,EAAcnB,EAAKoB,WACrBvE,KAAKyC,qBAAqBU,EAAKoB,iBAC/BF,EAEJ,MAAO,CACLG,QAAS,CACPf,GAAIN,EAAKO,WAAa,GACtB/E,YAAawE,EAAKc,OAAS,GAC3BQ,iBAA4B,QAAXlB,EAAAJ,EAAKuB,cAAM,IAAAnB,OAAA,EAAXA,EAAaoB,cAAe,GAC7CnC,KAAMW,EAAKX,MAAQ,WAErBoC,aAAcpB,EAAQlF,OACtBuG,kBAAmBrB,EAAQN,OAAQ4B,GAAMA,EAAEnB,UAAUrF,OACrDgG,cACAJ,WACAV,aAKAuB,aACNC,EACAC,GAEA,MAAMC,EAAc,IAAIC,IAAIH,EAASzC,IAAK6C,GAAM,CAACA,EAAEZ,QAAQf,GAAI2B,KAE/D,OAAOH,EAAS1C,IAAK8C,IACnB,MAAMC,EAAOJ,EAAYK,IAAIF,EAAUb,QAAQf,IAC/C,IAAK6B,EAAM,OAAOD,EAElB,MAAMG,EAAgB,IAAIL,IACxBG,EAAK9B,QAAQjB,IAAKuC,GAAM,CAACA,EAAErB,GAAIqB,EAAEnB,YAE7BH,EAAU6B,EAAU7B,QAAQjB,IAAKuC,IAAC,IACnCA,EACHnB,SAAU6B,EAAcC,IAAIX,EAAErB,IAC1B+B,EAAcD,IAAIT,EAAErB,IACpBqB,EAAEnB,YAEFkB,EAAoBrB,EAAQN,OAAQ4B,GAAMA,EAAEnB,UAAUrF,OAE5D,MAAO,IAAK+G,EAAW7B,UAASqB,uBAIpCa,uBACE,OAAO1F,KAAK6B,SAGd8D,sBACE,OAAO3F,KAAK4F,kBAGdC,eAAenH,GACEsB,KAAK6B,SAASC,MAAMgE,KAAMC,GAAMA,EAAErH,WAAaA,KAG9DsB,KAAK4F,kBAAkB9D,MAAQpD,GAGjCsH,eAAeC,EAAkBC,GAC/BlG,KAAKoC,uBAAwBe,IAAI,IAC5BA,EACHgD,QAAShD,EAAKgD,QAAQ5D,IAAK6D,IACzB,GAAIA,EAAO5B,QAAQf,KAAOwC,EAAU,OAAOG,EAC3C,MAAM5C,EAAU4C,EAAO5C,QAAQjB,IAAKuC,GAClCA,EAAErB,KAAOyC,EAAW,IAAKpB,EAAGnB,UAAWmB,EAAEnB,UAAamB,GAElDD,EAAoBrB,EAAQN,OAAQ4B,GAAMA,EAAEnB,UAAUrF,OAC5D,MAAO,IAAK8H,EAAQ5C,UAASqB,0BAS3BwB,6BAA6BC,GACnC,GAAyB,MAArBA,EAAMC,WACR,OAGF,MAAMC,EAAkC,CACtCC,KAAMH,EAAMC,WACZG,QAASJ,EAAMI,SAAW,iBAC1BC,SAAS,EACTvF,KAAMkF,EAAMlF,MAGVpB,KAAK4G,aACP5G,KAAK4G,YAAYJ,GAIrB,uBACE,UACQxG,KAAKyB,iBAAiBoF,UAAU,gBACtC,MAAOP,GACPQ,YAAiBR,EAAO,CACtBS,QAAS,sCAEXC,QAAQV,MAAM,yCAA0CA,IAI5D,aACE,UACQtG,KAAKiH,uBACLjH,KAAKkH,eACX,MAAMC,EAAsBnH,KAAKoH,yBAC7BD,IACFnH,KAAKqH,gBAAkBF,GAEzBnH,KAAKsH,iBACL,MAAOhB,GACP,MAAMiB,EACJjB,aAAiBkB,MACblB,EAAMI,QACN,iCACN1G,KAAKyH,SAASF,GACdP,QAAQV,MAAM,6CAA8CA,IAIhE,qBACE,IAAItG,KAAKG,aAAa7B,OAItB,IACE0B,KAAKkC,cAAcJ,OAAQ,EAC3B,MAAM4F,QAAgB1H,KAAK4B,QAAQzB,aAC/BuH,GAAWA,EAAQpJ,OAAS,EAC9B0B,KAAK6B,SAASC,MAAQ4F,EAEtB1H,KAAK6B,SAASC,MAAQ6F,OAAOC,OAC3BpJ,GAGJ,MAAO8H,GAGP,GAFAU,QAAQa,IAAI,+CAAgDvB,GAExDA,aAAiBwB,IAEnB,YADA9H,KAAKqG,6BAA6BC,GAID,IAA/BtG,KAAK6B,SAASC,MAAMxD,SACtB0B,KAAK6B,SAASC,MAAQ6F,OAAOC,OAC3BpJ,IAGJ,QACAwB,KAAKkC,cAAcJ,OAAQ,GAI/B,qBAAqBV,GACnB,ID7N8BA,OAC3BA,GAAwB,iBAATA,KAEE,iBAAbA,EAAKN,KACZM,EAAKN,IAAIxC,OAAS,GACK,iBAAhB8C,EAAKL,QACZ4G,OAAOC,OAAO1G,KAAY6G,SAAS3G,EAAKL,SACvB,OAAjBK,EAAKb,SACmB,iBAAjBa,EAAKb,UACXsD,MAAMC,QAAQ1C,EAAKb,YAClBa,EAAK4G,UAAqC,mBAAlB5G,EAAK4G,WCoNzBC,CAAkB7G,EAAK8G,qBACzBlI,KAAK4B,QAAQpB,kBAAkBY,EAAK8G,mBACpClI,KAAK4G,YAAcxF,EAAK8G,kBAAkBF,eACpChI,KAAKkH,eACXlH,KAAKsH,kBAEP,MAAOhB,GACP,MAAMiB,EACJjB,aAAiBkB,MAAQlB,EAAMI,QAAU,2BAC3CM,QAAQV,MAAM,iDAAkDA,GAE3DtG,KAAKmI,0BAA0BrG,OAClC9B,KAAKyH,SAASF,IAKpB,8BACEa,GAEA,IACEpI,KAAKqI,YAAW,GAChBrI,KAAKyH,SAAS,MAEd,MAAMa,QAAiBtI,KAAK4B,QAAQZ,2BAA2BoH,GAE3DpI,KAAKwB,UACPxB,KAAKwB,SAAS+G,aAAa,CACzB/F,KAAM,iCACNgE,QAAS8B,EAASE,cAGtB,MAAOlC,GACP,MAAMiB,EACJjB,aAAiBkB,MACblB,EAAMI,QACN,oCAGN,MAFA1G,KAAKyH,SAASF,GACdP,QAAQV,MAAM,kDAAmDA,GAC3DA,EACN,QACAtG,KAAKqI,YAAW,IAOpBI,UACEzI,KAAK0I,cACL1I,KAAKmI,0BAA0BrG,OAAQ,EACvC9B,KAAK4F,kBAAkB9D,MAAQ,KAC/B9B,KAAK2I,iBAAmB,KAO1BC,yBAAyBzF,GACvB,GAAIA,EAAK0F,WACP,OAGF,MAAMC,EAAStK,EAAqC2E,EAAK4F,SAASzK,QAClE,IAAKwK,EACH,OAGF,MAAMtC,EAA+B,CACnCwC,cAAe7F,EAAK4F,SAASxG,IAAI,CAACwD,EAAGkD,KAAiB,CACpDC,SAAUnD,EAAEvD,KACZ2G,UAAWpD,EAAEtC,GACb2F,SAAUN,EAAOlK,UAAUkK,EAAOzJ,eAAe4J,OAEnDI,YAAalG,EAAKM,IAEpBzD,KAAKwB,SAAS+G,aAAa,CACzB/F,KAAM,8BACNgE,YAQI8C,wBACN,MAAMnC,EAAsBnH,KAAKoH,yBAE7BD,GAAuBA,IAAwBnH,KAAKqH,kBACtDrH,KAAKqH,gBAAkBF,EACvBnH,KAAKsH,kBAIDF,yBAAwC,IAAAmC,EAAAC,EAAAC,EAAAC,EAAAC,EAC9C,MAAMC,EAAuC,QAAtBL,EAAGM,UAAIC,uBAAe,IAAAP,GAAQ,QAARC,EAAnBD,EAAqBQ,cAAM,IAAAP,GAEpD,QAFoDC,EAA3BD,EAA6B1D,KACpDkE,GAAuB,iBAAjBA,EAAEC,mBACV,IAAAR,GAAU,QAAVC,EAFyBD,EAEvBS,gBAAQ,IAAAR,GAAY,QAAZC,EAFeD,EAEbS,kBAAU,IAAAR,OAFsB,EAAnBA,EAEDS,6BAEzB,GAAyB,MAArBR,EACF,OAAO,KAGT,MAAMS,EAAiBC,SAASC,OAAOX,GAAoB,IAE3D,OAAIY,OAAOC,SAASJ,IAAmBA,EAAiB,EAC9B,IAAjBA,EAGF,KAMT3B,cACM1I,KAAK0K,cACP1K,KAAK0K,YAAYC,OACjB3K,KAAK0K,YAAc,MAGjB1K,KAAKkC,cAAcJ,QACrB9B,KAAKkC,cAAcJ,OAAQ,GAO/BwF,iBAEEtH,KAAK0I,cAGL1I,KAAK0K,YAAc1K,KAAK4B,QAAQnB,sBAC9BT,KAAKqH,gBACJjG,IACCpB,KAAKsJ,wBACLtJ,KAAK4K,4BAA4BxJ,IAElCkF,IACCU,QAAQV,MAAM,2CAA4CA,GAEtDA,aAAiBwB,KACnB9H,KAAKqG,6BAA6BC,GAG/BtG,KAAKmI,0BAA0BrG,OAClC9B,KAAKyH,SACHnB,aAAiBkB,MAAQlB,EAAMI,QAAU,yBAOnDkE,4BAA4BxJ,GAC1B,IAAKA,IAASA,EAAKyJ,SAAWzJ,EAAKA,KACjC,OAGF,IAAKyC,MAAMC,QAAQ1C,EAAKA,KAAKkB,OAC3B,OAIF,MAAMwI,EAAe3M,YAAe4M,KAAKC,UAAU5J,IACnD,GAAIpB,KAAK2I,mBAAqBmC,EAE5B,YADA9D,QAAQa,IAAI,yDAGd7H,KAAK2I,iBAAmBmC,EAExB,MAAMG,EAA+C,GAErD,IAAK,MAAM9H,KAAQ/B,EAAKA,KAAKkB,MAAO,CAClC,MAAMyG,EAAsC,GAC5C,GAAK5F,EAAK+H,aAAV,CAwBO,IAAAC,EArBP,GAAIhI,EAAKiI,oBAAsBvH,MAAMC,QAAQX,EAAKiI,oBAChD,IAAK,MAAMC,KAAMlI,EAAKiI,mBAAoB,KAAAE,EACxC,IAAI3M,EAAcwE,EAAKc,OAAS,GAG9BoH,EAAGE,kBACHF,EAAGG,WACHH,EAAGI,YACHJ,EAAGG,UAAUE,cACbL,EAAGI,WAAWC,eAEd/M,EAAc,GAAG0M,EAAGG,UAAUE,mBAAmBL,EAAGI,WAAWC,gBAGjE3C,EAAS/E,KAAK,CACZP,GAAI4H,EAAG3H,WAAa,GACpB/E,cACA8F,iBAA0B,QAAT6G,EAAAD,EAAG3G,cAAM,IAAA4G,OAAA,EAATA,EAAW3G,cAAe,GAC3CnC,KAAM6I,EAAG7I,MAAQ,iBAIrBuG,EAAS/E,KAAK,CACZP,GAAIN,EAAKO,WAAa,GACtB/E,YAAawE,EAAKc,OAAS,GAC3BQ,iBAA4B,QAAX0G,EAAAhI,EAAKuB,cAAM,IAAAyG,OAAA,EAAXA,EAAaQ,QAAS,GACvCnJ,KAAMW,EAAKX,MAAQ,YAIvByI,EAAqBjH,KAAK,CACxBP,GAAIN,EAAKO,WAAa,GACtBmF,WAAY7I,KAAKuB,UAAY4B,EAAKO,UAClCqF,cAIJ,MAAM6C,EAAW,IAAI5L,KAAKsC,MAAMR,OAC1B+J,EAAgCD,EAASE,UAC5CzN,GAAiB,uBAAXA,EAAEmE,MAGyB,IAAhCyI,EAAqB3M,QAEgB,IAAnCuN,GACFD,EAASG,OAAOF,EAA+B,IAEL,IAAnCA,EACTD,EAASC,GAAiC,CACxCrJ,KAAM,qBACNF,MAAO2I,GAGTW,EAASI,QAAQ,CACfxJ,KAAM,qBACNF,MAAO2I,IAIX,MAAMgB,EAAajM,KAAKiD,sBAAsB7B,EAAKA,KAAKkB,OAClD4J,EAAmBN,EAASE,UAC/BzN,GAAiB,mBAAXA,EAAEmE,MAGX,IAA0B,IAAtB0J,EAAyB,CAC3B,MAAMC,EAAcP,EAASM,GACvBE,EAAgBpM,KAAK+E,aAAaoH,EAAYhG,QAAS8F,GAC7DL,EAASM,GAAoB,CAC3B1J,KAAM,iBACN2D,QAASiG,QAGXR,EAAS5H,KAAK,CAAExB,KAAM,iBAAkB2D,QAAS8F,IAGnDjM,KAAKsC,MAAMR,MAAQ8J,EAEd5L,KAAKmI,0BAA0BrG,QAClC9B,KAAKmI,0BAA0BrG,OAAQ,EACnC9B,KAAKsG,MAAMxE,OACb9B,KAAKyH,SAAS,OAKpB,4BACEzH,KAAKyH,SAAS,MACdzH,KAAKmI,0BAA0BrG,OAAQ,QACjC9B,KAAKkH,eACXlH,KAAKsH","file":"14.maestro-web-sdk.esm.js","sourcesContent":["export const slugify = (str: string) =>\n str\n .toLowerCase()\n .trim()\n .replace(/[\\s\\W-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\nexport function stringHashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","/**\n * @description Represents a single stream/camera listing available for multi-view\n */\nexport interface CuratedMultiviewListing {\n id: string;\n description: string;\n backgroundImage: string;\n type: string;\n}\n\n/**\n * @description Position data for a single window within a layout\n */\nexport interface LayoutPosition {\n w: number;\n h: number;\n x: number;\n y: number;\n}\n\n/**\n * @description Defines a multi-view layout configuration with positioned windows\n */\nexport interface MultiViewLayout {\n layoutId: string;\n description: string;\n positions: Record<string, LayoutPosition>;\n name: string;\n windowCount: number;\n positionsOrder: string[];\n}\n\n/**\n * @description Child listing with position for new multiview event payload (PRD: SDK to pass event to client)\n */\nexport interface NewMultiviewChildListing {\n listingId: string;\n callsign: string;\n position: LayoutPosition;\n}\n\n/**\n * @description Payload for fox-multiview:new-multiview panel event when a curated multiview is selected\n */\nexport interface NewMultiviewPayload {\n multiviewID: string;\n childListings: NewMultiviewChildListing[];\n}\n\nexport type BuildYourOwnTab = 'streams' | 'layouts';\n\n/**\n * @description Represents a single camera angle within a stream\n */\nexport type Camera = {\n id: string;\n name: string;\n isActive: boolean;\n};\n\n/**\n * @description Represents a stream with its cameras and metadata, used in Build Your Own\n */\nexport interface CustomMultiviewStream {\n listing: CuratedMultiviewListing;\n totalCameras: number;\n activeCameraCount: number;\n currentTime?: string;\n location?: string;\n cameras: Camera[];\n}\n\n/**\n * @description Available layouts organized by stream count\n */\nexport const DEFAULT_LAYOUTS_BY_LISTINGS_QUANTITY: Record<\n number,\n MultiViewLayout\n> = {\n 2: {\n layoutId: 'LR',\n description: 'Two equal-sized windows side by side',\n positions: {\n L: {\n w: 0.4766,\n h: 0.4766,\n x: 0.259,\n y: 0.5,\n },\n R: {\n w: 0.4766,\n h: 0.4766,\n x: 0.7409,\n y: 0.5,\n },\n },\n name: '50/50',\n windowCount: 2,\n positionsOrder: ['L', 'R'],\n },\n 3: {\n layoutId: 'TLTRB',\n description: 'Three equal-sized windows in T layout',\n positions: {\n B: {\n w: 0.458,\n h: 0.458,\n x: 0.5,\n y: 0.266,\n },\n TL: {\n w: 0.458,\n h: 0.458,\n x: 0.268,\n y: 0.7335,\n },\n TR: {\n w: 0.458,\n h: 0.458,\n x: 0.732,\n y: 0.7335,\n },\n },\n name: 'Triple T',\n windowCount: 3,\n positionsOrder: ['TL', 'TR', 'B'],\n },\n 4: {\n layoutId: 'TLTRBLBR',\n description: 'Four equal-sized windows in 2x2 grid',\n positions: {\n BL: {\n w: 0.4766,\n h: 0.4766,\n x: 0.259,\n y: 0.257,\n },\n BR: {\n w: 0.4766,\n h: 0.4766,\n x: 0.741,\n y: 0.257,\n },\n TL: {\n w: 0.4766,\n h: 0.4766,\n x: 0.259,\n y: 0.743,\n },\n TR: {\n w: 0.4766,\n h: 0.4766,\n x: 0.741,\n y: 0.743,\n },\n },\n name: '2x2 Grid',\n windowCount: 4,\n positionsOrder: ['TL', 'TR', 'BL', 'BR'],\n },\n};\n","import NetworkManager, {\n HttpMethod,\n} from '@/services/NetworkManager/NetworkManager';\nimport { MultiViewLayout } from '../types';\n\nconst MULTIVIEW_BASE_URL =\n 'https://qa-mvlm.api.shared.digitalvideoplatform.com';\n\nexport type ProductAPIData = {\n url: string;\n method: HttpMethod;\n headers: Record<string, string>;\n callback?: (error: ProductAPIErrorPayload) => void;\n};\n\nexport type ProductAPIErrorPayload = {\n code: number;\n message: string;\n success: false;\n data?: unknown;\n};\n\nexport type MultiViewListingRequest = {\n layoutId: string;\n listings: Array<{\n listingId: string;\n callsign: string;\n }>;\n};\n\nexport type MultiViewListingResponse = {\n multiviewId?: string;\n callbackSeconds?: number;\n};\n\nexport interface CuratedMultiviewResponse {\n status: boolean;\n data?: {\n items?: CuratedMultiviewResponseItem[];\n };\n}\n\nexport interface CuratedMultiviewResponseItem {\n entity_id?: string;\n type?: string;\n title?: string;\n is_multiview?: boolean;\n is_multiview_eligible?: boolean;\n is_sportingevent?: boolean;\n images?: {\n still?: string;\n series_list?: string;\n };\n location?: {\n city?: string;\n state?: string;\n };\n start_time?: string;\n associated_listings?: Array<{\n entity_id?: string;\n title?: string;\n }>;\n multiview?: string[];\n multiview_metadata?: CuratedMultiviewResponseItem[];\n left_team?: CuratedMultiviewResponseItemTeam;\n right_team?: CuratedMultiviewResponseItemTeam;\n}\n\ntype CuratedMultiviewResponseItemTeam = {\n abbreviation?: string;\n};\n\nexport const isProductAPIValid = (data: any): data is ProductAPIData => {\n if (!data || typeof data !== 'object') return false;\n return (\n typeof data.url === 'string' &&\n data.url.length > 0 &&\n typeof data.method === 'string' &&\n Object.values(HttpMethod).includes(data.method as HttpMethod) &&\n data.headers !== null &&\n typeof data.headers === 'object' &&\n !Array.isArray(data.headers) &&\n (!data.callback || typeof data.callback === 'function')\n );\n};\n\n/**\n * Service for handling multi-view API calls\n */\nclass MultiViewService {\n private networkManager: NetworkManager;\n private productAPI: ProductAPIData | null = null;\n\n constructor() {\n this.networkManager = new NetworkManager();\n }\n\n /**\n * Fetch available multi-view layouts\n *\n * @returns Promise resolving to layouts data\n */\n getLayouts(): Promise<MultiViewLayout[]> | null {\n if (!this.productAPI) {\n return null;\n }\n\n return this.networkManager.externalApiRequest<MultiViewLayout[]>({\n endpoint: `${MULTIVIEW_BASE_URL}/mvlm/v1/layouts`,\n headers: this.productAPI.headers,\n });\n }\n\n /**\n * Set the product API configuration\n *\n * @param productAPI - The product API endpoint, method, and headers\n */\n setProductAPIData(productAPI: ProductAPIData): void {\n this.productAPI = productAPI;\n }\n\n /**\n * Start polling curated multiviews using the product API configuration.\n * Returns null if no product API has been set.\n *\n * @param interval - Polling interval in milliseconds\n * @param onData - Callback invoked with the data on each successful poll\n * @param onError - Optional callback invoked on error\n * @returns Object with a stop function, or null if no productAPI is configured\n */\n pollCuratedMultiviews(\n interval: number,\n onData: (data: CuratedMultiviewResponse) => void,\n onError?: (error: Error) => void\n ): { stop: () => void } | null {\n if (!this.productAPI) {\n return null;\n }\n\n return this.networkManager.pollExternalApiRequest({\n endpoint: this.productAPI.url,\n interval,\n method: this.productAPI.method,\n headers: this.productAPI.headers,\n onData,\n onError,\n });\n }\n\n /**\n * Request an existing or new custom multiview.\n * If the multiview exists, the response will include a multiviewId.\n * If the multiview needs to be created, the response will include\n * callbackSeconds indicating when to retry.\n *\n * @param config - The layout ID and listings for the multiview\n * @param headers - Request headers (e.g. x-access-token, Content-Type)\n * @returns Promise resolving to the multiview listing response\n */\n getOrCreateCustomMultiview(\n config: MultiViewListingRequest,\n headers: Record<string, string> = {}\n ): Promise<MultiViewListingResponse> {\n return this.networkManager.externalApiRequest<MultiViewListingResponse>({\n endpoint: `${MULTIVIEW_BASE_URL}/mvlm/v1/mvlisting`,\n method: HttpMethod.POST,\n data: config,\n headers,\n });\n }\n}\n\nexport default MultiViewService;\n","import { ViewModel } from '@/view-models/ViewModel';\nimport { Observable } from '@/helpers/Observable';\nimport { stringHashCode } from '@/helpers/strings';\nimport {\n CuratedMultiviewListing,\n CustomMultiviewStream,\n DEFAULT_LAYOUTS_BY_LISTINGS_QUANTITY,\n MultiViewLayout,\n NewMultiviewPayload,\n} from '../types';\nimport IMaestroEventDelegate from '@/interfaces/IMaestroEventDelegate';\nimport MultiViewService, {\n CuratedMultiviewResponse,\n isProductAPIValid,\n ProductAPIErrorPayload,\n MultiViewListingRequest,\n} from '../services/MultiViewService';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\nimport { AuthError } from '@/services/NetworkManager/errors';\nimport { captureException } from '@/sentry';\nimport SDK from '@/index';\n\nconst DEFAULT_POLLING_INTERVAL = 30000;\n\nexport type CuratedMultiviewItem = {\n id: string;\n isSelected: boolean;\n listings: CuratedMultiviewListing[];\n};\n\nexport type CuratedMultiviewsItem = {\n type: 'curated-multiviews';\n items: CuratedMultiviewItem[];\n};\n\nexport type BuildYourOwnItem = {\n type: 'build-your-own';\n streams: CustomMultiviewStream[];\n};\n\nexport type MultiviewItem = CuratedMultiviewsItem | BuildYourOwnItem;\n\nexport class MultiViewViewModel extends ViewModel {\n private _layouts = new Observable<MultiViewLayout[]>([]);\n private _isPolling = new Observable<boolean>(false);\n private service: MultiViewService;\n private delegate: IMaestroEventDelegate;\n private eventId: string;\n private analyticsService: AnalyticsService;\n public isDataLoading = new Observable<boolean>(false);\n private pollingTask: { stop: () => void } | null = null;\n private pollingInterval: number = DEFAULT_POLLING_INTERVAL;\n items = new Observable<MultiviewItem[]>([]);\n private hasEverSuccessfullyLoaded = new Observable<boolean>(false);\n private onAuthError?: (payload: ProductAPIErrorPayload) => void;\n private _selectedLayoutId = new Observable<string | null>(null);\n private lastResponseHash: number | null = null;\n\n constructor(\n eventId: string,\n delegate: IMaestroEventDelegate,\n analyticsService: AnalyticsService\n ) {\n super();\n this.eventId = eventId;\n this.delegate = delegate;\n this.analyticsService = analyticsService;\n this.service = new MultiViewService();\n }\n\n getLayouts(): MultiViewLayout[] {\n return this._layouts.value;\n }\n\n getIsPolling(): Observable<boolean> {\n return this._isPolling;\n }\n\n getIsDataLoading(): Observable<boolean> {\n return this.isDataLoading;\n }\n\n getEventId(): string {\n return this.eventId;\n }\n\n private updateBuildYourOwnItem(\n updater: (item: BuildYourOwnItem) => BuildYourOwnItem\n ): void {\n this.items.value = this.items.value.map((i) =>\n i.type === 'build-your-own' ? updater(i as BuildYourOwnItem) : i\n );\n }\n\n private calculateElapsedTime(startTime: string): string {\n const elapsedMinutes = Math.floor(\n (Date.now() - new Date(startTime).getTime()) / 60000\n );\n if (elapsedMinutes < 0) return '';\n return `${elapsedMinutes}'`;\n }\n\n private buildStreamsFromItems(\n items: NonNullable<NonNullable<CuratedMultiviewResponse['data']>['items']>\n ): CustomMultiviewStream[] {\n return items\n .filter((item) => item.is_multiview_eligible === true)\n .map((item) => {\n const cameras = [\n {\n id: item.entity_id || '',\n name: 'Main Broadcast',\n isActive: true,\n },\n ];\n\n if (\n item.associated_listings &&\n Array.isArray(item.associated_listings)\n ) {\n for (const al of item.associated_listings) {\n cameras.push({\n id: al.entity_id || '',\n name: al.title || '',\n isActive: false,\n });\n }\n }\n\n const location =\n item.location?.city && item.location?.state\n ? `${item.location.city}, ${item.location.state}`\n : undefined;\n\n const currentTime = item.start_time\n ? this.calculateElapsedTime(item.start_time)\n : undefined;\n\n return {\n listing: {\n id: item.entity_id || '',\n description: item.title || '',\n backgroundImage: item.images?.series_list || '',\n type: item.type || 'unknown',\n },\n totalCameras: cameras.length,\n activeCameraCount: cameras.filter((c) => c.isActive).length,\n currentTime,\n location,\n cameras,\n };\n });\n }\n\n private mergeStreams(\n existing: CustomMultiviewStream[],\n incoming: CustomMultiviewStream[]\n ): CustomMultiviewStream[] {\n const existingMap = new Map(existing.map((s) => [s.listing.id, s]));\n\n return incoming.map((newStream) => {\n const prev = existingMap.get(newStream.listing.id);\n if (!prev) return newStream;\n\n const prevCameraMap = new Map(\n prev.cameras.map((c) => [c.id, c.isActive])\n );\n const cameras = newStream.cameras.map((c) => ({\n ...c,\n isActive: prevCameraMap.has(c.id)\n ? prevCameraMap.get(c.id)!\n : c.isActive,\n }));\n const activeCameraCount = cameras.filter((c) => c.isActive).length;\n\n return { ...newStream, cameras, activeCameraCount };\n });\n }\n\n getLayoutsObservable(): Observable<MultiViewLayout[]> {\n return this._layouts;\n }\n\n getSelectedLayoutId(): Observable<string | null> {\n return this._selectedLayoutId;\n }\n\n onSelectLayout(layoutId: string): void {\n const layout = this._layouts.value.find((l) => l.layoutId === layoutId);\n if (!layout) return;\n\n this._selectedLayoutId.value = layoutId;\n }\n\n onToggleCamera(streamId: string, cameraId: string): void {\n this.updateBuildYourOwnItem((item) => ({\n ...item,\n streams: item.streams.map((stream) => {\n if (stream.listing.id !== streamId) return stream;\n const cameras = stream.cameras.map((c) =>\n c.id === cameraId ? { ...c, isActive: !c.isActive } : c\n );\n const activeCameraCount = cameras.filter((c) => c.isActive).length;\n return { ...stream, cameras, activeCameraCount };\n }),\n }));\n }\n\n /**\n * Notify client app about a Product API auth error.\n * Uses configured callback first, and falls back to onPanelEvent.\n */\n private notifyProductAPIUnauthorized(error: AuthError): void {\n if (error.statusCode !== 401) {\n return;\n }\n\n const payload: ProductAPIErrorPayload = {\n code: error.statusCode,\n message: error.message || 'Not authorized',\n success: false,\n data: error.data,\n };\n\n if (this.onAuthError) {\n this.onAuthError(payload);\n }\n }\n\n private async trackPanelView(): Promise<void> {\n try {\n await this.analyticsService.panelView('foxMultiView');\n } catch (error) {\n captureException(error, {\n context: 'MultiViewViewModel.trackPanelView',\n });\n console.error('[MULTIVIEW] Error tracking panel view:', error);\n }\n }\n\n async init(): Promise<void> {\n try {\n await this.trackPanelView();\n await this.fetchLayouts();\n const panelConfigInterval = this.getPanelConfigInterval();\n if (panelConfigInterval) {\n this.pollingInterval = panelConfigInterval;\n }\n this.refreshPolling();\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to initialize MultiView';\n this.setError(errorMessage);\n console.error('[MultiViewViewModel] Initialization error:', error);\n }\n }\n\n async fetchLayouts(): Promise<void> {\n if (this.getLayouts().length) {\n return;\n }\n\n try {\n this.isDataLoading.value = true;\n const layouts = await this.service.getLayouts();\n if (layouts && layouts.length > 0) {\n this._layouts.value = layouts;\n } else {\n this._layouts.value = Object.values(\n DEFAULT_LAYOUTS_BY_LISTINGS_QUANTITY\n );\n }\n } catch (error) {\n console.log('[MultiViewViewModel] Error fetching layouts:', error);\n\n if (error instanceof AuthError) {\n this.notifyProductAPIUnauthorized(error);\n return;\n }\n\n if (this._layouts.value.length === 0) {\n this._layouts.value = Object.values(\n DEFAULT_LAYOUTS_BY_LISTINGS_QUANTITY\n );\n }\n } finally {\n this.isDataLoading.value = false;\n }\n }\n\n async setDataToPanel(data: Record<string, any>) {\n try {\n if (isProductAPIValid(data.productAPIRequest)) {\n this.service.setProductAPIData(data.productAPIRequest);\n this.onAuthError = data.productAPIRequest.callback;\n await this.fetchLayouts();\n this.refreshPolling();\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to set panel data';\n console.error('[MultiViewViewModel] Error setting panel data:', error);\n\n if (!this.hasEverSuccessfullyLoaded.value) {\n this.setError(errorMessage);\n }\n }\n }\n\n async onSelectCustomMultiview(\n params: MultiViewListingRequest\n ): Promise<void> {\n try {\n this.setLoading(true);\n this.setError(null);\n\n const response = await this.service.getOrCreateCustomMultiview(params);\n\n if (this.delegate) {\n this.delegate.onPanelEvent({\n type: 'fox-multiview:custom-multiview',\n payload: response.multiviewId,\n });\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : 'Failed to select custom multiview';\n this.setError(errorMessage);\n console.error('[MultiViewViewModel] Error selecting multiview:', error);\n throw error;\n } finally {\n this.setLoading(false);\n }\n }\n\n /**\n * Clean up resources when the ViewModel is no longer needed\n */\n cleanup(): void {\n this.stopPolling();\n this.hasEverSuccessfullyLoaded.value = false;\n this._selectedLayoutId.value = null;\n this.lastResponseHash = null;\n }\n\n /**\n * Called when a curated multiview is selected. Notifies the client via onPanelEvent\n * so the app can switch the video player to the selected multiview.\n */\n onSelectCuratedMultiview(item: CuratedMultiviewItem) {\n if (item.isSelected) {\n return;\n }\n\n const layout = DEFAULT_LAYOUTS_BY_LISTINGS_QUANTITY[item.listings.length];\n if (!layout) {\n return;\n }\n\n const payload: NewMultiviewPayload = {\n childListings: item.listings.map((l, listingIndex) => ({\n callsign: l.type,\n listingId: l.id,\n position: layout.positions[layout.positionsOrder[listingIndex]],\n })),\n multiviewID: item.id,\n };\n this.delegate.onPanelEvent({\n type: 'fox-multiview:new-multiview',\n payload,\n });\n }\n\n /**\n * @description Update polling interval from panel config.\n * Refresh polling if necessary.\n */\n private updatePollingInterval(): void {\n const panelConfigInterval = this.getPanelConfigInterval();\n\n if (panelConfigInterval && panelConfigInterval !== this.pollingInterval) {\n this.pollingInterval = panelConfigInterval;\n this.refreshPolling();\n }\n }\n\n private getPanelConfigInterval(): number | null {\n const intervalInSeconds = SDK.getPageConfig()?.panels?.find(\n (p) => p.panel_type === 'foxMultiView'\n )?.renderer?.block_data?.product_api_polling_interval;\n\n if (intervalInSeconds == null) {\n return null;\n }\n\n const parsedInterval = parseInt(String(intervalInSeconds), 10);\n\n if (Number.isFinite(parsedInterval) && parsedInterval > 0) {\n return parsedInterval * 1000; // Convert seconds to milliseconds\n }\n\n return null;\n }\n\n /**\n * Stop polling for multiview data\n */\n stopPolling(): void {\n if (this.pollingTask) {\n this.pollingTask.stop();\n this.pollingTask = null;\n }\n\n if (this.isDataLoading.value) {\n this.isDataLoading.value = false;\n }\n }\n\n /**\n * Refresh polling for curated multiviews\n */\n refreshPolling(): void {\n // First stop any existing polling\n this.stopPolling();\n\n // Start the poll loop\n this.pollingTask = this.service.pollCuratedMultiviews(\n this.pollingInterval,\n (data) => {\n this.updatePollingInterval();\n this.processCuratedMultiviewData(data);\n },\n (error) => {\n console.error('[MultiViewViewModel] Error polling data:', error);\n\n if (error instanceof AuthError) {\n this.notifyProductAPIUnauthorized(error);\n }\n\n if (!this.hasEverSuccessfullyLoaded.value) {\n this.setError(\n error instanceof Error ? error.message : 'Failed to load data'\n );\n }\n }\n );\n }\n\n processCuratedMultiviewData(data: CuratedMultiviewResponse) {\n if (!data || !data.status || !data.data) {\n return;\n }\n\n if (!Array.isArray(data.data.items)) {\n return;\n }\n\n // Calculate hash to check if data changed\n const responseHash = stringHashCode(JSON.stringify(data));\n if (this.lastResponseHash === responseHash) {\n console.log('[MULTIVIEW] Response hash unchanged - skipping update');\n return;\n }\n this.lastResponseHash = responseHash;\n\n const curatedMultiviewItem: CuratedMultiviewItem[] = [];\n\n for (const item of data.data.items) {\n const listings: CuratedMultiviewListing[] = [];\n if (!item.is_multiview) {\n continue;\n }\n if (item.multiview_metadata && Array.isArray(item.multiview_metadata)) {\n for (const mv of item.multiview_metadata) {\n let description = item.title || '';\n\n if (\n mv.is_sportingevent &&\n mv.left_team &&\n mv.right_team &&\n mv.left_team.abbreviation &&\n mv.right_team.abbreviation\n ) {\n description = `${mv.left_team.abbreviation} vs ${mv.right_team.abbreviation}`;\n }\n\n listings.push({\n id: mv.entity_id || '',\n description,\n backgroundImage: mv.images?.series_list || '',\n type: mv.type || 'unknown',\n });\n }\n } else {\n listings.push({\n id: item.entity_id || '',\n description: item.title || '',\n backgroundImage: item.images?.still || '',\n type: item.type || 'unknown',\n });\n }\n\n curatedMultiviewItem.push({\n id: item.entity_id || '',\n isSelected: this.eventId === item.entity_id,\n listings,\n });\n }\n\n const newItems = [...this.items.value];\n const existingCuratedMultiviewIndex = newItems.findIndex(\n (i) => i.type === 'curated-multiviews'\n );\n\n if (curatedMultiviewItem.length === 0) {\n // No curated multiview items — remove the section if it was previously present\n if (existingCuratedMultiviewIndex !== -1) {\n newItems.splice(existingCuratedMultiviewIndex, 1);\n }\n } else if (existingCuratedMultiviewIndex !== -1) {\n newItems[existingCuratedMultiviewIndex] = {\n type: 'curated-multiviews',\n items: curatedMultiviewItem,\n };\n } else {\n newItems.unshift({\n type: 'curated-multiviews',\n items: curatedMultiviewItem,\n });\n }\n\n const newStreams = this.buildStreamsFromItems(data.data.items);\n const existingByoIndex = newItems.findIndex(\n (i) => i.type === 'build-your-own'\n );\n\n if (existingByoIndex !== -1) {\n const existingByo = newItems[existingByoIndex] as BuildYourOwnItem;\n const mergedStreams = this.mergeStreams(existingByo.streams, newStreams);\n newItems[existingByoIndex] = {\n type: 'build-your-own',\n streams: mergedStreams,\n };\n } else {\n newItems.push({ type: 'build-your-own', streams: newStreams });\n }\n\n this.items.value = newItems;\n\n if (!this.hasEverSuccessfullyLoaded.value) {\n this.hasEverSuccessfullyLoaded.value = true;\n if (this.error.value) {\n this.setError(null);\n }\n }\n }\n\n async clearTabLoadFailure() {\n this.setError(null);\n this.hasEverSuccessfullyLoaded.value = false;\n await this.fetchLayouts();\n this.refreshPolling();\n }\n}\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{104:function(e,t,a){"use strict";a.d(t,"a",(function(){return i})),a.d(t,"b",(function(){return r}));const i=e=>e.toLowerCase().trim().replace(/[\s\W-]+/g,"-").replace(/^-+|-+$/g,"");function r(e){let t=0;for(let a=0;a<e.length;a++){t=(t<<5)-t+e.charCodeAt(a),t&=t}return t}},125:function(e,t,a){"use strict";a.r(t),a.d(t,"BuilderPanelViewModel",(function(){return o}));var i=a(3),r=a(34),n=a(4),s=a(104);function l(e,t,a){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var a=e[Symbol.toPrimitive];if(void 0!==a){var i=a.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}class o extends r.a{constructor(e,t){super(),l(this,"sections",new i.a([])),l(this,"expandedCardIds",new i.a(new Set)),l(this,"isDataLoading",new i.a(!1)),l(this,"hasEverSuccessfullyLoaded",new i.a(!1)),l(this,"analyticsService",null),l(this,"lastResponseHash",null),l(this,"initialized",!1),this.analyticsService=t||null,e&&this.parseBlockData(e)}async init(e){this.analyticsService&&await this.trackPanelView(),this.parseBlockData(e),this.initialized=!0}cleanup(){this.sections.value=[],this.expandedCardIds.value=new Set,this.lastResponseHash=null,this.initialized=!1}updatePanelConfig(e){this.parseBlockData(e)}async trackPanelView(){try{this.analyticsService}catch(e){Object(n.a)(e,{tags:{component:"BuilderPanelViewModel",method:"trackPanelView"}})}}parseBlockData(e){try{if(this.isDataLoading.value=!0,this.setError(null),!e)throw new Error("Panel config is required");if(!e.block_data)throw new Error("block_data is missing from panel config");const t=e.block_data;if(!t.sections)throw new Error("sections array is missing from block_data");if(!Array.isArray(t.sections))throw new Error("sections must be an array");const a=Object(s.b)(JSON.stringify(t.sections));if(a===this.lastResponseHash)return void(this.isDataLoading.value=!1);this.sections.value=this.parseSections(t.sections),this.lastResponseHash=a,this.hasEverSuccessfullyLoaded.value=!0,this.isDataLoading.value=!1}catch(t){const a=t instanceof Error?t.message:"Failed to parse block data";this.setError(a),this.isDataLoading.value=!1,Object(n.a)(t,{tags:{component:"BuilderPanelViewModel",method:"parseBlockData"},extra:{panelConfig:e}})}}toggleCardExpanded(e){const t=new Set(this.expandedCardIds.value);t.has(e)?t.delete(e):t.add(e),this.expandedCardIds.value=t}collapseAllCards(){this.expandedCardIds.value=new Set}parsePadding(e){var t,a,i,r;const n=8,s=8,l=8,o=8;return{top:null!==(t=null==e?void 0:e.top)&&void 0!==t?t:n,right:null!==(a=null==e?void 0:e.right)&&void 0!==a?a:s,bottom:null!==(i=null==e?void 0:e.bottom)&&void 0!==i?i:l,left:null!==(r=null==e?void 0:e.left)&&void 0!==r?r:o}}parseHeader(e){var t,a,i;return{content:null!==(t=null==e?void 0:e.content)&&void 0!==t?t:"",enabled:null!==(a=null==e?void 0:e.enabled)&&void 0!==a&&a,type:null!==(i=null==e?void 0:e.type)&&void 0!==i?i:"text",alt:null==e?void 0:e.alt}}parseSectionSettings(e){var t,a,i,r;return{backgroundColor:null!==(t=null==e?void 0:e.background_color)&&void 0!==t?t:"transparent",header:this.parseHeader(null==e?void 0:e.header),padding:this.parsePadding(null==e?void 0:e.padding),spacing:null!==(a=null==e?void 0:e.spacing)&&void 0!==a?a:8,sticky:null!==(i=null==e?void 0:e.sticky)&&void 0!==i&&i,textAlignment:null!==(r=null==e?void 0:e.text_alignment)&&void 0!==r?r:"left"}}parseSimpleCard(e){var t,a,i,r;return{id:e.id,type:"simple",title:null!==(t=e.title)&&void 0!==t?t:"",image:{url:null!==(a=null===(i=e.image)||void 0===i?void 0:i.url)&&void 0!==a?a:"",alt:null===(r=e.image)||void 0===r?void 0:r.alt}}}parseExpandableCard(e){var t,a,i;return{id:e.id,type:"expandable",title:null!==(t=e.title)&&void 0!==t?t:"",collapsedState:{cards:Array.isArray(null===(a=e.collapsed_state)||void 0===a?void 0:a.cards)?e.collapsed_state.cards.map(e=>this.parseSimpleCard(e)):[]},expandedState:{cards:Array.isArray(null===(i=e.expanded_state)||void 0===i?void 0:i.cards)?e.expanded_state.cards.map(e=>this.parseSimpleCard(e)):[]},settings:e.settings?this.parseSectionSettings(e.settings):void 0}}parseCard(e){if(!e||!e.id)throw new Error("Card must have an id");return"expandable"===e.type?this.parseExpandableCard(e):this.parseSimpleCard(e)}parseSection(e){var t;if(!e||!e.id)throw new Error("Section must have an id");return{id:e.id,title:null!==(t=e.title)&&void 0!==t?t:"",cards:Array.isArray(e.cards)?e.cards.map(e=>this.parseCard(e)):[],settings:this.parseSectionSettings(e.settings)}}parseSections(e){if(!Array.isArray(e))throw new Error("Sections must be an array");return e.map(e=>this.parseSection(e))}}}}]);
|
|
2
2
|
//# sourceMappingURL=15.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/helpers/url.ts","webpack:///./src/modules/espn/key-plays/view-model/KeyPlaysViewModel.ts"],"names":["setImageDimensions","url","width","height","urlObj","URL","searchParams","set","toString","err","console","warn","KeyPlaysViewModel","constructor","analyticsService","_defineProperty","Observable","this","onUpdatePlayerTimeCode","playerTimeCode","filterItemsByPlayerTimeCode","cleanErrors","filteredItems","value","items","item","filteredKeyPlays","filter","keyPlay","shouldShowKeyPlay","length","push","title","wallClock","timestamp","Date","isCurrentlyPlaying","index","currentlyPlayingClipIndex","parseNetworkResponse","errorState","allItems","atIndex","SDK","getMaestroEventViewModel","delegate","playClip","panelClick","type","name","metadata","action","clip","clipID","key_play","description","panelView","response","_response$entities","_response$entities2","teams","Object","values","entities","team","athletes","athlete","homeTeam","find","homeAway","awayTeam","result","section","sections","playTeam","id","undefined","a","teamImageUrl","logoRef","playerImageUrl","headshot","thumbnailImageUrl","thumbnailType","thumbnail","homeScore","awayScore","homeTeamScore","scoringPlay","parseInt","awayTeamScore","keyPlayData","homeTeamName","shortName","awayTeamName","sectionTitle","existingSection","reduce","acc","concat","forKeyPlayAtIndex","handleKeyPlayLoadFailure","newFailedClips","failedClips","setTimeout","loadFailureStatus","clearLoadFailureStatus","mevm","userRequestedNewKeyPlaysData"],"mappings":"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","file":"15.maestro-web-sdk.esm.js","sourcesContent":["export const setImageDimensions = (\n url: string,\n width: number,\n height: number\n) => {\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.set('w', width.toString());\n urlObj.searchParams.set('h', height.toString());\n return urlObj.toString();\n } catch (err) {\n console.warn('Malformed URL:', url, err);\n return url; // Return the original URL if it cannot be parsed\n }\n};\n","import SDK from '@/index';\nimport IMaestroKeyPlaysResponse from '../interfaces/IKeyPlaysResponse';\nimport IKeyPlay, {\n KeyPlayLoadFailureStatus,\n KeyPlaysErrorState,\n} from '../interfaces/IKeyPlays';\nimport { Observable } from '@/helpers/Observable';\nimport { setImageDimensions } from '@/helpers/url';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\n\nexport type KeyPlayItem = {\n title?: string;\n items: IKeyPlay[];\n};\n\nclass KeyPlaysViewModel {\n currentlyPlayingClipIndex = new Observable<number | null>(null);\n lastPlayedClipIndex = new Observable<number | null>(null);\n currentClipPlaybackProgress = new Observable<number | null>(null);\n errorState = new Observable<KeyPlaysErrorState | null>('unpopulatedEvent');\n failedClips = new Observable<{ [key: string]: KeyPlayLoadFailureStatus }>({});\n items = new Observable<KeyPlayItem[]>([]);\n filteredItems = new Observable<KeyPlayItem[]>([]);\n analyticsService: AnalyticsService;\n\n constructor(analyticsService: AnalyticsService) {\n this.analyticsService = analyticsService;\n }\n\n onUpdatePlayerTimeCode(playerTimeCode: number | null): void {\n this.filterItemsByPlayerTimeCode(playerTimeCode);\n this.cleanErrors();\n }\n\n private filterItemsByPlayerTimeCode(playerTimeCode: number | null) {\n if (!playerTimeCode) {\n this.filteredItems.value = this.items.value;\n return;\n }\n\n const filteredItems: KeyPlayItem[] = [];\n for (const item of this.items.value) {\n const filteredKeyPlays = item.items.filter((keyPlay) =>\n this.shouldShowKeyPlay(keyPlay, playerTimeCode)\n );\n if (filteredKeyPlays.length > 0) {\n filteredItems.push({\n title: item.title,\n items: filteredKeyPlays,\n });\n }\n }\n this.filteredItems.value = filteredItems;\n }\n\n private shouldShowKeyPlay(\n keyPlay: IKeyPlay,\n playerTimeCode: number | null\n ): boolean {\n if (!keyPlay.wallClock || !playerTimeCode) {\n return true;\n }\n\n const timestamp = new Date(playerTimeCode);\n const wallClockTimestamp = new Date(keyPlay.wallClock);\n return wallClockTimestamp <= timestamp;\n }\n\n isCurrentlyPlaying(index: number): boolean {\n return index === this.currentlyPlayingClipIndex.value;\n }\n\n async setKeyPlays(\n items: IMaestroKeyPlaysResponse | null,\n playerTimeCode: number | null\n ): Promise<void> {\n if (items === null) {\n this.errorState.value = 'tabLoadFailure';\n return;\n }\n\n this.items.value = this.parseNetworkResponse(items);\n this.filterItemsByPlayerTimeCode(playerTimeCode);\n this.cleanErrors();\n }\n\n private cleanErrors() {\n if (this.errorState.value === 'tabLoadFailure') {\n this.errorState.value = null;\n }\n\n if (this.errorState.value === 'unpopulatedEvent' && this.allItems.length) {\n this.errorState.value = null;\n }\n\n if (!this.filteredItems.value.length) {\n this.errorState.value = 'unpopulatedEvent';\n }\n }\n\n async playKeyPlay(atIndex: number): Promise<void> {\n const keyPlay = this.allItems[atIndex];\n if (!keyPlay) {\n console.warn('Key play not found at index:', atIndex);\n return;\n }\n\n const mevm = SDK.getMaestroEventViewModel();\n mevm.delegate.playClip(atIndex);\n\n this.analyticsService.panelClick({\n type: 'espnKeyPlays',\n name: 'key_play_clicked',\n metadata: {\n action: 'play clip',\n clip: keyPlay.clipID,\n key_play: keyPlay.description,\n },\n });\n }\n\n async init() {\n await this.analyticsService.panelView('espnKeyPlays');\n }\n\n parseNetworkResponse(response: IMaestroKeyPlaysResponse): KeyPlayItem[] {\n const teams = Object.values(response.entities?.team || {});\n const athletes = Object.values(response.entities?.athlete || {});\n const homeTeam = teams.find((team) => team.homeAway === 'home');\n const awayTeam = teams.find((team) => team.homeAway === 'away');\n\n const items: IKeyPlay[] = [];\n const result: KeyPlayItem[] = [];\n\n for (const section of response.sections) {\n for (const keyPlay of section.items) {\n const playTeam = keyPlay.team\n ? teams.find((team) => team.id === keyPlay.team)\n : undefined;\n const athlete = keyPlay.athlete\n ? athletes.find((a) => a.id === keyPlay.athlete)\n : undefined;\n\n const teamImageUrl = playTeam?.logoRef\n ? setImageDimensions(playTeam.logoRef, 184, 144)\n : undefined;\n const playerImageUrl = athlete?.headshot\n ? setImageDimensions(athlete.headshot, 184, 144)\n : undefined;\n const thumbnailImageUrl =\n keyPlay.thumbnailType !== 'headshot' && keyPlay.thumbnail\n ? setImageDimensions(keyPlay.thumbnail, 184, 144)\n : undefined;\n\n const homeScore = keyPlay.homeScore ? keyPlay.homeScore : '0';\n const awayScore = keyPlay.awayScore ? keyPlay.awayScore : '0';\n const homeTeamScore = keyPlay.scoringPlay\n ? parseInt(homeScore)\n : undefined;\n const awayTeamScore = keyPlay.scoringPlay\n ? parseInt(awayScore)\n : undefined;\n\n const keyPlayData: IKeyPlay = {\n id: `${section.title || ''}-${keyPlay.clipID}`,\n description: keyPlay.description ? keyPlay.description : '',\n homeTeamName: homeTeam ? homeTeam.shortName : '',\n awayTeamName: awayTeam ? awayTeam.shortName : '',\n homeTeamScore,\n awayTeamScore,\n clipID: keyPlay.clipID,\n teamImageUrl,\n playerImageUrl,\n thumbnailImageUrl,\n section: section.title,\n wallClock: keyPlay.wallClock,\n };\n\n items.push(keyPlayData);\n }\n\n // Only add the section if it has items\n if (items.length) {\n const sectionTitle = section.title;\n const existingSection = result.find(\n (item) => item.title === sectionTitle\n );\n\n if (existingSection) {\n existingSection.items.push(...items);\n } else {\n result.push({\n title: sectionTitle,\n items: [...items],\n });\n }\n\n // Reset items for the next section\n items.length = 0;\n }\n }\n\n return result;\n }\n\n get allItems() {\n return this.items.value.reduce((acc, section) => {\n return acc.concat(section.items);\n }, [] as IKeyPlay[]);\n }\n\n clipID(forKeyPlayAtIndex: number): string | undefined {\n const item = this.allItems[forKeyPlayAtIndex];\n if (!item) {\n return undefined;\n }\n return this.allItems[forKeyPlayAtIndex].clipID;\n }\n\n handleKeyPlayLoadFailure(forKeyPlayAtIndex: number): void {\n const clipID = this.clipID(forKeyPlayAtIndex);\n if (clipID) {\n const newFailedClips = this.failedClips.value;\n newFailedClips[clipID] = 'recentFailure';\n\n this.failedClips.value = newFailedClips;\n\n setTimeout(() => {\n if (this.loadFailureStatus(forKeyPlayAtIndex) === 'recentFailure') {\n const newFailedClips = this.failedClips.value;\n newFailedClips[clipID] = 'nonRecentFailure';\n this.failedClips.value = newFailedClips;\n }\n }, 5000);\n }\n }\n\n loadFailureStatus(forKeyPlayAtIndex: number): KeyPlayLoadFailureStatus {\n const clipID = this.clipID(forKeyPlayAtIndex);\n const newFailedClips = this.failedClips.value;\n if (!newFailedClips) {\n return 'noFailure';\n }\n return clipID ? this.failedClips.value[clipID] : 'noFailure';\n }\n\n clearLoadFailureStatus(forKeyPlayAtIndex: number): void {\n const clipID = this.clipID(forKeyPlayAtIndex);\n if (clipID && this.failedClips) {\n this.failedClips.value = {\n ...this.failedClips.value,\n [clipID]: 'noFailure',\n };\n }\n }\n\n async userRequestedNewKeyPlaysData() {\n const mevm = SDK.getMaestroEventViewModel();\n await mevm.delegate.userRequestedNewKeyPlaysData();\n }\n}\n\nexport default KeyPlaysViewModel;\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/helpers/strings.ts","webpack:///./src/modules/maestro/builder/view-model/BuilderPanelViewModel.ts"],"names":["slugify","str","toLowerCase","trim","replace","stringHashCode","hash","i","length","charCodeAt","BuilderPanelViewModel","ViewModel","constructor","panelConfig","analyticsService","super","_defineProperty","Observable","Set","this","parseBlockData","trackPanelView","initialized","cleanup","sections","value","expandedCardIds","lastResponseHash","updatePanelConfig","error","captureException","tags","component","method","isDataLoading","setError","Error","block_data","blockData","Array","isArray","responseHash","JSON","stringify","parseSections","hasEverSuccessfullyLoaded","errorMessage","message","extra","toggleCardExpanded","cardId","currentExpandedIds","has","delete","add","collapseAllCards","parsePadding","raw","_raw$top","_raw$right","_raw$bottom","_raw$left","DEFAULT_PADDING","top","right","bottom","left","parseHeader","_raw$content","_raw$enabled","_raw$type","content","enabled","type","alt","parseSectionSettings","_raw$background_color","_raw$spacing","_raw$sticky","_raw$text_alignment","backgroundColor","background_color","header","padding","spacing","sticky","textAlignment","text_alignment","parseSimpleCard","_raw$title","_raw$image$url","_raw$image","_raw$image2","id","title","image","url","parseExpandableCard","_raw$title2","_raw$collapsed_state","_raw$expanded_state","collapsedState","cards","collapsed_state","map","card","expandedState","expanded_state","settings","undefined","parseCard","parseSection","_raw$title3","rawSections","section"],"mappings":"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","file":"15.maestro-web-sdk.esm.js","sourcesContent":["export const slugify = (str: string) =>\n str\n .toLowerCase()\n .trim()\n .replace(/[\\s\\W-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\nexport function stringHashCode(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n","import { Observable } from '../../../../helpers/Observable';\nimport { ViewModel } from '../../../../view-models/ViewModel';\nimport { captureException } from '@/sentry';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\nimport { stringHashCode } from '@/helpers/strings';\nimport {\n ICard,\n IExpandableCard,\n ISection,\n ISectionSettings,\n ISimpleCard,\n} from '../types';\n\ninterface IBlockData {\n sections: any[];\n}\n\ninterface IPanelConfig {\n block_data?: IBlockData;\n id: string;\n panel_name: string;\n panel_type: string;\n icon_name?: string;\n}\n\nexport class BuilderPanelViewModel extends ViewModel {\n public sections = new Observable<ISection[]>([]);\n public expandedCardIds = new Observable<Set<string>>(new Set());\n public isDataLoading = new Observable<boolean>(false);\n public hasEverSuccessfullyLoaded = new Observable<boolean>(false);\n\n private analyticsService: AnalyticsService | null = null;\n private lastResponseHash: number | null = null;\n initialized = false;\n\n constructor(panelConfig?: IPanelConfig, analyticsService?: AnalyticsService) {\n super();\n this.analyticsService = analyticsService || null;\n\n if (panelConfig) {\n this.parseBlockData(panelConfig);\n }\n }\n\n async init(panelConfig: IPanelConfig): Promise<void> {\n if (this.analyticsService) {\n await this.trackPanelView();\n }\n this.parseBlockData(panelConfig);\n this.initialized = true;\n }\n\n cleanup(): void {\n this.sections.value = [];\n this.expandedCardIds.value = new Set();\n this.lastResponseHash = null;\n this.initialized = false;\n }\n\n updatePanelConfig(panelConfig: IPanelConfig): void {\n this.parseBlockData(panelConfig);\n }\n\n private async trackPanelView(): Promise<void> {\n try {\n if (this.analyticsService) {\n // TODO: Add builder to MaestroPanelType analytics before enabling\n // await this.analyticsService.panelView('builderBlockPanel');\n }\n } catch (error) {\n captureException(error, {\n tags: {\n component: 'BuilderPanelViewModel',\n method: 'trackPanelView',\n },\n });\n }\n }\n\n private parseBlockData(panelConfig: IPanelConfig): void {\n try {\n this.isDataLoading.value = true;\n this.setError(null);\n\n if (!panelConfig) {\n throw new Error('Panel config is required');\n }\n\n if (!panelConfig.block_data) {\n throw new Error('block_data is missing from panel config');\n }\n\n const blockData = panelConfig.block_data;\n\n if (!blockData.sections) {\n throw new Error('sections array is missing from block_data');\n }\n\n if (!Array.isArray(blockData.sections)) {\n throw new Error('sections must be an array');\n }\n\n const responseHash = stringHashCode(JSON.stringify(blockData.sections));\n if (responseHash === this.lastResponseHash) {\n this.isDataLoading.value = false;\n return;\n }\n\n // Parse the raw config into properly typed sections with camelCase\n this.sections.value = this.parseSections(blockData.sections);\n this.lastResponseHash = responseHash;\n this.hasEverSuccessfullyLoaded.value = true;\n this.isDataLoading.value = false;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Failed to parse block data';\n this.setError(errorMessage);\n this.isDataLoading.value = false;\n\n captureException(error, {\n tags: {\n component: 'BuilderPanelViewModel',\n method: 'parseBlockData',\n },\n extra: {\n panelConfig,\n },\n });\n }\n }\n\n toggleCardExpanded(cardId: string): void {\n const currentExpandedIds = new Set(this.expandedCardIds.value);\n\n if (currentExpandedIds.has(cardId)) {\n currentExpandedIds.delete(cardId);\n } else {\n currentExpandedIds.add(cardId);\n }\n\n this.expandedCardIds.value = currentExpandedIds;\n }\n\n collapseAllCards(): void {\n this.expandedCardIds.value = new Set();\n }\n\n private parsePadding(raw: any) {\n const DEFAULT_PADDING = { top: 8, right: 8, bottom: 8, left: 8 };\n return {\n top: raw?.top ?? DEFAULT_PADDING.top,\n right: raw?.right ?? DEFAULT_PADDING.right,\n bottom: raw?.bottom ?? DEFAULT_PADDING.bottom,\n left: raw?.left ?? DEFAULT_PADDING.left,\n };\n }\n\n private parseHeader(raw: any) {\n return {\n content: raw?.content ?? '',\n enabled: raw?.enabled ?? false,\n type: (raw?.type ?? 'text') as 'text' | 'image',\n alt: raw?.alt,\n };\n }\n\n private parseSectionSettings(raw: any): ISectionSettings {\n return {\n backgroundColor: raw?.background_color ?? 'transparent',\n header: this.parseHeader(raw?.header),\n padding: this.parsePadding(raw?.padding),\n spacing: raw?.spacing ?? 8,\n sticky: raw?.sticky ?? false,\n textAlignment: raw?.text_alignment ?? 'left',\n };\n }\n\n private parseSimpleCard(raw: any): ISimpleCard {\n return {\n id: raw.id,\n type: 'simple',\n title: raw.title ?? '',\n image: {\n url: raw.image?.url ?? '',\n alt: raw.image?.alt,\n },\n };\n }\n\n private parseExpandableCard(raw: any): IExpandableCard {\n return {\n id: raw.id,\n type: 'expandable',\n title: raw.title ?? '',\n collapsedState: {\n cards: Array.isArray(raw.collapsed_state?.cards)\n ? raw.collapsed_state.cards.map((card: any) =>\n this.parseSimpleCard(card)\n )\n : [],\n },\n expandedState: {\n cards: Array.isArray(raw.expanded_state?.cards)\n ? raw.expanded_state.cards.map((card: any) =>\n this.parseSimpleCard(card)\n )\n : [],\n },\n settings: raw.settings\n ? this.parseSectionSettings(raw.settings)\n : undefined,\n };\n }\n\n private parseCard(raw: any): ICard {\n if (!raw || !raw.id) {\n throw new Error('Card must have an id');\n }\n\n if (raw.type === 'expandable') {\n return this.parseExpandableCard(raw);\n }\n\n return this.parseSimpleCard(raw);\n }\n\n private parseSection(raw: any): ISection {\n if (!raw || !raw.id) {\n throw new Error('Section must have an id');\n }\n\n return {\n id: raw.id,\n title: raw.title ?? '',\n cards: Array.isArray(raw.cards)\n ? raw.cards.map((card: any) => this.parseCard(card))\n : [],\n settings: this.parseSectionSettings(raw.settings),\n };\n }\n\n private parseSections(rawSections: any[]): ISection[] {\n if (!Array.isArray(rawSections)) {\n throw new Error('Sections must be an array');\n }\n\n return rawSections.map((section: any) => this.parseSection(section));\n }\n}\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{120:function(e,t,i){"use strict";i.d(t,"a",(function(){return a}));const a=(e,t,i)=>{try{const a=new URL(e);return a.searchParams.set("w",t.toString()),a.searchParams.set("h",i.toString()),a.toString()}catch(t){return console.warn("Malformed URL:",e,t),e}}},234:function(e,t,i){"use strict";i.r(t);var a=i(8),l=i(3),s=i(120);function r(e,t,i){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var i=e[Symbol.toPrimitive];if(void 0!==i){var a=i.call(e,t||"default");if("object"!=typeof a)return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}t.default=class{constructor(e){r(this,"currentlyPlayingClipIndex",new l.a(null)),r(this,"lastPlayedClipIndex",new l.a(null)),r(this,"currentClipPlaybackProgress",new l.a(null)),r(this,"errorState",new l.a("unpopulatedEvent")),r(this,"failedClips",new l.a({})),r(this,"items",new l.a([])),r(this,"filteredItems",new l.a([])),r(this,"analyticsService",void 0),this.analyticsService=e}onUpdatePlayerTimeCode(e){this.filterItemsByPlayerTimeCode(e),this.cleanErrors()}filterItemsByPlayerTimeCode(e){if(!e)return void(this.filteredItems.value=this.items.value);const t=[];for(const i of this.items.value){const a=i.items.filter(t=>this.shouldShowKeyPlay(t,e));a.length>0&&t.push({title:i.title,items:a})}this.filteredItems.value=t}shouldShowKeyPlay(e,t){if(!e.wallClock||!t)return!0;const i=new Date(t);return new Date(e.wallClock)<=i}isCurrentlyPlaying(e){return e===this.currentlyPlayingClipIndex.value}async setKeyPlays(e,t){null!==e?(this.items.value=this.parseNetworkResponse(e),this.filterItemsByPlayerTimeCode(t),this.cleanErrors()):this.errorState.value="tabLoadFailure"}cleanErrors(){"tabLoadFailure"===this.errorState.value&&(this.errorState.value=null),"unpopulatedEvent"===this.errorState.value&&this.allItems.length&&(this.errorState.value=null),this.filteredItems.value.length||(this.errorState.value="unpopulatedEvent")}async playKeyPlay(e){const t=this.allItems[e];if(!t)return void console.warn("Key play not found at index:",e);a.default.getMaestroEventViewModel().delegate.playClip(e),this.analyticsService.panelClick({type:"espnKeyPlays",name:"key_play_clicked",metadata:{action:"play clip",clip:t.clipID,key_play:t.description}})}async init(){await this.analyticsService.panelView("espnKeyPlays")}parseNetworkResponse(e){var t,i;const a=Object.values((null===(t=e.entities)||void 0===t?void 0:t.team)||{}),l=Object.values((null===(i=e.entities)||void 0===i?void 0:i.athlete)||{}),r=a.find(e=>"home"===e.homeAway),n=a.find(e=>"away"===e.homeAway),o=[],u=[];for(const t of e.sections){for(const e of t.items){const i=e.team?a.find(t=>t.id===e.team):void 0,u=e.athlete?l.find(t=>t.id===e.athlete):void 0,c=null!=i&&i.logoRef?Object(s.a)(i.logoRef,184,144):void 0,h=null!=u&&u.headshot?Object(s.a)(u.headshot,184,144):void 0,d="headshot"!==e.thumbnailType&&e.thumbnail?Object(s.a)(e.thumbnail,184,144):void 0,p=e.homeScore?e.homeScore:"0",y=e.awayScore?e.awayScore:"0",m=e.scoringPlay?parseInt(p):void 0,f=e.scoringPlay?parseInt(y):void 0,v={id:`${t.title||""}-${e.clipID}`,description:e.description?e.description:"",homeTeamName:r?r.shortName:"",awayTeamName:n?n.shortName:"",homeTeamScore:m,awayTeamScore:f,clipID:e.clipID,teamImageUrl:c,playerImageUrl:h,thumbnailImageUrl:d,section:t.title,wallClock:e.wallClock};o.push(v)}if(o.length){const e=t.title,i=u.find(t=>t.title===e);i?i.items.push(...o):u.push({title:e,items:[...o]}),o.length=0}}return u}get allItems(){return this.items.value.reduce((e,t)=>e.concat(t.items),[])}clipID(e){if(this.allItems[e])return this.allItems[e].clipID}handleKeyPlayLoadFailure(e){const t=this.clipID(e);if(t){const i=this.failedClips.value;i[t]="recentFailure",this.failedClips.value=i,setTimeout(()=>{if("recentFailure"===this.loadFailureStatus(e)){const e=this.failedClips.value;e[t]="nonRecentFailure",this.failedClips.value=e}},5e3)}}loadFailureStatus(e){const t=this.clipID(e);return this.failedClips.value&&t?this.failedClips.value[t]:"noFailure"}clearLoadFailureStatus(e){const t=this.clipID(e);t&&this.failedClips&&(this.failedClips.value={...this.failedClips.value,[t]:"noFailure"})}async userRequestedNewKeyPlaysData(){const e=a.default.getMaestroEventViewModel();await e.delegate.userRequestedNewKeyPlaysData()}}}}]);
|
|
2
2
|
//# sourceMappingURL=16.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/AddIcon.tsx"],"names":["AddIcon","props","React","createElement","width","height","viewBox","fill","xmlns","d","stroke","strokeWidth","strokeLinecap"],"mappings":"0FAAA,2BAsBeA,UAnBEC,GAEbC,IAAAC,cAAA,OACEC,MAAOH,EAAMG,MACbC,OAAQJ,EAAMI,OACdC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENN,IAAAC,cAAA,QACEM,EAAE,uBACFC,OAAO,UACPC,YAAY,IACZC,cAAc","file":"16.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\n\nconst AddIcon = (props: IconProps) => {\n return (\n <svg\n width={props.width}\n height={props.height}\n viewBox=\"0 0 21 21\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.5 1V20M1 10.5H20\"\n stroke=\"#FFFFFF\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n\nexport default AddIcon;\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/helpers/url.ts","webpack:///./src/modules/espn/key-plays/view-model/KeyPlaysViewModel.ts"],"names":["setImageDimensions","url","width","height","urlObj","URL","searchParams","set","toString","err","console","warn","KeyPlaysViewModel","constructor","analyticsService","_defineProperty","Observable","this","onUpdatePlayerTimeCode","playerTimeCode","filterItemsByPlayerTimeCode","cleanErrors","filteredItems","value","items","item","filteredKeyPlays","filter","keyPlay","shouldShowKeyPlay","length","push","title","wallClock","timestamp","Date","isCurrentlyPlaying","index","currentlyPlayingClipIndex","parseNetworkResponse","errorState","allItems","atIndex","SDK","getMaestroEventViewModel","delegate","playClip","panelClick","type","name","metadata","action","clip","clipID","key_play","description","panelView","response","_response$entities","_response$entities2","teams","Object","values","entities","team","athletes","athlete","homeTeam","find","homeAway","awayTeam","result","section","sections","playTeam","id","undefined","a","teamImageUrl","logoRef","playerImageUrl","headshot","thumbnailImageUrl","thumbnailType","thumbnail","homeScore","awayScore","homeTeamScore","scoringPlay","parseInt","awayTeamScore","keyPlayData","homeTeamName","shortName","awayTeamName","sectionTitle","existingSection","reduce","acc","concat","forKeyPlayAtIndex","handleKeyPlayLoadFailure","newFailedClips","failedClips","setTimeout","loadFailureStatus","clearLoadFailureStatus","mevm","userRequestedNewKeyPlaysData"],"mappings":"2FAAA,kCAAO,MAAMA,EAAqBA,CAChCC,EACAC,EACAC,KAEA,IACE,MAAMC,EAAS,IAAIC,IAAIJ,GAGvB,OAFAG,EAAOE,aAAaC,IAAI,IAAKL,EAAMM,YACnCJ,EAAOE,aAAaC,IAAI,IAAKJ,EAAOK,YAC7BJ,EAAOI,WACd,MAAOC,GAEP,OADAC,QAAQC,KAAK,iBAAkBV,EAAKQ,GAC7BR,K,ggBC0PIW,UAvPf,MAUEC,YAAYC,GAAoCC,EAAA,iCATpB,IAAIC,IAA0B,OAAKD,EAAA,2BACzC,IAAIC,IAA0B,OAAKD,EAAA,mCAC3B,IAAIC,IAA0B,OAAKD,EAAA,kBACpD,IAAIC,IAAsC,qBAAmBD,EAAA,mBAC5D,IAAIC,IAAwD,KAAGD,EAAA,aACrE,IAAIC,IAA0B,KAAGD,EAAA,qBACzB,IAAIC,IAA0B,KAAGD,EAAA,gCAI/CE,KAAKH,iBAAmBA,EAG1BI,uBAAuBC,GACrBF,KAAKG,4BAA4BD,GACjCF,KAAKI,cAGCD,4BAA4BD,GAClC,IAAKA,EAEH,YADAF,KAAKK,cAAcC,MAAQN,KAAKO,MAAMD,OAIxC,MAAMD,EAA+B,GACrC,IAAK,MAAMG,KAAQR,KAAKO,MAAMD,MAAO,CACnC,MAAMG,EAAmBD,EAAKD,MAAMG,OAAQC,GAC1CX,KAAKY,kBAAkBD,EAAST,IAE9BO,EAAiBI,OAAS,GAC5BR,EAAcS,KAAK,CACjBC,MAAOP,EAAKO,MACZR,MAAOE,IAIbT,KAAKK,cAAcC,MAAQD,EAGrBO,kBACND,EACAT,GAEA,IAAKS,EAAQK,YAAcd,EACzB,OAAO,EAGT,MAAMe,EAAY,IAAIC,KAAKhB,GAE3B,OAD2B,IAAIgB,KAAKP,EAAQK,YACfC,EAG/BE,mBAAmBC,GACjB,OAAOA,IAAUpB,KAAKqB,0BAA0Bf,MAGlD,kBACEC,EACAL,GAEc,OAAVK,GAKJP,KAAKO,MAAMD,MAAQN,KAAKsB,qBAAqBf,GAC7CP,KAAKG,4BAA4BD,GACjCF,KAAKI,eANHJ,KAAKuB,WAAWjB,MAAQ,iBASpBF,cACwB,mBAA1BJ,KAAKuB,WAAWjB,QAClBN,KAAKuB,WAAWjB,MAAQ,MAGI,qBAA1BN,KAAKuB,WAAWjB,OAAgCN,KAAKwB,SAASX,SAChEb,KAAKuB,WAAWjB,MAAQ,MAGrBN,KAAKK,cAAcC,MAAMO,SAC5Bb,KAAKuB,WAAWjB,MAAQ,oBAI5B,kBAAkBmB,GAChB,MAAMd,EAAUX,KAAKwB,SAASC,GAC9B,IAAKd,EAEH,YADAlB,QAAQC,KAAK,+BAAgC+B,GAIlCC,UAAIC,2BACZC,SAASC,SAASJ,GAEvBzB,KAAKH,iBAAiBiC,WAAW,CAC/BC,KAAM,eACNC,KAAM,mBACNC,SAAU,CACRC,OAAQ,YACRC,KAAMxB,EAAQyB,OACdC,SAAU1B,EAAQ2B,eAKxB,mBACQtC,KAAKH,iBAAiB0C,UAAU,gBAGxCjB,qBAAqBkB,GAAmD,IAAAC,EAAAC,EACtE,MAAMC,EAAQC,OAAOC,QAAwB,QAAjBJ,EAAAD,EAASM,gBAAQ,IAAAL,OAAA,EAAjBA,EAAmBM,OAAQ,IACjDC,EAAWJ,OAAOC,QAAwB,QAAjBH,EAAAF,EAASM,gBAAQ,IAAAJ,OAAA,EAAjBA,EAAmBO,UAAW,IACvDC,EAAWP,EAAMQ,KAAMJ,GAA2B,SAAlBA,EAAKK,UACrCC,EAAWV,EAAMQ,KAAMJ,GAA2B,SAAlBA,EAAKK,UAErC7C,EAAoB,GACpB+C,EAAwB,GAE9B,IAAK,MAAMC,KAAWf,EAASgB,SAAU,CACvC,IAAK,MAAM7C,KAAW4C,EAAQhD,MAAO,CACnC,MAAMkD,EAAW9C,EAAQoC,KACrBJ,EAAMQ,KAAMJ,GAASA,EAAKW,KAAO/C,EAAQoC,WACzCY,EACEV,EAAUtC,EAAQsC,QACpBD,EAASG,KAAMS,GAAMA,EAAEF,KAAO/C,EAAQsC,cACtCU,EAEEE,EAAeJ,WAAUK,QAC3B/E,YAAmB0E,EAASK,QAAS,IAAK,UAC1CH,EACEI,EAAiBd,WAASe,SAC5BjF,YAAmBkE,EAAQe,SAAU,IAAK,UAC1CL,EACEM,EACsB,aAA1BtD,EAAQuD,eAAgCvD,EAAQwD,UAC5CpF,YAAmB4B,EAAQwD,UAAW,IAAK,UAC3CR,EAEAS,EAAYzD,EAAQyD,UAAYzD,EAAQyD,UAAY,IACpDC,EAAY1D,EAAQ0D,UAAY1D,EAAQ0D,UAAY,IACpDC,EAAgB3D,EAAQ4D,YAC1BC,SAASJ,QACTT,EACEc,EAAgB9D,EAAQ4D,YAC1BC,SAASH,QACTV,EAEEe,EAAwB,CAC5BhB,GAAI,GAAGH,EAAQxC,OAAS,MAAMJ,EAAQyB,SACtCE,YAAa3B,EAAQ2B,YAAc3B,EAAQ2B,YAAc,GACzDqC,aAAczB,EAAWA,EAAS0B,UAAY,GAC9CC,aAAcxB,EAAWA,EAASuB,UAAY,GAC9CN,gBACAG,gBACArC,OAAQzB,EAAQyB,OAChByB,eACAE,iBACAE,oBACAV,QAASA,EAAQxC,MACjBC,UAAWL,EAAQK,WAGrBT,EAAMO,KAAK4D,GAIb,GAAInE,EAAMM,OAAQ,CAChB,MAAMiE,EAAevB,EAAQxC,MACvBgE,EAAkBzB,EAAOH,KAC5B3C,GAASA,EAAKO,QAAU+D,GAGvBC,EACFA,EAAgBxE,MAAMO,QAAQP,GAE9B+C,EAAOxC,KAAK,CACVC,MAAO+D,EACPvE,MAAO,IAAIA,KAKfA,EAAMM,OAAS,GAInB,OAAOyC,EAGT,eACE,OAAOtD,KAAKO,MAAMD,MAAM0E,OAAO,CAACC,EAAK1B,IAC5B0B,EAAIC,OAAO3B,EAAQhD,OACzB,IAGL6B,OAAO+C,GAEL,GADanF,KAAKwB,SAAS2D,GAI3B,OAAOnF,KAAKwB,SAAS2D,GAAmB/C,OAG1CgD,yBAAyBD,GACvB,MAAM/C,EAASpC,KAAKoC,OAAO+C,GAC3B,GAAI/C,EAAQ,CACV,MAAMiD,EAAiBrF,KAAKsF,YAAYhF,MACxC+E,EAAejD,GAAU,gBAEzBpC,KAAKsF,YAAYhF,MAAQ+E,EAEzBE,WAAW,KACT,GAAkD,kBAA9CvF,KAAKwF,kBAAkBL,GAAwC,CACjE,MAAME,EAAiBrF,KAAKsF,YAAYhF,MACxC+E,EAAejD,GAAU,mBACzBpC,KAAKsF,YAAYhF,MAAQ+E,IAE1B,MAIPG,kBAAkBL,GAChB,MAAM/C,EAASpC,KAAKoC,OAAO+C,GAE3B,OADuBnF,KAAKsF,YAAYhF,OAIjC8B,EAASpC,KAAKsF,YAAYhF,MAAM8B,GAF9B,YAKXqD,uBAAuBN,GACrB,MAAM/C,EAASpC,KAAKoC,OAAO+C,GACvB/C,GAAUpC,KAAKsF,cACjBtF,KAAKsF,YAAYhF,MAAQ,IACpBN,KAAKsF,YAAYhF,MACpB,CAAC8B,GAAS,cAKhB,qCACE,MAAMsD,EAAOhE,UAAIC,iCACX+D,EAAK9D,SAAS+D","file":"16.maestro-web-sdk.esm.js","sourcesContent":["export const setImageDimensions = (\n url: string,\n width: number,\n height: number\n) => {\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.set('w', width.toString());\n urlObj.searchParams.set('h', height.toString());\n return urlObj.toString();\n } catch (err) {\n console.warn('Malformed URL:', url, err);\n return url; // Return the original URL if it cannot be parsed\n }\n};\n","import SDK from '@/index';\nimport IMaestroKeyPlaysResponse from '../interfaces/IKeyPlaysResponse';\nimport IKeyPlay, {\n KeyPlayLoadFailureStatus,\n KeyPlaysErrorState,\n} from '../interfaces/IKeyPlays';\nimport { Observable } from '@/helpers/Observable';\nimport { setImageDimensions } from '@/helpers/url';\nimport AnalyticsService from '@/services/AnalyticsService/AnalyticsService';\n\nexport type KeyPlayItem = {\n title?: string;\n items: IKeyPlay[];\n};\n\nclass KeyPlaysViewModel {\n currentlyPlayingClipIndex = new Observable<number | null>(null);\n lastPlayedClipIndex = new Observable<number | null>(null);\n currentClipPlaybackProgress = new Observable<number | null>(null);\n errorState = new Observable<KeyPlaysErrorState | null>('unpopulatedEvent');\n failedClips = new Observable<{ [key: string]: KeyPlayLoadFailureStatus }>({});\n items = new Observable<KeyPlayItem[]>([]);\n filteredItems = new Observable<KeyPlayItem[]>([]);\n analyticsService: AnalyticsService;\n\n constructor(analyticsService: AnalyticsService) {\n this.analyticsService = analyticsService;\n }\n\n onUpdatePlayerTimeCode(playerTimeCode: number | null): void {\n this.filterItemsByPlayerTimeCode(playerTimeCode);\n this.cleanErrors();\n }\n\n private filterItemsByPlayerTimeCode(playerTimeCode: number | null) {\n if (!playerTimeCode) {\n this.filteredItems.value = this.items.value;\n return;\n }\n\n const filteredItems: KeyPlayItem[] = [];\n for (const item of this.items.value) {\n const filteredKeyPlays = item.items.filter((keyPlay) =>\n this.shouldShowKeyPlay(keyPlay, playerTimeCode)\n );\n if (filteredKeyPlays.length > 0) {\n filteredItems.push({\n title: item.title,\n items: filteredKeyPlays,\n });\n }\n }\n this.filteredItems.value = filteredItems;\n }\n\n private shouldShowKeyPlay(\n keyPlay: IKeyPlay,\n playerTimeCode: number | null\n ): boolean {\n if (!keyPlay.wallClock || !playerTimeCode) {\n return true;\n }\n\n const timestamp = new Date(playerTimeCode);\n const wallClockTimestamp = new Date(keyPlay.wallClock);\n return wallClockTimestamp <= timestamp;\n }\n\n isCurrentlyPlaying(index: number): boolean {\n return index === this.currentlyPlayingClipIndex.value;\n }\n\n async setKeyPlays(\n items: IMaestroKeyPlaysResponse | null,\n playerTimeCode: number | null\n ): Promise<void> {\n if (items === null) {\n this.errorState.value = 'tabLoadFailure';\n return;\n }\n\n this.items.value = this.parseNetworkResponse(items);\n this.filterItemsByPlayerTimeCode(playerTimeCode);\n this.cleanErrors();\n }\n\n private cleanErrors() {\n if (this.errorState.value === 'tabLoadFailure') {\n this.errorState.value = null;\n }\n\n if (this.errorState.value === 'unpopulatedEvent' && this.allItems.length) {\n this.errorState.value = null;\n }\n\n if (!this.filteredItems.value.length) {\n this.errorState.value = 'unpopulatedEvent';\n }\n }\n\n async playKeyPlay(atIndex: number): Promise<void> {\n const keyPlay = this.allItems[atIndex];\n if (!keyPlay) {\n console.warn('Key play not found at index:', atIndex);\n return;\n }\n\n const mevm = SDK.getMaestroEventViewModel();\n mevm.delegate.playClip(atIndex);\n\n this.analyticsService.panelClick({\n type: 'espnKeyPlays',\n name: 'key_play_clicked',\n metadata: {\n action: 'play clip',\n clip: keyPlay.clipID,\n key_play: keyPlay.description,\n },\n });\n }\n\n async init() {\n await this.analyticsService.panelView('espnKeyPlays');\n }\n\n parseNetworkResponse(response: IMaestroKeyPlaysResponse): KeyPlayItem[] {\n const teams = Object.values(response.entities?.team || {});\n const athletes = Object.values(response.entities?.athlete || {});\n const homeTeam = teams.find((team) => team.homeAway === 'home');\n const awayTeam = teams.find((team) => team.homeAway === 'away');\n\n const items: IKeyPlay[] = [];\n const result: KeyPlayItem[] = [];\n\n for (const section of response.sections) {\n for (const keyPlay of section.items) {\n const playTeam = keyPlay.team\n ? teams.find((team) => team.id === keyPlay.team)\n : undefined;\n const athlete = keyPlay.athlete\n ? athletes.find((a) => a.id === keyPlay.athlete)\n : undefined;\n\n const teamImageUrl = playTeam?.logoRef\n ? setImageDimensions(playTeam.logoRef, 184, 144)\n : undefined;\n const playerImageUrl = athlete?.headshot\n ? setImageDimensions(athlete.headshot, 184, 144)\n : undefined;\n const thumbnailImageUrl =\n keyPlay.thumbnailType !== 'headshot' && keyPlay.thumbnail\n ? setImageDimensions(keyPlay.thumbnail, 184, 144)\n : undefined;\n\n const homeScore = keyPlay.homeScore ? keyPlay.homeScore : '0';\n const awayScore = keyPlay.awayScore ? keyPlay.awayScore : '0';\n const homeTeamScore = keyPlay.scoringPlay\n ? parseInt(homeScore)\n : undefined;\n const awayTeamScore = keyPlay.scoringPlay\n ? parseInt(awayScore)\n : undefined;\n\n const keyPlayData: IKeyPlay = {\n id: `${section.title || ''}-${keyPlay.clipID}`,\n description: keyPlay.description ? keyPlay.description : '',\n homeTeamName: homeTeam ? homeTeam.shortName : '',\n awayTeamName: awayTeam ? awayTeam.shortName : '',\n homeTeamScore,\n awayTeamScore,\n clipID: keyPlay.clipID,\n teamImageUrl,\n playerImageUrl,\n thumbnailImageUrl,\n section: section.title,\n wallClock: keyPlay.wallClock,\n };\n\n items.push(keyPlayData);\n }\n\n // Only add the section if it has items\n if (items.length) {\n const sectionTitle = section.title;\n const existingSection = result.find(\n (item) => item.title === sectionTitle\n );\n\n if (existingSection) {\n existingSection.items.push(...items);\n } else {\n result.push({\n title: sectionTitle,\n items: [...items],\n });\n }\n\n // Reset items for the next section\n items.length = 0;\n }\n }\n\n return result;\n }\n\n get allItems() {\n return this.items.value.reduce((acc, section) => {\n return acc.concat(section.items);\n }, [] as IKeyPlay[]);\n }\n\n clipID(forKeyPlayAtIndex: number): string | undefined {\n const item = this.allItems[forKeyPlayAtIndex];\n if (!item) {\n return undefined;\n }\n return this.allItems[forKeyPlayAtIndex].clipID;\n }\n\n handleKeyPlayLoadFailure(forKeyPlayAtIndex: number): void {\n const clipID = this.clipID(forKeyPlayAtIndex);\n if (clipID) {\n const newFailedClips = this.failedClips.value;\n newFailedClips[clipID] = 'recentFailure';\n\n this.failedClips.value = newFailedClips;\n\n setTimeout(() => {\n if (this.loadFailureStatus(forKeyPlayAtIndex) === 'recentFailure') {\n const newFailedClips = this.failedClips.value;\n newFailedClips[clipID] = 'nonRecentFailure';\n this.failedClips.value = newFailedClips;\n }\n }, 5000);\n }\n }\n\n loadFailureStatus(forKeyPlayAtIndex: number): KeyPlayLoadFailureStatus {\n const clipID = this.clipID(forKeyPlayAtIndex);\n const newFailedClips = this.failedClips.value;\n if (!newFailedClips) {\n return 'noFailure';\n }\n return clipID ? this.failedClips.value[clipID] : 'noFailure';\n }\n\n clearLoadFailureStatus(forKeyPlayAtIndex: number): void {\n const clipID = this.clipID(forKeyPlayAtIndex);\n if (clipID && this.failedClips) {\n this.failedClips.value = {\n ...this.failedClips.value,\n [clipID]: 'noFailure',\n };\n }\n }\n\n async userRequestedNewKeyPlaysData() {\n const mevm = SDK.getMaestroEventViewModel();\n await mevm.delegate.userRequestedNewKeyPlaysData();\n }\n}\n\nexport default KeyPlaysViewModel;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{98:function(e,t,n){"use strict";n.r(t);var w=n(0),i=n.n(w);t.default=e=>i.a.createElement("svg",{width:e.width,height:e.height,viewBox:"0 0 21 21",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i.a.createElement("path",{d:"M10.5 1V20M1 10.5H20",stroke:"#FFFFFF",strokeWidth:"2",strokeLinecap:"round"}))}}]);
|
|
2
2
|
//# sourceMappingURL=17.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/AddIcon.tsx"],"names":["AddIcon","props","React","createElement","width","height","viewBox","fill","xmlns","d","stroke","strokeWidth","strokeLinecap"],"mappings":"0FAAA,2BAsBeA,UAnBEC,GAEbC,IAAAC,cAAA,OACEC,MAAOH,EAAMG,MACbC,OAAQJ,EAAMI,OACdC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENN,IAAAC,cAAA,QACEM,EAAE,uBACFC,OAAO,UACPC,YAAY,IACZC,cAAc","file":"17.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\n\nconst AddIcon = (props: IconProps) => {\n return (\n <svg\n width={props.width}\n height={props.height}\n viewBox=\"0 0 21 21\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10.5 1V20M1 10.5H20\"\n stroke=\"#FFFFFF\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n\nexport default AddIcon;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{79:function(e,t,V){"use strict";V.r(t);var l=V(0),H=V.n(l);t.default=e=>H.a.createElement("svg",{width:e.width,height:e.height,viewBox:"0 0 72 72",fill:"none",xmlns:"http://www.w3.org/2000/svg"},H.a.createElement("path",{d:"M38.25 43.2954H33V38.25H38.25V43.2954Z",fill:"#9D9E9F"}),H.a.createElement("path",{d:"M28.5 28.7045V33.75H23.25V28.7045H28.5Z",fill:"#9D9E9F"}),H.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M54.75 12.75H6.75V52.5C6.75 56.2279 9.77208 59.25 13.5 59.25H58.5C62.2279 59.25 65.25 56.2279 65.25 52.5V17.25H59.25V50.25C59.25 51.4926 58.2426 52.5 57 52.5C55.7574 52.5 54.75 51.4926 54.75 50.25V12.75ZM28.5 51V47.7954H23.16C20.7244 47.7954 18.75 45.821 18.75 43.3854V41.9659H23.25V43.2954H28.5V38.25H23.16C20.7244 38.25 18.75 36.2756 18.75 33.84V28.6145C18.75 26.179 20.7244 24.2045 23.16 24.2045H28.5V21H33V24.2045H38.34C40.7756 24.2045 42.75 26.179 42.75 28.6145V30.0341H38.25V28.7045H33V33.75H38.34C40.7756 33.75 42.75 35.7244 42.75 38.16V43.3854C42.75 45.821 40.7756 47.7954 38.34 47.7954H33V51H28.5Z",fill:"#9D9E9F"}))}}]);
|
|
2
2
|
//# sourceMappingURL=18.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/BetsIcon.tsx"],"names":["BetsIcon","props","React","createElement","width","height","viewBox","fill","xmlns","d","fillRule","clipRule"],"mappings":"0FAAA,2BAuBeA,UArBGC,GAEdC,IAAAC,cAAA,OACEC,MAAOH,EAAMG,MACbC,OAAQJ,EAAMI,OACdC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENN,IAAAC,cAAA,QAAMM,EAAE,yCAAyCF,KAAK,YACtDL,IAAAC,cAAA,QAAMM,EAAE,0CAA0CF,KAAK,YACvDL,IAAAC,cAAA,QACEO,SAAS,UACTC,SAAS,UACTF,EAAE,imBACFF,KAAK","file":"18.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\nconst BetsIcon = (props: IconProps) => {\n return (\n <svg\n width={props.width}\n height={props.height}\n viewBox=\"0 0 72 72\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M38.25 43.2954H33V38.25H38.25V43.2954Z\" fill=\"#9D9E9F\" />\n <path d=\"M28.5 28.7045V33.75H23.25V28.7045H28.5Z\" fill=\"#9D9E9F\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M54.75 12.75H6.75V52.5C6.75 56.2279 9.77208 59.25 13.5 59.25H58.5C62.2279 59.25 65.25 56.2279 65.25 52.5V17.25H59.25V50.25C59.25 51.4926 58.2426 52.5 57 52.5C55.7574 52.5 54.75 51.4926 54.75 50.25V12.75ZM28.5 51V47.7954H23.16C20.7244 47.7954 18.75 45.821 18.75 43.3854V41.9659H23.25V43.2954H28.5V38.25H23.16C20.7244 38.25 18.75 36.2756 18.75 33.84V28.6145C18.75 26.179 20.7244 24.2045 23.16 24.2045H28.5V21H33V24.2045H38.34C40.7756 24.2045 42.75 26.179 42.75 28.6145V30.0341H38.25V28.7045H33V33.75H38.34C40.7756 33.75 42.75 35.7244 42.75 38.16V43.3854C42.75 45.821 40.7756 47.7954 38.34 47.7954H33V51H28.5Z\"\n fill=\"#9D9E9F\"\n />\n </svg>\n );\n};\n\nexport default BetsIcon;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{87:function(e,t,n){"use strict";n.r(t);var s=n(0),o=n.n(s);class i extends o.a.Component{constructor(e){super(e)}render(){return o.a.createElement("svg",{width:this.props.width,height:this.props.height,viewBox:"0 0 32 32",fill:"none",xmlns:"http://www.w3.org/2000/svg"},o.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M3 16C3 8.8203 8.8203 3 16 3C23.1797 3 29 8.8203 29 16C29 23.1797 23.1797 29 16 29C8.8203 29 3 23.1797 3 16ZM14.6001 12.0668H17.4001V9.26676H14.6001V12.0668ZM17.3333 22.6667V14H14.6667V22.6667H17.3333Z",fill:"#FFB759"}))}}t.default=i}}]);
|
|
2
2
|
//# sourceMappingURL=19.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/BetsWarningIcon.tsx"],"names":["BetsWarningIcon","React","Component","constructor","props","super","render","createElement","width","this","height","viewBox","fill","xmlns","fillRule","clipRule","d"],"mappings":"0FAAA,2BAGA,MAAMA,UAAwBC,IAAMC,UAClCC,YAAYC,GACVC,MAAMD,GAGRE,SACE,OACEL,IAAAM,cAAA,OACEC,MAAOC,KAAKL,MAAMI,MAClBE,OAAQD,KAAKL,MAAMM,OACnBC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENZ,IAAAM,cAAA,QACEO,SAAS,UACTC,SAAS,UACTC,EAAE,4MACFJ,KAAK,cAOAZ","file":"19.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\n\nclass BetsWarningIcon extends React.Component<IconProps> {\n constructor(props: IconProps) {\n super(props);\n }\n\n render() {\n return (\n <svg\n width={this.props.width}\n height={this.props.height}\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 16C3 8.8203 8.8203 3 16 3C23.1797 3 29 8.8203 29 16C29 23.1797 23.1797 29 16 29C8.8203 29 3 23.1797 3 16ZM14.6001 12.0668H17.4001V9.26676H14.6001V12.0668ZM17.3333 22.6667V14H14.6667V22.6667H17.3333Z\"\n fill=\"#FFB759\"\n />\n </svg>\n );\n }\n}\n\nexport default BetsWarningIcon;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{94:function(C,e,t){"use strict";t.r(e);var a=t(0),l=t.n(a);e.default=C=>l.a.createElement("svg",{width:C.width,height:C.height,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.a.createElement("path",{d:"M5.25 1.25C3.84987 1.25 3.1498 1.25 2.61502 1.52248C2.14462 1.76217 1.76217 2.14462 1.52248 2.61502C1.25 3.1498 1.25 3.84987 1.25 5.25V18.75C1.25 20.1501 1.25 20.8502 1.52248 21.385C1.76217 21.8554 2.14462 22.2378 2.61502 22.4775C3.1498 22.75 3.84987 22.75 5.25 22.75H6.75C8.15013 22.75 8.8502 22.75 9.38498 22.4775C9.85538 22.2378 10.2378 21.8554 10.4775 21.385C10.75 20.8502 10.75 20.1501 10.75 18.75V5.25C10.75 3.84987 10.75 3.1498 10.4775 2.61502C10.2378 2.14462 9.85538 1.76217 9.38498 1.52248C8.8502 1.25 8.15013 1.25 6.75 1.25H5.25Z",fill:"#F3F7FF"}),l.a.createElement("path",{d:"M13.25 5.25C13.25 3.84987 13.25 3.1498 13.5225 2.61502C13.7622 2.14462 14.1446 1.76217 14.615 1.52248C15.1498 1.25 15.8499 1.25 17.25 1.25H18.75C20.1501 1.25 20.8502 1.25 21.385 1.52248C21.8554 1.76217 22.2378 2.14462 22.4775 2.61502C22.75 3.1498 22.75 3.84987 22.75 5.25V6.75C22.75 8.15013 22.75 8.8502 22.4775 9.38498C22.2378 9.85538 21.8554 10.2378 21.385 10.4775C20.8502 10.75 20.1501 10.75 18.75 10.75H17.25C15.8499 10.75 15.1498 10.75 14.615 10.4775C14.1446 10.2378 13.7622 9.85538 13.5225 9.38498C13.25 8.8502 13.25 8.15013 13.25 6.75V5.25Z",fill:"#F3F7FF"}),l.a.createElement("path",{d:"M17.25 13.25C15.8499 13.25 15.1498 13.25 14.615 13.5225C14.1446 13.7622 13.7622 14.1446 13.5225 14.615C13.25 15.1498 13.25 15.8499 13.25 17.25V18.75C13.25 20.1501 13.25 20.8502 13.5225 21.385C13.7622 21.8554 14.1446 22.2378 14.615 22.4775C15.1498 22.75 15.8499 22.75 17.25 22.75H18.75C20.1501 22.75 20.8502 22.75 21.385 22.4775C21.8554 22.2378 22.2378 21.8554 22.4775 21.385C22.75 20.8502 22.75 20.1501 22.75 18.75V17.25C22.75 15.8499 22.75 15.1498 22.4775 14.615C22.2378 14.1446 21.8554 13.7622 21.385 13.5225C20.8502 13.25 20.1501 13.25 18.75 13.25H17.25Z",fill:"#F3F7FF"}))}}]);
|
|
2
2
|
//# sourceMappingURL=20.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/BuilderIcon.tsx"],"names":["BuilderIcon","props","React","createElement","width","height","viewBox","fill","xmlns","d"],"mappings":"0FAAA,2BA4BeA,UAzBMC,GAEjBC,IAAAC,cAAA,OACEC,MAAOH,EAAMG,MACbC,OAAQJ,EAAMI,OACdC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENN,IAAAC,cAAA,QACEM,EAAE,8hBACFF,KAAK,YAEPL,IAAAC,cAAA,QACEM,EAAE,siBACFF,KAAK,YAEPL,IAAAC,cAAA,QACEM,EAAE,gjBACFF,KAAK","file":"20.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\n\nconst BuilderIcon = (props: IconProps) => {\n return (\n <svg\n width={props.width}\n height={props.height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.25 1.25C3.84987 1.25 3.1498 1.25 2.61502 1.52248C2.14462 1.76217 1.76217 2.14462 1.52248 2.61502C1.25 3.1498 1.25 3.84987 1.25 5.25V18.75C1.25 20.1501 1.25 20.8502 1.52248 21.385C1.76217 21.8554 2.14462 22.2378 2.61502 22.4775C3.1498 22.75 3.84987 22.75 5.25 22.75H6.75C8.15013 22.75 8.8502 22.75 9.38498 22.4775C9.85538 22.2378 10.2378 21.8554 10.4775 21.385C10.75 20.8502 10.75 20.1501 10.75 18.75V5.25C10.75 3.84987 10.75 3.1498 10.4775 2.61502C10.2378 2.14462 9.85538 1.76217 9.38498 1.52248C8.8502 1.25 8.15013 1.25 6.75 1.25H5.25Z\"\n fill=\"#F3F7FF\"\n />\n <path\n d=\"M13.25 5.25C13.25 3.84987 13.25 3.1498 13.5225 2.61502C13.7622 2.14462 14.1446 1.76217 14.615 1.52248C15.1498 1.25 15.8499 1.25 17.25 1.25H18.75C20.1501 1.25 20.8502 1.25 21.385 1.52248C21.8554 1.76217 22.2378 2.14462 22.4775 2.61502C22.75 3.1498 22.75 3.84987 22.75 5.25V6.75C22.75 8.15013 22.75 8.8502 22.4775 9.38498C22.2378 9.85538 21.8554 10.2378 21.385 10.4775C20.8502 10.75 20.1501 10.75 18.75 10.75H17.25C15.8499 10.75 15.1498 10.75 14.615 10.4775C14.1446 10.2378 13.7622 9.85538 13.5225 9.38498C13.25 8.8502 13.25 8.15013 13.25 6.75V5.25Z\"\n fill=\"#F3F7FF\"\n />\n <path\n d=\"M17.25 13.25C15.8499 13.25 15.1498 13.25 14.615 13.5225C14.1446 13.7622 13.7622 14.1446 13.5225 14.615C13.25 15.1498 13.25 15.8499 13.25 17.25V18.75C13.25 20.1501 13.25 20.8502 13.5225 21.385C13.7622 21.8554 14.1446 22.2378 14.615 22.4775C15.1498 22.75 15.8499 22.75 17.25 22.75H18.75C20.1501 22.75 20.8502 22.75 21.385 22.4775C21.8554 22.2378 22.2378 21.8554 22.4775 21.385C22.75 20.8502 22.75 20.1501 22.75 18.75V17.25C22.75 15.8499 22.75 15.1498 22.4775 14.615C22.2378 14.1446 21.8554 13.7622 21.385 13.5225C20.8502 13.25 20.1501 13.25 18.75 13.25H17.25Z\"\n fill=\"#F3F7FF\"\n />\n </svg>\n );\n};\n\nexport default BuilderIcon;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{92:function(e,C,t){"use strict";t.r(C);var n=t(0),i=t.n(n);C.default=e=>i.a.createElement("svg",{width:e.width,height:e.height,viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M3 20.3077C3 20.1622 3.04487 20.0272 3.12152 19.9158C3.48396 19.3721 3.73959 18.988 3.92078 18.6789C4.10212 18.3696 4.18012 18.1822 4.21373 18.0371C4.23728 17.9356 4.24555 17.893 4.2506 17.8569C4.25566 17.8209 4.25941 17.7777 4.2647 17.6736C4.27129 17.5439 4.23648 17.2915 4.09725 16.7831C3.96289 16.2924 3.75483 15.6413 3.46816 14.7447C3.20249 13.9139 3 12.9666 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21H3.69231C3.30996 21 3 20.69 3 20.3077ZM8.30769 9.46154C7.92534 9.46154 7.61538 9.7715 7.61538 10.1538C7.61538 10.5362 7.92534 10.8462 8.30769 10.8462H15.6923C16.0747 10.8462 16.3846 10.5362 16.3846 10.1538C16.3846 9.7715 16.0747 9.46154 15.6923 9.46154H8.30769ZM7.61538 13.8462C7.61538 13.4638 7.92534 13.1538 8.30769 13.1538H12C12.3824 13.1538 12.6923 13.4638 12.6923 13.8462C12.6923 14.2285 12.3824 14.5385 12 14.5385H8.30769C7.92534 14.5385 7.61538 14.2285 7.61538 13.8462Z",fill:"#F3F7FF"}))}}]);
|
|
2
2
|
//# sourceMappingURL=21.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/ChatIcon.tsx"],"names":["ChatIcon","props","React","createElement","width","height","viewBox","fill","xmlns","fillRule","clipRule","d"],"mappings":"0FAAA,2BAsBeA,UAnBGC,GAEdC,IAAAC,cAAA,OACEC,MAAOH,EAAMG,MACbC,OAAQJ,EAAMI,OACdC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENN,IAAAC,cAAA,QACEM,SAAS,UACTC,SAAS,UACTC,EAAE,85BACFJ,KAAK","file":"21.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\n\nconst ChatIcon = (props: IconProps) => {\n return (\n <svg\n width={props.width}\n height={props.height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3 20.3077C3 20.1622 3.04487 20.0272 3.12152 19.9158C3.48396 19.3721 3.73959 18.988 3.92078 18.6789C4.10212 18.3696 4.18012 18.1822 4.21373 18.0371C4.23728 17.9356 4.24555 17.893 4.2506 17.8569C4.25566 17.8209 4.25941 17.7777 4.2647 17.6736C4.27129 17.5439 4.23648 17.2915 4.09725 16.7831C3.96289 16.2924 3.75483 15.6413 3.46816 14.7447C3.20249 13.9139 3 12.9666 3 12C3 7.02944 7.02944 3 12 3C16.9706 3 21 7.02944 21 12C21 16.9706 16.9706 21 12 21H3.69231C3.30996 21 3 20.69 3 20.3077ZM8.30769 9.46154C7.92534 9.46154 7.61538 9.7715 7.61538 10.1538C7.61538 10.5362 7.92534 10.8462 8.30769 10.8462H15.6923C16.0747 10.8462 16.3846 10.5362 16.3846 10.1538C16.3846 9.7715 16.0747 9.46154 15.6923 9.46154H8.30769ZM7.61538 13.8462C7.61538 13.4638 7.92534 13.1538 8.30769 13.1538H12C12.3824 13.1538 12.6923 13.4638 12.6923 13.8462C12.6923 14.2285 12.3824 14.5385 12 14.5385H8.30769C7.92534 14.5385 7.61538 14.2285 7.61538 13.8462Z\"\n fill=\"#F3F7FF\"\n />\n </svg>\n );\n};\n\nexport default ChatIcon;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{85:function(e,t,n){"use strict";n.r(t);var i=n(0),l=n.n(i);t.default=e=>l.a.createElement("svg",{width:e.width,height:e.height,viewBox:"0 0 25 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M22.0678 6.50019L9.79999 18.768L3.53223 12.5002L5.29999 10.7324L9.79999 15.2324L20.3 4.73242L22.0678 6.50019Z",fill:"#41BA42"}))}}]);
|
|
2
2
|
//# sourceMappingURL=22.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/CheckmarkIcon.tsx"],"names":["CheckmarkIcon","props","React","createElement","width","height","viewBox","fill","xmlns","fillRule","clipRule","d"],"mappings":"0FAAA,2BAsBeA,UAnBQC,GAEnBC,IAAAC,cAAA,OACEC,MAAOH,EAAMG,MACbC,OAAQJ,EAAMI,OACdC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENN,IAAAC,cAAA,QACEM,SAAS,UACTC,SAAS,UACTC,EAAE,gHACFJ,KAAK","file":"22.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\n\nconst CheckmarkIcon = (props: IconProps) => {\n return (\n <svg\n width={props.width}\n height={props.height}\n viewBox=\"0 0 25 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M22.0678 6.50019L9.79999 18.768L3.53223 12.5002L5.29999 10.7324L9.79999 15.2324L20.3 4.73242L22.0678 6.50019Z\"\n fill=\"#41BA42\"\n />\n </svg>\n );\n};\n\nexport default CheckmarkIcon;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{83:function(e,t,i){"use strict";i.r(t);var n=i(0),w=i.n(n);t.default=e=>w.a.createElement("svg",{width:e.width,height:e.height,viewBox:"0 0 49 48",fill:"none",xmlns:"http://www.w3.org/2000/svg"},w.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M20 39L20 28.5L9.5 28.5L9.5 25.5L23 25.5L23 39L20 39ZM39.5 22.5L26 22.5L26 9.00392L29 9.00392L29 19.5L39.5 19.5L39.5 22.5Z",fill:"white"}))}}]);
|
|
2
2
|
//# sourceMappingURL=23.maestro-web-sdk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/
|
|
1
|
+
{"version":3,"sources":["webpack:///./src/components/atoms/SvgIcon/CollapseIcon.tsx"],"names":["CollapseIcon","props","React","createElement","width","height","viewBox","fill","xmlns","fillRule","clipRule","d"],"mappings":"0FAAA,2BAsBeA,UAnBOC,GAElBC,IAAAC,cAAA,OACEC,MAAOH,EAAMG,MACbC,OAAQJ,EAAMI,OACdC,QAAQ,YACRC,KAAK,OACLC,MAAM,8BAENN,IAAAC,cAAA,QACEM,SAAS,UACTC,SAAS,UACTC,EAAE,6HACFJ,KAAK","file":"23.maestro-web-sdk.esm.js","sourcesContent":["import React from 'react';\nimport { IconProps } from './Icon';\n\nconst CollapseIcon = (props: IconProps) => {\n return (\n <svg\n width={props.width}\n height={props.height}\n viewBox=\"0 0 49 48\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M20 39L20 28.5L9.5 28.5L9.5 25.5L23 25.5L23 39L20 39ZM39.5 22.5L26 22.5L26 9.00392L29 9.00392L29 19.5L39.5 19.5L39.5 22.5Z\"\n fill=\"white\"\n />\n </svg>\n );\n};\n\nexport default CollapseIcon;\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{
|
|
1
|
+
(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{82:function(e,t,i){"use strict";i.r(t);var n=i(0),w=i.n(n);t.default=e=>w.a.createElement("svg",{width:e.width,height:e.height,viewBox:"0 0 48 48",fill:"none",xmlns:"http://www.w3.org/2000/svg"},w.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M13.5 34.5L24 34.5L24 37.5L10.5 37.5L10.5 24L13.5 24L13.5 34.5ZM34.5 24L34.5 13.5006L24.0006 13.5045L23.9994 10.5045L37.5 10.4994L37.5 24L34.5 24Z",fill:"white"}))}}]);
|
|
2
2
|
//# sourceMappingURL=24.maestro-web-sdk.esm.js.map
|