diff --git a/jest.config.js b/jest.config.js index eccbb728f1f..28ebc92df8c 100644 --- a/jest.config.js +++ b/jest.config.js @@ -12,6 +12,7 @@ const ignorePatterns = [ '@nextcloud/vue', '@mdi/svg', '@vueuse/core', + '@vueuse/router', '@vueuse/shared', 'bail', 'ccount', // ESM dependency of remark-gfm diff --git a/package-lock.json b/package-lock.json index 25cc5c62e45..13231338688 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,8 +27,9 @@ "@nextcloud/upload": "^2.0.0-rc.0", "@nextcloud/vue": "^9.0.0-rc.6", "@vue-leaflet/vue-leaflet": "^0.10.1", - "@vueuse/components": "^13.4.0", - "@vueuse/core": "^13.4.0", + "@vueuse/components": "^13.7.0", + "@vueuse/core": "^13.7.0", + "@vueuse/router": "^13.7.0", "base64-js": "^1.5.1", "blurhash": "^2.0.5", "crypto-js": "^4.2.0", @@ -5388,6 +5389,22 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@vueuse/router": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/router/-/router-13.7.0.tgz", + "integrity": "sha512-nsl86yjQ/RNeSf3KDY9QnAWQxfPQAfXFHANC4GhDGNW+BXYRPVqh2+hXLn8K/EoD2dwZ2apsCqgLYwNfLLM+tw==", + "license": "MIT", + "dependencies": { + "@vueuse/shared": "13.7.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0", + "vue-router": "^4.0.0" + } + }, "node_modules/@vueuse/shared": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.7.0.tgz", @@ -23407,6 +23424,14 @@ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.7.0.tgz", "integrity": "sha512-8okFhS/1ite8EwUdZZfvTYowNTfXmVCOrBFlA31O0HD8HKXhY+WtTRyF0LwbpJfoFPc+s9anNJIXMVrvP7UTZg==" }, + "@vueuse/router": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/@vueuse/router/-/router-13.7.0.tgz", + "integrity": "sha512-nsl86yjQ/RNeSf3KDY9QnAWQxfPQAfXFHANC4GhDGNW+BXYRPVqh2+hXLn8K/EoD2dwZ2apsCqgLYwNfLLM+tw==", + "requires": { + "@vueuse/shared": "13.7.0" + } + }, "@vueuse/shared": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.7.0.tgz", diff --git a/package.json b/package.json index 4f8d9800a47..a7e4a544be0 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,9 @@ "@nextcloud/upload": "^2.0.0-rc.0", "@nextcloud/vue": "^9.0.0-rc.6", "@vue-leaflet/vue-leaflet": "^0.10.1", - "@vueuse/components": "^13.4.0", - "@vueuse/core": "^13.4.0", + "@vueuse/components": "^13.7.0", + "@vueuse/core": "^13.7.0", + "@vueuse/router": "^13.7.0", "base64-js": "^1.5.1", "blurhash": "^2.0.5", "crypto-js": "^4.2.0", diff --git a/src/composables/useGetThreadId.ts b/src/composables/useGetThreadId.ts index 4b81504bcf1..cf999d5386e 100644 --- a/src/composables/useGetThreadId.ts +++ b/src/composables/useGetThreadId.ts @@ -3,25 +3,19 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +import type { RouteParamValueRaw } from 'vue-router' + import { createSharedComposable } from '@vueuse/core' -import { computed, ref } from 'vue' -import { useRoute, useRouter } from 'vue-router' +import { useRouteQuery } from '@vueuse/router' /** * Shared composable to get threadId of current thread in conversation */ export const useGetThreadId = createSharedComposable(function() { - const router = useRouter() - const route = useRoute() - - if (router) { - return computed({ - get: () => route.query.threadId ? Number(route.query.threadId) : 0, - set: (value: number) => { - router.push({ query: { ...route.query, threadId: value !== 0 ? value : undefined } }) - }, - }) - } else { - return ref(0) - } + return useRouteQuery('threadId', '0', { + transform: { + get: (value: RouteParamValueRaw | undefined) => value ? Number(value) : 0, + set: (value: number) => value !== 0 ? String(value) : undefined, + }, + }) }) diff --git a/src/composables/useGetToken.ts b/src/composables/useGetToken.ts index c8a5c455ba5..f035bfe9273 100644 --- a/src/composables/useGetToken.ts +++ b/src/composables/useGetToken.ts @@ -4,24 +4,13 @@ */ import { createSharedComposable } from '@vueuse/core' -import { computed } from 'vue' -import { useTokenStore } from '../stores/token.ts' - -/** - * FIXME: if router is available (main app), rely on it. - * otherwise mock route object and expose controls - * - * TODO: move tokenStore.updateToken from router change to here - * - * const route = useRouter() ? useRoute() : undefined - * return computed(() => route?.params?.token ?? tokenStore.token) - */ +import { useRouteParams } from '@vueuse/router' /** * Shared composable to get token of current conversation */ export const useGetToken = createSharedComposable(function() { - const tokenStore = useTokenStore() - - return computed(() => tokenStore.token) + return useRouteParams('token', '', { + transform: (value: string | undefined) => value ?? '', + }) })