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, startsWith?: boolean, ) => boolean; isCurrentOrParentUrl: ( 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, startsWith: boolean = false, ) { const urlToCompare = currentUrl ?? currentUrlReactive.value; 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; } } function isCurrentOrParentUrl( urlToCheck: NonNullable, currentUrl?: string, ) { return isCurrentUrl(urlToCheck, currentUrl, true); } function whenCurrentUrl( urlToCheck: NonNullable, ifTrue: any, ifFalse: any = null, ) { return isCurrentUrl(urlToCheck) ? ifTrue : ifFalse; } return { currentUrl: readonly(currentUrlReactive), isCurrentUrl, isCurrentOrParentUrl, whenCurrentUrl, }; }