import { useRef, useCallback, Dispatch, SetStateAction } from "react"; import { ChatState } from "~/types/bot"; import { Message } from "~/types/chat"; import { ConversationStep } from "~/types/chat"; /** * Hook to manage request lifecycle and abort controllers * @param setChatState - State setter for chat state * @param setIsInputDisabled - State setter for input disabled flag * @param setInputState - State setter for input state * @param setCurrentStep - State setter for conversation step * @param setMessages - State setter for messages * @returns Object containing abort controller and stop function */ export function useRequestManagement( setChatState: Dispatch>, setIsInputDisabled: Dispatch>, setInputState: Dispatch< SetStateAction<"starting" | "generating" | "minimized"> >, setCurrentStep: Dispatch>, setMessages: Dispatch> ) { const currentAbortController = useRef(null); const stopCurrentRequest = useCallback(() => { if (currentAbortController.current) { currentAbortController.current.abort(); currentAbortController.current = null; } setChatState((prev) => ({ ...prev, isRequestInProgress: false, repliedProduct: null, })); setIsInputDisabled(false); setInputState("starting"); setCurrentStep("ongoing"); setMessages((prev) => prev.filter((msg) => msg.type !== "loading")); }, [ setChatState, setIsInputDisabled, setInputState, setCurrentStep, setMessages, ]); return { currentAbortController, stopCurrentRequest, }; }