"use strict";(("undefined"!=typeof self?self:this).wpChessCom_9fM6=("undefined"!=typeof self?self:this).wpChessCom_9fM6||[]).push([[4905],{1223:function(e,t,o){let a;o.r(t);o.d(t,{coachClient:function(){return z}});var n=o(7528),s=o(2365),r=o(519);function isCelebrityCoachesEnabled(){return window.Config.isCelebrityCoachesEnabled}var i=o(5591);let c=(0,i.createResource)({name:"coachesService.coachesCategory",global:!0,persist:!0,async loader(){let{ListCoaches:e}=await o.e(6439).then(o.bind(o,6439));return(await e({localeOverride:window.context.i18n.locale,withCelebrityCoaches:isCelebrityCoachesEnabled()},{"x-chesscom-bucketing-id":(0,r.x)().bucketingId})).data.coachCategories.map(e=>({...e,coaches:e.coaches.map(e=>({...e,name:e.name}))}))}});function getCoachesList(){return c.state.data?.flatMap(e=>e.coaches)??[]}function getCoach(e){return getCoachesList().find(t=>t.id===e)}function getUniqueCoachKey(e){return`${e.locale}${e.textId}`}class d extends i.Model{locale="";textId="";data;get key(){return getUniqueCoachKey({locale:this.locale,textId:this.textId})}}var l=o(7118);let h=(0,l.reactive)({coachAudio:{activeSound:null,currentPhrase:null,currentPhraseHash:null,isEnabled:!1,loadedSounds:{},speechTimeout:null},isCoachesModalOpen:!1,pendingCoachId:null,pendingCoachMessage:null,speechAssets:(0,l.markRaw)((0,i.createCollection)(d,{key:"key"})),speechLineTally:{}}),u=(0,i.createResource)({name:"coachesService.currentCoach",global:!0,persist:!0,async loader(){let{GetCurrentCoach:e}=await o.e(6439).then(o.bind(o,6439)),{bucketingId:t}=(0,r.x)();return{currentCoach:(await e({localeOverride:window.context.i18n.locale,bucketingId:t,withCelebrityCoaches:isCelebrityCoachesEnabled()},{"x-chesscom-bucketing-id":(0,r.x)().bucketingId})).data.currentCoach}}});function getSelectedCoach({preferPendingCoach:e}={preferPendingCoach:!1}){return e&&h.pendingCoachId?getCoach(h.pendingCoachId)??null:u.state.data?.currentCoach??null}function getAssetForCoach(e=getSelectedCoach()){if(e)return h.speechAssets.find(getUniqueCoachKey({locale:e.locale,textId:e.textId}))}var g=o(1999),f=o(8858);async function fetchCoachSpeechAssets({textId:e,locale:t}){if(!getAssetForCoach({textId:e,locale:t}))try{let{data:o}=await g.A.get(window.chesscom.features.includes("play_coach_use_asset_tier_and_ply_limits")?`https://text-and-audio.chess.com/text_prod/released/${e}/${t}/cee_asset_v2.json.bzp`:`https://text-and-audio.chess.com/text_prod/released/${e}/${t}/cee_asset.json.bzp`);h.speechAssets.add({locale:t,textId:e,data:o});s.z.emit(n.S.OnSpeechAssetsLoaded)}catch(e){e instanceof Error?(0,f.C)(e):(0,f.C)(Error(`An error occurred in fetchCoachSpeechAssets: ${e}`))}}async function fetchCurrentCoachSpeechAssets({preferPendingCoach:e}={preferPendingCoach:!1}){let t=getSelectedCoach({preferPendingCoach:e});await fetchCoachSpeechAssets(t)}o(394);var S=o(6666);function getEngine(){return a}function loadCoachSpeechAsset({assetString:e,locale:t,textId:o,type:a,engine:n}){let s=n||getEngine();return new Promise(n=>{if(!s){n();return}s.send(`fetch load-coach-asset text_id ${o} locale ${t} ${a} ${e}`);s.send(`fetch set-coach-asset text_id ${o} locale ${t}`);n()})}function getSpeechAssetsForCurrentCoach(){let e=getSelectedCoach({preferPendingCoach:!0});if(!e)return;let{textId:t,locale:o}=e;return getAssetForCoach({textId:t,locale:o})?.data}async function loadCoachSpeechAssetsIntoCeeUsingUci(){let e=getSelectedCoach();if(!e)return;let{locale:t,textId:o}=e,a=getSpeechAssetsForCurrentCoach();a&&await loadCoachSpeechAsset({assetString:a,locale:t,textId:o,type:"bzp"})}var p=o(2101);function loadCoachAssetsIntoCee(){p.I.cee&&p.I.cee&&"object"==typeof p.I.cee&&"uci"===p.I.cee.interface&&getEngine().isready(loadCoachSpeechAssetsIntoCeeUsingUci)}function isSentryHighProfileEnabled(){return!!(window.chesscom.enableSentryHP&&window.context?.user&&(window.context.user.isStreamer||window.context.user.chessTitle||window.context.user.hasConnectedTwitch||window.context.user.hasConnectedYoutube))}function isSentryEnabled(){return window.chesscom.enableSentry||window.chesscom.sudoEnableSentry||isSentryHighProfileEnabled()}function reportError(e){isSentryEnabled()&&(0,f.C)(e)}async function loadCoachesByCategoryResource(){try{await c.load()}catch(e){e instanceof Error?reportError(e):reportError(Error(`Error thrown while fetching coaches list: ${e}`))}}function resetSpeechLineTally(){h.speechLineTally={}}function getSelectedCoachLocale({preferPendingCoach:e}={preferPendingCoach:!1}){return getSelectedCoach({preferPendingCoach:e})?.locale||null}function getSelectedCoachVoiceId({preferPendingCoach:e}={preferPendingCoach:!1}){return getSelectedCoach({preferPendingCoach:e})?.voiceId||null}function getCoachPhraseUrl({hash:e}){let t=window.chesscom.features.includes("web_audio_use_new_sound_url")?"text-and-audio":"text-and-audio-cdn";return`https://${t}.chess.com/prod/released/${getSelectedCoachVoiceId({preferPendingCoach:!0})}/${getSelectedCoachLocale({preferPendingCoach:!0})}/${e}.mp3`}var w=o(4196);let{createEventEmitter:y}=o(327).EventEmitterUtil,C=y(),m={AssetNotFound:"HowlerEvents.AssetNotFound",ReadyForMove:"HowlerEvents.ReadyForMove"};class v{assets;howler=null;useAudioElement=!1;constructor(e,t=!1){/^((?!chrome|android).)*safari/i.test(navigator.userAgent)?this.assets=e.filter(e=>e.endsWith("mp3")).concat(e.filter(e=>!e.endsWith("mp3"))):this.assets=e;this.useAudioElement=t}fade(){if(this.howler){let e=200;this.howler.fade(1,0,e);setTimeout(()=>this.howler?.stop(),e)}}load(){this.unload();this.howler||(this.howler=new w.Howl({html5:this.useAudioElement,src:this.assets,onloaderror:()=>{console.warn("Howler: sounds failed to load, falling back to html5 audio");this.howler=new w.Howl({html5:!0,src:this.assets,onloaderror:(e,t)=>{4===t&&C.emit(m.AssetNotFound,this.assets);console.error("Howler: html5 audio fallback failed to load")}})}}))}unload(){this.howler?.unload()}play(){this.howler||this.load();this.howler?.volume(1);this.howler?.play();if(window.Cypress){window.Cypress.howlerHistory||(window.Cypress.howlerHistory=[]);window.Cypress.howlerHistory.push({time:Date.now(),src:this.assets.slice(0)})}}}var A=/* @__PURE__ */(e=>(e.Suspended="web-ui-sound-suspended",e.Enabled="web-ui-sound-enabled",e))(A||{});let E=window.chesscom||{},k=window.AudioContext||window.webkitAudioContext,b=!!k;function newAudioContext(){try{return new k}catch(e){return null}}function isSuspended(){return b}function resumeAudio(e){if(k){E.audioContext||(E.audioContext=newAudioContext());if(!E.audioContext||!E.audioContext.resume){b=!1;e();return}E.audioContext.resume().then(()=>{b=!1;e()})}}let x=["mousedown","keydown","touchstart","touchend"],I=!1;function addWindowEvents(e){if(!I){I=!0;x.forEach(t=>window.addEventListener(t,e))}}function removeWindowEvents(e){if(I){I=!1;x.forEach(t=>window.removeEventListener(t,e))}}function waitMessage(e,t){function listener(o){if(o?.data?.key===e){t();window.removeEventListener("message",listener)}}window.addEventListener("message",listener)}function enableSound(){isSuspended()&&resumeAudio(()=>{window.postMessage({key:A.Enabled},window.location.origin);removeWindowEvents(enableSound)})}function loadSound(e,t=!1){let o=new v(e,t);if(isSuspended()){addWindowEvents(enableSound);waitMessage(A.Enabled,()=>o.load())}else o.load();return o}let L=0,F=!1;function playSound(e){if(isSuspended()){if(!F&&L>3){L=0;F=!0;window.postMessage({key:A.Suspended},window.location.origin)}else if(!F){L++;enableSound();waitMessage(A.Enabled,()=>e.play())}}else e.play()}async function preloadHashSounds({hashes:e}){let t=e.map(async(t,o)=>{if(!h.coachAudio.loadedSounds[e[o]]){let a=getCoachPhraseUrl({hash:t});h.coachAudio.loadedSounds[e[o]]=loadSound([a])}});await Promise.all(t)}function stopSpeaking(){h.coachAudio.activeSound&&h.coachAudio.activeSound.fade()}async function speakInternal({phrases:e,hashes:t,idx:o={phrase:0,hash:0}}){stopSpeaking();let a=t[o.hash]?t[o.hash]:e[o.phrase];h.coachAudio.currentPhrase=e[o.phrase];h.coachAudio.currentPhraseHash=t[o.hash];if(h.coachAudio.loadedSounds[a]){h.coachAudio.activeSound=h.coachAudio.loadedSounds[a];if(h.coachAudio.activeSound?.howler){playSound(h.coachAudio.activeSound);h.coachAudio.activeSound.howler.off("end");t[o.hash+1]||e[o.phrase+1]?h.coachAudio.activeSound.howler.on("end",()=>{speakInternal({phrases:e,hashes:t,idx:{hash:Math.min(t.length,o.hash+1),phrase:Math.min(e.length,o.phrase+1)}})}):h.coachAudio.activeSound.howler.on("end",()=>{C.emit(m.ReadyForMove)})}}}function isCoachAudioEnabled(){return h.coachAudio.isEnabled}function isCoachAudioFeatureAvailable(){if(!(0,S.M3)())return!1;let e=getSelectedCoach();return!!e?.voiceId}function shouldSpeak(){return!!p.I.coachAudio&&isCoachAudioEnabled()&&p.I.coachAudio.shouldSpeak()&&isCoachAudioFeatureAvailable()}function speakHashes({hashes:e,phrases:t,delay:o=300}){stopSpeaking();if(e.length&&shouldSpeak()){if(window.playwright){window.playwright.audioHashes||(window.playwright.audioHashes=[]);e[0]&&window.playwright.audioHashes.push(e[0]);s.z.emit(n.S.OnSpeak,{phrases:e});return}h.coachAudio.speechTimeout&&clearTimeout(h.coachAudio.speechTimeout);preloadHashSounds({hashes:e}).then(()=>{h.coachAudio.speechTimeout=setTimeout(()=>speakInternal({hashes:e,phrases:t}),o)});s.z.emit(n.S.OnSpeak,{phrases:e})}}var P=o(4619);function speakNextTagline(e){let{text:t,audioUrlHash:o}=getNextTagline(e);h.pendingCoachMessage=t;speakHashes({phrases:[t],hashes:[o]})}function getNextTagline(e){let t=e?.taglines;if(!t||!e?.id)return{text:(0,P.pw)("Learning as you play is a great way to improve! Let's begin!"),audioUrlHash:""};let o=h.speechLineTally[e.id]||0,a=t[o],n=(o+1)%t.length;return h.speechLineTally[e.id]=n,a}function addCoachListeners(){s.z.on(n.S.OnCoachModalClose,()=>{resetSpeechLineTally();stopSpeaking()});p.I.cee&&s.z.once(n.S.OnCoachLoaded,async()=>{await fetchCurrentCoachSpeechAssets();loadCoachAssetsIntoCee()});s.z.on(n.S.OnCoachModalOpen,()=>{isCelebrityCoachesEnabled()&&speakNextTagline(getSelectedCoach());loadCoachesByCategoryResource()});s.z.on(n.S.OnSetPendingCoach,()=>{speakNextTagline(getSelectedCoach({preferPendingCoach:!0}))})}function getCurrentPhrase(){return h.coachAudio.currentPhrase}function getCurrentPhraseHash(){return h.coachAudio.currentPhraseHash}function getSelectedCoachId(){return getSelectedCoach()?.id??null}async function onAssetNotFound(e){if(!isCoachAudioEnabled()||!getSelectedCoachVoiceId())return;C.emit(m.ReadyForMove);let t=getCurrentPhraseHash(),o=getCurrentPhrase(),a=getSelectedCoachId();try{await g.A.get(e[0])}catch(e){e.response?.status===404&&o&&(0,f.C)(Error("Failed to load sound for phrase"),{phrase:o,phraseHash:t,coachId:a})}}function stopSpeakingAndPrepareNextMove(){stopSpeaking();C.emit(m.ReadyForMove)}let T={LocalStorage:"LocalStorage",SettingsService:"SettingsService",ThemesService:"ThemesService"},H={key:"learn.enable_coach_voice",edit:{type:"switch"},read:[{source:T.SettingsService}],write:[{source:T.SettingsService}]};function getTypedKeys(e){return Object.keys(e)}let M=(0,l.reactive)({loadedSettings:getLoadedSettings(),changedSettings:[],failedSettings:[],loadingSettings:[],localOverwrites:{}});function getLoadedSettings(){let e=window.chesscom?.settings;return e?getTypedKeys(e).map(t=>({key:t,value:e[t]})):[]}var O=o(1055);function getSetting(e){let t=(0,O.Kg)(e)?e:e.key;if(t in M.localOverwrites)return M.localOverwrites[t];let o=M.loadedSettings.find(e=>e.key===t);return o?.value}function onSettingsUpdate({settings:e}){if(e.includes(H.key)){h.coachAudio.isEnabled=getSetting(H.key);h.coachAudio.isEnabled||stopSpeakingAndPrepareNextMove()}}function createWatcherPromise(e){let t,o;if((0,O.Tn)(e))t=e;else{t=e.handler;o=e.timeout}return new Promise((e,a)=>{let n;function cleanupWatch(){n?n():setTimeout(cleanupWatch)}function resolveAndUnwatch(t){e(t);cleanupWatch()}function rejectAndUnwatch(e){a(e);cleanupWatch()}function watchHandler(){t(resolveAndUnwatch,rejectAndUnwatch)}(0,O.Et)(o)&&setTimeout(rejectAndUnwatch,o,Error("watcher promise timeout"));n=(0,l.watchEffect)(watchHandler)})}function waitForSettings(e){return createWatcherPromise((t,o)=>{let a=e.some(e=>M.failedSettings.includes((0,O.Kg)(e)?e:e.key));if(a){o(Error("settings failed to load"));return}e.every(e=>{let t=(0,O.Kg)(e)?e:e.key;return M.loadedSettings.some(e=>e.key===t)})&&t()})}let _={Load:"Load",Update:"Update"},U=(0,i.createQueuedEmitter)();async function readSettingsFromLocalStorage(e){if(!e.length)return[];let t=[],o={};return e.forEach(({key:e,read:a})=>{if(a.source===T.LocalStorage){let n;if(a.storageKey){if(!o[a.storageKey])try{o[a.storageKey]=JSON.parse(localStorage.getItem(a.storageKey)||"")}catch{}o[a.storageKey]&&a.key in o[a.storageKey]&&(n=o[a.storageKey][a.key])}else n=localStorage.getItem(a.key);t.push({key:e,value:a.transform?a.transform(n):n})}}),t}var N=o(3932),$=o(5969);let K="settingsHttpCache";function clearSettingsCache(e){let t=localStorage.getItem(K)||"{}",o={};try{o=JSON.parse(t)??{}}catch{}delete o[e];try{localStorage.setItem(K,JSON.stringify(o))}catch{localStorage.removeItem(K)}}function getEntriesFromData(e,t){return e.map(e=>{let o=e.read.key??e.key,a=e.read.transform?e.read.transform(t[o]):t[o];return{key:e.key,value:a}})}function getSettingsCache(e,t){let o=localStorage.getItem(K)||"{}";try{return JSON.parse(o)?.[e]?.[t]??void 0}catch{return}}function saveSettingsCache(e,t,o,a){let n=localStorage.getItem(K)||"{}",s={};try{s=JSON.parse(n)??{}}catch{}s[e]??={};s[e][t]={tag:o,settings:a};try{localStorage.setItem(K,JSON.stringify(s))}catch{localStorage.removeItem(K)}}async function readSettingsFromSettingsService(e){let t,o;if(!e.length)return[];let a=window.context.user.uuid,n=e.map(({key:e})=>e).sort().join(","),s=getSettingsCache(a,n),r={"Cache-Control":"max-age=604800"};s?.tag&&(r["If-None-Match"]=s.tag);try{let e=await (0,$.h)({method:"get",path:"users/me",service:N.YK.Settings,params:{include:n},headers:r});t=e.data;o=e.headers}catch(e){if(e.response?.status===304&&s?.settings)t=s.settings;else throw e}return s?.tag&&o?.etag&&clearSettingsCache(a),o?.etag&&saveSettingsCache(a,n,o.etag,t),getEntriesFromData(e,t)}var R=o(699);async function readSettingsFromThemesService(e){return e.length?getEntriesFromData(e,await R.e.load()):[]}function getSettingsReadBySource(e){let t={[T.LocalStorage]:[],[T.SettingsService]:[],[T.ThemesService]:[]};return e.forEach(e=>{let o=e.read.find(e=>!1!==e.enabled);o&&t[o.source].push({key:e.key,read:o})}),t}var W=o(381);async function readSettings(e){let t=getSettingsReadBySource(e),o=[],a=[],n={attempts:3,delay:e=>1e3*e};return await Promise.all([retry(readSettingsFromSettingsService,t[T.SettingsService],n,o,a),retry(readSettingsFromThemesService,t[T.ThemesService],n,o,a),retry(readSettingsFromLocalStorage,t[T.LocalStorage],{attempts:1},o,a)]),{loadedSettings:o,failedSettings:a}}async function retry(e,t,o,a,n){try{let n=await (0,W.t)(()=>e(t),o);a.push(...n)}catch(e){n.push(...t.map(e=>e.key))}}function removeFromArray(e,t){let o=(0,O.Tn)(t)?e.findIndex(t):e.indexOf(t);-1!==o&&e.splice(o,1)}async function loadSettings({settings:e,reload:t}){let o=e.filter(e=>M.loadingSettings.includes(e.key)),a=t?e:e.filter(e=>!M.loadedSettings.find(t=>t.key===e.key)&&!M.loadingSettings.includes(e.key));M.loadingSettings.push(...a.map(e=>e.key));let{loadedSettings:n,failedSettings:s}=await readSettings(a);o.length&&await waitForSettings(o);s.length&&(0,f.C)(Error("Failed to load settings"),{failedSettings:s});s.forEach(e=>{M.failedSettings.includes(e)||M.failedSettings.push(e)});n.forEach(e=>{let t=M.loadedSettings.find(t=>t.key===e.key);t?t.value=e.value:M.loadedSettings.push(e);removeFromArray(M.loadingSettings,e.key)});U.emit(_.Load,{settings:a.filter(e=>!s.includes(e.key))})}async function initCoachAudio(){C.on(m.AssetNotFound,onAssetNotFound);U.on(_.Update,onSettingsUpdate);if((0,S.M3)()){await loadSettings({settings:[H]});h.coachAudio.isEnabled=getSetting(H.key)}enableSound()}async function loadCurrentCoachResource(){try{await u.load();s.z.emit(n.S.OnCoachLoaded)}catch(e){e instanceof Error?reportError(e):reportError(Error(`Error thrown while loading current coach ${e}`))}}let z=(0,i.createClient)({init(){p.I.immediatelyLoadResources()&&loadCurrentCoachResource();p.I.coachAudio&&initCoachAudio();addCoachListeners()}})}}]);