Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
math_tutor_dev
public_math_tutor
Commits
27e61c16
Commit
27e61c16
authored
Mar 13, 2026
by
Kantz
Browse files
Pfeiltasten um History zu navigieren. Bisher noch nicht Fertig
parent
8cedace3
Changes
3
Hide whitespace changes
Inline
Side-by-side
math-tutor/frontend/src/components/Chat/ChatWindow.tsx
View file @
27e61c16
...
@@ -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
>
...
...
math-tutor/frontend/src/components/Chat/MessageInput.tsx
View file @
27e61c16
...
@@ -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
();
...
...
math-tutor/frontend/src/pages/ChatPage.tsx
View file @
27e61c16
...
@@ -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
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment