From b9725eaf1142f875750e16a49b4f076b2b5386d4 Mon Sep 17 00:00:00 2001 From: sharevb Date: Fri, 9 Aug 2024 21:09:01 +0200 Subject: [PATCH] feat(Slugify): add separator option Fix https://github.com/CorentinTh/it-tools/discussions/267 --- src/composable/queryParams.ts | 33 ++++++++++++++++++++- src/tools/slugify-string/slugify-string.vue | 24 +++++++++++++-- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/composable/queryParams.ts b/src/composable/queryParams.ts index 9699abbc..7cc8cc0d 100644 --- a/src/composable/queryParams.ts +++ b/src/composable/queryParams.ts @@ -1,7 +1,8 @@ import { useRouteQuery } from '@vueuse/router'; import { computed } from 'vue'; +import { useStorage } from '@vueuse/core'; -export { useQueryParam }; +export { useQueryParam, useQueryParamOrStorage }; const transformers = { number: { @@ -16,6 +17,12 @@ const transformers = { fromQuery: (value: string) => value.toLowerCase() === 'true', toQuery: (value: boolean) => (value ? 'true' : 'false'), }, + object: { + fromQuery: (value: string) => { + return JSON.parse(value); + }, + toQuery: (value: object) => JSON.stringify(value), + }, }; function useQueryParam({ name, defaultValue }: { name: string; defaultValue: T }) { @@ -33,3 +40,27 @@ function useQueryParam({ name, defaultValue }: { name: string; defaultValue: }, }); } + +function useQueryParamOrStorage({ name, storageName, defaultValue }: { name: string; storageName: string; defaultValue: T }) { + const type = typeof defaultValue; + const transformer = transformers[type as keyof typeof transformers] ?? transformers.string; + + const storageRef = useStorage(storageName, defaultValue); + const proxyDefaultValue = transformer.toQuery(defaultValue as never); + const proxy = useRouteQuery(name, proxyDefaultValue); + + const r = ref(defaultValue); + + watch(r, + (value) => { + proxy.value = transformer.toQuery(value as never); + storageRef.value = value as never; + }, + { deep: true }); + + r.value = (proxy.value && proxy.value !== proxyDefaultValue + ? transformer.fromQuery(proxy.value) as unknown as T + : storageRef.value as T) as never; + + return r; +} diff --git a/src/tools/slugify-string/slugify-string.vue b/src/tools/slugify-string/slugify-string.vue index f7666e30..bb03b435 100644 --- a/src/tools/slugify-string/slugify-string.vue +++ b/src/tools/slugify-string/slugify-string.vue @@ -2,17 +2,35 @@ import slugify from '@sindresorhus/slugify'; import { withDefaultOnError } from '@/utils/defaults'; import { useCopy } from '@/composable/copy'; +import { useQueryParamOrStorage } from '@/composable/queryParams'; const input = ref(''); -const slug = computed(() => withDefaultOnError(() => slugify(input.value), '')); +const separator = useQueryParamOrStorage({ name: 'sep', storageName: 'slugify:sep', defaultValue: '-' }); +const slug = computed(() => withDefaultOnError(() => slugify(input.value, { + separator: separator.value, +}), '')); const { copy } = useCopy({ source: slug, text: 'Slug copied to clipboard' });