"use client"; import { useEffect, useRef, useState } from "react"; import { getFindingById } from "@/actions/findings"; import { expandFindingWithRelationships } from "@/lib/finding-detail"; import { FindingProps } from "@/types"; interface UseFindingDetailsReturn { findingDetails: FindingProps | null; findingDetailLoading: boolean; navigateToFinding: (findingId: string) => Promise; resetFindingDetails: () => void; } export function useFindingDetails(): UseFindingDetailsReturn { const [findingDetails, setFindingDetails] = useState( null, ); const [findingDetailLoading, setFindingDetailLoading] = useState(false); const findingFetchRef = useRef(null); useEffect(() => { return () => { findingFetchRef.current?.abort(); }; }, []); const navigateToFinding = async (findingId: string) => { if (findingFetchRef.current) { findingFetchRef.current.abort(); } findingFetchRef.current = new AbortController(); setFindingDetailLoading(true); try { const findingData = await getFindingById( findingId, "resources,scan.provider", ); if (findingFetchRef.current?.signal.aborted) { return; } if (findingData?.data) { setFindingDetails(expandFindingWithRelationships(findingData)); } } catch (error) { if (error instanceof Error && error.name === "AbortError") { return; } console.error("Error fetching finding:", error); } finally { if (!findingFetchRef.current?.signal.aborted) { setFindingDetailLoading(false); } } }; const resetFindingDetails = () => { setFindingDetails(null); setFindingDetailLoading(false); }; return { findingDetails, findingDetailLoading, navigateToFinding, resetFindingDetails, }; }