import type { InertiaLinkProps } from '@inertiajs/vue3'; import { usePage } from '@inertiajs/vue3'; import type { ComputedRef, DeepReadonly } from 'vue'; import { computed, readonly } from 'vue'; import { toUrl } from '@/lib/utils'; import { matchesNavigationUrl } from '@/lib/navigation'; export type UseCurrentUrlReturn = { currentUrl: DeepReadonly>; isCurrentUrl: ( urlToCheck: NonNullable, currentUrl?: string, startsWith?: boolean, ) => boolean; isCurrentOrParentUrl: ( urlToCheck: NonNullable, currentUrl?: string, ) => boolean; whenCurrentUrl: ( urlToCheck: NonNullable, ifTrue: T, ifFalse?: F, ) => T | F; }; export function useCurrentUrl(): UseCurrentUrlReturn { const page = usePage(); const currentUrlReactive = computed( () => new URL(page.url, 'http://localhost').pathname, ); function isCurrentUrl( urlToCheck: NonNullable, currentUrl?: string, startsWith: boolean = false, ) { return matchesNavigationUrl( toUrl(urlToCheck), currentUrl ?? currentUrlReactive.value, startsWith, ); } function isCurrentOrParentUrl( urlToCheck: NonNullable, currentUrl?: string, ) { return isCurrentUrl(urlToCheck, currentUrl, true); } function whenCurrentUrl( urlToCheck: NonNullable, ifTrue: T, ifFalse: F = null as F, ): T | F { return isCurrentUrl(urlToCheck) ? ifTrue : ifFalse; } return { currentUrl: readonly(currentUrlReactive), isCurrentUrl, isCurrentOrParentUrl, whenCurrentUrl, }; }