Files
evening_detective_frontend/dist/assets/ScreenView-C8QdPa6D.js
T
2026-09-10 15:10:21 +07:00

1 line
9.1 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 u,X as ee,a as te,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-Hw3wsCSX.js";import{t as y}from"./Button-BWUMF92D.js";import{t as re}from"./Select-l80foPYO.js";import{t as ie}from"./use-message-B9ByOZtS.js";import{t as ae}from"./QrCode-c3qDqmj4.js";import{i as oe,n as b,t as se}from"./HeaderMenu-DOd51pLB.js";import{r as x}from"./application-Cn6gcvZk.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={class:`cassette`},_e=[`src`,`muted`],ve={key:2,class:`screen-media`},ye=[`src`,`muted`],be={key:3,class:`screen-message`},xe={key:4,class:`screen-message`},Se={key:5,class:`screen-message`},Ce={key:7,class:`screen-cover`},we=[`src`],Te={key:1,class:`cover-controls`},S=`evening-detective-screen-session`,C=b(t({__name:`ScreenPage`,setup(t){let b=oe(),C=ie(),w=te(),T=f(``),E=f(``),D=f(),O=f([]),k=f([]),A=f(),j,M=!1,N=f([]),P=f(null),F=f(!1),I=f(``),L=f(!0),R=f(!1),z=f(!1),B=f(),V=f(),H=f(),U=0,W,G,K,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()}),Ee=h(()=>N.value.map(e=>({label:`${ce(e.startAt).split(`,`)[0]||`дата не указана`} — ${e.name||`Игра ${e.id}`}`,value:e.id}))),Z=h(()=>D.value?.mode||`SCREEN_MODE_COVER`),De=h(()=>x(D.value?.introAudio)),Oe=h(()=>x(D.value?.conclusionVideo)),ke=h(()=>D.value?.coverImage?{backgroundImage:`linear-gradient(rgb(0 0 0 / 55%), rgb(0 0 0 / 55%)), url("${D.value.coverImage}")`}:{});function Ae(){sessionStorage.setItem(S,JSON.stringify({screenId:T.value,accessToken:E.value}))}function je(){try{let e=JSON.parse(sessionStorage.getItem(S)||`{}`);T.value=e.screenId||``,E.value=e.accessToken||``}catch{sessionStorage.removeItem(S)}}async function Me(){let e=await b.CreateScreenSession({});if(e.error||!e.screenId||!e.accessToken)throw Error(e.error||`Не удалось создать сессию экрана`);T.value=e.screenId,E.value=e.accessToken,Ae()}async function Q(){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,D.value?.gameId&&D.value.mode===`SCREEN_MODE_RESULTS`&&await Ne()}catch(e){C.error(e instanceof Error?e.message:`Не удалось получить состояние экрана`)}}async function Ne(){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 Pe(){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:`Не удалось загрузить игры`)}}function Fe(){let e=B.value,t=H.value;if(!(!e||!t||K))try{W=new AudioContext,G=W.createAnalyser(),G.fftSize=64,K=W.createMediaElementSource(e),K.connect(G),G.connect(W.destination);let n=new Uint8Array(G.frequencyBinCount),r=()=>{if(!G||!H.value)return;let e=H.value.getContext(`2d`);if(!e)return;G.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)}),q=requestAnimationFrame(r)};r()}catch{}}ee(D,async e=>{if(!e||!e.command||e.stateVersion===U)return;U=e.stateVersion||0,await o(),Fe();let t=Z.value===`SCREEN_MODE_CONCLUSION`?V.value:B.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 Ie(){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 ne(async()=>{if(Y.value){await Pe(),L.value=!1;return}je();try{(!T.value||!E.value)&&await Me(),await Q(),J=window.setInterval(Q,1e3)}catch(e){C.error(e instanceof Error?e.message:`Не удалось подготовить экран`)}finally{L.value=!1}}),e(()=>{J!=null&&window.clearInterval(J),j!=null&&window.clearInterval(j),cancelAnimationFrame(q),W?.close()}),(e,t)=>(a(),c(m,null,[Y.value?(a(),c(`div`,le,[r(p(v),{class:`binding-card`,title:`Привязка экрана`},{default:s(()=>[z.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(re),{value:P.value,"onUpdate:value":t[0]||=e=>P.value=e,options:Ee.value,placeholder:`Игра`},null,8,[`value`,`options`]),r(p(y),{type:`primary`,loading:R.value,disabled:P.value==null,onClick:Ie},{default:s(()=>[...t[3]||=[l(` Привязать `,-1)]]),_:1},8,[`loading`,`disabled`])],64))]),_:1})])):(a(),c(`div`,ue,[L.value?(a(),c(`div`,de,`Подготовка экрана…`)):(a(),c(m,{key:1},[D.value?.gameId?(a(),c(`div`,{key:1,class:`screen-content`,style:i(ke.value)},[I.value?(a(),c(`p`,me,n(I.value),1)):g(``,!0),Z.value===`SCREEN_MODE_INTRO`&&D.value.introAudio?(a(),c(`div`,he,[t[10]||=_(`p`,{class:`media-title`},`Введение`,-1),_(`div`,ge,[t[7]||=_(`div`,{class:`cassette-label`},`ДИКТОФОН`,-1),_(`canvas`,{ref_key:`visualizerCanvas`,ref:H,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:B,src:De.value,muted:!D.value.soundEnabled,autoplay:``,controls:``},null,8,_e)])):Z.value===`SCREEN_MODE_CONCLUSION`&&D.value.conclusionVideo?(a(),c(`div`,ve,[_(`video`,{ref_key:`conclusionVideoElement`,ref:V,src:Oe.value,muted:!D.value.soundEnabled,autoplay:``,controls:``,playsinline:``},null,8,ye)])):Z.value===`SCREEN_MODE_CONCLUSION`?(a(),c(`div`,be,`Видео закрывашки не задано`)):Z.value===`SCREEN_MODE_INTRO_DONE`?(a(),c(`div`,xe,`Успехов`)):Z.value===`SCREEN_MODE_CONCLUSION_DONE`?(a(),c(`div`,Se,`Спасибо за игру!`)):Z.value===`SCREEN_MODE_RESULTS`?(a(),c(`div`,{key:6,ref_key:`resultsContainer`,ref:A,class:`results-screen`},[t[15]||=_(`h1`,null,`Результаты`,-1),_(`table`,null,[_(`thead`,null,[_(`tr`,null,[t[11]||=_(`th`,null,`Место`,-1),t[12]||=_(`th`,null,`Команда`,-1),(a(!0),c(m,null,u(k.value,e=>(a(),c(`th`,{key:e.code},n(e.text),1))),128)),t[13]||=_(`th`,null,`Сумма`,-1),t[14]||=_(`th`,null,`Ходы`,-1)])]),_(`tbody`,null,[(a(!0),c(m,null,u(O.value,e=>(a(),c(`tr`,{key:e.team?.id},[_(`td`,null,n(e.place),1),_(`td`,null,n(e.team?.name),1),(a(!0),c(m,null,u(k.value,t=>(a(),c(`td`,{key:t.code},n(e.answers?.find(e=>e.questionCode===t.code)?.score??0),1))),128)),_(`td`,null,n(e.totalScore),1),_(`td`,null,n(e.actionsCount),1)]))),128))])])],512)):(a(),c(`div`,Ce,[D.value.coverImage?(a(),c(`img`,{key:0,src:D.value.coverImage,class:`cover-image`,alt:`Обложка дела`},null,8,we)):g(``,!0),F.value?g(``,!0):(a(),c(`div`,Te,[r(p(y),{type:`primary`,onClick:$},{default:s(()=>[...t[16]||=[l(`Подготовить экран`,-1)]]),_:1})]))]))],4)):(a(),c(`div`,fe,[r(p(v),{class:`qr-card`,title:`Подключение экрана`},{default:s(()=>[X.value?(a(),c(`div`,pe,[r(p(ae),{value:X.value,size:260,padding:0},null,8,[`value`])])):g(``,!0),t[6]||=_(`p`,null,`Отсканируйте QR телефоном организатора и выберите игру.`,-1),F.value?g(``,!0):(a(),d(p(y),{key:1,type:`primary`,onClick:$},{default:s(()=>[...t[5]||=[l(`Подготовить экран`,-1)]]),_:1}))]),_:1})]))],64))])),Y.value?(a(),d(se,{key:2,active:`games`})):g(``,!0)],64))}}),[[`__scopeId`,`data-v-67b0eb99`]]),w=t({__name:`ScreenView`,setup(e){return(e,t)=>(a(),d(C))}});export{w as default};