import type { NurseSearchFilters } from './types'; /** * React Query key factory for the search domain. * * **The filter object IS the query key** (phase §5, the caching contract). `results(filters)` keys on a * **canonical** serialization of the full filter object — a stable key order with every *absent* optional * filter omitted (never carried as `undefined`). Two filter sets that are semantically equal therefore * produce the identical key, so changing a filter and **reverting** to a previous set is a cache hit with * zero network calls (React Query hashes query keys deterministically; canonicalizing here makes the * intent explicit and keeps the URL/query-param serialization aligned with the cache key). */ /** Canonical, order-stable filter object with absent optionals omitted (the cache key + query params). */ export function canonicalizeSearchFilters(filters: NurseSearchFilters): Record { const canonical: Record = { serviceCategoryId: filters.serviceCategoryId, cityId: filters.cityId, sort: filters.sort, page: filters.page, pageSize: filters.pageSize, }; if (filters.districtId != null) canonical.districtId = filters.districtId; if (filters.nurseGender != null) canonical.nurseGender = filters.nurseGender; if (filters.priceMin != null && filters.priceMin !== '') canonical.priceMin = filters.priceMin; if (filters.priceMax != null && filters.priceMax !== '') canonical.priceMax = filters.priceMax; if (filters.priceUnit != null) canonical.priceUnit = filters.priceUnit; return canonical; } export const searchKeys = { all: ['search'] as const, results: (filters: NurseSearchFilters) => [...searchKeys.all, 'results', canonicalizeSearchFilters(filters)] as const, profiles: () => [...searchKeys.all, 'profile'] as const, profile: (nurseId: number) => [...searchKeys.profiles(), nurseId] as const, };