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'; export type UseCurrentUrlReturn = { currentUrl: DeepReadonly>; isCurrentUrl: ( urlToCheck: NonNullable, currentUrl?: string, ) => boolean; whenCurrentUrl: ( urlToCheck: NonNullable, ifTrue: T, ifFalse?: F, ) => T | F; }; const page = usePage(); const currentUrlReactive = computed( () => new URL(page.url, window?.location.origin).pathname, ); export function useCurrentUrl(): UseCurrentUrlReturn { function isCurrentUrl( urlToCheck: NonNullable, currentUrl?: string, ) { const urlToCompare = currentUrl ?? currentUrlReactive.value; const urlString = toUrl(urlToCheck); if (!urlString.startsWith('http')) { return urlString === urlToCompare; } try { const absoluteUrl = new URL(urlString); return absoluteUrl.pathname === urlToCompare; } catch { return false; } } function whenCurrentUrl( urlToCheck: NonNullable, ifTrue: any, ifFalse: any = null, ) { return isCurrentUrl(urlToCheck) ? ifTrue : ifFalse; } return { currentUrl: readonly(currentUrlReactive), isCurrentUrl, whenCurrentUrl, }; }