diff --git a/src/components/ScreenPage.vue b/src/components/ScreenPage.vue index 0723997..e8a6ca9 100644 --- a/src/components/ScreenPage.vue +++ b/src/components/ScreenPage.vue @@ -5,13 +5,15 @@ import { useRoute } from 'vue-router' import { getAuthClient } from '@/api/auth_client' import type { Game, ScreenState, TeamResult } from '@/api/generated/crabs/evening_detective_server' +import { buildClient } from '@/api/generated/crabs/evening_detective_server/client' import HeaderMenu from '@/components/HeaderMenu.vue' import { useSimplePolling } from '@/composables/useSimplePolling' import { applicationFileURL } from '@/utils/application' import { formatGameDateTime } from '@/utils/datetime' const sessionKey = 'evening-detective-screen-session' -const client = getAuthClient() +const screenClient = buildClient() +const authClient = getAuthClient() const message = useMessage() const route = useRoute() @@ -100,28 +102,36 @@ function readSession() { } async function createSession() { - const res = await client.CreateScreenSession({}) + const res = await screenClient.CreateScreenSession({}) if (!res.screenID || !res.accessToken) throw new Error('Не удалось создать сессию экрана') screenId.value = res.screenID accessToken.value = res.accessToken saveSession() } -async function loadState() { +async function loadState(recreateOnUnauthorized = true) { if (!screenId.value || !accessToken.value) return try { - const res = await client.GetScreenState({ screenID: screenId.value, accessToken: accessToken.value }) + const res = await screenClient.GetScreenState({ screenID: screenId.value, accessToken: accessToken.value }) state.value = res.state syncTimer(state.value) if (state.value?.gameID && state.value.mode === 'SCREEN_MODE_RESULTS') await loadResults() } catch (err) { + if (recreateOnUnauthorized && err instanceof Error && err.message === 'unauthorized') { + sessionStorage.removeItem(sessionKey) + screenId.value = '' + accessToken.value = '' + await createSession() + await loadState(false) + return + } message.error(err instanceof Error ? err.message : 'Не удалось получить состояние экрана') } } async function loadResults() { if (!screenId.value || !accessToken.value) return - const res = await client.GetScreenResults({ screenID: screenId.value, accessToken: accessToken.value }) + const res = await screenClient.GetScreenResults({ screenID: screenId.value, accessToken: accessToken.value }) resultQuestions.value = res.questions || [] resultTeams.value = res.teams || [] if (!resultsScrollStarted) { @@ -143,7 +153,7 @@ async function loadResults() { async function loadGames() { try { - const res = await client.GetGames({}) + const res = await authClient.GetGames({}) games.value = res.games || [] } catch (err) { message.error(err instanceof Error ? err.message : 'Не удалось загрузить игры') @@ -182,7 +192,7 @@ async function bind() { if (!selectedGameId.value || !route.query.screenID || !route.query.accessToken) return binding.value = true try { - await client.BindScreen({ + await authClient.BindScreen({ screenID: String(route.query.screenID), accessToken: String(route.query.accessToken), gameID: selectedGameId.value,