Files
prod/frontend/dist/assets/ScreenView-B4XZDHvf.js
T
2026-10-19 03:06:03 +07:00

1 line
11 KiB
JavaScript

import{Ct as e,Dt as t,Jt as n,Kt as r,Ot as i,Rn as a,Rt as o,St as s,Ut as c,Wt as ee,an as l,bt as u,gn as d,ht as f,kt as p,l as te,nn as m,on as h,t as ne,wt as g,xn as _,xt as v,zn as y}from"./client-VkQzMNpm.js";import{t as b}from"./Card-7Tw3fol6.js";import{r as re}from"./ui-BD3eDz7w.js";import{t as x}from"./Button-DqKYIN7y.js";import{t as ie}from"./Select-De2gmkuB.js";import{t as S}from"./_plugin-vue_export-helper-CKnPETe0.js";import{t as ae}from"./QrCode-CBeGB6cB.js";import{i as oe,lt as se,r as ce}from"./index-B7vdNr-Q.js";import{t as le}from"./HeaderMenu-5Mqj2OSx.js";import{r as C}from"./application-BHnktzA4.js";import{t as ue}from"./datetime-BJNH0M1T.js";import{t as de}from"./useDeviceContext-BpiRkRBq.js";var fe={key:0,class:`screen-center`},pe={key:1,class:`screen-page`},me={key:0,class:`screen-center`},he={key:0,class:`screen-center`},ge={key:0,class:`screen-qr`},_e={key:0,class:`media-error`},ve={key:1,class:`screen-media`},ye=[`src`,`muted`],be=[`src`,`muted`],xe={key:3,class:`conclusion-screen`},Se=[`src`,`muted`],Ce={key:4,class:`screen-message`},we={key:5,class:`screen-message`},Te={key:6,class:`timer-screen`},Ee={class:`timer-label`},De={class:`timer-value`},Oe={key:8,class:`screen-cover`},ke=[`src`],Ae={key:1,class:`cover-controls`},w=`evening-detective-screen-session`,T=S(p({__name:`ScreenPage`,setup(p){let S=ne(),T=oe(),E=re(),D=te(),O=d(``),k=d(``),A=d(),j=d([]),M=d([]),N=d(),P,F=!1,I=d([]),L=d(null),R=d(!1),z=d(``),B=d(!0),V=d(!1),H=d(!1),U=d(Date.now()),W=d(0),G=d(Date.now()),je=d(),Me=d(!1),K=d(),q=d(),J=d(),Ne=0,Y=null,X=u(()=>!!(D.query.screenID&&D.query.accessToken));de(()=>O.value&&k.value&&!X.value?{screenID:O.value,accessToken:k.value}:{});let Pe=u(()=>{if(!O.value||!k.value)return``;let e=new URL(`/screen`,window.location.origin);return e.searchParams.set(`screenId`,O.value),e.searchParams.set(`accessToken`,k.value),e.toString()}),Fe=u(()=>I.value.map(e=>({label:`${ue(e.startAt).split(`,`)[0]||`дата не указана`} — ${e.name||`Игра ${e.ID}`}`,value:e.ID}))),Z=u(()=>A.value?.mode||`SCREEN_MODE_COVER`),Ie=u(()=>A.value?.timerState===`SCREEN_TIMER_STATE_RUNNING`?Math.max(0,W.value-(U.value-G.value)/1e3):W.value),Le=u(()=>{let e=Math.floor(Ie.value/60),t=Math.floor(Ie.value%60);return`${String(e).padStart(2,`0`)}:${String(t).padStart(2,`0`)}`}),Re=u(()=>C(A.value?.introAudio)),ze=u(()=>C(A.value?.conclusionVideo)),Be=u(()=>C((A.value?.music?.playlist?.tracks||[])[A.value?.music?.trackIndex||0]?.filename)),Ve=u(()=>[A.value?.music?.playlist?.ID,A.value?.music?.trackIndex,A.value?.music?.playback]),He=u(()=>{let e=A.value?.backgroundImage||A.value?.coverImage;return e?{backgroundImage:`linear-gradient(rgb(0 0 0 / 55%), rgb(0 0 0 / 55%)), url("${e}")`}:{}});function Ue(){sessionStorage.setItem(w,JSON.stringify({screenID:O.value,accessToken:k.value}))}function We(e){let t=Math.max(0,Number(e?.timerRemainingSeconds||0));if(e?.timerState===`SCREEN_TIMER_STATE_RUNNING`&&je.value===e.timerState){let e=Math.max(0,W.value-(Date.now()-G.value)/1e3);if(Math.abs(t-e)<=.5)return}W.value=t,G.value=Date.now(),je.value=e?.timerState}function Ge(){try{let e=JSON.parse(sessionStorage.getItem(w)||`{}`);O.value=e.screenId||``,k.value=e.accessToken||``}catch{sessionStorage.removeItem(w)}}async function Ke(){let e=await S.CreateScreenSession({});if(!e.screenID||!e.accessToken)throw Error(`Не удалось создать сессию экрана`);O.value=e.screenID,k.value=e.accessToken,Ue()}async function Q(e=!0){if(!(!O.value||!k.value))try{let e=await S.GetScreenState({screenID:O.value,accessToken:k.value});A.value=e.state,We(A.value),A.value?.gameID&&A.value.mode===`SCREEN_MODE_RESULTS`&&await qe()}catch(t){if(e&&t instanceof Error&&t.message===`unauthorized`){sessionStorage.removeItem(w),O.value=``,k.value=``,await Ke(),await Q(!1);return}E.error(t instanceof Error?t.message:`Не удалось получить состояние экрана`)}}async function qe(){if(!O.value||!k.value)return;let e=await S.GetScreenResults({screenID:O.value,accessToken:k.value});if(M.value=e.questions||[],j.value=e.teams||[],!F){F=!0,await o();let e=N.value;e&&(e.scrollTop=e.scrollHeight,P=window.setInterval(()=>{e.scrollTop=Math.max(0,e.scrollTop-32),e.scrollTop===0&&P!=null&&(window.clearInterval(P),P=void 0)},1e3))}}async function Je(){try{let e=await T.GetGames({});I.value=e.games||[]}catch(e){E.error(e instanceof Error?e.message:`Не удалось загрузить игры`)}}ce(()=>{Me.value&&Q()},1e3),m(A,async e=>{if(!e||!e.command||e.stateVersion===Ne)return;Ne=e.stateVersion||0,await o();let t=Z.value===`SCREEN_MODE_CONCLUSION`?J.value:K.value;t&&(t.currentTime=(e.positionMs||0)/1e3,t.volume=Math.max(0,Math.min(1,(e.volume??100)/100)),e.command!==`SCREEN_COMMAND_SEEK`&&e.command!==`SCREEN_COMMAND_VOLUME`&&(e.command===`SCREEN_COMMAND_PLAY`||e.command===`SCREEN_COMMAND_RESUME`||e.command===`SCREEN_COMMAND_REPLAY`?(e.command===`SCREEN_COMMAND_REPLAY`&&(t.currentTime=0),t.play().catch(()=>{z.value=`Браузер заблокировал воспроизведение. Нажмите «Подготовить экран» на этом устройстве.`})):(e.command===`SCREEN_COMMAND_PAUSE`||e.command===`SCREEN_COMMAND_STOP`)&&t.pause()))});function Ye(e){return e.readyState>=HTMLMediaElement.HAVE_METADATA?Promise.resolve():new Promise(t=>{let n=()=>{e.removeEventListener(`loadedmetadata`,n),e.removeEventListener(`error`,n),t()};e.addEventListener(`loadedmetadata`,n,{once:!0}),e.addEventListener(`error`,n,{once:!0})})}m(Ve,async(e,t)=>{let n=A.value?.music;if(!n||!n.playlist?.tracks?.length)return;await o();let r=q.value;if(!r)return;let i=!t||e[0]!==t[0]||e[1]!==t[1],a=!t||e[2]!==t[2];!i&&!a||(await Ye(r),r.currentTime=i?0:(n.positionMs||0)/1e3,n.playback===`MUSIC_PLAYBACK_PLAYING`?r.play().catch(()=>{z.value=`Браузер заблокировал воспроизведение музыки. Нажмите «Подготовить экран».`}):r.pause())},{immediate:!0}),m(()=>[A.value?.music?.volume,A.value?.soundEnabled],([e,t])=>{let n=q.value;n&&(n.volume=Math.max(0,Math.min(1,(e??100)/100)),n.muted=!t)},{immediate:!0});async function Xe(){if(!(!O.value||!k.value))try{await S.AdvanceScreenMusic({screenID:O.value,accessToken:k.value})}catch{z.value=`Не удалось синхронизировать музыку. Повторная попытка выполняется автоматически.`}}async function Ze(){if(!(!L.value||!D.query.screenID||!D.query.accessToken)){V.value=!0;try{await T.BindScreen({screenID:String(D.query.screenID),accessToken:String(D.query.accessToken),gameID:L.value,initializeAudio:!1}),H.value=!0}catch(e){E.error(e instanceof Error?e.message:`Не удалось привязать экран`)}finally{V.value=!1}}}async function $(){try{await document.documentElement.requestFullscreen?.()}catch{E.warning(`Полноэкранный режим недоступен в этом браузере`)}R.value=!0,await o();for(let e of[K.value,J.value,q.value])if(e){e.muted=!0;try{await e.play(),e.pause(),e.currentTime=0,e.muted=!A.value?.soundEnabled}catch{z.value=`Браузер не разрешил подготовить воспроизведение на этом устройстве.`}}}return c(async()=>{if(X.value){await Je(),B.value=!1;return}Ge();try{(!O.value||!k.value)&&await Ke(),await Q(),Me.value=!0,Y=window.setInterval(()=>{U.value=Date.now()},250)}catch(e){E.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{B.value=!1}}),ee(()=>{Y!=null&&window.clearInterval(Y),P!=null&&window.clearInterval(P)}),(o,c)=>(r(),g(f,null,[X.value?(r(),g(`div`,fe,[i(_(b),{class:`binding-card`,title:`Привязка экрана`},{default:l(()=>[H.value?(r(),g(f,{key:0},[c[1]||=v(`p`,null,`Экран привязан к игре.`,-1),c[2]||=v(`p`,null,`Можно закрыть эту страницу.`,-1)],64)):(r(),g(f,{key:1},[c[4]||=v(`p`,null,`Выберите игру, к которой привязать экран.`,-1),i(_(ie),{value:L.value,"onUpdate:value":c[0]||=e=>L.value=e,options:Fe.value,placeholder:`Игра`},null,8,[`value`,`options`]),i(_(x),{type:`primary`,loading:V.value,disabled:L.value==null,onClick:Ze},{default:l(()=>[...c[3]||=[t(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(r(),g(`div`,pe,[B.value?(r(),g(`div`,me,`Подготовка экрана…`)):(r(),g(f,{key:1},[A.value?.gameID?(r(),g(`div`,{key:1,class:`screen-content`,style:a(He.value)},[z.value?(r(),g(`p`,_e,y(z.value),1)):e(``,!0),A.value.introAudio?h((r(),g(`div`,ve,[v(`audio`,{ref_key:`introAudioElement`,ref:K,src:Re.value,muted:!A.value.soundEnabled,controls:``},null,8,ye)],512)),[[se,Z.value===`SCREEN_MODE_INTRO`]]):e(``,!0),A.value.music?.playlist?.tracks?.length?(r(),g(`audio`,{key:2,ref_key:`musicAudioElement`,ref:q,src:Be.value,muted:!A.value.soundEnabled,onEnded:Xe},null,40,be)):e(``,!0),A.value.conclusionVideo?h((r(),g(`div`,xe,[v(`video`,{ref_key:`conclusionVideoElement`,ref:J,src:ze.value,muted:!A.value.soundEnabled,playsinline:``},null,8,Se)],512)),[[se,Z.value===`SCREEN_MODE_CONCLUSION`]]):e(``,!0),Z.value===`SCREEN_MODE_CONCLUSION`&&!A.value.conclusionVideo?(r(),g(`div`,Ce,`Видео закрывашки не задано`)):e(``,!0),Z.value===`SCREEN_MODE_TEXT`?(r(),g(`div`,we,y(A.value.text),1)):e(``,!0),Z.value===`SCREEN_MODE_TIMER`?(r(),g(`div`,Te,[v(`h1`,Ee,y(A.value.timerLabel||`Перерыв`),1),v(`div`,De,y(Le.value),1)])):e(``,!0),Z.value===`SCREEN_MODE_RESULTS`?(r(),g(`div`,{key:7,ref_key:`resultsContainer`,ref:N,class:`results-screen`},[c[11]||=v(`h1`,null,`Результаты`,-1),v(`table`,null,[v(`thead`,null,[v(`tr`,null,[c[7]||=v(`th`,null,`Место`,-1),c[8]||=v(`th`,null,`Команда`,-1),(r(!0),g(f,null,n(M.value,e=>(r(),g(`th`,{key:e.code},y(e.code),1))),128)),c[9]||=v(`th`,null,`Сумма`,-1),c[10]||=v(`th`,null,`Ходы`,-1)])]),v(`tbody`,null,[(r(!0),g(f,null,n(j.value,e=>(r(),g(`tr`,{key:e.team?.ID},[v(`td`,null,y(e.place),1),v(`td`,null,y(e.team?.name),1),(r(!0),g(f,null,n(M.value,t=>(r(),g(`td`,{key:t.code},y(e.answers?.find(e=>e.questionCode===t.code)?.score??0),1))),128)),v(`td`,null,y(e.totalScore),1),v(`td`,null,y(e.actionsCount),1)]))),128))])])],512)):e(``,!0),Z.value===`SCREEN_MODE_COVER`?(r(),g(`div`,Oe,[A.value.coverImage?(r(),g(`img`,{key:0,src:A.value.coverImage,class:`cover-image`,alt:`Обложка дела`},null,8,ke)):e(``,!0),R.value?e(``,!0):(r(),g(`div`,Ae,[i(_(x),{type:`primary`,onClick:$},{default:l(()=>[...c[12]||=[t(`Подготовить экран`,-1)]]),_:1})]))])):e(``,!0)],4)):(r(),g(`div`,he,[i(_(b),{class:`qr-card`,title:`Подключение экрана`},{default:l(()=>[Pe.value?(r(),g(`div`,ge,[i(_(ae),{value:Pe.value,size:260,padding:0},null,8,[`value`])])):e(``,!0),c[6]||=v(`p`,null,`Отсканируйте QR телефоном организатора и выберите игру.`,-1),R.value?e(``,!0):(r(),s(_(x),{key:1,type:`primary`,onClick:$},{default:l(()=>[...c[5]||=[t(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),X.value?(r(),s(le,{key:2,active:`games`})):e(``,!0)],64))}}),[[`__scopeId`,`data-v-285e03fe`]]),E=p({__name:`ScreenView`,setup(e){return(e,t)=>(r(),s(T))}});export{E as default};