All files / hooks use-message-files.ts

0% Statements 0/21
0% Branches 0/6
0% Functions 0/6
0% Lines 0/18

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 };
}