Описание изменений

This commit is contained in:
2025-03-06 21:31:29 +03:00
parent 3157ad0cd9
commit 765637f2d0
57 changed files with 6240 additions and 3695 deletions

View File

@@ -58,7 +58,6 @@ import { ref, computed, onMounted, watch, nextTick } from 'vue';
import { useAuthStore } from '../stores/auth';
import axios from 'axios';
import WalletConnection from '../components/WalletConnection.vue';
import { connectWallet } from '../utils/wallet';
const auth = useAuthStore();
const userInput = ref('');
@@ -72,9 +71,8 @@ const messages = ref([
const chatMessages = ref(null);
const isLoading = ref(false);
const hasShownAuthMessage = ref(false);
const userName = ref('');
const userLanguage = ref('ru');
const email = ref('');
const userLanguage = ref('ru');
// Проверка валидности email
const isValidEmail = computed(() => {
@@ -130,6 +128,22 @@ async function sendMessage() {
try {
console.log('Отправка сообщения:', userMessage, 'язык:', userLanguage.value);
// Проверяем, авторизован ли пользователь
if (!auth.isAuthenticated && !hasShownAuthMessage.value) {
// Если пользователь не авторизован и мы еще не показывали сообщение с опциями авторизации
setTimeout(() => {
messages.value.push({
sender: 'ai',
text: 'Для продолжения общения и доступа ко всем функциям, пожалуйста, авторизуйтесь одним из способов:',
timestamp: new Date(),
showAuthOptions: true,
});
isLoading.value = false;
hasShownAuthMessage.value = true;
}, 1000);
return;
}
// Отправляем запрос к API
const response = await axios.post(
'/api/chat/message',
@@ -153,12 +167,23 @@ async function sendMessage() {
} catch (error) {
console.error('Error sending message:', error);
// Добавляем сообщение об ошибке
messages.value.push({
sender: 'ai',
text: 'Извините, произошла ошибка при обработке вашего запроса. Пожалуйста, попробуйте позже.',
timestamp: new Date(),
});
// Если ошибка связана с авторизацией (401)
if (error.response && error.response.status === 401 && !hasShownAuthMessage.value) {
messages.value.push({
sender: 'ai',
text: 'Для продолжения общения и доступа ко всем функциям, пожалуйста, авторизуйтесь одним из способов:',
timestamp: new Date(),
showAuthOptions: true,
});
hasShownAuthMessage.value = true;
} else {
// Добавляем сообщение об ошибке
messages.value.push({
sender: 'ai',
text: 'Извините, произошла ошибка при обработке вашего запроса. Пожалуйста, попробуйте позже.',
timestamp: new Date(),
});
}
} finally {
isLoading.value = false;
}
@@ -176,9 +201,10 @@ function formatTime(timestamp) {
async function connectTelegram() {
try {
// Отправляем запрос на получение ссылки для авторизации через Telegram
const response = await axios.get('/api/auth/telegram');
// Если сервер вернул ошибку, показываем сообщение
const response = await axios.get('/api/auth/telegram', {
withCredentials: true
});
if (response.data.error) {
messages.value.push({
sender: 'ai',
@@ -187,32 +213,26 @@ async function connectTelegram() {
});
return;
}
// Если сервер вернул ссылку для авторизации, показываем её пользователю
if (response.data.authUrl) {
messages.value.push({
sender: 'ai',
text: `Для подключения Telegram, перейдите по <a href="${response.data.authUrl}" target="_blank">этой ссылке</a> и авторизуйтесь.`,
timestamp: new Date(),
});
// Открываем ссылку в новом окне
window.open(response.data.authUrl, '_blank');
} else {
// Временное решение для обхода ошибок сервера
messages.value.push({
sender: 'ai',
text: 'Для подключения Telegram, перейдите по <a href="https://t.me/YourBotName" target="_blank">этой ссылке</a> и авторизуйтесь.',
timestamp: new Date(),
});
// Открываем ссылку на бота в новом окне
window.open('https://t.me/YourBotName', '_blank');
}
} catch (error) {
console.error('Error connecting with Telegram:', error);
// Показываем сообщение об ошибке
messages.value.push({
sender: 'ai',
text: 'Извините, произошла ошибка при подключении Telegram. Пожалуйста, попробуйте позже.',
@@ -224,131 +244,91 @@ async function connectTelegram() {
// Функция для подключения через Email
async function connectEmail() {
if (!isValidEmail.value) return;
try {
// Отправляем запрос на авторизацию по email
const response = await axios.post('/api/auth/email', { email: email.value });
// Если сервер вернул ошибку, показываем сообщение
messages.value.push({
sender: 'ai',
text: `Отправляем код подтверждения на ${email.value}...`,
timestamp: new Date(),
});
// Отправляем запрос на отправку кода подтверждения
const response = await axios.post('/api/auth/email', {
email: email.value
}, {
withCredentials: true
});
if (response.data.error) {
messages.value.push({
sender: 'ai',
text: `Ошибка при подключении Email: ${response.data.error}`,
text: `Ошибка: ${response.data.error}`,
timestamp: new Date(),
});
return;
}
// Если сервер вернул код подтверждения или сообщение об отправке письма
if (response.data.success) {
messages.value.push({
sender: 'ai',
text: `На ваш email ${email.value} отправлено письмо с кодом подтверждения. Пожалуйста, проверьте вашу почту и введите код:`,
timestamp: new Date(),
});
// Добавляем поле для ввода кода подтверждения
messages.value.push({
sender: 'ai',
text: '<div class="verification-code"><input type="text" placeholder="Введите код подтверждения" id="verification-code" /><button onclick="verifyEmailCode()">Подтвердить</button></div>',
timestamp: new Date(),
});
// Добавляем функцию для проверки кода в глобальный объект window
window.verifyEmailCode = async function () {
const code = document.getElementById('verification-code').value;
if (!code) return;
try {
const verifyResponse = await axios.post('/api/auth/email/verify', {
email: email.value,
code,
});
if (verifyResponse.data.authenticated) {
auth.authenticated = true;
auth.address = email.value;
auth.isAdmin = verifyResponse.data.isAdmin;
auth.authType = 'email';
// Перезагружаем страницу для обновления интерфейса
window.location.reload();
} else {
messages.value.push({
sender: 'ai',
text: 'Неверный код подтверждения. Пожалуйста, попробуйте еще раз.',
timestamp: new Date(),
});
}
} catch (error) {
console.error('Error verifying email code:', error);
messages.value.push({
sender: 'ai',
text: `На ваш email ${email.value} отправлено письмо с кодом подтверждения. Пожалуйста, введите код:`,
timestamp: new Date(),
});
// Добавляем поле для ввода кода
const verificationCode = prompt('Введите код подтверждения:');
if (verificationCode) {
try {
// Отправляем запрос на проверку кода
const verifyResponse = await axios.post('/api/auth/email/verify', {
email: email.value,
code: verificationCode
}, {
withCredentials: true
});
if (verifyResponse.data.error) {
messages.value.push({
sender: 'ai',
text: 'Произошла ошибка при проверке кода. Пожалуйста, попробуйте позже.',
text: `Ошибка: ${verifyResponse.data.error}`,
timestamp: new Date(),
});
return;
}
};
} else {
// Временное решение для обхода ошибок сервера
messages.value.push({
sender: 'ai',
text: `На ваш email ${email.value} отправлено письмо с кодом подтверждения. Пожалуйста, проверьте вашу почту.`,
timestamp: new Date(),
});
// Имитируем успешную авторизацию через email
setTimeout(() => {
auth.authenticated = true;
auth.address = email.value;
auth.isAdmin = email.value.includes('admin');
messages.value.push({
sender: 'ai',
text: 'Email успешно подтвержден! Теперь вы можете использовать все функции чата.',
timestamp: new Date(),
});
// Обновляем состояние аутентификации
auth.isAuthenticated = true;
auth.user = { email: email.value };
auth.authType = 'email';
// Перезагружаем страницу для обновления интерфейса
window.location.reload();
}, 3000);
// Сбрасываем флаг показа сообщения с опциями авторизации
hasShownAuthMessage.value = false;
} catch (error) {
console.error('Error verifying email code:', error);
messages.value.push({
sender: 'ai',
text: 'Произошла ошибка при проверке кода. Пожалуйста, попробуйте позже.',
timestamp: new Date(),
});
}
}
} catch (error) {
console.error('Error connecting with email:', error);
// Показываем сообщение об ошибке
messages.value.push({
sender: 'ai',
text: 'Извините, произошла ошибка при подключении Email. Пожалуйста, попробуйте позже.',
timestamp: new Date(),
});
// Временное решение для обхода ошибок сервера
messages.value.push({
sender: 'ai',
text: `На ваш email ${email.value} отправлено письмо с кодом подтверждения. Пожалуйста, проверьте вашу почту.`,
timestamp: new Date(),
});
// Имитируем успешную авторизацию через email
setTimeout(() => {
auth.authenticated = true;
auth.address = email.value;
auth.isAdmin = email.value.includes('admin');
auth.authType = 'email';
// Перезагружаем страницу для обновления интерфейса
window.location.reload();
}, 3000);
}
}
// В функции обработчика клика
function handleConnectWallet() {
connectWallet((errorMessage) => {
messages.value.push({
sender: 'ai',
text: errorMessage,
timestamp: new Date(),
});
});
}
</script>
<style scoped>
@@ -387,6 +367,7 @@ h2 {
display: flex;
flex-direction: column;
gap: 1rem;
min-height: 400px;
}
.message {
@@ -485,22 +466,6 @@ textarea {
cursor: not-allowed;
}
.email-auth {
display: flex;
flex-direction: column;
gap: 0.5rem;
width: 100%;
}
.email-auth input {
padding: 0.75rem 1rem;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 1rem;
width: 100%;
box-sizing: border-box;
}
/* Общие стили для всех кнопок аутентификации */
.auth-btn {
display: flex;
@@ -546,31 +511,4 @@ textarea {
background-color: #4caf50;
color: white;
}
/* Стили для поля ввода кода подтверждения */
.verification-code {
display: flex;
gap: 0.5rem;
margin-top: 0.5rem;
}
.verification-code input {
flex: 1;
padding: 0.75rem 1rem;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 1rem;
box-sizing: border-box;
}
.verification-code button {
padding: 0.75rem 1rem;
background-color: #4caf50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
font-weight: 500;
}
</style>