mirror of https://github.com/lukechilds/docs.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.5 KiB
54 lines
1.5 KiB
import React, { useEffect } from 'react';
|
|
import { useRouter } from 'next/router';
|
|
import { useAppState } from '@common/hooks/use-app-state';
|
|
|
|
interface ActiveHeadingReturn {
|
|
isActive: boolean;
|
|
doChangeActiveSlug: (value: string) => void;
|
|
location: string;
|
|
slugInView?: string;
|
|
doChangeSlugInView: (value: string) => void;
|
|
}
|
|
|
|
const getHash = (url: string) => url?.includes('#') && url.split('#')[1];
|
|
|
|
export const useWatchActiveHeadingChange = () => {
|
|
const router = useRouter();
|
|
const asPath = router && router.asPath;
|
|
const { activeSlug, doChangeActiveSlug } = useAppState();
|
|
const urlHash = getHash(asPath);
|
|
|
|
const handleRouteChange = url => {
|
|
if (url) {
|
|
const hash = getHash(url);
|
|
if (hash) doChangeActiveSlug(hash);
|
|
}
|
|
};
|
|
|
|
useEffect(() => {
|
|
if ((urlHash && !activeSlug) || (urlHash && urlHash !== activeSlug)) {
|
|
doChangeActiveSlug(urlHash);
|
|
}
|
|
router.events.on('hashChangeStart', handleRouteChange);
|
|
router.events.on('routeChangeStart', handleRouteChange);
|
|
return () => {
|
|
router.events.off('hashChangeStart', handleRouteChange);
|
|
router.events.off('routeChangeStart', handleRouteChange);
|
|
};
|
|
}, []);
|
|
};
|
|
|
|
export const useActiveHeading = (_slug: string): ActiveHeadingReturn => {
|
|
const { activeSlug, slugInView, doChangeActiveSlug, doChangeSlugInView } = useAppState();
|
|
const location = typeof window !== 'undefined' && window.location.href;
|
|
|
|
const isActive = _slug === activeSlug;
|
|
|
|
return {
|
|
isActive,
|
|
doChangeActiveSlug,
|
|
location,
|
|
slugInView,
|
|
doChangeSlugInView,
|
|
};
|
|
};
|
|
|