Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | import { AiHydroMessage } from "@shared/ExtensionMessage"
import { useCallback, useMemo, useRef, useState } from "react"
import { ChatState } from "../types/chatTypes"
/**
* Custom hook for managing chat state
* Handles input values, selection states, and UI state
*/
export function useChatState(messages: AiHydroMessage[]): ChatState {
// Input and selection state
const [inputValue, setInputValue] = useState("")
const [activeQuote, setActiveQuote] = useState<string | null>(null)
const [isTextAreaFocused, setIsTextAreaFocused] = useState(false)
const [selectedImages, setSelectedImages] = useState<string[]>([])
const [selectedFiles, setSelectedFiles] = useState<string[]>([])
// UI state
const [sendingDisabled, setSendingDisabled] = useState(false)
const [enableButtons, setEnableButtons] = useState<boolean>(false)
const [primaryButtonText, setPrimaryButtonText] = useState<string | undefined>("Approve")
const [secondaryButtonText, setSecondaryButtonText] = useState<string | undefined>("Reject")
const [expandedRows, setExpandedRows] = useState<Record<number, boolean>>({})
// Refs
const textAreaRef = useRef<HTMLTextAreaElement>(null)
// Derived state
const lastMessage = useMemo(() => messages.at(-1), [messages])
const secondLastMessage = useMemo(() => messages.at(-2), [messages])
const aihydroAsk = useMemo(() => (lastMessage?.type === "ask" ? lastMessage.ask : undefined), [lastMessage])
// Clear expanded rows when task changes
const task = useMemo(() => messages.at(0), [messages])
const clearExpandedRows = useCallback(() => {
setExpandedRows({})
}, [])
// Reset state when starting new conversation
const resetState = useCallback(() => {
setInputValue("")
setActiveQuote(null)
setSelectedImages([])
setSelectedFiles([])
}, [])
// Handle focus change
const handleFocusChange = useCallback((isFocused: boolean) => {
setIsTextAreaFocused(isFocused)
}, [])
return {
// State values
inputValue,
setInputValue,
activeQuote,
setActiveQuote,
isTextAreaFocused,
setIsTextAreaFocused,
selectedImages,
setSelectedImages,
selectedFiles,
setSelectedFiles,
sendingDisabled,
setSendingDisabled,
enableButtons,
setEnableButtons,
primaryButtonText,
setPrimaryButtonText,
secondaryButtonText,
setSecondaryButtonText,
expandedRows,
setExpandedRows,
// Refs
textAreaRef,
// Derived values
lastMessage,
secondLastMessage,
aihydroAsk,
task,
// Handlers
handleFocusChange,
clearExpandedRows,
resetState,
}
}
|