blocks/multiplatform/choose-share/hooks/useTabScroll.ts (28 lines of code) (raw):
import { useRouter } from 'next/router';
import { useCallback, useEffect } from 'react';
export function useTabScroll(tabs: { id: string }[], prefix: string, onChange: (index: number) => void) {
const router = useRouter();
const navigateToHash = useCallback(function navigateToHash(e) {
e.preventDefault();
const href = e?.target?.closest('[role="tab"]')?.href;
if (href) router.replace(href, undefined);
}, [router]);
useEffect(() => {
function handleHashChange(prefix: string) {
const hash = globalThis?.location?.hash;
if (!hash) return;
const i = tabs.findIndex(tab => hash === `#${prefix}${tab.id}`);
if (i === -1) return;
onChange(i);
const id = `${prefix}${tabs[i]?.id}`;
const el = document.getElementById(id);
const offset = el?.offsetTop ?? 0;
if (offset) el?.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'center' });
}
const handle = () => handleHashChange(prefix);
handle();
window.addEventListener('hashchange', handle);
return () => window.removeEventListener('hashchange', handle);
}, [tabs, prefix, onChange]);
return navigateToHash;
}