поменяла алерты на тостер/соннер + настройка отображения небольшая

This commit is contained in:
Tatyana 2025-08-20 14:28:15 +03:00
parent 00126080bf
commit 1197c9ca1d
6 changed files with 113 additions and 47 deletions

View File

@ -6,6 +6,7 @@ const Toaster: React.FC<ToasterProps> = ({ className, ...props }) => {
return ( return (
<Sonner <Sonner
className={`toaster group ${className ?? ''}`} className={`toaster group ${className ?? ''}`}
position="bottom-center"
{...props} {...props}
/> />
); );

View File

@ -43,3 +43,23 @@
} }
} }
.ToastRoot[data-swipe="move"] {
transform: translateX(var(--radix-toast-swipe-move-x));
}
.ToastRoot[data-swipe="cancel"] {
transform: translateX(0);
transition: transform 200ms ease-out;
}
.ToastRoot[data-swipe="end"] {
animation: slideRight 100ms ease-out;
}
@keyframes slideRight {
from {
transform: translateX(var(--radix-toast-swipe-end-x));
}
to {
transform: translateX(100%);
}
}

View File

@ -7,6 +7,32 @@ import { useHistory } from "react-router-dom"
import HeaderNav from "../components/HeaderNav" import HeaderNav from "../components/HeaderNav"
import { getRouteCourseExercises } from "../shared/consts/router" import { getRouteCourseExercises } from "../shared/consts/router"
const ProgressLine = () => {
return (<div
className="h-full bg-orange-400 transition-all duration-500 absolute left-0 top-0 rounded-l-xl"
style={{ width: '85%' }}
/>
);
}
const AnalitcsCards = () => {
{/* Analytics Cards */ }
return (
<div className="px-6 mb-8" >
<div className="text-center relative ">
<div className="w-full h-10 bg-gray-500 rounded-xl relative flex items-center justify-center mb-4 shadow-xl">
{/* Прогрессная часть */}
<ProgressLine/>
{/* Текст поверх линии */}
<div className="absolute text-white font-semibold text-base">Вы прошли реабилитацию на {85}%</div>
</div>
</div>
</div>
)
}
const Home: React.FC = () => { const Home: React.FC = () => {
const history = useHistory() const history = useHistory()
@ -16,35 +42,10 @@ const Home: React.FC = () => {
{ id: 3, name: "Реабилитация плеча", progress: 90, color: "from-[#2BACBE]/80 to-[#5F5C5C]" }, { id: 3, name: "Реабилитация плеча", progress: 90, color: "from-[#2BACBE]/80 to-[#5F5C5C]" },
]; ];
return ( return (
<div className="my-36 min-h-screen max-w-4xl mx-auto"> <div className="my-36 min-h-screen max-w-4xl mx-auto">
<HeaderNav item='Курсы' text='все назначенные' /> <HeaderNav item='Курсы' text='все назначенные' />
<AnalitcsCards />
{/* Analytics Cards */}
<div className="px-6 mb-8">
<div className="text-center relative ">
<div className="w-full h-10 bg-gray-500 rounded-xl relative flex items-center justify-center mb-4 shadow-xl">
{/* Прогрессная часть */}
<div
className="h-full bg-orange-400 transition-all duration-500 absolute left-0 top-0 rounded-l-xl"
style={{ width: '85%' }}
></div>
{/* Текст поверх линии */}
<div className="absolute text-white font-semibold text-base">Вы прошли реабилитацию на {85}%</div>
</div>
</div>
</div>
{/* Courses */} {/* Courses */}

View File

@ -96,6 +96,51 @@ const Exercise: React.FC = () => {
}, },
] ]
class User {
age = 18;
private _token = '';
constructor(age = 18, token = '') {
this.token = token
this.age = age
}
get isOld() {
return this.age > 70;
}
get isAuth() {
return this._token.length > 0 && this._token.length <= 20;
}
set token (t: string) {
if(t.length === 0) return;
this._token = t;
}
get token () {
return this._token;
}
}
const user = new User();
user.isOld // false
user.age = 71
user.isOld // true
user.isAuth // false
user.token = '123'
user.isAuth // true
user.token = '123'
return ( return (
<div className="bg-gray-50 w-full h-full overflow-auto"> <div className="bg-gray-50 w-full h-full overflow-auto">
@ -103,9 +148,6 @@ const Exercise: React.FC = () => {
<HeaderNav item='Надо разобраться?' text='упражнение' /> <HeaderNav item='Надо разобраться?' text='упражнение' />
{/* Video/Image Section */} {/* Video/Image Section */}
<div className="px-4 sm:px-6 mt-10 mb-6"> <div className="px-4 sm:px-6 mt-10 mb-6">
<div className="glass-morphism rounded-3xl overflow-hidden shadow-2xl border border-white/20 backdrop-blur-2xl"> <div className="glass-morphism rounded-3xl overflow-hidden shadow-2xl border border-white/20 backdrop-blur-2xl">

View File

@ -23,7 +23,7 @@ const handleSubmit = async (e: React.FormEvent) => {
try { try {
await connect.post('/reset-password/api/add-request', { email }); await connect.post('/reset-password/api/add-request', { email });
toast.error('Письмо для сброса пароля отправлено.', { toast.success('Письмо для сброса пароля отправлено.', {
richColors: true, richColors: true,
}); });
@ -38,7 +38,6 @@ const handleSubmit = async (e: React.FormEvent) => {
} catch (error: any) { } catch (error: any) {
setIsSubmitted(false); setIsSubmitted(false);
toast.error('Ошибка авторизации!', { toast.error('Ошибка авторизации!', {
description: `${e}`,
richColors: true, richColors: true,
}); });

View File

@ -68,7 +68,6 @@ export default function LoginPage() {
if (error.response.status === 400) { if (error.response.status === 400) {
toast.error('Неверные данные для входа', { toast.error('Неверные данные для входа', {
description: `${e}`,
richColors: true, richColors: true,
}); });
} }
@ -109,14 +108,18 @@ export default function LoginPage() {
localStorage.setItem('userName', data.user_name) localStorage.setItem('userName', data.user_name)
console.log('Данные сохранены в localStorage') console.log('Данные сохранены в localStorage')
alert('Вы успешно зерегистрировались!') toast.success('Вы успешно зарегистрировались', {
richColors: true,
});
console.log('Отправляемые данные:', { email, password }); console.log('Отправляемые данные:', { email, password });
// После этого можно перейти или показать сообщение // После этого можно перейти или показать сообщение
history.push(getRouteHome()) history.push(getRouteHome())
} catch (error) { } catch (error) {
console.error('Ошибка при регистрации:', error) console.error('Ошибка при регистрации:', error)
alert('Ошибка при регистрации') toast.error('Ошибка при регистрации', {
richColors: true,
});
} }
} }