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