diff --git a/src/components/Sonner.tsx b/src/components/Sonner.tsx index 5b8ea52..a702d99 100644 --- a/src/components/Sonner.tsx +++ b/src/components/Sonner.tsx @@ -6,6 +6,7 @@ const Toaster: React.FC = ({ className, ...props }) => { return ( ); diff --git a/src/index.css b/src/index.css index a80673c..ba992c9 100644 --- a/src/index.css +++ b/src/index.css @@ -42,4 +42,24 @@ height: 100%; } - } \ No newline at end of file + } + +.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%); + } +} diff --git a/src/pages/Courses.tsx b/src/pages/Courses.tsx index dad0aa3..ee1e651 100644 --- a/src/pages/Courses.tsx +++ b/src/pages/Courses.tsx @@ -7,6 +7,32 @@ import { useHistory } from "react-router-dom" import HeaderNav from "../components/HeaderNav" import { getRouteCourseExercises } from "../shared/consts/router" +const ProgressLine = () => { + return (
+ ); +} + +const AnalitcsCards = () => { + + {/* Analytics Cards */ } + return ( +
+
+
+ {/* Прогрессная часть */} + + + {/* Текст поверх линии */} +
Вы прошли реабилитацию на {85}%
+
+
+
+ ) +} + const Home: React.FC = () => { const history = useHistory() @@ -16,35 +42,10 @@ const Home: React.FC = () => { { id: 3, name: "Реабилитация плеча", progress: 90, color: "from-[#2BACBE]/80 to-[#5F5C5C]" }, ]; - - - return ( - - -
- - {/* Analytics Cards */} -
- -
- -
- {/* Прогрессная часть */} -
- {/* Текст поверх линии */} -
Вы прошли реабилитацию на {85}%
-
- -
- -
- + {/* Courses */} diff --git a/src/pages/Exercise.tsx b/src/pages/Exercise.tsx index 069a063..1fd103b 100644 --- a/src/pages/Exercise.tsx +++ b/src/pages/Exercise.tsx @@ -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 (
@@ -103,9 +148,6 @@ const Exercise: React.FC = () => { - - - {/* Video/Image Section */}
diff --git a/src/pages/ForgotPassword.tsx b/src/pages/ForgotPassword.tsx index e3c60fe..c79c11b 100644 --- a/src/pages/ForgotPassword.tsx +++ b/src/pages/ForgotPassword.tsx @@ -23,7 +23,7 @@ const handleSubmit = async (e: React.FormEvent) => { try { await connect.post('/reset-password/api/add-request', { email }); - toast.error('Письмо для сброса пароля отправлено.', { + toast.success('Письмо для сброса пароля отправлено.', { richColors: true, }); @@ -38,7 +38,6 @@ const handleSubmit = async (e: React.FormEvent) => { } catch (error: any) { setIsSubmitted(false); toast.error('Ошибка авторизации!', { - description: `${e}`, richColors: true, }); diff --git a/src/pages/Login.tsx b/src/pages/Login.tsx index 9866004..e797c8e 100644 --- a/src/pages/Login.tsx +++ b/src/pages/Login.tsx @@ -68,14 +68,13 @@ export default function LoginPage() { if (error.response.status === 400) { toast.error('Неверные данные для входа', { - description: `${e}`, - richColors: true, - }); + richColors: true, + }); } } } else { console.error('Неожиданная ошибка:', error); - ; + ; } } @@ -87,9 +86,9 @@ export default function LoginPage() { const handleRegisterSubmit = async (e: React.FormEvent) => { e.preventDefault() if (registerFormData.password !== registerFormData.confirmPassword) { - toast.error('Пароли не совпадают', { - richColors: true, - }); + toast.error('Пароли не совпадают', { + richColors: true, + }); return } try { @@ -109,14 +108,18 @@ export default function LoginPage() { localStorage.setItem('userName', data.user_name) console.log('Данные сохранены в localStorage') - alert('Вы успешно зерегистрировались!') + toast.success('Вы успешно зарегистрировались', { + richColors: true, + }); console.log('Отправляемые данные:', { email, password }); // После этого можно перейти или показать сообщение history.push(getRouteHome()) } catch (error) { console.error('Ошибка при регистрации:', error) - alert('Ошибка при регистрации') + toast.error('Ошибка при регистрации', { + richColors: true, + }); } } @@ -151,8 +154,8 @@ export default function LoginPage() { type="button" onClick={() => setActiveTab("login")} className={`flex-1 px-3 py-3 rounded-xl text-lg font-semibold transition-all duration-300 ${activeTab === "login" - ? "bg-white text-gray-800 shadow-lg" - : "text-white/80 hover:text-white hover:bg-white/10" + ? "bg-white text-gray-800 shadow-lg" + : "text-white/80 hover:text-white hover:bg-white/10" }`} > Вход @@ -161,8 +164,8 @@ export default function LoginPage() { type="button" onClick={() => setActiveTab("register")} className={`flex-1 px-3 py-3 rounded-xl text-lg font-semibold transition-all duration-300 ${activeTab === "register" - ? "bg-white text-gray-800 shadow-lg" - : "text-white/80 hover:text-white hover:bg-white/10" + ? "bg-white text-gray-800 shadow-lg" + : "text-white/80 hover:text-white hover:bg-white/10" }`} > Регистрация @@ -224,7 +227,7 @@ export default function LoginPage() { aria-label={showPassword ? "Hide password" : "Show password"} > {showPassword ? ( - + ) : ( @@ -367,7 +370,7 @@ export default function LoginPage() { aria-label={showConfirmRegisterPassword ? "Hide password" : "Show password"} > {showConfirmRegisterPassword ? ( - + ) : (