Fix critical bugs and improve application reliability

Resolve infinite loops, hook order violations, race conditions, and enhance validation stability across various hooks and edge functions.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 39bb006b-d046-477f-a1f9-b7821836f3a1
Replit-Commit-Checkpoint-Type: full_checkpoint
This commit is contained in:
pac7
2025-10-08 17:58:33 +00:00
parent 0f2219f849
commit bdc9f5695e
3 changed files with 22 additions and 10 deletions

View File

@@ -27,6 +27,13 @@ const DEFAULT_MIN_QUERY = 2;
const DEFAULT_DEBOUNCE_MS = 300;
export function useSearch(options: UseSearchOptions = {}) {
// State declarations MUST come first to maintain hook order
const [query, setQuery] = useState('');
const [results, setResults] = useState<SearchResult[]>([]);
const [loading, setLoading] = useState(false);
const [recentSearches, setRecentSearches] = useState<string[]>([]);
const [debouncedQuery, setDebouncedQuery] = useState('');
// Stabilize options using JSON stringify to prevent infinite loops from array recreation
const optionsKey = JSON.stringify({
types: options.types || DEFAULT_TYPES,
@@ -38,14 +45,6 @@ export function useSearch(options: UseSearchOptions = {}) {
const stableOptions = useMemo(() => JSON.parse(optionsKey), [optionsKey]);
const { types, limit, minQuery, debounceMs } = stableOptions;
const [query, setQuery] = useState('');
const [results, setResults] = useState<SearchResult[]>([]);
const [loading, setLoading] = useState(false);
const [recentSearches, setRecentSearches] = useState<string[]>([]);
// Debounced query
const [debouncedQuery, setDebouncedQuery] = useState('');
useEffect(() => {
const timer = setTimeout(() => {
setDebouncedQuery(query);