From b517adfb6615a8a8522ef5a2b2a7e29c80e865e1 Mon Sep 17 00:00:00 2001 From: Abhay Mishra Date: Mon, 12 Jan 2026 16:41:15 +0530 Subject: [PATCH] fix: auto-scroll active installed-apps category tab into view on mobile (#26414) * fix: auto-scroll active installed-apps category tab into view on mobile * updated code3 --- .../_components/AppCategoryNavigation.tsx | 30 ++++++++++-- .../navigation/tabs/HorizontalTabs.tsx | 49 +++++++++++++++++-- 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/packages/app-store/_components/AppCategoryNavigation.tsx b/packages/app-store/_components/AppCategoryNavigation.tsx index b894d648a0..0757d8cc6d 100644 --- a/packages/app-store/_components/AppCategoryNavigation.tsx +++ b/packages/app-store/_components/AppCategoryNavigation.tsx @@ -28,17 +28,37 @@ const AppCategoryNavigation = ({ useQueryParam?: boolean; }) => { const [animationRef] = useAutoAnimate(); - const appCategories = useMemo(() => getAppCategories(baseURL, useQueryParam), [baseURL, useQueryParam]); + const appCategories = useMemo( + () => getAppCategories(baseURL, useQueryParam), + [baseURL, useQueryParam] + ); return ( -
+
- +
- +
-
+
{children}
diff --git a/packages/ui/components/navigation/tabs/HorizontalTabs.tsx b/packages/ui/components/navigation/tabs/HorizontalTabs.tsx index ad25afbee1..984ae65414 100644 --- a/packages/ui/components/navigation/tabs/HorizontalTabs.tsx +++ b/packages/ui/components/navigation/tabs/HorizontalTabs.tsx @@ -1,3 +1,5 @@ +import { useIsomorphicLayoutEffect } from "@calcom/lib/hooks/useIsomorphicLayoutEffect"; +import { useRef } from "react"; import type { HorizontalTabItemProps } from "./HorizontalTabItem"; import HorizontalTabItem from "./HorizontalTabItem"; @@ -6,17 +8,56 @@ export interface NavTabProps { linkShallow?: boolean; linkScroll?: boolean; actions?: JSX.Element; + scrollActiveTabIntoView?: boolean; } -const HorizontalTabs = function ({ tabs, linkShallow, linkScroll, actions, ...props }: NavTabProps) { +const HorizontalTabs = ({ + tabs, + linkShallow, + linkScroll, + actions, + scrollActiveTabIntoView, + ...props +}: NavTabProps): JSX.Element => { + const navRef = useRef(null); + const lastScrolledActiveHrefRef = useRef(null); + + useIsomorphicLayoutEffect(() => { + if (!scrollActiveTabIntoView) return; + const navEl = navRef.current; + if (!navEl) return; + + if (navEl.scrollWidth <= navEl.clientWidth) return; + + const activeEl = navEl.querySelector("[aria-current='page']"); + if (!activeEl) return; + + const activeHref = activeEl.getAttribute("href"); + if (activeHref && lastScrolledActiveHrefRef.current === activeHref) return; + + activeEl.scrollIntoView({ + behavior: "auto", + block: "nearest", + inline: "center", + }); + if (activeHref) lastScrolledActiveHrefRef.current = activeHref; + }, [scrollActiveTabIntoView, tabs]); + return (
{actions && actions}