Commit edc397cf authored by Kantz's avatar Kantz
Browse files

fallback wenn topic nicht gefunden wrid.

parent d4169dd2
...@@ -62,7 +62,7 @@ You can open a task chat directly with URL query parameters: ...@@ -62,7 +62,7 @@ You can open a task chat directly with URL query parameters:
Example: Example:
`http://localhost:5173/chat?orchestrator=task&file_id=analysis_1&task_id=03` `http://localhost:5173/chat?orchestrator=task&file_id=abc-formel-anwenden&task_id=03`
Notes: Notes:
......
...@@ -306,62 +306,88 @@ export default function ChatPage() { ...@@ -306,62 +306,88 @@ export default function ChatPage() {
return; 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; let cancelled = false;
void (async () => { void (async () => {
try { try {
// Validate Socratic topic early (before applying selection), similar to task param validation
if (deepLinkTarget.isSocratic) { 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, draft: targetSessionId,
topicKey: deepLinkTarget.topicKey, topicKey: deepLinkTarget.topicKey,
}).then((selected) => {
if (!cancelled) {
setTopicRef({ topicKey: selected.topic_key });
}
}); });
setTopicRef({ topicKey: selected.topic_key });
} else { } else {
const selectedFile = taskFiles.find((file) => file.file_id === deepLinkTarget.fileId); const selectedFile = taskFiles.find((file) => file.file_id === deepLinkTarget.fileId);
const selectedTask = selectedFile?.tasks.find((task) => task.task_id === deepLinkTarget.taskId); const selectedTask = selectedFile?.tasks.find((task) => task.task_id === deepLinkTarget.taskId);
...@@ -374,6 +400,7 @@ export default function ChatPage() { ...@@ -374,6 +400,7 @@ export default function ChatPage() {
taskId: selectedTask.task_id, taskId: selectedTask.task_id,
}); });
} }
if (!cancelled) { if (!cancelled) {
processedDeepLinkRef.current = deepLinkTarget.key; processedDeepLinkRef.current = deepLinkTarget.key;
pendingDeepLinkRef.current = ""; pendingDeepLinkRef.current = "";
...@@ -384,7 +411,13 @@ export default function ChatPage() { ...@@ -384,7 +411,13 @@ export default function ChatPage() {
if (!cancelled) { if (!cancelled) {
pendingDeepLinkRef.current = ""; pendingDeepLinkRef.current = "";
setDeepLinkError( 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); setTaskRef(null);
setTopicRef(null); setTopicRef(null);
......
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