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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | /** * Shared types and interfaces for the chat view components */ import { AiHydroAsk, AiHydroMessage } from "@shared/ExtensionMessage" import { VirtuosoHandle } from "react-virtuoso" import { ButtonActionType } from "../shared/buttonConfig" /** * Main ChatView component props */ export interface ChatViewProps { isHidden: boolean showAnnouncement: boolean hideAnnouncement: () => void showHistoryView: () => void } /** * Chat state interface */ export interface ChatState { // State values inputValue: string setInputValue: React.Dispatch<React.SetStateAction<string>> activeQuote: string | null setActiveQuote: React.Dispatch<React.SetStateAction<string | null>> isTextAreaFocused: boolean setIsTextAreaFocused: React.Dispatch<React.SetStateAction<boolean>> selectedImages: string[] setSelectedImages: React.Dispatch<React.SetStateAction<string[]>> selectedFiles: string[] setSelectedFiles: React.Dispatch<React.SetStateAction<string[]>> sendingDisabled: boolean setSendingDisabled: React.Dispatch<React.SetStateAction<boolean>> enableButtons: boolean setEnableButtons: React.Dispatch<React.SetStateAction<boolean>> primaryButtonText: string | undefined setPrimaryButtonText: React.Dispatch<React.SetStateAction<string | undefined>> secondaryButtonText: string | undefined setSecondaryButtonText: React.Dispatch<React.SetStateAction<string | undefined>> expandedRows: Record<number, boolean> setExpandedRows: React.Dispatch<React.SetStateAction<Record<number, boolean>>> // Refs textAreaRef: React.RefObject<HTMLTextAreaElement> // Derived values lastMessage: AiHydroMessage | undefined secondLastMessage: AiHydroMessage | undefined aihydroAsk: AiHydroAsk | undefined task: AiHydroMessage | undefined // Handlers handleFocusChange: (isFocused: boolean) => void clearExpandedRows: () => void resetState: () => void // Scroll-related state (will be moved to scroll hook) showScrollToBottom?: boolean isAtBottom?: boolean pendingScrollToMessage?: number | null } /** * Message handlers interface */ export interface MessageHandlers { executeButtonAction: (action: ButtonActionType, text?: string, images?: string[], files?: string[]) => Promise<void> handleSendMessage: (text: string, images: string[], files: string[]) => Promise<void> handleTaskCloseButtonClick: () => void startNewTask: () => Promise<void> } /** * Scroll behavior interface */ export interface ScrollBehavior { virtuosoRef: React.RefObject<VirtuosoHandle> scrollContainerRef: React.RefObject<HTMLDivElement> disableAutoScrollRef: React.MutableRefObject<boolean> scrollToBottomSmooth: () => void scrollToBottomAuto: () => void scrollToMessage: (messageIndex: number) => void toggleRowExpansion: (ts: number) => void handleRowHeightChange: (isTaller: boolean) => void showScrollToBottom: boolean setShowScrollToBottom: React.Dispatch<React.SetStateAction<boolean>> isAtBottom: boolean setIsAtBottom: React.Dispatch<React.SetStateAction<boolean>> pendingScrollToMessage: number | null setPendingScrollToMessage: React.Dispatch<React.SetStateAction<number | null>> } /** * Button state interface */ export interface ButtonState { enableButtons: boolean primaryButtonText: string | undefined secondaryButtonText: string | undefined } /** * Input state interface */ export interface InputState { inputValue: string selectedImages: string[] selectedFiles: string[] activeQuote: string | null isTextAreaFocused: boolean } /** * Task section props */ export interface TaskSectionProps { task: AiHydroMessage messages: AiHydroMessage[] scrollBehavior: ScrollBehavior buttonState: ButtonState messageHandlers: MessageHandlers chatState: ChatState apiMetrics: { totalTokensIn: number totalTokensOut: number totalCacheWrites?: number totalCacheReads?: number totalCost: number } lastApiReqTotalTokens?: number selectedModelInfo: { supportsPromptCache: boolean supportsImages: boolean } isStreaming: boolean aihydroAsk?: AiHydroAsk modifiedMessages: AiHydroMessage[] } /** * Welcome section props */ export interface WelcomeSectionProps { showAnnouncement: boolean hideAnnouncement: () => void showHistoryView: () => void telemetrySetting: string version: string taskHistory: any[] shouldShowQuickWins: boolean } /** * Input section props */ export interface InputSectionProps { chatState: ChatState messageHandlers: MessageHandlers textAreaRef: React.RefObject<HTMLTextAreaElement> onFocusChange: (isFocused: boolean) => void onInputChange: (value: string) => void onQuoteChange: (quote: string | null) => void onImagesChange: (images: string[]) => void onFilesChange: (files: string[]) => void placeholderText: string shouldDisableFilesAndImages: boolean selectFilesAndImages: () => Promise<void> } |