import type { WritableComputedRef } from 'vue' import { computed, nextTick, unref } from 'vue' import { useRouter } from 'vue-router' export function useRouteQuery( name: string, defaultValue?: T, { mode = 'replace', } = {}, ): WritableComputedRef { const router = useRouter() return computed({ get() { const data = router.currentRoute.value.query[name] if (data == null) return defaultValue ?? null if (Array.isArray(data)) return data.filter(Boolean) return data }, set(v) { nextTick(() => { const oldValue = router.currentRoute.value.query[name] if ((oldValue ?? defaultValue?.toString()) === v.toString()) return router[unref(mode) as 'replace' | 'push']({ query: { ...router.currentRoute.value.query, [name]: `${v}` === defaultValue ? undefined : v, }, }) }) }, }) }