From 56a04dbe14def4ca591be4a5e94cddfda42a54fe Mon Sep 17 00:00:00 2001
From: Primakov Alexandr Alexandrovich <primakov.pro@yandex.ru>
Date: Thu, 27 Mar 2025 14:01:12 +0300
Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?=
 =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?=
 =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BA=D1=86=D0=B8?=
 =?UTF-8?q?=D0=B9=20=D1=81=D1=82=D1=83=D0=B4=D0=B5=D0=BD=D1=82=D0=BE=D0=B2?=
 =?UTF-8?q?=20=D0=B8=20=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20?=
 =?UTF-8?q?=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=B5=D0=BA=20=D0=BD=D0=B0?=
 =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B5=20=D0=BF?=
 =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB?=
 =?UTF-8?q?=D1=8F.=20=D0=A3=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD=D0=BE=20?=
 =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?=
 =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D1=80=D0=B5=D0=B0=D0=BA=D1=86?=
 =?UTF-8?q?=D0=B8=D0=B9=20=D0=B8=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=BE=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?=
 =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8?=
 =?UTF-8?q?=D0=B5=D0=BC=20=D0=B0=D0=BD=D0=B8=D0=BC=D0=B0=D1=86=D0=B8=D0=B8?=
 =?UTF-8?q?=20=D1=81=D1=82=D1=83=D0=B4=D0=B5=D0=BD=D1=82=D0=BE=D0=B2.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/pages/lesson-details.tsx | 23 ++++++---------------
 src/pages/user-page.tsx      | 40 ++++++++++++++++++------------------
 2 files changed, 26 insertions(+), 37 deletions(-)

diff --git a/src/pages/lesson-details.tsx b/src/pages/lesson-details.tsx
index 634c0a7..dca5e38 100644
--- a/src/pages/lesson-details.tsx
+++ b/src/pages/lesson-details.tsx
@@ -137,29 +137,18 @@ const LessonDetail = () => {
         if (!groupedReactions[reaction.sub]) {
           groupedReactions[reaction.sub] = [];
         }
-        
-        // Добавляем только новые реакции
-        const isNewReaction = !prevReactionsRef.current[reaction.sub]?.some(
-          r => r._id === reaction._id
-        );
-        
-        if (isNewReaction) {
-          groupedReactions[reaction.sub] = [reaction];
-        }
+        groupedReactions[reaction.sub].push(reaction);
       });
       
       // Обновляем отображаемые реакции
       setStudentReactions(groupedReactions);
       
-      // Обновляем предыдущие реакции
-      prevReactionsRef.current = { ...groupedReactions };
+      // Обновляем предыдущие реакции после небольшой задержки
+      const updatePrevReactionsTimeout = setTimeout(() => {
+        prevReactionsRef.current = groupedReactions;
+      }, 1000);
       
-      // Сбрасываем отображаемые реакции через некоторое время
-      const clearReactionsTimeout = setTimeout(() => {
-        setStudentReactions({});
-      }, 5000);
-      
-      return () => clearTimeout(clearReactionsTimeout);
+      return () => clearTimeout(updatePrevReactionsTimeout);
     }
   }, [accessCode?.body?.lesson?.studentReactions]);
 
diff --git a/src/pages/user-page.tsx b/src/pages/user-page.tsx
index 67c6e9b..a0ef422 100644
--- a/src/pages/user-page.tsx
+++ b/src/pages/user-page.tsx
@@ -63,28 +63,28 @@ const UserPage = () => {
   // Эффект для поэтапного появления карточек студентов
   useEffect(() => {
     if (ls.data?.body?.students?.length) {
-      // Сначала очищаем список
-      setAnimatedStudents([])
-      
-      // Затем постепенно добавляем студентов для красивой анимации
-      const students = [...ls.data.body.students]
-      const addStudentWithDelay = (index) => {
-        if (index < students.length) {
-          setAnimatedStudents(prev => [...prev, {...students[index], isNew: true}])
-          
-          // Для следующего студента
-          setTimeout(() => {
-            addStudentWithDelay(index + 1)
-          }, 100) // Уменьшенная задержка для более плавной анимации
+      // Обновляем существующих студентов с сохранением их анимации
+      setAnimatedStudents(prevStudents => {
+        const newStudents = ls.data.body.students.map(student => {
+          // Находим существующего студента
+          const existingStudent = prevStudents.find(p => p.sub === student.sub);
+          // Сохраняем флаг isNew если студент уже существует
+          return {
+            ...student,
+            isNew: existingStudent ? existingStudent.isNew : true
+          };
+        });
+        
+        // Если количество студентов не изменилось, сохраняем текущий массив
+        if (prevStudents.length === newStudents.length && 
+            prevStudents.every(student => newStudents.find(n => n.sub === student.sub))) {
+          return prevStudents;
         }
-      }
-      
-      // Запускаем процесс добавления с небольшой задержкой для лучшего UX
-      setTimeout(() => {
-        addStudentWithDelay(0)
-      }, 300)
+        
+        return newStudents;
+      });
     }
-  }, [ls.data?.body?.students])
+  }, [ls.data?.body?.students, ls.data?.body?.studentReactions])
   
   // Эффект для сброса флага "новизны" студентов
   useEffect(() => {