Add optional keys
This commit is contained in:
parent
8d9a0378bd
commit
4125265bae
2
apps/api
2
apps/api
|
@ -1 +1 @@
|
|||
Subproject commit 8b74f463f454cf84e0f39bf78ff7d0f245014caa
|
||||
Subproject commit c129586336b287d7b93c516435d905337951d2d2
|
|
@ -1 +1 @@
|
|||
Subproject commit 30cbf3990bb5baae7fd4fd46c93f6e5bc402f84c
|
||||
Subproject commit 794dda81932f6c0572941fb70cc38b599510d31f
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user