sanity-plugin-icon-picker-fix
Version:
An Icon Picker plugin for Sanity
47 lines (40 loc) • 1.25 kB
text/typescript
import { useEffect, useMemo, useState } from 'react';
import { LOADING_TIMER_MS } from '../constants';
import { getIcons } from '../utils/icons';
import useDebouncedCallback from './useDebouncedCallback';
import type { IconObjectArray, IconPickerOptions } from '../types';
import type { Dispatch, SetStateAction } from 'react';
interface UseQueryProps {
(options: IconPickerOptions): UseQueryResult;
}
interface UseQueryResult {
query: string;
loading: boolean;
results: IconObjectArray;
setQuery: Dispatch<SetStateAction<string>>;
}
export const useQuery: UseQueryProps = (options) => {
const [query, setQuery] = useState('');
const [loading, setLoading] = useState(true);
const [results, setResults] = useState<IconObjectArray>([]);
const icons = useMemo(() => getIcons(options), [options]);
const debouncedFetchIcons = useDebouncedCallback(() => {
const queryResults = icons.filter(({ name }) =>
name.toLowerCase().includes(query.toLowerCase())
);
setResults(queryResults);
setLoading(false);
}, LOADING_TIMER_MS);
useEffect(() => {
if (!loading) {
setLoading(true);
}
debouncedFetchIcons();
}, [query]);
return {
query,
loading,
results,
setQuery,
};
};