Files
prod/frontend/dist/assets/ScreenView-inqywvkx.js
T
2026-10-03 20:39:03 +07:00

1 line
8.9 KiB
JavaScript

import{D as e,E as t,K as ee,M as n,N as r,O as i,Rt as te,T as a,V as o,Y as s,Z as c,at as l,gt as u,j as d,l as ne,q as re,rt as ie,w as f,xt as p,y as m,zt as h}from"./client-D4OUh_qg.js";import{t as g}from"./Card-DBIocgsk.js";import{t as _}from"./Button-BXlnMtYy.js";import{t as ae}from"./Select-D5gimYuZ.js";import{n as oe,r as se}from"./es-DG8HHPeF.js";import{t as ce}from"./QrCode-g-S7ajou.js";import{t as le}from"./HeaderMenu-CfpzFeZj.js";import{t as v}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{r as y}from"./application-zifn-37k.js";import{t as ue}from"./useSimplePolling-DBCHnikM.js";import{t as de}from"./datetime-BJNH0M1T.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={key:2,class:`conclusion-screen`},xe=[`src`,`muted`],Se={key:3,class:`screen-message`},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`},b=`evening-detective-screen-session`,x=v(r({__name:`ScreenPage`,setup(r){let v=oe(),x=se(),S=ne(),C=u(``),w=u(``),T=u(),E=u([]),D=u([]),O=u(),k,A=!1,j=u([]),M=u(null),N=u(!1),P=u(``),F=u(!0),I=u(!1),L=u(!1),R=u(Date.now()),z=u(0),B=u(Date.now()),V=u(),H=u(!1),U=u(),W=u(),G=0,K=null,q=f(()=>!!(S.query.screenID&&S.query.accessToken)),J=f(()=>{if(!C.value||!w.value)return``;let e=new URL(`/screen`,window.location.origin);return e.searchParams.set(`screenId`,C.value),e.searchParams.set(`accessToken`,w.value),e.toString()}),je=f(()=>j.value.map(e=>({label:`${de(e.startAt).split(`,`)[0]||`дата не указана`} — ${e.name||`Игра ${e.ID}`}`,value:e.ID}))),Y=f(()=>T.value?.mode||`SCREEN_MODE_COVER`),X=f(()=>T.value?.timerState===`SCREEN_TIMER_STATE_RUNNING`?Math.max(0,z.value-(R.value-B.value)/1e3):z.value),Me=f(()=>{let e=Math.floor(X.value/60),t=Math.floor(X.value%60);return`${String(e).padStart(2,`0`)}:${String(t).padStart(2,`0`)}`}),Z=f(()=>y(T.value?.introAudio)),Ne=f(()=>y(T.value?.conclusionVideo)),Pe=f(()=>{let e=T.value?.backgroundImage||T.value?.coverImage;return e?{backgroundImage:`linear-gradient(rgb(0 0 0 / 55%), rgb(0 0 0 / 55%)), url("${e}")`}:{}});function Fe(){sessionStorage.setItem(b,JSON.stringify({screenID:C.value,accessToken:w.value}))}function Ie(e){let t=Math.max(0,Number(e?.timerRemainingSeconds||0));if(e?.timerState===`SCREEN_TIMER_STATE_RUNNING`&&V.value===e.timerState){let e=Math.max(0,z.value-(Date.now()-B.value)/1e3);if(Math.abs(t-e)<=.5)return}z.value=t,B.value=Date.now(),V.value=e?.timerState}function Le(){try{let e=JSON.parse(sessionStorage.getItem(b)||`{}`);C.value=e.screenId||``,w.value=e.accessToken||``}catch{sessionStorage.removeItem(b)}}async function Re(){let e=await v.CreateScreenSession({});if(!e.screenID||!e.accessToken)throw Error(`Не удалось создать сессию экрана`);C.value=e.screenID,w.value=e.accessToken,Fe()}async function Q(){if(!(!C.value||!w.value))try{let e=await v.GetScreenState({screenID:C.value,accessToken:w.value});T.value=e.state,Ie(T.value),T.value?.gameID&&T.value.mode===`SCREEN_MODE_RESULTS`&&await ze()}catch(e){x.error(e instanceof Error?e.message:`Не удалось получить состояние экрана`)}}async function ze(){if(!C.value||!w.value)return;let e=await v.GetScreenResults({screenID:C.value,accessToken:w.value});if(D.value=e.questions||[],E.value=e.teams||[],!A){A=!0,await o();let e=O.value;e&&(e.scrollTop=e.scrollHeight,k=window.setInterval(()=>{e.scrollTop=Math.max(0,e.scrollTop-32),e.scrollTop===0&&k!=null&&(window.clearInterval(k),k=void 0)},1e3))}}async function Be(){try{let e=await v.GetGames({});j.value=e.games||[]}catch(e){x.error(e instanceof Error?e.message:`Не удалось загрузить игры`)}}ue(()=>{H.value&&Q()},1e3),ie(T,async e=>{if(!e||!e.command||e.stateVersion===G)return;G=e.stateVersion||0,await o();let t=Y.value===`SCREEN_MODE_CONCLUSION`?W.value:U.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(()=>{P.value=`Браузер заблокировал воспроизведение. Нажмите «Подготовить экран» на этом устройстве.`})):(e.command===`SCREEN_COMMAND_PAUSE`||e.command===`SCREEN_COMMAND_STOP`)&&t.pause()))});async function Ve(){if(!(!M.value||!S.query.screenID||!S.query.accessToken)){I.value=!0;try{await v.BindScreen({screenID:String(S.query.screenID),accessToken:String(S.query.accessToken),gameID:M.value}),L.value=!0}catch(e){x.error(e instanceof Error?e.message:`Не удалось привязать экран`)}finally{I.value=!1}}}async function $(){try{await document.documentElement.requestFullscreen?.()}catch{x.warning(`Полноэкранный режим недоступен в этом браузере`)}N.value=!0}return ee(async()=>{if(q.value){await Be(),F.value=!1;return}Le();try{(!C.value||!w.value)&&await Re(),await Q(),H.value=!0,K=window.setInterval(()=>{R.value=Date.now()},250)}catch(e){x.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{F.value=!1}}),re(()=>{K!=null&&window.clearInterval(K),k!=null&&window.clearInterval(k)}),(ee,r)=>(s(),i(m,null,[q.value?(s(),i(`div`,fe,[n(p(g),{class:`binding-card`,title:`Привязка экрана`},{default:l(()=>[L.value?(s(),i(m,{key:0},[r[1]||=a(`p`,null,`Экран привязан к игре.`,-1),r[2]||=a(`p`,null,`Можно закрыть эту страницу.`,-1)],64)):(s(),i(m,{key:1},[r[4]||=a(`p`,null,`Выберите игру, к которой привязать экран.`,-1),n(p(ae),{value:M.value,"onUpdate:value":r[0]||=e=>M.value=e,options:je.value,placeholder:`Игра`},null,8,[`value`,`options`]),n(p(_),{type:`primary`,loading:I.value,disabled:M.value==null,onClick:Ve},{default:l(()=>[...r[3]||=[d(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(s(),i(`div`,pe,[F.value?(s(),i(`div`,me,`Подготовка экрана…`)):(s(),i(m,{key:1},[T.value?.gameID?(s(),i(`div`,{key:1,class:`screen-content`,style:te(Pe.value)},[P.value?(s(),i(`p`,_e,h(P.value),1)):e(``,!0),Y.value===`SCREEN_MODE_INTRO`&&T.value.introAudio?(s(),i(`div`,ve,[a(`audio`,{ref_key:`introAudioElement`,ref:U,src:Z.value,muted:!T.value.soundEnabled,controls:``},null,8,ye)])):Y.value===`SCREEN_MODE_CONCLUSION`&&T.value.conclusionVideo?(s(),i(`div`,be,[a(`video`,{ref_key:`conclusionVideoElement`,ref:W,src:Ne.value,muted:!T.value.soundEnabled,playsinline:``},null,8,xe)])):Y.value===`SCREEN_MODE_CONCLUSION`?(s(),i(`div`,Se,`Видео закрывашки не задано`)):Y.value===`SCREEN_MODE_INTRO_DONE`?(s(),i(`div`,Ce,`Успехов`)):Y.value===`SCREEN_MODE_CONCLUSION_DONE`?(s(),i(`div`,we,`Спасибо за игру!`)):Y.value===`SCREEN_MODE_TIMER`?(s(),i(`div`,Te,[a(`h1`,Ee,h(T.value.timerLabel||`Перерыв`),1),a(`div`,De,h(Me.value),1)])):Y.value===`SCREEN_MODE_RESULTS`?(s(),i(`div`,{key:7,ref_key:`resultsContainer`,ref:O,class:`results-screen`},[r[11]||=a(`h1`,null,`Результаты`,-1),a(`table`,null,[a(`thead`,null,[a(`tr`,null,[r[7]||=a(`th`,null,`Место`,-1),r[8]||=a(`th`,null,`Команда`,-1),(s(!0),i(m,null,c(D.value,e=>(s(),i(`th`,{key:e.code},h(e.code),1))),128)),r[9]||=a(`th`,null,`Сумма`,-1),r[10]||=a(`th`,null,`Ходы`,-1)])]),a(`tbody`,null,[(s(!0),i(m,null,c(E.value,e=>(s(),i(`tr`,{key:e.team?.ID},[a(`td`,null,h(e.place),1),a(`td`,null,h(e.team?.name),1),(s(!0),i(m,null,c(D.value,t=>(s(),i(`td`,{key:t.code},h(e.answers?.find(e=>e.questionCode===t.code)?.score??0),1))),128)),a(`td`,null,h(e.totalScore),1),a(`td`,null,h(e.actionsCount),1)]))),128))])])],512)):(s(),i(`div`,Oe,[T.value.coverImage?(s(),i(`img`,{key:0,src:T.value.coverImage,class:`cover-image`,alt:`Обложка дела`},null,8,ke)):e(``,!0),N.value?e(``,!0):(s(),i(`div`,Ae,[n(p(_),{type:`primary`,onClick:$},{default:l(()=>[...r[12]||=[d(`Подготовить экран`,-1)]]),_:1})]))]))],4)):(s(),i(`div`,he,[n(p(g),{class:`qr-card`,title:`Подключение экрана`},{default:l(()=>[J.value?(s(),i(`div`,ge,[n(p(ce),{value:J.value,size:260,padding:0},null,8,[`value`])])):e(``,!0),r[6]||=a(`p`,null,`Отсканируйте QR телефоном организатора и выберите игру.`,-1),N.value?e(``,!0):(s(),t(p(_),{key:1,type:`primary`,onClick:$},{default:l(()=>[...r[5]||=[d(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),q.value?(s(),t(le,{key:2,active:`games`})):e(``,!0)],64))}}),[[`__scopeId`,`data-v-da62c446`]]),S=r({__name:`ScreenView`,setup(e){return(e,ee)=>(s(),t(x))}});export{S as default};