Qif Documentation

Creating Custom Filters with react-Qif

This tutorial will guide you through the process of creating custom filter components using the Qif package.

Step 1: Set up filter state

First, initialize your filters using the useFilters hook with your parsers:

import { useFilters, FiltersProvider } from 'react-qif';
import { parseAsString } from 'nuqs';

const App = () => {
  const filtersInstance = useFilters({
    parsers: {
      search: parseAsString.withDefault(''),
      category: parseAsString.withDefault('test')
    }
  });

  return (
    <FiltersProvider instance={filtersInstance}>
      {/* Your app content */}
    </FiltersProvider>
  );
};

Step 2: Set up NuqsAdapter

Since Qif uses nuqs internally, you need to select and set up the appropriate NuqsAdapter for your framework:

For React Applications
import { NuqsAdapter } from 'nuqs/adapters/react';

createRoot(document.getElementById('root')!).render(
  <StrictMode>
    <NuqsAdapter>
      <App />
    </NuqsAdapter>
  </StrictMode>
);
For Next.js Applications
import { NuqsAdapter } from 'nuqs/adapters/next';

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        <NuqsAdapter>{children}</NuqsAdapter>
      </body>
    </html>
  );

For more information about NuqsAdapter configuration, read Docs

Step 3: Create a custom filter component

Now, let's create a custom filter component using the useFiltersContext hook:

import { useFiltersContext } from 'react-qif';

const CustomFilter = ({ name }) => {
  const { setValue, getValue } = useFiltersContext();

  const handleChange = (e) => setValue(name, e.target.value);

  return (
    <div>
      <label htmlFor={name}>{name}</label>
      <input
        id={name}
        type="text"
        value={getValue(name)}
        onChange={handleChange}
        placeholder={`Enter ${name}...`}
      />
    </div>
  );
};

Step 4: Use the custom filter in your app

Now you can use your custom filter component in your app:

import { parseAsString } from 'nuqs';

const App = () => {
  const filtersInstance = useFilters({
    syncWithSearchParams: true,
    parsers: {
      search: parseAsString.withDefault(''),
      category: parseAsString.withDefault('test')
    }
  });

  return (
    <FiltersProvider instance={filtersInstance}>
      <CustomFilter name="search" />
      <CustomFilter name="category" />
      {/* Other components */}
    </FiltersProvider>
  );
};

Step 5: Create a reset button

Let's add a reset button to clear all filters to default values:

import { useFiltersContext } from 'react-qif';

const ResetButton = () => {
  const { reset, isResetDisabled } = useFiltersContext();

  return (
    <button onClick={reset} disabled={isResetDisabled}>
      Reset Filters 
    </button>
  );
};

Step 6: Use filter values

Finally, use the filter values in your components:

import { useFiltersContext } from 'react-qif';

const FilteredContent = () => {
  const { getValue, filters } = useFiltersContext();

  const searchTerm = getValue('search');
  const category = getValue('category');

  // You can also access all filters directly
  console.log('All filters:', filters);

  return (
    <div>
      <h2>Filtered Results</h2>
      <p>Search: {searchTerm}</p>
      <p>Category: {category}</p>
      {/* Render your filtered content here */}
    </div>
  );
};