From 48bd5c21655729d7f0c4c6dee410c63917f5720c Mon Sep 17 00:00:00 2001 From: Simon Relet Date: Mon, 13 Jan 2025 17:34:01 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Update=20search=20params?= =?UTF-8?q?=20io?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/src/animals/search-params.ts | 171 ++++++------------ apps/admin/src/breeds/search-params.ts | 17 +- apps/admin/src/colors/search-params.ts | 13 +- apps/admin/src/core/search-params.ts | 17 +- .../src/foster-families/search-params.ts | 61 ++----- .../routes/resources.global-search/shared.tsx | 13 +- .../src/routes/resources.scrap-url/shared.tsx | 8 +- .../src/show/applications/search-params.ts | 35 ++-- apps/admin/src/users/search-params.ts | 42 ++--- apps/show/src/mocks/cloudinary.server.ts | 6 +- libs/core/src/image-url.tsx | 8 +- libs/search-params-io/src/io.ts | 23 ++- libs/search-params-io/src/reader.ts | 52 +++--- libs/search-params-io/src/writter.ts | 72 ++++---- 14 files changed, 218 insertions(+), 320 deletions(-) diff --git a/apps/admin/src/animals/search-params.ts b/apps/admin/src/animals/search-params.ts index a7bba58d..a761344c 100644 --- a/apps/admin/src/animals/search-params.ts +++ b/apps/admin/src/animals/search-params.ts @@ -24,15 +24,14 @@ export const ANIMAL_DEFAULT_SORT = AnimalSort.PICK_UP; export const AnimalSortSearchParams = SearchParamsIO.create({ keys: { sort: "sort" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return AnimalSortSearchParamsSchema.parse({ - sort: SearchParamsIO.getValue(searchParams, keys.sort), + sort: getValue(keys.sort), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue( - searchParams, + setFunction: (data, { keys, setValue }) => { + setValue( keys.sort, data.sort === ANIMAL_DEFAULT_SORT ? undefined : data.sort, ); @@ -80,179 +79,117 @@ export const AnimalSearchParams = SearchParamsIO.create({ vaccinations: "v", }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue, getValues }) => { return AnimalSearchParamsSchema.parse({ - adoptionDateEnd: SearchParamsIO.getValue( - searchParams, - keys.adoptionDateEnd, - ), - adoptionDateStart: SearchParamsIO.getValue( - searchParams, - keys.adoptionDateStart, - ), - adoptionOptions: SearchParamsIO.getValues( - searchParams, - keys.adoptionOptions, - ), - ages: SearchParamsIO.getValues(searchParams, keys.ages), - birthdateEnd: SearchParamsIO.getValue(searchParams, keys.birthdateEnd), - birthdateStart: SearchParamsIO.getValue( - searchParams, - keys.birthdateStart, - ), - diagnosis: SearchParamsIO.getValues(searchParams, keys.diagnosis), - felvResults: SearchParamsIO.getValues(searchParams, keys.felvResults), - fivResults: SearchParamsIO.getValues(searchParams, keys.fivResults), - fosterFamiliesId: SearchParamsIO.getValues( - searchParams, - keys.fosterFamiliesId, - ), - managersId: SearchParamsIO.getValues(searchParams, keys.managersId), - nameOrAlias: SearchParamsIO.getValue(searchParams, keys.nameOrAlias), - nextVaccinationDateEnd: SearchParamsIO.getValue( - searchParams, - keys.nextVaccinationDateEnd, - ), - nextVaccinationDateStart: SearchParamsIO.getValue( - searchParams, - keys.nextVaccinationDateStart, - ), - pickUpDateEnd: SearchParamsIO.getValue(searchParams, keys.pickUpDateEnd), - pickUpDateStart: SearchParamsIO.getValue( - searchParams, - keys.pickUpDateStart, - ), - pickUpLocations: SearchParamsIO.getValues( - searchParams, - keys.pickUpLocations, - ), - pickUpReasons: SearchParamsIO.getValues(searchParams, keys.pickUpReasons), - species: SearchParamsIO.getValues(searchParams, keys.species), - statuses: SearchParamsIO.getValues(searchParams, keys.statuses), - sterilizations: SearchParamsIO.getValues( - searchParams, - keys.sterilizations, - ), - vaccinations: SearchParamsIO.getValues(searchParams, keys.vaccinations), + adoptionDateEnd: getValue(keys.adoptionDateEnd), + adoptionDateStart: getValue(keys.adoptionDateStart), + adoptionOptions: getValues(keys.adoptionOptions), + ages: getValues(keys.ages), + birthdateEnd: getValue(keys.birthdateEnd), + birthdateStart: getValue(keys.birthdateStart), + diagnosis: getValues(keys.diagnosis), + felvResults: getValues(keys.felvResults), + fivResults: getValues(keys.fivResults), + fosterFamiliesId: getValues(keys.fosterFamiliesId), + managersId: getValues(keys.managersId), + nameOrAlias: getValue(keys.nameOrAlias), + nextVaccinationDateEnd: getValue(keys.nextVaccinationDateEnd), + nextVaccinationDateStart: getValue(keys.nextVaccinationDateStart), + pickUpDateEnd: getValue(keys.pickUpDateEnd), + pickUpDateStart: getValue(keys.pickUpDateStart), + pickUpLocations: getValues(keys.pickUpLocations), + pickUpReasons: getValues(keys.pickUpReasons), + species: getValues(keys.species), + statuses: getValues(keys.statuses), + sterilizations: getValues(keys.sterilizations), + vaccinations: getValues(keys.vaccinations), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue( - searchParams, + setFunction: (data, { keys, setValue, setValues }) => { + setValue( keys.adoptionDateEnd, data.adoptionDateEnd == null ? undefined : DateTime.fromJSDate(data.adoptionDateEnd).toISODate(), ); - SearchParamsIO.setValue( - searchParams, + setValue( keys.adoptionDateStart, data.adoptionDateStart == null ? undefined : DateTime.fromJSDate(data.adoptionDateStart).toISODate(), ); - SearchParamsIO.setValues( - searchParams, - keys.adoptionOptions, - data.adoptionOptions, - ); + setValues(keys.adoptionOptions, data.adoptionOptions); - SearchParamsIO.setValues(searchParams, keys.ages, data.ages); + setValues(keys.ages, data.ages); - SearchParamsIO.setValue( - searchParams, + setValue( keys.birthdateEnd, data.birthdateEnd == null ? undefined : DateTime.fromJSDate(data.birthdateEnd).toISODate(), ); - SearchParamsIO.setValue( - searchParams, + setValue( keys.birthdateStart, data.birthdateStart == null ? undefined : DateTime.fromJSDate(data.birthdateStart).toISODate(), ); - SearchParamsIO.setValues(searchParams, keys.diagnosis, data.diagnosis); + setValues(keys.diagnosis, data.diagnosis); - SearchParamsIO.setValues(searchParams, keys.felvResults, data.felvResults); + setValues(keys.felvResults, data.felvResults); - SearchParamsIO.setValues(searchParams, keys.fivResults, data.fivResults); + setValues(keys.fivResults, data.fivResults); - SearchParamsIO.setValues( - searchParams, - keys.fosterFamiliesId, - data.fosterFamiliesId, - ); + setValues(keys.fosterFamiliesId, data.fosterFamiliesId); - SearchParamsIO.setValues(searchParams, keys.managersId, data.managersId); + setValues(keys.managersId, data.managersId); - SearchParamsIO.setValue(searchParams, keys.nameOrAlias, data.nameOrAlias); + setValue(keys.nameOrAlias, data.nameOrAlias); - SearchParamsIO.setValue( - searchParams, + setValue( keys.nextVaccinationDateEnd, data.nextVaccinationDateEnd == null ? undefined : DateTime.fromJSDate(data.nextVaccinationDateEnd).toISODate(), ); - SearchParamsIO.setValue( - searchParams, + setValue( keys.nextVaccinationDateStart, data.nextVaccinationDateStart == null ? undefined : DateTime.fromJSDate(data.nextVaccinationDateStart).toISODate(), ); - SearchParamsIO.setValue( - searchParams, + setValue( keys.pickUpDateEnd, data.pickUpDateEnd == null ? undefined : DateTime.fromJSDate(data.pickUpDateEnd).toISODate(), ); - SearchParamsIO.setValue( - searchParams, + setValue( keys.pickUpDateStart, data.pickUpDateStart == null ? undefined : DateTime.fromJSDate(data.pickUpDateStart).toISODate(), ); - SearchParamsIO.setValues( - searchParams, - keys.pickUpLocations, - data.pickUpLocations, - ); + setValues(keys.pickUpLocations, data.pickUpLocations); - SearchParamsIO.setValues( - searchParams, - keys.pickUpReasons, - data.pickUpReasons, - ); + setValues(keys.pickUpReasons, data.pickUpReasons); - SearchParamsIO.setValues(searchParams, keys.species, data.species); + setValues(keys.species, data.species); - SearchParamsIO.setValues(searchParams, keys.statuses, data.statuses); + setValues(keys.statuses, data.statuses); - SearchParamsIO.setValues( - searchParams, - keys.sterilizations, - data.sterilizations, - ); + setValues(keys.sterilizations, data.sterilizations); - SearchParamsIO.setValues( - searchParams, - keys.vaccinations, - data.vaccinations, - ); + setValues(keys.vaccinations, data.vaccinations); }, }); @@ -298,14 +235,14 @@ const AnimalSearchParamsSchema = zu.object({ export const PickUpLocationSearchParams = SearchParamsIO.create({ keys: { text: "q" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return PickUpLocationSearchParamsSchema.parse({ - text: SearchParamsIO.getValue(searchParams, keys.text), + text: getValue(keys.text), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.text, data.text); + setFunction: (data, { keys, setValue }) => { + setValue(keys.text, data.text); }, }); diff --git a/apps/admin/src/breeds/search-params.ts b/apps/admin/src/breeds/search-params.ts index 38cb32fc..47bbe5e6 100644 --- a/apps/admin/src/breeds/search-params.ts +++ b/apps/admin/src/breeds/search-params.ts @@ -12,24 +12,23 @@ export const BREED_DEFAULT_SORT = BreedSort.NAME; export const BreedSearchParams = SearchParamsIO.create({ keys: { name: "q", sort: "sort", species: "species" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue, getValues }) => { return BreedSearchParamsSchema.parse({ - name: SearchParamsIO.getValue(searchParams, keys.name), - sort: SearchParamsIO.getValue(searchParams, keys.sort), - species: SearchParamsIO.getValues(searchParams, keys.species), + name: getValue(keys.name), + sort: getValue(keys.sort), + species: getValues(keys.species), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.name, data.name); + setFunction: (data, { keys, setValue, setValues }) => { + setValue(keys.name, data.name); - SearchParamsIO.setValue( - searchParams, + setValue( keys.sort, data.sort === BREED_DEFAULT_SORT ? undefined : data.sort, ); - SearchParamsIO.setValues(searchParams, keys.species, data.species); + setValues(keys.species, data.species); }, }); diff --git a/apps/admin/src/colors/search-params.ts b/apps/admin/src/colors/search-params.ts index 4f941920..a70b5ec3 100644 --- a/apps/admin/src/colors/search-params.ts +++ b/apps/admin/src/colors/search-params.ts @@ -11,18 +11,17 @@ export const COLOR_DEFAULT_SORT = ColorSort.NAME; export const ColorSearchParams = SearchParamsIO.create({ keys: { name: "q", sort: "sort" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return ColorSearchParamsSchema.parse({ - name: SearchParamsIO.getValue(searchParams, keys.name), - sort: SearchParamsIO.getValue(searchParams, keys.sort), + name: getValue(keys.name), + sort: getValue(keys.sort), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.name, data.name); + setFunction: (data, { keys, setValue }) => { + setValue(keys.name, data.name); - SearchParamsIO.setValue( - searchParams, + setValue( keys.sort, data.sort === COLOR_DEFAULT_SORT ? undefined : data.sort, ); diff --git a/apps/admin/src/core/search-params.ts b/apps/admin/src/core/search-params.ts index f0b88245..697dc3bb 100644 --- a/apps/admin/src/core/search-params.ts +++ b/apps/admin/src/core/search-params.ts @@ -4,15 +4,14 @@ import { zu } from "@animeaux/zod-utils"; export const PageSearchParams = SearchParamsIO.create({ keys: { page: "page" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return PageSchema.parse({ - page: SearchParamsIO.getValue(searchParams, keys.page), + page: getValue(keys.page), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue( - searchParams, + setFunction: (data, { keys, setValue }) => { + setValue( keys.page, data.page == null || data.page === 0 ? undefined : String(data.page), ); @@ -26,14 +25,14 @@ const PageSchema = zu.object({ export const NextSearchParams = SearchParamsIO.create({ keys: { next: "next" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return NextSchema.parse({ - next: SearchParamsIO.getValue(searchParams, keys.next), + next: getValue(keys.next), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.next, data.next); + setFunction: (data, { keys, setValue }) => { + setValue(keys.next, data.next); }, }); diff --git a/apps/admin/src/foster-families/search-params.ts b/apps/admin/src/foster-families/search-params.ts index 9146e7d9..30287d15 100644 --- a/apps/admin/src/foster-families/search-params.ts +++ b/apps/admin/src/foster-families/search-params.ts @@ -18,53 +18,28 @@ export const FosterFamilySearchParams = SearchParamsIO.create({ zipCode: "zip", }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue, getValues }) => { return Schema.parse({ - displayName: SearchParamsIO.getValue(searchParams, keys.displayName), - garden: SearchParamsIO.getValues(searchParams, keys.garden), - housing: SearchParamsIO.getValues(searchParams, keys.housing), - cities: SearchParamsIO.getValues(searchParams, keys.cities), - speciesAlreadyPresent: SearchParamsIO.getValues( - searchParams, - keys.speciesAlreadyPresent, - ), - speciesToAvoid: SearchParamsIO.getValues( - searchParams, - keys.speciesToAvoid, - ), - speciesToHost: SearchParamsIO.getValue(searchParams, keys.speciesToHost), - zipCode: SearchParamsIO.getValue(searchParams, keys.zipCode), + displayName: getValue(keys.displayName), + garden: getValues(keys.garden), + housing: getValues(keys.housing), + cities: getValues(keys.cities), + speciesAlreadyPresent: getValues(keys.speciesAlreadyPresent), + speciesToAvoid: getValues(keys.speciesToAvoid), + speciesToHost: getValue(keys.speciesToHost), + zipCode: getValue(keys.zipCode), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.displayName, data.displayName); - - SearchParamsIO.setValues(searchParams, keys.garden, data.garden); - - SearchParamsIO.setValues(searchParams, keys.housing, data.housing); - - SearchParamsIO.setValues(searchParams, keys.cities, data.cities); - - SearchParamsIO.setValues( - searchParams, - keys.speciesAlreadyPresent, - data.speciesAlreadyPresent, - ); - - SearchParamsIO.setValues( - searchParams, - keys.speciesToAvoid, - data.speciesToAvoid, - ); - - SearchParamsIO.setValue( - searchParams, - keys.speciesToHost, - data.speciesToHost, - ); - - SearchParamsIO.setValue(searchParams, keys.zipCode, data.zipCode); + setFunction: (data, { keys, setValue, setValues }) => { + setValue(keys.displayName, data.displayName); + setValues(keys.garden, data.garden); + setValues(keys.housing, data.housing); + setValues(keys.cities, data.cities); + setValues(keys.speciesAlreadyPresent, data.speciesAlreadyPresent); + setValues(keys.speciesToAvoid, data.speciesToAvoid); + setValue(keys.speciesToHost, data.speciesToHost); + setValue(keys.zipCode, data.zipCode); }, }); diff --git a/apps/admin/src/routes/resources.global-search/shared.tsx b/apps/admin/src/routes/resources.global-search/shared.tsx index b26c9540..0f6a9e02 100644 --- a/apps/admin/src/routes/resources.global-search/shared.tsx +++ b/apps/admin/src/routes/resources.global-search/shared.tsx @@ -22,17 +22,16 @@ export const SORTED_ENTITIES = orderBy( export const GlobalSearchParams = SearchParamsIO.create({ keys: { text: "q", entity: "entity" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return GlobalSearchParamsSchema.parse({ - text: SearchParamsIO.getValue(searchParams, keys.text), - entity: SearchParamsIO.getValue(searchParams, keys.entity), + text: getValue(keys.text), + entity: getValue(keys.entity), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.text, data.text); - - SearchParamsIO.setValue(searchParams, keys.entity, data.entity); + setFunction: (data, { keys, setValue }) => { + setValue(keys.text, data.text); + setValue(keys.entity, data.entity); }, }); diff --git a/apps/admin/src/routes/resources.scrap-url/shared.tsx b/apps/admin/src/routes/resources.scrap-url/shared.tsx index c1f82099..d726e708 100644 --- a/apps/admin/src/routes/resources.scrap-url/shared.tsx +++ b/apps/admin/src/routes/resources.scrap-url/shared.tsx @@ -4,14 +4,14 @@ import { zu } from "@animeaux/zod-utils"; export const ScrapUrlSearchParams = SearchParamsIO.create({ keys: { url: "url" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return Schema.parse({ - url: SearchParamsIO.getValue(searchParams, keys.url), + url: getValue(keys.url), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.url, data.url); + setFunction: (data, { keys, setValue }) => { + setValue(keys.url, data.url); }, }); diff --git a/apps/admin/src/show/applications/search-params.ts b/apps/admin/src/show/applications/search-params.ts index d736c279..95dd28f8 100644 --- a/apps/admin/src/show/applications/search-params.ts +++ b/apps/admin/src/show/applications/search-params.ts @@ -17,31 +17,24 @@ export const ApplicationSearchParams = SearchParamsIO.create({ targets: "ta", }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue, getValues }) => { return SearchParamsSchema.parse({ - fields: SearchParamsIO.getValues(searchParams, keys.fields), - name: SearchParamsIO.getValue(searchParams, keys.name), - partnershipCategories: SearchParamsIO.getValues( - searchParams, - keys.partnershipCategories, - ), - sort: SearchParamsIO.getValue(searchParams, keys.sort), - statuses: SearchParamsIO.getValues(searchParams, keys.statuses), - targets: SearchParamsIO.getValues(searchParams, keys.targets), + fields: getValues(keys.fields), + name: getValue(keys.name), + partnershipCategories: getValues(keys.partnershipCategories), + sort: getValue(keys.sort), + statuses: getValues(keys.statuses), + targets: getValues(keys.targets), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValues(searchParams, keys.fields, data.fields); - SearchParamsIO.setValue(searchParams, keys.name, data.name); - SearchParamsIO.setValues( - searchParams, - keys.partnershipCategories, - data.partnershipCategories, - ); - SearchParamsIO.setValue(searchParams, keys.sort, data.sort); - SearchParamsIO.setValues(searchParams, keys.statuses, data.statuses); - SearchParamsIO.setValues(searchParams, keys.targets, data.targets); + setFunction: (data, { keys, setValue, setValues }) => { + setValues(keys.fields, data.fields); + setValue(keys.name, data.name); + setValues(keys.partnershipCategories, data.partnershipCategories); + setValue(keys.sort, data.sort); + setValues(keys.statuses, data.statuses); + setValues(keys.targets, data.targets); }, }); diff --git a/apps/admin/src/users/search-params.ts b/apps/admin/src/users/search-params.ts index 8a7205dc..1cad6adf 100644 --- a/apps/admin/src/users/search-params.ts +++ b/apps/admin/src/users/search-params.ts @@ -21,52 +21,38 @@ export const UserSearchParams = SearchParamsIO.create({ sort: "sort", }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue, getValues }) => { return Schema.parse({ - displayName: SearchParamsIO.getValue(searchParams, keys.displayName), - groups: SearchParamsIO.getValues(searchParams, keys.groups), - lastActivityEnd: SearchParamsIO.getValue( - searchParams, - keys.lastActivityEnd, - ), - lastActivityStart: SearchParamsIO.getValue( - searchParams, - keys.lastActivityStart, - ), - noActivity: SearchParamsIO.getValue(searchParams, keys.noActivity), - sort: SearchParamsIO.getValue(searchParams, keys.sort), + displayName: getValue(keys.displayName), + groups: getValues(keys.groups), + lastActivityEnd: getValue(keys.lastActivityEnd), + lastActivityStart: getValue(keys.lastActivityStart), + noActivity: getValue(keys.noActivity), + sort: getValue(keys.sort), }); }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.displayName, data.displayName); + setFunction: (data, { keys, setValue, setValues }) => { + setValue(keys.displayName, data.displayName); + setValues(keys.groups, data.groups); - SearchParamsIO.setValues(searchParams, keys.groups, data.groups); - - SearchParamsIO.setValue( - searchParams, + setValue( keys.lastActivityEnd, data.lastActivityEnd == null ? undefined : DateTime.fromJSDate(data.lastActivityEnd).toISODate(), ); - SearchParamsIO.setValue( - searchParams, + setValue( keys.lastActivityStart, data.lastActivityStart == null ? undefined : DateTime.fromJSDate(data.lastActivityStart).toISODate(), ); - SearchParamsIO.setValue( - searchParams, - keys.noActivity, - data.noActivity ? "on" : undefined, - ); + setValue(keys.noActivity, data.noActivity ? "on" : undefined); - SearchParamsIO.setValue( - searchParams, + setValue( keys.sort, data.sort === USER_DEFAULT_SORT ? undefined : data.sort, ); diff --git a/apps/show/src/mocks/cloudinary.server.ts b/apps/show/src/mocks/cloudinary.server.ts index 28d51d8a..91f1f4a1 100644 --- a/apps/show/src/mocks/cloudinary.server.ts +++ b/apps/show/src/mocks/cloudinary.server.ts @@ -55,10 +55,10 @@ const RESOURCE_COUNT = 200; const GetResourcesImageUploadSearchParams = SearchParamsReader.create({ keys: { maxResults: "max_results", nextIndex: "next_cursor" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return ResourcesImageUploadSearchParamsSchema.parse({ - maxResults: SearchParamsReader.getValue(searchParams, keys.maxResults), - nextIndex: SearchParamsReader.getValue(searchParams, keys.nextIndex), + maxResults: getValue(keys.maxResults), + nextIndex: getValue(keys.nextIndex), }); }, }); diff --git a/libs/core/src/image-url.tsx b/libs/core/src/image-url.tsx index cd9d6c25..7df55459 100644 --- a/libs/core/src/image-url.tsx +++ b/libs/core/src/image-url.tsx @@ -30,13 +30,13 @@ export const ImageUrl = { const BlurhashSearchParams = SearchParamsIO.create({ keys: { blurhash: "blurhash" }, - parseFunction: (searchParams, keys) => { + parseFunction: ({ keys, getValue }) => { return { - blurhash: SearchParamsIO.getValue(searchParams, keys.blurhash)?.trim(), + blurhash: getValue(keys.blurhash)?.trim(), }; }, - setFunction: (searchParams, data, keys) => { - SearchParamsIO.setValue(searchParams, keys.blurhash, data.blurhash); + setFunction: (data, { keys, setValue }) => { + setValue(keys.blurhash, data.blurhash); }, }); diff --git a/libs/search-params-io/src/io.ts b/libs/search-params-io/src/io.ts index 3f5dd28a..a032d379 100644 --- a/libs/search-params-io/src/io.ts +++ b/libs/search-params-io/src/io.ts @@ -6,18 +6,13 @@ export interface SearchParamsIO, TData> SearchParamsWritter> { set( searchParams: URLSearchParams, - data: Partial | ((data: TData) => Partial), + dataAction: Partial | ((currentData: TData) => Partial), ): URLSearchParams; copy(from: URLSearchParams, to: URLSearchParams): URLSearchParams; } export namespace SearchParamsIO { - export const getValue = SearchParamsReader.getValue; - export const getValues = SearchParamsReader.getValues; - export const setValue = SearchParamsWritter.setValue; - export const setValues = SearchParamsWritter.setValues; - export function create, TData>({ keys, parseFunction, @@ -30,12 +25,16 @@ export namespace SearchParamsIO { const reader = SearchParamsReader.create({ keys, parseFunction }); const writter = SearchParamsWritter.create({ keys, setFunction }); - const set: SearchParamsIO["set"] = (searchParams, data) => { - if (typeof data === "function") { - data = data(reader.parse(searchParams)); - } - - return writter.set(searchParams, data); + const set: SearchParamsIO["set"] = ( + searchParams, + dataAction, + ) => { + return writter.set( + searchParams, + typeof dataAction === "function" + ? dataAction(reader.parse(searchParams)) + : dataAction, + ); }; const copy: SearchParamsIO["copy"] = (from, to) => { diff --git a/libs/search-params-io/src/reader.ts b/libs/search-params-io/src/reader.ts index 190cbc0a..80960bc8 100644 --- a/libs/search-params-io/src/reader.ts +++ b/libs/search-params-io/src/reader.ts @@ -27,7 +27,18 @@ export namespace SearchParamsReader { const parse: SearchParamsReader["parse"] = ( searchParams, ) => { - return parseFunction(searchParams, keys); + return parseFunction({ + searchParams, + keys, + + getValue(key) { + return searchParams.get(key) ?? undefined; + }, + + getValues(key) { + return searchParams.getAll(key); + }, + }); }; const areEqual: SearchParamsReader["areEqual"] = (a, b) => { @@ -43,27 +54,26 @@ export namespace SearchParamsReader { return { keys, parse, areEqual, isEmpty }; } - /** - * Same as `URLSearchParams.get()` but returns `undefined` instead of `null` - * for missing search parameters. - */ - export function getValue(searchParams: URLSearchParams, key: string) { - return searchParams.get(key) ?? undefined; - } - - /** - * Same as `URLSearchParams.getAll()`. - * Here for consistency with `getValue`. - */ - export function getValues(searchParams: URLSearchParams, key: string) { - return searchParams.getAll(key); - } - export type Infer> = TReader extends SearchParamsReader ? TOutput : never; - export type ParseFunction, TOutput> = ( - searchParams: URLSearchParams, - keys: TKeys, - ) => TOutput; + export type ParseFunction< + TKeys extends Record, + TOutput, + > = (context: { + searchParams: URLSearchParams; + keys: TKeys; + + /** + * Same as `URLSearchParams.get()` but returns `undefined` instead of + * `null` for missing search parameters. + */ + getValue: (key: string) => undefined | string; + + /** + * Same as `URLSearchParams.getAll()`. + * Here for consistency with `getValue`. + */ + getValues: (key: string) => string[]; + }) => TOutput; } diff --git a/libs/search-params-io/src/writter.ts b/libs/search-params-io/src/writter.ts index 485cb627..4e41ec07 100644 --- a/libs/search-params-io/src/writter.ts +++ b/libs/search-params-io/src/writter.ts @@ -12,7 +12,7 @@ export interface SearchParamsWritter< create(data: TInput): URLSearchParams; /** - * Alias for `writter.set(new URLSearchParams(), data).toString()`. + * Alias for `writter.create(data).toString()`. */ format(data: TInput): string; @@ -31,7 +31,28 @@ export namespace SearchParamsWritter { searchParams, data, ) => { - setFunction(searchParams, data, keys); + setFunction(data, { + searchParams, + keys, + + setValue(key, value) { + if (value == null) { + searchParams.delete(key); + return; + } + + searchParams.set(key, value); + }, + + setValues(key, values) { + searchParams.delete(key); + + values?.forEach((value) => { + searchParams.append(key, value); + }); + }, + }); + return searchParams; }; @@ -56,43 +77,24 @@ export namespace SearchParamsWritter { return { keys, set, create, format, clear }; } - /** - * Sets or deletes the value for the given search parameter. - */ - export function setValue( - searchParams: URLSearchParams, - key: string, - value?: null | string, - ) { - if (value == null) { - searchParams.delete(key); - return; - } - - searchParams.set(key, value); - } - - /** - * Sets of deletes the values for the given search parameter. - */ - export function setValues( - searchParams: URLSearchParams, - key: string, - values?: null | string[] | Set, - ) { - searchParams.delete(key); - - values?.forEach((value) => { - searchParams.append(key, value); - }); - } - export type Infer> = TWritter extends SearchParamsWritter ? TInput : never; export type SetFunction, TInput> = ( - searchParams: URLSearchParams, data: TInput, - keys: TKeys, + context: { + searchParams: URLSearchParams; + keys: TKeys; + + /** + * Sets or deletes the value for the given search parameter. + */ + setValue: (key: string, value?: null | string) => void; + + /** + * Sets of deletes the values for the given search parameter. + */ + setValues: (key: string, values?: null | string[] | Set) => void; + }, ) => void; }