Files
prod/frontend/dist/assets/ScreenView-BLuCHZOp.js
T
2026-10-04 23:08:13 +07:00

1 line
9.2 KiB
JavaScript

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