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