-
-
-
-
-
+
-
Создать новый сценарий
-
-
-
-
-
{{ scenario.name }}
-
-
-
+
+
+
+
+
+
Создать новый сценарий
+
+
+
+
{{ scenario.name }}
+
+
-
-
-
-
-
- x
-
-
-
-
-
- Создать
-
-
-
-
-
+
+
+
+
+ x
+
+
+
+
+ Создать
+
+
+
+
diff --git a/src/components/UsersPage.vue b/src/components/UsersPage.vue
index 844bc24..bd34390 100644
--- a/src/components/UsersPage.vue
+++ b/src/components/UsersPage.vue
@@ -3,11 +3,9 @@ import HeaderMenu from '@/components/HeaderMenu.vue'
-
+
-
- Пользователи
-
+ Пользователи
diff --git a/src/router/index.ts b/src/router/index.ts
index 5687263..5c66b69 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -49,7 +49,7 @@ const router = createRouter({
component: ScenariosView,
},
{
- path: '/scenarios/:id', // Динамический параметр id
+ path: '/scenarios/:id', // Динамический параметр id
name: 'ScenariosEditorView',
component: ScenariosEditorView,
},
diff --git a/src/stores/auth.ts b/src/stores/auth.ts
index 72a51b7..e63b49a 100644
--- a/src/stores/auth.ts
+++ b/src/stores/auth.ts
@@ -1,226 +1,226 @@
-import { defineStore } from 'pinia';
-import { computed,ref } from 'vue';
+import { defineStore } from 'pinia'
+import { computed, ref } from 'vue'
-import { type User } from '@/api/generated/crabs/evening_detective_server';
-import { buildClient } from '@/api/generated/crabs/evening_detective_server/client';
+import { type User } from '@/api/generated/crabs/evening_detective_server'
+import { buildClient } from '@/api/generated/crabs/evening_detective_server/client'
export const useAuthStore = defineStore('auth', () => {
- // ===== STATE =====
- const accessToken = ref
(null);
- const refreshToken = ref(null);
- const user = ref(null);
- const isLoading = ref(false);
- const error = ref(null);
+ // ===== STATE =====
+ const accessToken = ref(null)
+ const refreshToken = ref(null)
+ const user = ref(null)
+ const isLoading = ref(false)
+ const error = ref(null)
- // ===== GETTERS =====
- const isAuthenticated = computed(() => !!accessToken.value);
- const username = computed(() => user.value?.username || '');
- const userRoles = computed(() => user.value?.roles || []);
+ // ===== GETTERS =====
+ const isAuthenticated = computed(() => !!accessToken.value)
+ const username = computed(() => user.value?.username || '')
+ const userRoles = computed(() => user.value?.roles || [])
- // ===== ACTIONS =====
+ // ===== ACTIONS =====
- // Инициализация из localStorage при загрузке
- function initFromStorage() {
- const token = localStorage.getItem('accessToken');
- const refresh = localStorage.getItem('refreshToken');
+ // Инициализация из localStorage при загрузке
+ function initFromStorage() {
+ const token = localStorage.getItem('accessToken')
+ const refresh = localStorage.getItem('refreshToken')
- if (token) {
- accessToken.value = token;
- refreshToken.value = refresh;
+ if (token) {
+ accessToken.value = token
+ refreshToken.value = refresh
- // Получаем данные пользователя
- fetchUser();
+ // Получаем данные пользователя
+ fetchUser()
+ }
+ }
+
+ function getToken(): string | null {
+ return accessToken.value
+ }
+
+ // Получение данных пользователя
+ async function fetchUser() {
+ if (!accessToken.value) return
+
+ try {
+ const client = buildClient(getToken)
+ const response = await client.GetMe({})
+
+ if (response.error) {
+ error.value = response.error
+ return
+ }
+
+ if (response.user) {
+ user.value = response.user
+ }
+ } catch (err) {
+ console.error('Failed to fetch user:', err)
+ // Если 401 — токен протух
+ if (err instanceof Error && err.message.includes('401')) {
+ await logout()
+ }
+ }
+ }
+
+ // Логин
+ async function login(email: string, password: string) {
+ isLoading.value = true
+ error.value = null
+
+ try {
+ const client = buildClient(getToken)
+ const response = await client.Login({ email, password })
+
+ if (response.error) {
+ error.value = response.error
+ return false
+ }
+
+ // Сохраняем токены
+ if (response.accessToken) {
+ accessToken.value = response.accessToken
+ refreshToken.value = response.refreshToken || null
+
+ // Сохраняем в localStorage
+ localStorage.setItem('accessToken', response.accessToken)
+ if (response.refreshToken) {
+ localStorage.setItem('refreshToken', response.refreshToken)
}
+
+ // Получаем данные пользователя
+ await fetchUser()
+
+ return true
+ }
+
+ return false
+ } catch (err) {
+ error.value = err instanceof Error ? err.message : 'Login failed'
+ return false
+ } finally {
+ isLoading.value = false
}
+ }
- function getToken(): string | null {
- return accessToken.value
+ // Обновление токена
+ async function refreshTokenAction() {
+ if (!refreshToken.value) return false
+
+ try {
+ const client = buildClient(getToken)
+ const response = await client.Refresh({
+ refreshToken: refreshToken.value,
+ })
+
+ if (response.error || !response.accessToken) {
+ return false
+ }
+
+ // Обновляем токены
+ accessToken.value = response.accessToken
+ refreshToken.value = response.refreshToken || null
+
+ localStorage.setItem('accessToken', response.accessToken)
+ if (response.refreshToken) {
+ localStorage.setItem('refreshToken', response.refreshToken)
+ }
+
+ return true
+ } catch {
+ return false
}
+ }
- // Получение данных пользователя
- async function fetchUser() {
- if (!accessToken.value) return;
+ // Регистрация
+ async function signup(username: string, email: string) {
+ isLoading.value = true
+ error.value = null
- try {
- const client = buildClient(getToken);
- const response = await client.GetMe({});
+ try {
+ const client = buildClient(getToken)
+ const response = await client.Signup({ username, email })
- if (response.error) {
- error.value = response.error;
- return;
- }
+ if (response.error) {
+ error.value = response.error
+ return false
+ }
- if (response.user) {
- user.value = response.user;
- }
- } catch (err) {
- console.error('Failed to fetch user:', err);
- // Если 401 — токен протух
- if (err instanceof Error && err.message.includes('401')) {
- await logout();
- }
- }
+ return true
+ } catch (err) {
+ error.value = err instanceof Error ? err.message : 'Signup failed'
+ return false
+ } finally {
+ isLoading.value = false
}
+ }
- // Логин
- async function login(email: string, password: string) {
- isLoading.value = true;
- error.value = null;
+ // Восстановление пароля
+ async function refreshPassword(email: string) {
+ isLoading.value = true
+ error.value = null
- try {
- const client = buildClient(getToken);
- const response = await client.Login({ email, password });
+ try {
+ const client = buildClient(getToken)
+ const response = await client.RefreshPassword({ email })
- if (response.error) {
- error.value = response.error;
- return false;
- }
+ if (response.error) {
+ error.value = response.error
+ return false
+ }
- // Сохраняем токены
- if (response.accessToken) {
- accessToken.value = response.accessToken;
- refreshToken.value = response.refreshToken || null;
-
- // Сохраняем в localStorage
- localStorage.setItem('accessToken', response.accessToken);
- if (response.refreshToken) {
- localStorage.setItem('refreshToken', response.refreshToken);
- }
-
- // Получаем данные пользователя
- await fetchUser();
-
- return true;
- }
-
- return false;
- } catch (err) {
- error.value = err instanceof Error ? err.message : 'Login failed';
- return false;
- } finally {
- isLoading.value = false;
- }
+ return true
+ } catch (err) {
+ error.value = err instanceof Error ? err.message : 'Password reset failed'
+ return false
+ } finally {
+ isLoading.value = false
}
+ }
- // Обновление токена
- async function refreshTokenAction() {
- if (!refreshToken.value) return false;
+ // Выход
+ async function logout() {
+ accessToken.value = null
+ refreshToken.value = null
+ user.value = null
+ error.value = null
- try {
- const client = buildClient(getToken);
- const response = await client.Refresh({
- refreshToken: refreshToken.value
- });
+ localStorage.removeItem('accessToken')
+ localStorage.removeItem('refreshToken')
+ }
- if (response.error || !response.accessToken) {
- return false;
- }
+ // Проверка ролей
+ function hasRole(role: string): boolean {
+ return userRoles.value.includes(role)
+ }
- // Обновляем токены
- accessToken.value = response.accessToken;
- refreshToken.value = response.refreshToken || null;
+ function hasAnyRole(roles: string[]): boolean {
+ return roles.some((role) => userRoles.value.includes(role))
+ }
- localStorage.setItem('accessToken', response.accessToken);
- if (response.refreshToken) {
- localStorage.setItem('refreshToken', response.refreshToken);
- }
+ // ===== RETURN =====
+ return {
+ // State
+ accessToken,
+ refreshToken,
+ user,
+ isLoading,
+ error,
- return true;
- } catch {
- return false;
- }
- }
+ // Getters
+ isAuthenticated,
+ username,
+ userRoles,
- // Регистрация
- async function signup(username: string, email: string) {
- isLoading.value = true;
- error.value = null;
-
- try {
- const client = buildClient(getToken);
- const response = await client.Signup({ username, email });
-
- if (response.error) {
- error.value = response.error;
- return false;
- }
-
- return true
- } catch (err) {
- error.value = err instanceof Error ? err.message : 'Signup failed';
- return false;
- } finally {
- isLoading.value = false;
- }
- }
-
- // Восстановление пароля
- async function refreshPassword(email: string) {
- isLoading.value = true;
- error.value = null;
-
- try {
- const client = buildClient(getToken);
- const response = await client.RefreshPassword({ email });
-
- if (response.error) {
- error.value = response.error;
- return false;
- }
-
- return true;
- } catch (err) {
- error.value = err instanceof Error ? err.message : 'Password reset failed';
- return false;
- } finally {
- isLoading.value = false;
- }
- }
-
- // Выход
- async function logout() {
- accessToken.value = null;
- refreshToken.value = null;
- user.value = null;
- error.value = null;
-
- localStorage.removeItem('accessToken');
- localStorage.removeItem('refreshToken');
- }
-
- // Проверка ролей
- function hasRole(role: string): boolean {
- return userRoles.value.includes(role);
- }
-
- function hasAnyRole(roles: string[]): boolean {
- return roles.some(role => userRoles.value.includes(role));
- }
-
- // ===== RETURN =====
- return {
- // State
- accessToken,
- refreshToken,
- user,
- isLoading,
- error,
-
- // Getters
- isAuthenticated,
- username,
- userRoles,
-
- // Actions
- initFromStorage,
- getToken,
- login,
- signup,
- refreshPassword,
- logout,
- fetchUser,
- refreshTokenAction,
- hasRole,
- hasAnyRole,
- };
-});
\ No newline at end of file
+ // Actions
+ initFromStorage,
+ getToken,
+ login,
+ signup,
+ refreshPassword,
+ logout,
+ fetchUser,
+ refreshTokenAction,
+ hasRole,
+ hasAnyRole,
+ }
+})
diff --git a/src/views/GamesView.vue b/src/views/GamesView.vue
index a5f55d0..58b65e2 100644
--- a/src/views/GamesView.vue
+++ b/src/views/GamesView.vue
@@ -1,5 +1,5 @@
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
index 1489feb..56033fe 100644
--- a/src/views/HomeView.vue
+++ b/src/views/HomeView.vue
@@ -1,7 +1,7 @@
@@ -18,12 +18,8 @@ const keyColorClass = computed(() => {
-
- Вечерний детектив
-
-
- Дело №0
-
+
Вечерний детектив
+
Дело №0
Поиграем?
@@ -36,7 +32,7 @@ const keyColorClass = computed(() => {
diff --git a/src/views/ScenariosEditorView.vue b/src/views/ScenariosEditorView.vue
index 783ea82..f04173e 100644
--- a/src/views/ScenariosEditorView.vue
+++ b/src/views/ScenariosEditorView.vue
@@ -1,5 +1,5 @@
diff --git a/src/views/ScenariosView.vue b/src/views/ScenariosView.vue
index 2718b74..841bc6d 100644
--- a/src/views/ScenariosView.vue
+++ b/src/views/ScenariosView.vue
@@ -1,5 +1,5 @@
diff --git a/src/views/UserAgreementView.vue b/src/views/UserAgreementView.vue
index 0310b84..c2ec939 100644
--- a/src/views/UserAgreementView.vue
+++ b/src/views/UserAgreementView.vue
@@ -1,7 +1,5 @@
-
- Пользовательское соглашение
-
+Пользовательское соглашение
diff --git a/src/views/UsersView.vue b/src/views/UsersView.vue
index ff6a0ac..a7d3120 100644
--- a/src/views/UsersView.vue
+++ b/src/views/UsersView.vue
@@ -1,5 +1,5 @@