Add optional keys

This commit is contained in:
sean-brydon 2022-12-15 13:55:18 +00:00
parent 8d9a0378bd
commit 4125265bae
3 changed files with 15 additions and 17 deletions

@ -1 +1 @@
Subproject commit 8b74f463f454cf84e0f39bf78ff7d0f245014caa
Subproject commit c129586336b287d7b93c516435d905337951d2d2

@ -1 +1 @@
Subproject commit 30cbf3990bb5baae7fd4fd46c93f6e5bc402f84c
Subproject commit 794dda81932f6c0572941fb70cc38b599510d31f

View File

@ -4,16 +4,20 @@ import { z } from "zod";
export function useTypedQuery<T extends z.Schema>(schema: T) {
type InferedSchema = z.infer<typeof schema>;
type SchemaKeys = keyof InferedSchema;
type OptionalKeys = {
[K in keyof InferedSchema]: undefined extends InferedSchema[K] ? K : never;
}[keyof InferedSchema];
const { query: unparsedQuery, ...router } = useRouter();
const parsedQuery = schema.parse(unparsedQuery) as InferedSchema;
const parsedQuery = schema.parse(unparsedQuery);
// Set the query based on schema values
function setQuery<J extends SchemaKeys>(key: J, value: InferedSchema[J]) {
function setQuery<J extends SchemaKeys>(key: J, value: Partial<InferedSchema[J]>) {
router.replace({ query: { ...parsedQuery, [key]: value } }, undefined, { shallow: true });
}
// Delete a key from the query
function removeByKey(key: SchemaKeys) {
function removeByKey(key: OptionalKeys) {
const { [key]: _, ...newQuery } = parsedQuery;
router.replace({ query: newQuery }, undefined, { shallow: true });
}
@ -21,11 +25,9 @@ export function useTypedQuery<T extends z.Schema>(schema: T) {
// push item to existing key
function pushItemToKey<J extends SchemaKeys>(
key: J,
value: InferedSchema[J] extends Array<unknown>
? InferedSchema[J][0]
: InferedSchema[J] extends Array<unknown> | undefined
? NonNullable<InferedSchema[J]>[0]
: InferedSchema[J]
value: InferedSchema[J] extends Array<unknown> | undefined
? NonNullable<InferedSchema[J]>[number]
: NonNullable<InferedSchema[J]>
) {
const existingValue = parsedQuery[key];
if (Array.isArray(existingValue)) {
@ -38,11 +40,9 @@ export function useTypedQuery<T extends z.Schema>(schema: T) {
// Remove item by key and value
function removeItemByKeyAndValue<J extends SchemaKeys>(
key: J,
value: InferedSchema[J] extends Array<unknown>
? InferedSchema[J][0]
: InferedSchema[J] extends Array<unknown> | undefined
? NonNullable<InferedSchema[J]>[0]
: InferedSchema[J]
value: InferedSchema[J] extends Array<unknown> | undefined
? NonNullable<InferedSchema[J]>[number]
: NonNullable<InferedSchema[J]>
) {
const existingValue = parsedQuery[key];
if (Array.isArray(existingValue)) {
@ -50,8 +50,6 @@ export function useTypedQuery<T extends z.Schema>(schema: T) {
key,
existingValue.filter((item: InferedSchema[J][0]) => item !== value)
);
} else {
removeByKey(key); // if its the last item, remove the key from the query entirely
}
}