Files
ui/_docs/02_document/modules/src__hooks__useDebounce.md
Oleksandr Bezdieniezhnykh 510df68bcf [AZ-447] autodev Steps 1-4 baseline: docs, tests, refactor specs
Captures the full output of autodev existing-code Phase A through
Step 4 (Code Testability Revision) for the Azaion UI workspace:

- Step 1 Document: _docs/02_document/ (FINAL_report, architecture,
  glossary, components/, modules/, diagrams/, system-flows,
  module-layout) plus _docs/00_problem/ + _docs/01_solution/ +
  _docs/legacy/ + _docs/how_to_test + README.
- Step 2 Architecture Baseline: architecture_compliance_baseline.md.
- Step 3 Test Spec: _docs/02_document/tests/ (environment,
  test-data, blackbox/performance/resilience/security/
  resource-limit tests, traceability-matrix), enum_spec_snapshot,
  expected_results/results_report.md (98 rows), plus the
  run-tests.sh + run-performance-tests.sh runners.
- Step 4 Code Testability Revision: 01-testability-refactoring/
  run dir (list-of-changes C01-C07, deferred_to_refactor,
  analysis/research_findings + refactoring_roadmap) and the 7
  child task specs AZ-448..AZ-454 under _docs/02_tasks/todo/
  plus _dependencies_table.md.
- _docs/_autodev_state.md pins the cursor at Step 4 / refactor
  Phase 4 entry so /autodev resumes cleanly.

Epic AZ-447 (UI testability gates) tracks the 7 child tasks that
will land in subsequent commits.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 00:38:49 +03:00

1.9 KiB

Module: src/hooks/useDebounce.ts

Source: src/hooks/useDebounce.ts (12 lines) Topo batch: B1 (leaf)

Purpose

Generic React hook that delays propagation of a rapidly-changing value to its consumers, used to throttle search inputs against the backend.

Public interface

export function useDebounce<T>(value: T, delay: number): T

Returns the latest value only after delay milliseconds have elapsed without any further change. Generic in T, so callers can debounce strings, numbers, or any reference value (referential identity matters; see notes).

Internal logic

useState<T>(value) for the debounced output; useEffect registers a setTimeout(setDebounced, delay) and returns a clearTimeout cleanup. The effect re-runs whenever value or delay changes — each new input value cancels the pending timeout from the previous render and starts a fresh one.

Dependencies

  • Internal: none.
  • External: react (useState, useEffect).

Consumers (intra-repo)

  • src/features/annotations/MediaList.tsx — debounces the media-name search input.
  • src/features/dataset/DatasetPage.tsx — debounces the dataset name-search filter (specified as 400ms in _docs/ui_design/README.md §"Dataset Explorer", but the actual delay is set by the caller).

Data models

None.

Configuration

None.

External integrations

None.

Security

None.

Tests

None.

Notes / open questions

  • The hook compares values by referential equality (useEffect deps array). Passing a fresh object literal each render — e.g. useDebounce({ q }, 300) — would re-trigger the timer endlessly. Current callers pass primitives only; safe.
  • No "leading edge" / "trailing edge" / "max wait" knobs. Adequate for the two current consumers; if/when richer behaviour is needed, prefer useDebouncedCallback from a library over extending this module.