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