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