ваше сообщение коммита
This commit is contained in:
223
frontend/src/composables/useAuthFlow.js
Normal file
223
frontend/src/composables/useAuthFlow.js
Normal 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,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user