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