Commit 27e61c16 authored by Kantz's avatar Kantz
Browse files

Pfeiltasten um History zu navigieren. Bisher noch nicht Fertig

parent 8cedace3
...@@ -9,6 +9,7 @@ type ChatWindowProps = { ...@@ -9,6 +9,7 @@ type ChatWindowProps = {
draft: string; draft: string;
onDraftChange: (value: string) => void; onDraftChange: (value: string) => void;
onSend: () => void; onSend: () => void;
onHistoryNavigate?: (direction: "older" | "newer") => boolean;
onToggleCanvas?: () => void; onToggleCanvas?: () => void;
onInspectDoc?: (doc: RetrievedDoc) => void; onInspectDoc?: (doc: RetrievedDoc) => void;
docIndex?: Record<string, RetrievedDoc>; docIndex?: Record<string, RetrievedDoc>;
...@@ -20,6 +21,7 @@ export default function ChatWindow({ ...@@ -20,6 +21,7 @@ export default function ChatWindow({
draft, draft,
onDraftChange, onDraftChange,
onSend, onSend,
onHistoryNavigate,
onToggleCanvas, onToggleCanvas,
onInspectDoc, onInspectDoc,
docIndex, docIndex,
...@@ -38,6 +40,7 @@ export default function ChatWindow({ ...@@ -38,6 +40,7 @@ export default function ChatWindow({
value={draft} value={draft}
onChange={onDraftChange} onChange={onDraftChange}
onSend={onSend} onSend={onSend}
onHistoryNavigate={onHistoryNavigate}
onToggleCanvas={onToggleCanvas} onToggleCanvas={onToggleCanvas}
/> />
</div> </div>
......
...@@ -5,6 +5,7 @@ type MessageInputProps = { ...@@ -5,6 +5,7 @@ type MessageInputProps = {
value: string; value: string;
onChange: (value: string) => void; onChange: (value: string) => void;
onSend: () => void; onSend: () => void;
onHistoryNavigate?: (direction: "older" | "newer") => boolean;
onToggleCanvas?: () => void; onToggleCanvas?: () => void;
}; };
...@@ -12,6 +13,7 @@ export default function MessageInput({ ...@@ -12,6 +13,7 @@ export default function MessageInput({
value, value,
onChange, onChange,
onSend, onSend,
onHistoryNavigate,
onToggleCanvas, onToggleCanvas,
}: MessageInputProps) { }: MessageInputProps) {
const canSend = value.trim().length > 0; const canSend = value.trim().length > 0;
...@@ -46,6 +48,19 @@ export default function MessageInput({ ...@@ -46,6 +48,19 @@ export default function MessageInput({
value={value} value={value}
onChange={(event) => onChange(event.target.value)} onChange={(event) => onChange(event.target.value)}
onKeyDown={(event) => { onKeyDown={(event) => {
const isCursorAtStart =
event.currentTarget.selectionStart === 0 && event.currentTarget.selectionEnd === 0;
if (event.key === "ArrowUp" && isCursorAtStart && onHistoryNavigate?.("older")) {
event.preventDefault();
return;
}
if (event.key === "ArrowDown" && isCursorAtStart && onHistoryNavigate?.("newer")) {
event.preventDefault();
return;
}
if (event.key === "Enter" && !event.shiftKey) { if (event.key === "Enter" && !event.shiftKey) {
event.preventDefault(); event.preventDefault();
onSend(); onSend();
......
...@@ -134,6 +134,8 @@ export default function ChatPage() { ...@@ -134,6 +134,8 @@ export default function ChatPage() {
const [messages, setMessages] = useState<ChatMessage[]>(initialMessages); const [messages, setMessages] = useState<ChatMessage[]>(initialMessages);
const [draft, setDraft] = useState(""); const [draft, setDraft] = useState("");
const [draftHistoryIndex, setDraftHistoryIndex] = useState<number | null>(null);
const [draftBeforeHistory, setDraftBeforeHistory] = useState<string | null>(null);
const [isArchiving, setIsArchiving] = useState(false); const [isArchiving, setIsArchiving] = useState(false);
const [archivedChats, setArchivedChats] = useState<ArchivedChatSummary[]>([]); const [archivedChats, setArchivedChats] = useState<ArchivedChatSummary[]>([]);
const [selectedArchiveId, setSelectedArchiveId] = useState(""); const [selectedArchiveId, setSelectedArchiveId] = useState("");
...@@ -345,6 +347,58 @@ export default function ChatPage() { ...@@ -345,6 +347,58 @@ export default function ChatPage() {
return { fileId: selectedTaskFile.file_id, taskId: previousTask.task_id }; return { fileId: selectedTaskFile.file_id, taskId: previousTask.task_id };
}, [selectedTaskFile, selectedTaskRef]); }, [selectedTaskFile, selectedTaskRef]);
const userMessageHistory = useMemo(
() => messages.filter((message) => message.role === "user").map((message) => message.text),
[messages]
);
const resetDraftHistoryNavigation = () => {
setDraftHistoryIndex(null);
setDraftBeforeHistory(null);
};
const handleDraftChange = (value: string) => {
if (draftHistoryIndex !== null) {
resetDraftHistoryNavigation();
}
setDraft(value);
};
const handleHistoryNavigate = (direction: "older" | "newer") => {
if (!userMessageHistory.length) {
return false;
}
if (direction === "older") {
const nextIndex =
draftHistoryIndex === null
? userMessageHistory.length - 1
: Math.max(0, draftHistoryIndex - 1);
if (draftHistoryIndex === null) {
setDraftBeforeHistory(draft);
}
setDraftHistoryIndex(nextIndex);
setDraft(userMessageHistory[nextIndex]);
return true;
}
if (draftHistoryIndex === null) {
return false;
}
const nextIndex = draftHistoryIndex + 1;
if (nextIndex >= userMessageHistory.length) {
setDraft(draftBeforeHistory ?? "");
resetDraftHistoryNavigation();
return true;
}
setDraftHistoryIndex(nextIndex);
setDraft(userMessageHistory[nextIndex]);
return true;
};
const handleSend = async () => { const handleSend = async () => {
const trimmed = draft.trim(); const trimmed = draft.trim();
if (!trimmed) { if (!trimmed) {
...@@ -359,6 +413,7 @@ export default function ChatPage() { ...@@ -359,6 +413,7 @@ export default function ChatPage() {
setMessages((prev) => [...prev, userMessage]); setMessages((prev) => [...prev, userMessage]);
setDraft(""); setDraft("");
resetDraftHistoryNavigation();
setRetrievalLoading(true); setRetrievalLoading(true);
setRetrievalError(null); setRetrievalError(null);
...@@ -491,6 +546,7 @@ export default function ChatPage() { ...@@ -491,6 +546,7 @@ export default function ChatPage() {
const resetChatState = () => { const resetChatState = () => {
setMessages(initialMessages); setMessages(initialMessages);
setDraft(""); setDraft("");
resetDraftHistoryNavigation();
setDirectChildren([]); setDirectChildren([]);
setTaskChildren([]); setTaskChildren([]);
setIndirectChildren([]); setIndirectChildren([]);
...@@ -831,8 +887,9 @@ export default function ChatPage() { ...@@ -831,8 +887,9 @@ export default function ChatPage() {
<ChatWindow <ChatWindow
messages={messages} messages={messages}
draft={draft} draft={draft}
onDraftChange={setDraft} onDraftChange={handleDraftChange}
onSend={handleSend} onSend={handleSend}
onHistoryNavigate={handleHistoryNavigate}
onToggleCanvas={handleToggleCanvas} onToggleCanvas={handleToggleCanvas}
onInspectDoc={handleInspectDoc} onInspectDoc={handleInspectDoc}
docIndex={docIndexes.bySourceKey} docIndex={docIndexes.bySourceKey}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment