diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3e27718 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "claudeCode.allowDangerouslySkipPermissions": true +} \ No newline at end of file diff --git a/VERSION b/VERSION index 7849b73..8ac3c44 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.3.3 +6.3.4 diff --git a/play-life-web/package.json b/play-life-web/package.json index 1eb4f90..54f98de 100644 --- a/play-life-web/package.json +++ b/play-life-web/package.json @@ -1,6 +1,6 @@ { "name": "play-life-web", - "version": "6.3.3", + "version": "6.3.4", "type": "module", "scripts": { "dev": "vite", diff --git a/play-life-web/src/App.jsx b/play-life-web/src/App.jsx index fc39d05..960bc20 100644 --- a/play-life-web/src/App.jsx +++ b/play-life-web/src/App.jsx @@ -242,8 +242,8 @@ function AppContent() { const tabFromUrl = urlParams.get('tab') const validTabs = ['current', 'priorities', 'full', 'words', 'add-words', 'dictionaries', 'test', 'tasks', 'task-form', 'wishlist', 'wishlist-form', 'wishlist-detail', 'board-form', 'board-join', 'profile', 'todoist-integration', 'telegram-integration', 'fitbit-integration', 'tracking', 'tracking-access', 'tracking-invite'] - if (tabFromUrl && validTabs.includes(tabFromUrl) && deepTabs.includes(tabFromUrl)) { - // Восстанавливаем параметры из URL + if (tabFromUrl && validTabs.includes(tabFromUrl) && deepTabs.includes(tabFromUrl) && window.history.length > 1) { + // Восстанавливаем глубокий таб из URL только если есть история (не рестарт PWA) const params = {} urlParams.forEach((value, key) => { if (key !== 'tab') { @@ -256,31 +256,36 @@ function AppContent() { }) const deepTabUrl = window.location.pathname + window.location.search ensureBaseHistory(tabFromUrl, params, deepTabUrl) - // Если в URL есть глубокий таб, восстанавливаем его setActiveTab(tabFromUrl) setLoadedTabs(prev => ({ ...prev, [tabFromUrl]: true })) if (Object.keys(params).length > 0) { setTabParams(params) - // Если это экран full с selectedProject, восстанавливаем его if (tabFromUrl === 'full' && params.selectedProject) { setSelectedProject(params.selectedProject) } } } else { - // Если в URL нет глубокого таба, проверяем localStorage для основного таба - const savedTab = window.localStorage?.getItem('activeTab') - if (savedTab && validTabs.includes(savedTab)) { - setActiveTab(savedTab) - setLoadedTabs(prev => ({ ...prev, [savedTab]: true })) - } - // Очищаем URL от параметров таба, если это основной таб - if (tabFromUrl && mainTabs.includes(tabFromUrl)) { - const url = new URL(window.location) - url.searchParams.delete('tab') - url.searchParams.forEach((value, key) => { - url.searchParams.delete(key) - }) - window.history.replaceState({}, '', url) + // При рестарте PWA (history.length <= 1) с deep tab в URL — сбрасываем на current + if (tabFromUrl && deepTabs.includes(tabFromUrl) && window.history.length <= 1) { + window.history.replaceState({ tab: 'current' }, '', '/') + setActiveTab('current') + setLoadedTabs(prev => ({ ...prev, 'current': true })) + } else { + // Проверяем localStorage для основного таба + const savedTab = window.localStorage?.getItem('activeTab') + if (savedTab && validTabs.includes(savedTab) && mainTabs.includes(savedTab)) { + setActiveTab(savedTab) + setLoadedTabs(prev => ({ ...prev, [savedTab]: true })) + } + // Очищаем URL от параметров таба, если это основной таб + if (tabFromUrl && mainTabs.includes(tabFromUrl)) { + const url = new URL(window.location) + url.searchParams.delete('tab') + url.searchParams.forEach((value, key) => { + url.searchParams.delete(key) + }) + window.history.replaceState({}, '', url) + } } } setIsInitialized(true)