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
edc397cf
Commit
edc397cf
authored
Jun 03, 2026
by
Kantz
Browse files
fallback wenn topic nicht gefunden wrid.
parent
d4169dd2
Changes
2
Hide whitespace changes
Inline
Side-by-side
math-tutor/README.md
View file @
edc397cf
...
...
@@ -62,7 +62,7 @@ You can open a task chat directly with URL query parameters:
Example:
`http://localhost:5173/chat?orchestrator=task&file_id=a
nalysis_1
&task_id=03`
`http://localhost:5173/chat?orchestrator=task&file_id=a
bc-formel-anwenden
&task_id=03`
Notes:
...
...
math-tutor/frontend/src/pages/ChatPage.tsx
View file @
edc397cf
...
...
@@ -306,62 +306,88 @@ export default function ChatPage() {
return
;
}
if
(
deepLinkTarget
.
isSocratic
)
{
setSelectedOrchestrator
(
"
socratic
"
);
setTaskRef
(
null
);
setTopicRef
({
topicKey
:
deepLinkTarget
.
topicKey
});
}
else
{
const
selectedFile
=
taskFiles
.
find
((
file
)
=>
file
.
file_id
===
deepLinkTarget
.
fileId
);
if
(
!
selectedFile
)
{
setDeepLinkError
(
t
(
"
deepLinkInvalidTask
"
));
pendingDeepLinkRef
.
current
=
""
;
setTaskRef
(
null
);
setTopicRef
(
null
);
unlockTask
();
navigate
(
targetRoute
,
{
replace
:
true
});
return
;
}
const
selectedTask
=
selectedFile
.
tasks
.
find
((
task
)
=>
task
.
task_id
===
deepLinkTarget
.
taskId
);
if
(
!
selectedTask
)
{
setDeepLinkError
(
t
(
"
deepLinkInvalidTask
"
));
pendingDeepLinkRef
.
current
=
""
;
setTaskRef
(
null
);
setTopicRef
(
null
);
unlockTask
();
navigate
(
targetRoute
,
{
replace
:
true
});
return
;
}
setSelectedOrchestrator
(
"
task
"
);
setTopicRef
(
null
);
setTaskRef
({
fileId
:
selectedFile
.
file_id
,
taskId
:
selectedTask
.
task_id
});
}
unlockTask
();
const
targetSessionId
=
createSessionId
();
setChatSessionId
(
targetSessionId
);
setMessages
(
initialMessages
);
setDraft
(
""
);
resetDraftHistoryNavigation
();
setIsSending
(
false
);
setDirectChildren
([]);
setTaskChildren
([]);
setIndirectChildren
([]);
setSubsections
([]);
setSubsubsections
([]);
setSections
([]);
setRetrievalLoading
(
false
);
setRetrievalError
(
null
);
setCanvasStatus
(
null
);
setIsCanvasVisible
(
false
);
let
cancelled
=
false
;
void
(
async
()
=>
{
try
{
// Validate Socratic topic early (before applying selection), similar to task param validation
if
(
deepLinkTarget
.
isSocratic
)
{
const
selected
=
await
selectTopic
({
const
topicResponse
=
await
fetch
(
"
/api/tasks/socratic-topics
"
);
if
(
!
topicResponse
.
ok
)
{
throw
new
Error
(
"
topic validation failed
"
);
}
const
topicPayload
:
{
topics
:
{
topic_key
:
string
}[]
}
=
await
topicResponse
.
json
();
const
selectedTopic
=
topicPayload
.
topics
.
find
(
(
topic
)
=>
topic
.
topic_key
===
deepLinkTarget
.
topicKey
);
if
(
!
selectedTopic
)
{
setDeepLinkError
(
t
(
"
deepLinkInvalidTopic
"
));
pendingDeepLinkRef
.
current
=
""
;
setTaskRef
(
null
);
setTopicRef
(
null
);
unlockTask
();
navigate
(
targetRoute
,
{
replace
:
true
});
return
;
}
// Apply local selection state now that topic is validated
setSelectedOrchestrator
(
"
socratic
"
);
setTaskRef
(
null
);
setTopicRef
({
topicKey
:
deepLinkTarget
.
topicKey
});
}
else
{
// Validate task params locally (file & task existence) and apply selection
const
selectedFile
=
taskFiles
.
find
((
file
)
=>
file
.
file_id
===
deepLinkTarget
.
fileId
);
if
(
!
selectedFile
)
{
setDeepLinkError
(
t
(
"
deepLinkInvalidTask
"
));
pendingDeepLinkRef
.
current
=
""
;
setTaskRef
(
null
);
setTopicRef
(
null
);
unlockTask
();
navigate
(
targetRoute
,
{
replace
:
true
});
return
;
}
const
selectedTask
=
selectedFile
.
tasks
.
find
((
task
)
=>
task
.
task_id
===
deepLinkTarget
.
taskId
);
if
(
!
selectedTask
)
{
setDeepLinkError
(
t
(
"
deepLinkInvalidTask
"
));
pendingDeepLinkRef
.
current
=
""
;
setTaskRef
(
null
);
setTopicRef
(
null
);
unlockTask
();
navigate
(
targetRoute
,
{
replace
:
true
});
return
;
}
setSelectedOrchestrator
(
"
task
"
);
setTopicRef
(
null
);
setTaskRef
({
fileId
:
selectedFile
.
file_id
,
taskId
:
selectedTask
.
task_id
});
}
// Common post-selection setup
unlockTask
();
const
targetSessionId
=
createSessionId
();
setChatSessionId
(
targetSessionId
);
setMessages
(
initialMessages
);
setDraft
(
""
);
resetDraftHistoryNavigation
();
setIsSending
(
false
);
setDirectChildren
([]);
setTaskChildren
([]);
setIndirectChildren
([]);
setSubsections
([]);
setSubsubsections
([]);
setSections
([]);
setRetrievalLoading
(
false
);
setRetrievalError
(
null
);
setCanvasStatus
(
null
);
setIsCanvasVisible
(
false
);
// Perform server-side selection (selectTopic / selectTask)
if
(
deepLinkTarget
.
isSocratic
)
{
await
selectTopic
({
draft
:
targetSessionId
,
topicKey
:
deepLinkTarget
.
topicKey
,
}).
then
((
selected
)
=>
{
if
(
!
cancelled
)
{
setTopicRef
({
topicKey
:
selected
.
topic_key
});
}
});
setTopicRef
({
topicKey
:
selected
.
topic_key
});
}
else
{
const
selectedFile
=
taskFiles
.
find
((
file
)
=>
file
.
file_id
===
deepLinkTarget
.
fileId
);
const
selectedTask
=
selectedFile
?.
tasks
.
find
((
task
)
=>
task
.
task_id
===
deepLinkTarget
.
taskId
);
...
...
@@ -374,6 +400,7 @@ export default function ChatPage() {
taskId
:
selectedTask
.
task_id
,
});
}
if
(
!
cancelled
)
{
processedDeepLinkRef
.
current
=
deepLinkTarget
.
key
;
pendingDeepLinkRef
.
current
=
""
;
...
...
@@ -384,7 +411,13 @@ export default function ChatPage() {
if
(
!
cancelled
)
{
pendingDeepLinkRef
.
current
=
""
;
setDeepLinkError
(
deepLinkTarget
.
isSocratic
?
t
(
"
deepLinkInitFailedTopic
"
)
:
t
(
"
deepLinkInitFailed
"
)
deepLinkTarget
.
isSocratic
&&
error
instanceof
Error
&&
error
.
message
===
"
invalid topic deep link
"
?
t
(
"
deepLinkInvalidTopic
"
)
:
deepLinkTarget
.
isSocratic
?
t
(
"
deepLinkInitFailedTopic
"
)
:
t
(
"
deepLinkInitFailed
"
)
);
setTaskRef
(
null
);
setTopicRef
(
null
);
...
...
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