Something went wrong. Try again.
A lexicon-driven AppView for ATProto.
Something went wrong. Try again.
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100import { createParser } from "nuqs/server";import { z } from "zod";
import { dataTableConfig } from "@/config/data-table";
import type { ExtendedColumnFilter, ExtendedColumnSort,} from "@/types/data-table";
const sortingItemSchema = z.object({ id: z.string(), desc: z.boolean(),});
export const getSortingStateParser = <TData>( columnIds?: string[] | Set<string>,) => { const validKeys = columnIds ? columnIds instanceof Set ? columnIds : new Set(columnIds) : null;
return createParser({ parse: (value) => { try { const parsed = JSON.parse(value); const result = z.array(sortingItemSchema).safeParse(parsed);
if (!result.success) return null;
if (validKeys && result.data.some((item) => !validKeys.has(item.id))) { return null; }
return result.data as ExtendedColumnSort<TData>[]; } catch { return null; } }, serialize: (value) => JSON.stringify(value), eq: (a, b) => a.length === b.length && a.every( (item, index) => item.id === b[index]?.id && item.desc === b[index]?.desc, ), });};
const filterItemSchema = z.object({ id: z.string(), value: z.union([z.string(), z.array(z.string())]), variant: z.enum(dataTableConfig.filterVariants), operator: z.enum(dataTableConfig.operators), filterId: z.string(),});
export type FilterItemSchema = z.infer<typeof filterItemSchema>;
export const getFiltersStateParser = <TData>( columnIds?: string[] | Set<string>,) => { const validKeys = columnIds ? columnIds instanceof Set ? columnIds : new Set(columnIds) : null;
return createParser({ parse: (value) => { try { const parsed = JSON.parse(value); const result = z.array(filterItemSchema).safeParse(parsed);
if (!result.success) return null;
if (validKeys && result.data.some((item) => !validKeys.has(item.id))) { return null; }
return result.data as ExtendedColumnFilter<TData>[]; } catch { return null; } }, serialize: (value) => JSON.stringify(value), eq: (a, b) => a.length === b.length && a.every( (filter, index) => filter.id === b[index]?.id && filter.value === b[index]?.value && filter.variant === b[index]?.variant && filter.operator === b[index]?.operator, ), });};