Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | "use client";
import { useEffect, useRef, useState } from "react";
import type { UIMessage } from "ai";
type UseMessageFilesProps = {
messages: UIMessage[];
};
export function useMessageFiles({ messages }: UseMessageFilesProps) {
const [messageFiles, setMessageFiles] = useState<Map<string, File>>(new Map());
const pendingFileRef = useRef<File | null>(null);
const prevMessageCountRef = useRef(messages.length);
useEffect(() => {
if (!pendingFileRef.current) return;
const newMessages = messages.slice(prevMessageCountRef.current);
const newUserMessage = newMessages.find((m) => m.role === "user");
if (newUserMessage) {
const file = pendingFileRef.current;
setMessageFiles((prev) => new Map(prev).set(newUserMessage.id, file));
pendingFileRef.current = null;
prevMessageCountRef.current = messages.length;
}
}, [messages]);
function handleFileAttached(file: File | null) {
pendingFileRef.current = file;
}
function snapshotMessageCount() {
if (pendingFileRef.current) {
prevMessageCountRef.current = messages.length;
}
}
return { messageFiles, handleFileAttached, snapshotMessageCount };
}
|