From 0463c237c0b6c51ee5f332382ab1fe8bfa852eb3 Mon Sep 17 00:00:00 2001 From: poignatov Date: Thu, 5 Feb 2026 12:49:46 +0300 Subject: [PATCH] =?UTF-8?q?4.20.5:=20=D0=9A=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=B0=D0=B4=20=D0=B4=D0=BB=D1=8F=20=D0=BE?= =?UTF-8?q?=D0=BA=D0=BD=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- VERSION | 2 +- play-life-web/package.json | 2 +- play-life-web/src/components/TaskList.jsx | 81 ++++++++++++++++------- 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/VERSION b/VERSION index ba8acfe..9d0fec8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.20.4 +4.20.5 diff --git a/play-life-web/package.json b/play-life-web/package.json index 0ab08ea..9c3b543 100644 --- a/play-life-web/package.json +++ b/play-life-web/package.json @@ -1,6 +1,6 @@ { "name": "play-life-web", - "version": "4.20.4", + "version": "4.20.5", "type": "module", "scripts": { "dev": "vite", diff --git a/play-life-web/src/components/TaskList.jsx b/play-life-web/src/components/TaskList.jsx index e57bfb9..1daae1c 100644 --- a/play-life-web/src/components/TaskList.jsx +++ b/play-life-web/src/components/TaskList.jsx @@ -75,39 +75,62 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry setSelectedTaskForDetail(null) } - // Добавляем запись в историю при открытии модального окна и обрабатываем "назад" - const historyPushedRef = useRef(false) + // Добавляем запись в историю при открытии модальных окон и обрабатываем "назад" + const historyPushedForDetailRef = useRef(false) + const historyPushedForPostponeRef = useRef(false) const selectedTaskForDetailRef = useRef(selectedTaskForDetail) + const selectedTaskForPostponeRef = useRef(selectedTaskForPostpone) - // Обновляем ref при изменении значения + // Обновляем refs при изменении значений useEffect(() => { selectedTaskForDetailRef.current = selectedTaskForDetail - }, [selectedTaskForDetail]) + selectedTaskForPostponeRef.current = selectedTaskForPostpone + }, [selectedTaskForDetail, selectedTaskForPostpone]) useEffect(() => { - if (selectedTaskForDetail && !historyPushedRef.current) { - // Добавляем запись в историю при открытии модального окна - window.history.pushState({ modalOpen: true, type: 'task-detail' }, '', window.location.href) - historyPushedRef.current = true - } else if (!selectedTaskForDetail) { - historyPushedRef.current = false + if (selectedTaskForPostpone && !historyPushedForPostponeRef.current) { + // Добавляем запись в историю при открытии модального окна переноса + window.history.pushState({ modalOpen: true, type: 'task-postpone' }, '', window.location.href) + historyPushedForPostponeRef.current = true + } else if (!selectedTaskForPostpone) { + historyPushedForPostponeRef.current = false } - if (!selectedTaskForDetail) return + if (selectedTaskForDetail && !historyPushedForDetailRef.current) { + // Добавляем запись в историю при открытии модального окна деталей задачи + window.history.pushState({ modalOpen: true, type: 'task-detail' }, '', window.location.href) + historyPushedForDetailRef.current = true + } else if (!selectedTaskForDetail) { + historyPushedForDetailRef.current = false + } + + if (!selectedTaskForDetail && !selectedTaskForPostpone) return const handlePopState = (event) => { - // Проверяем наличие модального окна в DOM + // Проверяем наличие модальных окон в DOM const taskDetailModal = document.querySelector('.task-detail-modal-overlay') + const postponeModal = document.querySelector('.task-postpone-modal-overlay') - // Используем ref для получения актуального состояния + // Используем refs для получения актуального состояния const currentTaskDetail = selectedTaskForDetailRef.current + const currentPostpone = selectedTaskForPostponeRef.current - // Проверяем, открыто ли модальное окно (по состоянию или в DOM) + // Сначала проверяем модальное окно переноса (если оно открыто поверх) + if (currentPostpone || postponeModal) { + setSelectedTaskForPostpone(null) + setPostponeDate('') + historyPushedForPostponeRef.current = false + // Возвращаем запись для модального окна деталей задачи, если оно было открыто + if (currentTaskDetail || taskDetailModal) { + window.history.pushState({ modalOpen: true, type: 'task-detail' }, '', window.location.href) + } + return + } + + // Если открыто модальное окно деталей задачи, закрываем его if (currentTaskDetail || taskDetailModal) { - // Закрываем модальное окно setSelectedTaskForDetail(null) - historyPushedRef.current = false - // Предотвращаем дальнейшую обработку в App.jsx + historyPushedForDetailRef.current = false // Следующее нажатие "назад" обработается App.jsx нормально return } @@ -117,7 +140,7 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry return () => { window.removeEventListener('popstate', handlePopState) } - }, [selectedTaskForDetail]) + }, [selectedTaskForDetail, selectedTaskForPostpone]) @@ -367,8 +390,15 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry } const handlePostponeClose = () => { - setSelectedTaskForPostpone(null) - setPostponeDate('') + // Если была добавлена запись в историю, удаляем её через history.back() + // Обработчик popstate закроет модальное окно и сбросит флаг + if (historyPushedForPostponeRef.current) { + window.history.back() + } else { + // Если записи не было, просто закрываем модальное окно + setSelectedTaskForPostpone(null) + setPostponeDate('') + } } const handleDateSelect = (date) => { @@ -440,9 +470,14 @@ function TaskList({ onNavigate, data, loading, backgroundLoading, error, onRetry onRefresh() } - // Закрываем модальное окно - setSelectedTaskForPostpone(null) - setPostponeDate('') + // Закрываем модальное окно и удаляем запись из истории, если она была добавлена + // Обработчик popstate закроет модальное окно и сбросит флаг + if (historyPushedForPostponeRef.current) { + window.history.back() + } else { + setSelectedTaskForPostpone(null) + setPostponeDate('') + } } catch (err) { console.error('Error postponing task:', err) setToast({ message: err.message || 'Ошибка при переносе задачи', type: 'error' })