diff --git a/js/cf-webapp/src/app/(dashboard)/review-optimizations/page.tsx b/js/cf-webapp/src/app/(dashboard)/review-optimizations/page.tsx index b91e4798d..0e86b886a 100644 --- a/js/cf-webapp/src/app/(dashboard)/review-optimizations/page.tsx +++ b/js/cf-webapp/src/app/(dashboard)/review-optimizations/page.tsx @@ -227,6 +227,7 @@ export default function StagingPage() { const [error, setError] = useState(null) const { currentOrg, loading: isLoadingViewMode } = useViewMode() + const currentOrgId = currentOrg?.id ?? null const [availableRepositories, setAvailableRepositories] = useState< Array<{ id: string; full_name: string }> @@ -271,8 +272,6 @@ export default function StagingPage() { // Reset repository filter immediately when switching contexts (synchronously, before other effects) useLayoutEffect(() => { - const currentOrgId = currentOrg?.id ?? null - // Skip on initial mount if (previousOrgId.current === undefined) { previousOrgId.current = currentOrgId @@ -294,7 +293,7 @@ export default function StagingPage() { previousOrgId.current = currentOrgId } - }, [currentOrg]) + }, [currentOrgId]) // Load repositories with staging events useEffect(() => { @@ -303,8 +302,8 @@ export default function StagingPage() { try { const userSession = await getUserIdAndUsername() const repos = await getRepositoriesWithStagingEvents( - currentOrg - ? { orgId: currentOrg.id } + currentOrgId + ? { orgId: currentOrgId } : { userId: userSession.userId, username: userSession.username }, ) setAvailableRepositories(repos) @@ -316,7 +315,7 @@ export default function StagingPage() { if (!isLoadingUser && !isLoadingViewMode && userId) { loadRepositories() } - }, [userId, isLoadingUser, isLoadingViewMode, currentOrg]) + }, [userId, isLoadingUser, isLoadingViewMode, currentOrgId]) // Memoized load events function const loadEvents = useCallback(async () => { @@ -364,8 +363,8 @@ export default function StagingPage() { const userSession = await getUserIdAndUsername() const data = await getAllOptimizationEvents({ - payload: currentOrg - ? { orgId: currentOrg.id } + payload: currentOrgId + ? { orgId: currentOrgId } : { userId: userSession.userId, username: userSession.username }, search: filters.search, filter, @@ -398,7 +397,7 @@ export default function StagingPage() { } finally { setIsLoading(false) } - }, [userId, filters, currentOrg, pageSize]) + }, [userId, filters, currentOrgId, pageSize]) // Load events when filters change - with debounce for search useEffect(() => { diff --git a/js/cf-webapp/src/app/dashboard/page.tsx b/js/cf-webapp/src/app/dashboard/page.tsx index 6714369f9..b87c231df 100644 --- a/js/cf-webapp/src/app/dashboard/page.tsx +++ b/js/cf-webapp/src/app/dashboard/page.tsx @@ -61,7 +61,7 @@ interface ActiveUserData { } function Dashboard() { - const { currentOrg } = useViewMode() + const { currentOrg, loading: loadingViewMode } = useViewMode() const currentYear = new Date().getFullYear() const [repositories, setRepositories] = useState([]) @@ -207,8 +207,10 @@ function Dashboard() { }, [selectedYear, currentOrgId]) useEffect(() => { - fetchDashboardData() - }, [fetchDashboardData]) + if (!loadingViewMode) { + fetchDashboardData() + } + }, [fetchDashboardData, loadingViewMode]) const handleYearChange = useCallback((year: number) => { setSelectedYear(year) diff --git a/js/cf-webapp/src/components/dashboard/sidebar.tsx b/js/cf-webapp/src/components/dashboard/sidebar.tsx index 741f3d342..3f87216ef 100644 --- a/js/cf-webapp/src/components/dashboard/sidebar.tsx +++ b/js/cf-webapp/src/components/dashboard/sidebar.tsx @@ -4,7 +4,7 @@ import { Button } from "@/components/ui/button" import LogoBox from "@/components/dashboard/logo-box" import Link from "next/link" import { usePathname } from "next/navigation" -import React, { useEffect, useState, useRef, type JSX } from "react" +import React, { useEffect, useState, useRef, useCallback, type JSX, type MouseEvent } from "react" import Image from "next/image" import { FolderGit2, @@ -74,6 +74,15 @@ export function Sidebar({ className, user, isLoading, error }: SidebarProps): JS const isMemberOfOrg = mode === "organization" && !!currentOrg + const preventSameRouteNavigation = useCallback( + (href: string) => (e: MouseEvent) => { + if (currentRoute === href) { + e.preventDefault() + } + }, + [currentRoute], + ) + useEffect(() => { const savedTheme = localStorage.getItem("theme") const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches @@ -243,7 +252,7 @@ export function Sidebar({ className, user, isLoading, error }: SidebarProps): JS
{/* Main Navigation Group - Always visible */} - +
- +