feat: persist active tab in URL (?tab=chat survives reload)

This commit is contained in:
Markov 2026-02-24 10:32:55 +01:00
parent f4f09bfeee
commit 9b2026c5fa

View File

@ -1,5 +1,5 @@
import { useEffect, useState } from "react"; 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 { getProjects, type Project } from "@/lib/api";
import Sidebar from "@/components/Sidebar"; import Sidebar from "@/components/Sidebar";
import KanbanBoard from "@/components/KanbanBoard"; import KanbanBoard from "@/components/KanbanBoard";
@ -16,9 +16,17 @@ const TABS = [
export default function ProjectPage() { export default function ProjectPage() {
const { slug } = useParams<{ slug: string }>(); const { slug } = useParams<{ slug: string }>();
const [searchParams, setSearchParams] = useSearchParams();
const [projects, setProjects] = useState<Project[]>([]); const [projects, setProjects] = useState<Project[]>([]);
const [loading, setLoading] = useState(true); 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(() => { useEffect(() => {
getProjects() getProjects()