Data Table zustand Store Adapter
data-table-filters/data-table-zustandFreeBlock
Client-side state management adapter using zustand for app-level filter persistence.
Install it
npx shadcn@latest add https://logs.run/r/data-table-zustand.jsonSource
1/**2 * Zustand Adapter for BYOS3 *4 * This adapter integrates with existing Zustand stores via a slice pattern.5 * It is client-only and does not support SSR.6 */78"use client";910import { useMemo, useRef } from "react";11import type { StoreApi } from "zustand";12import type { InternalStoreAdapter } from "../../adapter/types";13import { getSchemaDefaults } from "../../schema/serialization";14import type { SchemaDefinition, StoreSnapshot } from "../../schema/types";15import { getFilterSliceKeys } from "./slice";16import type { ZustandAdapterOptions } from "./types";1718export type {19 ZustandAdapterOptions,20 FilterSlice,21 FilterSliceState,22 FilterSliceActions,23} from "./types";24export {25 createFilterSlice,26 getFilterSliceKeys,27 getFilterSliceFromState,28} from "./slice";2930/**31 * Create a Zustand adapter from an existing store32 *33 * @example34 * ```typescript35 * import { create } from 'zustand';36 * import { createFilterSlice, useZustandAdapter } from '@/lib/store/adapters/zustand';37 *38 * const schema = createSchema({39 * regions: field.array(field.string()).default([]),40 * host: field.string(),41 * });42 *43 * // Create store with filter slice44 * const useAppStore = create((set, get) => ({45 * user: null,46 * ...createFilterSlice(schema.definition, 'my-table', set, get),47 * }));48 *49 * // In component50 * function MyComponent() {51 * const adapter = useZustandAdapter(useAppStore, schema.definition, { id: 'my-table' });52 * return (53 * <DataTableStoreProvider adapter={adapter}>54 * <DataTable />55 * </DataTableStoreProvider>56 * );57 * }58 * ```59 */60export function useZustandAdapter<61 TStore extends Record<string, unknown>,62 TFilters extends Record<string, unknown>,63>(64 useStore: {65 (): TStore;66 getState: () => TStore;67 subscribe: (68 listener: (state: TStore, prevState: TStore) => void,69 ) => () => void;70 },71 schema: SchemaDefinition,72 options: ZustandAdapterOptions<TFilters>,73): InternalStoreAdapter<TFilters> {74 const { id, initialState } = options;75 const keys = getFilterSliceKeys(id);76 const defaults = useMemo(77 () => getSchemaDefaults(schema) as TFilters,78 [schema],79 );8081 const versionRef = useRef(0);8283 // Cache server snapshot to avoid infinite loop with useSyncExternalStore84 const serverSnapshotRef = useRef<StoreSnapshot<TFilters>>({85 state: { ...defaults, ...initialState } as TFilters,86 version: 0,87 });8889 const adapter = useMemo<InternalStoreAdapter<TFilters>>(() => {90// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from data-table-filters
All 11 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Data Table with Filtersdata-table | data-table-filters | Blocks | Free | 17 deps · 53 files | |
| Data Table Cell Renderersdata-table-cell | data-table-filters | Blocks | Free | 4 deps · 17 files | |
| Data Table Drizzle ORM Helpersdata-table-drizzle | data-table-filters | Blocks | Free | 2 deps · 7 files | |
| Data Table Filter Command Palettedata-table-filter-command | data-table-filters | Blocks | Free | 2 deps · 2 files | |
| Data Table AI Filter Command Palettedata-table-filter-command-ai | data-table-filters | Blocks | Free | 6 deps · 11 files | |
| Data Table MCP Serverdata-table-mcp | data-table-filters | Blocks | Free | 2 deps · 5 files | |
| Data Table nuqs Store Adapterdata-table-nuqs | data-table-filters | Blocks | Free | 1 dep · 4 files | |
| Data Table Query Layerdata-table-query | data-table-filters | Blocks | Free | 3 deps · 3 files |
