Files
prod/frontend/dist/assets/ScreenView-DRfAj24V.js
T
2026-10-04 13:24:30 +07:00

1 line
9.2 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,t as ae,w as f,xt as p,y as m,zt as h}from"./client-Dr2LhGo3.js";import{t as g}from"./Card-C2NfeMd7.js";import{t as _}from"./Button-DrSwbbPC.js";import{t as oe}from"./Select-DmL-LHJf.js";import{n as se,r as ce}from"./es-DzLJg_jB.js";import{t as le}from"./QrCode-C77qvj1J.js";import{t as ue}from"./HeaderMenu-BMv76IOe.js";import{t as v}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{r as y}from"./application-DXNAO2qx.js";import{t as de}from"./useSimplePolling-CNLkEswH.js";import{t as fe}from"./datetime-BJNH0M1T.js";var pe={key:0,class:`screen-center`},me={key:1,class:`screen-page`},he={key:0,class:`screen-center`},ge={key:0,class:`screen-center`},_e={key:0,class:`screen-qr`},ve={key:0,class:`media-error`},ye={key:1,class:`screen-media`},be=[`src`,`muted`],xe={key:2,class:`conclusion-screen`},Se=[`src`,`muted`],Ce={key:3,class:`screen-message`},we={key:4,class:`screen-message`},Te={key:5,class:`screen-message`},Ee={key:6,class:`screen-message`},De={key:7,class:`timer-screen`},Oe={class:`timer-label`},ke={class:`timer-value`},Ae={key:9,class:`screen-cover`},je=[`src`],Me={key:1,class:`cover-controls`},b=`evening-detective-screen-session`,x=v(r({__name:`ScreenPage`,setup(r){let v=ae(),x=se(),S=ce(),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(!1),W=u(),G=u(),K=0,q=null,J=f(()=>!!(C.query.screenID&&C.query.accessToken)),Y=f(()=>{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()}),Ne=f(()=>M.value.map(e=>({label:`${fe(e.startAt).split(`,`)[0]||`дата не указана`} — ${e.name||`Игра ${e.ID}`}`,value:e.ID}))),X=f(()=>E.value?.mode||`SCREEN_MODE_COVER`),Z=f(()=>E.value?.timerState===`SCREEN_TIMER_STATE_RUNNING`?Math.max(0,B.value-(z.value-V.value)/1e3):B.value),Pe=f(()=>{let e=Math.floor(Z.value/60),t=Math.floor(Z.value%60);return`${String(e).padStart(2,`0`)}:${String(t).padStart(2,`0`)}`}),Fe=f(()=>y(E.value?.introAudio)),Ie=f(()=>y(E.value?.conclusionVideo)),Le=f(()=>{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 Re(){sessionStorage.setItem(b,JSON.stringify({screenID:w.value,accessToken:T.value}))}function ze(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 Be(){try{let e=JSON.parse(sessionStorage.getItem(b)||`{}`);w.value=e.screenId||``,T.value=e.accessToken||``}catch{sessionStorage.removeItem(b)}}async function Q(){let e=await v.CreateScreenSession({});if(!e.screenID||!e.accessToken)throw Error(`Не удалось создать сессию экрана`);w.value=e.screenID,T.value=e.accessToken,Re()}async function $(e=!0){if(!(!w.value||!T.value))try{let e=await v.GetScreenState({screenID:w.value,accessToken:T.value});E.value=e.state,ze(E.value),E.value?.gameID&&E.value.mode===`SCREEN_MODE_RESULTS`&&await Ve()}catch(t){if(e&&t instanceof Error&&t.message===`unauthorized`){sessionStorage.removeItem(b),w.value=``,T.value=``,await Q(),await $(!1);return}S.error(t instanceof Error?t.message:`Не удалось получить состояние экрана`)}}async function Ve(){if(!w.value||!T.value)return;let e=await v.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 He(){try{let e=await x.GetGames({});M.value=e.games||[]}catch(e){S.error(e instanceof Error?e.message:`Не удалось загрузить игры`)}}de(()=>{U.value&&$()},1e3),ie(E,async e=>{if(!e||!e.command||e.stateVersion===K)return;K=e.stateVersion||0,await o();let t=X.value===`SCREEN_MODE_CONCLUSION`?G.value:W.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 Ue(){if(!(!N.value||!C.query.screenID||!C.query.accessToken)){L.value=!0;try{await x.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 We(){try{await document.documentElement.requestFullscreen?.()}catch{S.warning(`Полноэкранный режим недоступен в этом браузере`)}P.value=!0}return ee(async()=>{if(J.value){await He(),I.value=!1;return}Be();try{(!w.value||!T.value)&&await Q(),await $(),U.value=!0,q=window.setInterval(()=>{z.value=Date.now()},250)}catch(e){S.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{I.value=!1}}),re(()=>{q!=null&&window.clearInterval(q),A!=null&&window.clearInterval(A)}),(ee,r)=>(s(),i(m,null,[J.value?(s(),i(`div`,pe,[n(p(g),{class:`binding-card`,title:`Привязка экрана`},{default:l(()=>[R.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(oe),{value:N.value,"onUpdate:value":r[0]||=e=>N.value=e,options:Ne.value,placeholder:`Игра`},null,8,[`value`,`options`]),n(p(_),{type:`primary`,loading:L.value,disabled:N.value==null,onClick:Ue},{default:l(()=>[...r[3]||=[d(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(s(),i(`div`,me,[I.value?(s(),i(`div`,he,`Подготовка экрана…`)):(s(),i(m,{key:1},[E.value?.gameID?(s(),i(`div`,{key:1,class:`screen-content`,style:te(Le.value)},[F.value?(s(),i(`p`,ve,h(F.value),1)):e(``,!0),X.value===`SCREEN_MODE_INTRO`&&E.value.introAudio?(s(),i(`div`,ye,[a(`audio`,{ref_key:`introAudioElement`,ref:W,src:Fe.value,muted:!E.value.soundEnabled,controls:``},null,8,be)])):X.value===`SCREEN_MODE_CONCLUSION`&&E.value.conclusionVideo?(s(),i(`div`,xe,[a(`video`,{ref_key:`conclusionVideoElement`,ref:G,src:Ie.value,muted:!E.value.soundEnabled,playsinline:``},null,8,Se)])):X.value===`SCREEN_MODE_CONCLUSION`?(s(),i(`div`,Ce,`Видео закрывашки не задано`)):X.value===`SCREEN_MODE_INTRO_DONE`?(s(),i(`div`,we,`Успехов`)):X.value===`SCREEN_MODE_CONCLUSION_DONE`?(s(),i(`div`,Te,`Спасибо за игру!`)):X.value===`SCREEN_MODE_TEXT`?(s(),i(`div`,Ee,h(E.value.text),1)):X.value===`SCREEN_MODE_TIMER`?(s(),i(`div`,De,[a(`h1`,Oe,h(E.value.timerLabel||`Перерыв`),1),a(`div`,ke,h(Pe.value),1)])):X.value===`SCREEN_MODE_RESULTS`?(s(),i(`div`,{key:8,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(m,null,c(O.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(D.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(O.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`,Ae,[E.value.coverImage?(s(),i(`img`,{key:0,src:E.value.coverImage,class:`cover-image`,alt:`Обложка дела`},null,8,je)):e(``,!0),P.value?e(``,!0):(s(),i(`div`,Me,[n(p(_),{type:`primary`,onClick:We},{default:l(()=>[...r[12]||=[d(`Подготовить экран`,-1)]]),_:1})]))]))],4)):(s(),i(`div`,ge,[n(p(g),{class:`qr-card`,title:`Подключение экрана`},{default:l(()=>[Y.value?(s(),i(`div`,_e,[n(p(le),{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(p(_),{key:1,type:`primary`,onClick:We},{default:l(()=>[...r[5]||=[d(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),J.value?(s(),t(ue,{key:2,active:`games`})):e(``,!0)],64))}}),[[`__scopeId`,`data-v-ccd8d01d`]]),S=r({__name:`ScreenView`,setup(e){return(e,ee)=>(s(),t(x))}});export{S as default};