From 9b2026c5fa0bcbd95b4ce5c1696d7c8af3c98201 Mon Sep 17 00:00:00 2001 From: Markov Date: Tue, 24 Feb 2026 10:32:55 +0100 Subject: [PATCH] feat: persist active tab in URL (?tab=chat survives reload) --- src/pages/ProjectPage.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pages/ProjectPage.tsx b/src/pages/ProjectPage.tsx index 82fe6a2..037c7d7 100644 --- a/src/pages/ProjectPage.tsx +++ b/src/pages/ProjectPage.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react"; -import { useParams } from "react-router-dom"; +import { useParams, useSearchParams } from "react-router-dom"; import { getProjects, type Project } from "@/lib/api"; import Sidebar from "@/components/Sidebar"; import KanbanBoard from "@/components/KanbanBoard"; @@ -16,9 +16,17 @@ const TABS = [ export default function ProjectPage() { const { slug } = useParams<{ slug: string }>(); + const [searchParams, setSearchParams] = useSearchParams(); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(true); - const [activeTab, setActiveTab] = useState("board"); + + const validTabs = ["board", "chat", "files", "settings"]; + const tabFromUrl = searchParams.get("tab") || "board"; + const activeTab = validTabs.includes(tabFromUrl) ? tabFromUrl : "board"; + + const setActiveTab = (tab: string) => { + setSearchParams(tab === "board" ? {} : { tab }, { replace: true }); + }; useEffect(() => { getProjects()