import type { InertiaLinkProps } from '@inertiajs/react'; import { usePage } from '@inertiajs/react'; import { toUrl } from '@/lib/utils'; export type IsCurrentUrlFn = ( urlToCheck: NonNullable, currentUrl?: string, startsWith?: boolean, ) => boolean; export type IsCurrentOrParentUrlFn = ( urlToCheck: NonNullable, currentUrl?: string, ) => boolean; export type WhenCurrentUrlFn = ( urlToCheck: NonNullable, ifTrue: TIfTrue, ifFalse?: TIfFalse, ) => TIfTrue | TIfFalse; export type UseCurrentUrlReturn = { currentUrl: string; isCurrentUrl: IsCurrentUrlFn; isCurrentOrParentUrl: IsCurrentOrParentUrlFn; whenCurrentUrl: WhenCurrentUrlFn; }; export function useCurrentUrl(): UseCurrentUrlReturn { const page = usePage(); const currentUrlPath = new URL( page.url, typeof window !== 'undefined' ? window.location.origin : 'http://localhost', ).pathname; const isCurrentUrl: IsCurrentUrlFn = ( urlToCheck: NonNullable, currentUrl?: string, startsWith: boolean = false, ) => { const urlToCompare = currentUrl ?? currentUrlPath; const urlString = toUrl(urlToCheck); const comparePath = (path: string): boolean => startsWith ? urlToCompare.startsWith(path) : path === urlToCompare; if (!urlString.startsWith('http')) { return comparePath(urlString); } try { const absoluteUrl = new URL(urlString); return comparePath(absoluteUrl.pathname); } catch { return false; } }; const isCurrentOrParentUrl: IsCurrentOrParentUrlFn = ( urlToCheck: NonNullable, currentUrl?: string, ) => { return isCurrentUrl(urlToCheck, currentUrl, true); }; const whenCurrentUrl: WhenCurrentUrlFn = ( urlToCheck: NonNullable, ifTrue: TIfTrue, ifFalse: TIfFalse = null as TIfFalse, ): TIfTrue | TIfFalse => { return isCurrentUrl(urlToCheck) ? ifTrue : ifFalse; }; return { currentUrl: currentUrlPath, isCurrentUrl, isCurrentOrParentUrl, whenCurrentUrl, }; }