qubit 1.0.0-beta.2

Seamless RPC for Rust & TypeScript
Documentation
import { useQuery } from "@tanstack/react-query";
import { useEffect, useRef, useState } from "react";
import { api } from "../api";
import type { ChatMessage } from "../bindings";
import { Message } from "./Message";

export const History = () => {
  const containerRef = useRef<HTMLOutputElement>(null);

  const { data: name } = useQuery({
    queryKey: ["name"],
    queryFn: () => api.get_name.query(),
  });

  const [messages, setMessages] = useState<ChatMessage[]>([]);

  useEffect(() => api.list_messages.subscribe({ on_data: setMessages }), []);

  // biome-ignore lint/correctness/useExhaustiveDependencies: scroll when messages changes
  useEffect(() => {
    containerRef.current?.scrollTo({
      top: containerRef.current.scrollHeight,
      behavior: "smooth",
    });
  }, [messages]);

  return (
    <output ref={containerRef}>
      {messages.map((message, i) => (
        <Message
          // biome-ignore lint/suspicious/noArrayIndexKey: order will never change
          key={i}
          emoji={message.user}
          message={message.content}
          you={message.user === name}
        />
      ))}
    </output>
  );
};