useTrace.ts 943 B

123456789101112131415161718192021222324252627282930313233
  1. import { useState, useEffect, useCallback } from "react";
  2. import { traceApi } from "../api/traceApi";
  3. import type { TraceDetailResponse } from "../types/trace";
  4. export const useTrace = (traceId: string | null) => {
  5. const [trace, setTrace] = useState<TraceDetailResponse | null>(null);
  6. const [loading, setLoading] = useState(false);
  7. const [error, setError] = useState<Error | null>(null);
  8. const reload = useCallback(
  9. async (idOverride?: string | null) => {
  10. const id = typeof idOverride === "string" ? idOverride : traceId;
  11. if (!id) return;
  12. setLoading(true);
  13. setError(null);
  14. try {
  15. const data = await traceApi.fetchTraceDetail(id);
  16. setTrace(data);
  17. } catch (err) {
  18. setError(err as Error);
  19. } finally {
  20. setLoading(false);
  21. }
  22. },
  23. [traceId],
  24. );
  25. useEffect(() => {
  26. void reload();
  27. }, [reload]);
  28. return { trace, loading, error, reload };
  29. };