/** * Публичная страница регистрации по ссылке-приглашению (Material UI версия) */ 'use client'; import React, { useState, useEffect } from 'react'; import { useParams, useRouter } from 'next/navigation'; import { getMentorInfoByToken, registerByLink } from '@/api/students'; import { useAuth } from '@/contexts/AuthContext'; import { getErrorMessage } from '@/lib/error-utils'; const loadMaterialComponents = async () => { await Promise.all([ import('@material/web/textfield/filled-text-field.js'), import('@material/web/button/filled-button.js'), import('@material/web/button/text-button.js'), ]); }; export default function InvitationPage() { const { token } = useParams(); const router = useRouter(); const { login: authLogin } = useAuth(); const [mounted, setMounted] = useState(false); const [mentor, setMentor] = useState<{ mentor_name: string; avatar_url: string | null } | null>(null); const [loading, setLoading] = useState(true); const [registering, setRegistering] = useState(false); const [error, setError] = useState(null); const [componentsLoaded, setComponentsLoaded] = useState(false); const [formData, setFormData] = useState({ first_name: '', last_name: '', email: '', password: '', }); useEffect(() => { setMounted(true); loadMaterialComponents() .then(() => setComponentsLoaded(true)) .catch((err) => { console.error('Error loading Material components:', err); setComponentsLoaded(true); }); }, []); useEffect(() => { const fetchMentor = async () => { try { const data = await getMentorInfoByToken(token as string); setMentor(data); } catch (err: any) { setError('Недействительная или просроченная ссылка'); } finally { setLoading(false); } }; if (token) { fetchMentor(); } }, [token]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); setRegistering(true); try { const response = await registerByLink({ token: token as string, ...formData, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, }); // Автоматический вход после регистрации if (response.access) { localStorage.setItem('access_token', response.access); if (response.refresh) { localStorage.setItem('refresh_token', response.refresh); } if (response.user) { await authLogin(response.access, response.user); } else { await authLogin(response.access); } window.location.href = '/dashboard'; } } catch (err: any) { setError(getErrorMessage(err, 'Ошибка при регистрации')); setRegistering(false); } }; if (!mounted || loading || !componentsLoaded) { return (
); } if (error && !mentor) { return (

Упс!

{error}

router.push('/')} style={{ width: '100%' }}> На главную
); } return (
Uchill Logo

Присоединяйтесь!

Вас пригласил ментор {mentor?.mentor_name}

{mentor?.avatar_url && (
{mentor.mentor_name}
)}
setFormData({ ...formData, first_name: e.target.value })} required style={{ width: '100%' }} /> setFormData({ ...formData, last_name: e.target.value })} required style={{ width: '100%' }} />
setFormData({ ...formData, email: e.target.value })} required style={{ width: '100%' }} /> setFormData({ ...formData, password: e.target.value })} required style={{ width: '100%' }} /> {error && (
{error}
)} {registering ? 'Регистрация...' : 'Начать обучение'}
router.push('/login')} style={{ fontSize: '14px' }}> Уже есть аккаунт? Войти
); }