generated from VLADIMIR/template_frontend
1 line
8.6 KiB
JavaScript
1 line
8.6 KiB
JavaScript
import{B as e,D as t,Dt as n,E as r,Et as i,H as a,P as o,Q as s,S as c,T as l,W as ee,X as te,a as u,b as d,it as f,lt as p,p as m,v as h,x as g,y as _,z as ne}from"./vue-router-bPs2Bq2h.js";import{t as v}from"./Card-CWgj08oh.js";import{t as y}from"./Button-qfcOTQ-R.js";import{t as b}from"./Select-DCGbXc8g.js";import{t as x}from"./use-message-DNYN5yWF.js";import{t as S}from"./QrCode-c3qDqmj4.js";import{i as re,n as C,t as ie}from"./HeaderMenu-DOd51pLB.js";import{r as w}from"./application-Cn6gcvZk.js";import{t as ae}from"./datetime-BJNH0M1T.js";var oe={key:0,class:`screen-center`},se={key:1,class:`screen-page`},ce={key:0,class:`screen-center`},le={key:0,class:`screen-center`},ue={key:0,class:`screen-qr`},de={key:0,class:`media-error`},fe={key:1,class:`screen-media`},pe={class:`cassette`},me=[`src`,`muted`],he={key:2,class:`screen-media`},ge=[`src`,`muted`],_e={key:3,class:`screen-message`},ve={key:4,class:`screen-message`},ye={key:5,class:`screen-message`},be={key:6,class:`results-screen`},xe={key:7,class:`screen-cover`},Se=[`src`],Ce={class:`cover-label`},T=`evening-detective-screen-session`,E=C(t({__name:`ScreenPage`,setup(t){let C=re(),E=x(),D=u(),O=f(``),k=f(``),A=f(),j=f([]),M=f([]),N=f(null),P=f(!1),F=f(``),I=f(!0),L=f(!1),R=f(!1),z=f(),B=f(),V=f(),H=0,U,W,G,K=0,q=null,J=h(()=>!!(D.query.screenId&&D.query.accessToken)),Y=h(()=>{if(!O.value||!k.value)return``;let e=new URL(`/screen`,window.location.origin);return e.searchParams.set(`screenId`,O.value),e.searchParams.set(`accessToken`,k.value),e.toString()}),we=h(()=>M.value.map(e=>({label:`${ae(e.startAt).split(`,`)[0]||`дата не указана`} — ${e.name||`Игра ${e.id}`}`,value:e.id}))),X=h(()=>A.value?.mode||`SCREEN_MODE_COVER`),Te=h(()=>w(A.value?.introAudio)),Ee=h(()=>w(A.value?.conclusionVideo)),De=h(()=>A.value?.coverImage?{backgroundImage:`linear-gradient(rgb(0 0 0 / 55%), rgb(0 0 0 / 55%)), url("${A.value.coverImage}")`}:{});function Oe(){sessionStorage.setItem(T,JSON.stringify({screenId:O.value,accessToken:k.value}))}function ke(){try{let e=JSON.parse(sessionStorage.getItem(T)||`{}`);O.value=e.screenId||``,k.value=e.accessToken||``}catch{sessionStorage.removeItem(T)}}async function Z(){let e=await C.CreateScreenSession({});if(e.error||!e.screenId||!e.accessToken)throw Error(e.error||`Не удалось создать сессию экрана`);O.value=e.screenId,k.value=e.accessToken,Oe()}async function Q(){if(!(!O.value||!k.value))try{let e=await C.GetScreenState({screenId:O.value,accessToken:k.value});if(e.error)throw Error(e.error);A.value=e.state,A.value?.mode===`SCREEN_MODE_RESULTS`&&await Ae()}catch(e){E.error(e instanceof Error?e.message:`Не удалось получить состояние экрана`)}}async function Ae(){if(!O.value||!k.value)return;let e=await C.GetScreenResults({screenId:O.value,accessToken:k.value});e.error==``&&(j.value=e.teams||[])}async function je(){try{let e=await C.GetGames({});if(e.error)throw Error(e.error);M.value=e.games||[]}catch(e){E.error(e instanceof Error?e.message:`Не удалось загрузить игры`)}}function Me(){let e=z.value,t=V.value;if(!(!e||!t||G))try{U=new AudioContext,W=U.createAnalyser(),W.fftSize=64,G=U.createMediaElementSource(e),G.connect(W),W.connect(U.destination);let n=new Uint8Array(W.frequencyBinCount),r=()=>{if(!W||!V.value)return;let e=V.value.getContext(`2d`);if(!e)return;W.getByteFrequencyData(n),e.clearRect(0,0,t.width,t.height);let i=t.width/n.length;n.forEach((n,r)=>{let a=n/255*t.height;e.fillStyle=`hsl(${160+r*3} 70% 60%)`,e.fillRect(r*i,t.height-a,Math.max(2,i-1),a)}),K=requestAnimationFrame(r)};r()}catch{}}te(A,async e=>{if(!e||!e.command||e.stateVersion===H)return;H=e.stateVersion||0,await o(),Me();let t=X.value===`SCREEN_MODE_CONCLUSION`?B.value:z.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 Ne(){if(!(!N.value||!D.query.screenId||!D.query.accessToken)){L.value=!0;try{let e=await C.BindScreen({screenId:String(D.query.screenId),accessToken:String(D.query.accessToken),gameId:N.value});if(e.error)throw Error(e.error);R.value=!0}catch(e){E.error(e instanceof Error?e.message:`Не удалось привязать экран`)}finally{L.value=!1}}}async function $(){try{await document.documentElement.requestFullscreen?.()}catch{E.warning(`Полноэкранный режим недоступен в этом браузере`)}P.value=!0}return ne(async()=>{if(J.value){await je(),I.value=!1;return}ke();try{(!O.value||!k.value)&&await Z(),await Q(),q=window.setInterval(Q,1e3)}catch(e){E.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{I.value=!1}}),e(()=>{q!=null&&window.clearInterval(q),cancelAnimationFrame(K),U?.close()}),(e,t)=>(a(),c(m,null,[J.value?(a(),c(`div`,oe,[r(p(v),{class:`binding-card`,title:`Привязка экрана`},{default:s(()=>[R.value?(a(),c(m,{key:0},[t[1]||=_(`p`,null,`Экран привязан к игре.`,-1),t[2]||=_(`p`,null,`Можно закрыть эту страницу.`,-1)],64)):(a(),c(m,{key:1},[t[4]||=_(`p`,null,`Выберите игру, к которой привязать экран.`,-1),r(p(b),{value:N.value,"onUpdate:value":t[0]||=e=>N.value=e,options:we.value,placeholder:`Игра`},null,8,[`value`,`options`]),r(p(y),{type:`primary`,loading:L.value,disabled:N.value==null,onClick:Ne},{default:s(()=>[...t[3]||=[l(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(a(),c(`div`,se,[I.value?(a(),c(`div`,ce,`Подготовка экрана…`)):(a(),c(m,{key:1},[A.value?.gameId?(a(),c(`div`,{key:1,class:`screen-content`,style:i(De.value)},[F.value?(a(),c(`p`,de,n(F.value),1)):g(``,!0),X.value===`SCREEN_MODE_INTRO`&&A.value.introAudio?(a(),c(`div`,fe,[t[10]||=_(`p`,{class:`media-title`},`Введение`,-1),_(`div`,pe,[t[7]||=_(`div`,{class:`cassette-label`},`ДИКТОФОН`,-1),_(`canvas`,{ref_key:`visualizerCanvas`,ref:V,width:`640`,height:`120`},null,512),t[8]||=_(`div`,{class:`cassette-reel cassette-reel-left`},null,-1),t[9]||=_(`div`,{class:`cassette-reel cassette-reel-right`},null,-1)]),_(`audio`,{ref_key:`introAudioElement`,ref:z,src:Te.value,muted:!A.value.soundEnabled,autoplay:``,controls:``},null,8,me)])):X.value===`SCREEN_MODE_CONCLUSION`&&A.value.conclusionVideo?(a(),c(`div`,he,[_(`video`,{ref_key:`conclusionVideoElement`,ref:B,src:Ee.value,muted:!A.value.soundEnabled,autoplay:``,controls:``,playsinline:``},null,8,ge)])):X.value===`SCREEN_MODE_CONCLUSION`?(a(),c(`div`,_e,`Видео закрывашки не задано`)):X.value===`SCREEN_MODE_INTRO_DONE`?(a(),c(`div`,ve,`Успехов`)):X.value===`SCREEN_MODE_CONCLUSION_DONE`?(a(),c(`div`,ye,`Спасибо за игру!`)):X.value===`SCREEN_MODE_RESULTS`?(a(),c(`div`,be,[t[12]||=_(`h1`,null,`Результаты`,-1),_(`table`,null,[t[11]||=_(`thead`,null,[_(`tr`,null,[_(`th`,null,`Место`),_(`th`,null,`Команда`),_(`th`,null,`Баллы`),_(`th`,null,`Ходы`)])],-1),_(`tbody`,null,[(a(!0),c(m,null,ee(j.value,e=>(a(),c(`tr`,{key:e.team?.id},[_(`td`,null,n(e.place),1),_(`td`,null,n(e.team?.name),1),_(`td`,null,n(e.totalScore),1),_(`td`,null,n(e.actionsCount),1)]))),128))])])])):(a(),c(`div`,xe,[A.value.coverImage?(a(),c(`img`,{key:0,src:A.value.coverImage,class:`cover-image`,alt:`Обложка дела`},null,8,Se)):g(``,!0),_(`p`,Ce,n(A.value.gameName||`Игра №${A.value.gameId}`),1),t[14]||=_(`p`,null,`Обложка дела`,-1),P.value?g(``,!0):(a(),d(p(y),{key:1,type:`primary`,onClick:$},{default:s(()=>[...t[13]||=[l(`Подготовить экран`,-1)]]),_:1}))]))],4)):(a(),c(`div`,le,[r(p(v),{class:`qr-card`,title:`Подключение экрана`},{default:s(()=>[Y.value?(a(),c(`div`,ue,[r(p(S),{value:Y.value,size:260,padding:0},null,8,[`value`])])):g(``,!0),t[6]||=_(`p`,null,`Отсканируйте QR телефоном организатора и выберите игру.`,-1),P.value?g(``,!0):(a(),d(p(y),{key:1,type:`primary`,onClick:$},{default:s(()=>[...t[5]||=[l(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),J.value?(a(),d(ie,{key:2,active:`games`})):g(``,!0)],64))}}),[[`__scopeId`,`data-v-f823e404`]]),D=t({__name:`ScreenView`,setup(e){return(e,t)=>(a(),d(E))}});export{D as default}; |