123 lines
3.1 KiB
TypeScript
123 lines
3.1 KiB
TypeScript
import { useEffect, useCallback } from "react";
|
|
import { useAppStore } from "@/components/state-provider";
|
|
import {
|
|
queueMessage,
|
|
cancelQueuedMessage,
|
|
getQueueStatus,
|
|
updateQueuedMessage,
|
|
} from "@/lib/api/domains/queue-api";
|
|
|
|
export type MessageAttachment = {
|
|
type: string;
|
|
data: string;
|
|
mime_type: string;
|
|
};
|
|
|
|
export function useQueue(sessionId: string | null) {
|
|
const queueStatus = useAppStore((state) =>
|
|
sessionId ? state.queue.bySessionId[sessionId] : undefined,
|
|
);
|
|
const isLoading = useAppStore((state) =>
|
|
sessionId ? (state.queue.isLoading[sessionId] ?? false) : false,
|
|
);
|
|
const setQueueStatus = useAppStore((state) => state.setQueueStatus);
|
|
const setQueueLoading = useAppStore((state) => state.setQueueLoading);
|
|
|
|
// Fetch queue status on mount
|
|
useEffect(() => {
|
|
if (!sessionId) return;
|
|
|
|
const fetchStatus = async () => {
|
|
try {
|
|
setQueueLoading(sessionId, true);
|
|
const status = await getQueueStatus(sessionId);
|
|
setQueueStatus(sessionId, status);
|
|
} catch (error) {
|
|
console.error("Failed to fetch queue status:", error);
|
|
} finally {
|
|
setQueueLoading(sessionId, false);
|
|
}
|
|
};
|
|
|
|
fetchStatus();
|
|
}, [sessionId, setQueueStatus, setQueueLoading]);
|
|
|
|
const queue = useCallback(
|
|
async (
|
|
taskId: string,
|
|
content: string,
|
|
model?: string,
|
|
planMode?: boolean,
|
|
attachments?: MessageAttachment[],
|
|
) => {
|
|
if (!sessionId) return;
|
|
|
|
try {
|
|
setQueueLoading(sessionId, true);
|
|
const queuedMsg = await queueMessage({
|
|
session_id: sessionId,
|
|
task_id: taskId,
|
|
content,
|
|
model,
|
|
plan_mode: planMode,
|
|
attachments,
|
|
});
|
|
|
|
setQueueStatus(sessionId, {
|
|
is_queued: true,
|
|
message: queuedMsg,
|
|
});
|
|
} catch (error) {
|
|
console.error("Failed to queue message:", error);
|
|
throw error;
|
|
} finally {
|
|
setQueueLoading(sessionId, false);
|
|
}
|
|
},
|
|
[sessionId, setQueueStatus, setQueueLoading],
|
|
);
|
|
|
|
const cancel = useCallback(async () => {
|
|
if (!sessionId) return;
|
|
|
|
try {
|
|
setQueueLoading(sessionId, true);
|
|
await cancelQueuedMessage(sessionId);
|
|
setQueueStatus(sessionId, {
|
|
is_queued: false,
|
|
message: null,
|
|
});
|
|
} catch (error) {
|
|
console.error("Failed to cancel queue:", error);
|
|
throw error;
|
|
} finally {
|
|
setQueueLoading(sessionId, false);
|
|
}
|
|
}, [sessionId, setQueueStatus, setQueueLoading]);
|
|
|
|
const updateContent = useCallback(
|
|
async (content: string) => {
|
|
if (!sessionId) return;
|
|
|
|
try {
|
|
const status = await updateQueuedMessage(sessionId, content);
|
|
setQueueStatus(sessionId, status);
|
|
} catch (error) {
|
|
console.error("Failed to update queued message:", error);
|
|
throw error;
|
|
}
|
|
},
|
|
[sessionId, setQueueStatus],
|
|
);
|
|
|
|
return {
|
|
queueStatus,
|
|
isQueued: queueStatus?.is_queued ?? false,
|
|
queuedMessage: queueStatus?.message,
|
|
isLoading,
|
|
queue,
|
|
cancel,
|
|
updateContent,
|
|
};
|
|
}
|