From 075d209b6f4be251064f1d0f1ee6324461c2401a Mon Sep 17 00:00:00 2001 From: Peer Richelsen Date: Wed, 19 Nov 2025 12:09:07 +0100 Subject: [PATCH] feat: remove OAuth clients link from settings navigation (#25206) * feat: remove OAuth clients link from settings navigation Co-Authored-By: peer@cal.com * fix: resolve infinite loop in sidebar close effect Use functional state update to avoid reading sideContainerOpen in dependency array, which was causing infinite re-renders when navigating between settings pages. Co-Authored-By: peer@cal.com --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../SettingsLayoutAppDirClient.tsx | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx index 8a1dd35930..a719de6010 100644 --- a/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx +++ b/apps/web/app/(use-page-wrapper)/settings/(settings-layout)/SettingsLayoutAppDirClient.tsx @@ -2,6 +2,7 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@radix-ui/react-collapsible"; import { useSession } from "next-auth/react"; +import Image from "next/image"; import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import type { ComponentProps } from "react"; @@ -101,8 +102,6 @@ const getTabs = (orgBranding: OrganizationBranding | null) => { name: "privacy_and_security", href: "/settings/organizations/privacy", }, - - { name: "OAuth Clients", href: "/settings/organizations/platform/oauth-clients" }, { name: "SSO", href: "/settings/organizations/sso", @@ -173,7 +172,6 @@ const organizationRequiredKeys = ["organization"]; const organizationAdminKeys = [ "privacy", "privacy_and_security", - "OAuth Clients", "SSO", "directory_sync", "delegation_credential", @@ -358,11 +356,12 @@ const TeamListCollapsible = ({ teamFeatures }: { teamFeatures?: Record(); const searchParams = useCompatSearchParams(); + const searchParamsId = searchParams?.get("id"); useEffect(() => { if (teams) { const teamStates = teams?.map((team) => ({ teamId: team.id, - teamMenuOpen: String(team.id) === searchParams?.get("id"), + teamMenuOpen: String(team.id) === searchParamsId, })); setTeamMenuState(teamStates); setTimeout(() => { @@ -372,7 +371,7 @@ const TeamListCollapsible = ({ teamFeatures }: { teamFeatures?: Record @@ -431,9 +430,11 @@ const TeamListCollapsible = ({ teamFeatures }: { teamFeatures?: Record {!team.parentId && ( - {team.name )} @@ -554,12 +555,13 @@ const SettingsSidebarContainer = ({ enabled: !!session.data?.user?.org, }); + const searchParamsId = searchParams?.get("id"); // Same as above but for otherTeams useEffect(() => { if (otherTeams) { const otherTeamStates = otherTeams?.map((team) => ({ teamId: team.id, - teamMenuOpen: String(team.id) === searchParams?.get("id"), + teamMenuOpen: String(team.id) === searchParamsId, })); setOtherTeamMenuState(otherTeamStates); setTimeout(() => { @@ -570,7 +572,7 @@ const SettingsSidebarContainer = ({ tabMembers?.scrollIntoView({ behavior: "smooth" }); }, 100); } - }, [searchParams?.get("id"), otherTeams]); + }, [searchParamsId, otherTeams]); return (