ваше сообщение коммита

This commit is contained in:
2025-04-30 14:31:48 +03:00
parent dde96d11f5
commit c694c43d82
11 changed files with 1089 additions and 3605 deletions

View File

@@ -0,0 +1,223 @@
import { ref, onUnmounted } from 'vue';
import api from '../api/axios';
import { useAuth } from './useAuth';
import { useNotifications } from './useNotifications';
export function useAuthFlow(options = {}) {
const { onAuthSuccess } = options; // Callback после успешной аутентификации/привязки
const auth = useAuth();
const { showSuccessMessage, showErrorMessage } = useNotifications();
// Состояния Telegram
const telegramAuth = ref({
showVerification: false,
verificationCode: '',
botLink: '',
checkInterval: null,
error: '',
isLoading: false, // Добавим isLoading
});
// Состояния Email
const emailAuth = ref({
showForm: false,
showVerification: false,
email: '',
verificationEmail: '', // Храним email, на который отправили код
verificationCode: '',
formatError: false,
isLoading: false, // Для отправки запроса на init
isVerifying: false, // Для проверки кода
error: '',
});
// --- Telegram ---
const clearTelegramInterval = () => {
if (telegramAuth.value.checkInterval) {
clearInterval(telegramAuth.value.checkInterval);
telegramAuth.value.checkInterval = null;
console.log('[useAuthFlow] Интервал проверки Telegram авторизации очищен');
}
};
const handleTelegramAuth = async () => {
if (telegramAuth.value.isLoading) return;
telegramAuth.value.isLoading = true;
telegramAuth.value.error = '';
try {
const response = await api.post('/api/auth/telegram/init');
if (response.data.success) {
telegramAuth.value.verificationCode = response.data.verificationCode;
telegramAuth.value.botLink = response.data.botLink;
telegramAuth.value.showVerification = true;
// Начинаем проверку статуса
clearTelegramInterval(); // На всякий случай
telegramAuth.value.checkInterval = setInterval(async () => {
try {
console.log('[useAuthFlow] Проверка статуса Telegram...');
// Используем checkAuth из useAuth для обновления состояния
const checkResponse = await auth.checkAuth();
const telegramId = auth.telegramId.value;
if (auth.isAuthenticated.value && telegramId) {
console.log('[useAuthFlow] Telegram успешно связан/подтвержден.');
clearTelegramInterval();
telegramAuth.value.showVerification = false;
telegramAuth.value.verificationCode = '';
telegramAuth.value.error = '';
showSuccessMessage('Telegram успешно подключен!');
if (onAuthSuccess) onAuthSuccess('telegram'); // Вызываем callback
// Нет необходимости продолжать интервал
return;
}
} catch (intervalError) {
console.error('[useAuthFlow] Ошибка при проверке статуса Telegram в интервале:', intervalError);
// Решаем, останавливать ли интервал при ошибке
// telegramAuth.value.error = 'Ошибка проверки статуса Telegram.';
// clearTelegramInterval();
}
}, 3000); // Проверяем каждые 3 секунды
} else {
telegramAuth.value.error = response.data.error || 'Ошибка инициализации Telegram';
showErrorMessage(telegramAuth.value.error);
}
} catch (error) {
console.error('[useAuthFlow] Ошибка инициализации Telegram аутентификации:', error);
const message = error?.response?.data?.error || 'Ошибка при инициализации аутентификации через Telegram';
telegramAuth.value.error = message;
showErrorMessage(message);
} finally {
telegramAuth.value.isLoading = false;
}
};
const cancelTelegramAuth = () => {
clearTelegramInterval();
telegramAuth.value.showVerification = false;
telegramAuth.value.verificationCode = '';
telegramAuth.value.error = '';
telegramAuth.value.isLoading = false;
console.log('[useAuthFlow] Аутентификация Telegram отменена');
};
// --- Email ---
const showEmailForm = () => {
emailAuth.value.showForm = true;
emailAuth.value.showVerification = false;
emailAuth.value.email = '';
emailAuth.value.formatError = false;
emailAuth.value.error = '';
emailAuth.value.isLoading = false;
emailAuth.value.isVerifying = false;
};
const sendEmailVerification = async () => {
emailAuth.value.formatError = false;
emailAuth.value.error = '';
if (!emailAuth.value.email || !emailAuth.value.email.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
emailAuth.value.formatError = true;
return;
}
if (emailAuth.value.isLoading) return;
emailAuth.value.isLoading = true;
try {
const response = await api.post('/api/auth/email/init', { email: emailAuth.value.email });
if (response.data.success) {
emailAuth.value.verificationEmail = emailAuth.value.email; // Сохраняем email
emailAuth.value.showForm = false;
emailAuth.value.showVerification = true;
emailAuth.value.verificationCode = ''; // Очищаем поле кода
console.log('[useAuthFlow] Код верификации Email отправлен на:', emailAuth.value.verificationEmail);
} else {
emailAuth.value.error = response.data.error || 'Ошибка инициализации аутентификации по email';
showErrorMessage(emailAuth.value.error);
}
} catch (error) {
console.error('[useAuthFlow] Ошибка при запросе инициализации Email:', error);
const message = error?.response?.data?.error || 'Ошибка при запросе кода подтверждения';
emailAuth.value.error = message;
showErrorMessage(message);
} finally {
emailAuth.value.isLoading = false;
}
};
const verifyEmailCode = async () => {
emailAuth.value.error = '';
if (!emailAuth.value.verificationCode) {
emailAuth.value.error = 'Пожалуйста, введите код верификации';
return;
}
if (emailAuth.value.isVerifying) return;
emailAuth.value.isVerifying = true;
try {
const response = await api.post('/api/auth/email/verify-code', {
email: emailAuth.value.verificationEmail,
code: emailAuth.value.verificationCode,
});
if (response.data.success) {
console.log('[useAuthFlow] Email успешно подтвержден:', emailAuth.value.verificationEmail);
emailAuth.value.showForm = false;
emailAuth.value.showVerification = false;
emailAuth.value.error = '';
// Обновляем состояние аутентификации через useAuth
await auth.checkAuth();
showSuccessMessage(`Email ${emailAuth.value.verificationEmail} успешно подтвержден!`);
if (onAuthSuccess) onAuthSuccess('email'); // Вызываем callback
} else {
emailAuth.value.error = response.data.message || 'Неверный код верификации';
// Не используем showErrorMessage здесь, т.к. ошибка отображается локально в форме
}
} catch (error) {
console.error('[useAuthFlow] Ошибка проверки кода Email:', error);
const message = error?.response?.data?.error || 'Ошибка при проверке кода';
emailAuth.value.error = message;
// Не используем showErrorMessage здесь
} finally {
emailAuth.value.isVerifying = false;
}
};
const cancelEmailAuth = () => {
emailAuth.value.showForm = false;
emailAuth.value.showVerification = false;
emailAuth.value.email = '';
emailAuth.value.verificationCode = '';
emailAuth.value.error = '';
emailAuth.value.formatError = false;
emailAuth.value.isLoading = false;
emailAuth.value.isVerifying = false;
console.log('[useAuthFlow] Аутентификация Email отменена');
};
// Очистка интервала при размонтировании
onUnmounted(() => {
clearTelegramInterval();
});
return {
telegramAuth,
handleTelegramAuth,
cancelTelegramAuth,
emailAuth,
showEmailForm,
sendEmailVerification,
verifyEmailCode,
cancelEmailAuth,
};
}