// A room view (`/r/:id`): the room's messages oldest-first, each a live row, plus the composer. The
// Rindle loader seeds the detail query for first paint and blocks client navigation until it is
// ready; after hydration the wasm engine owns the live read and every new message streams in.
import { Link, createFileRoute } from "@tanstack/react-router";
import { fragmentKey, useRoot } from "@rindle/react";
import { roomDetailQuery } from "../components/RoomView.queries.ts";
import { MessageCard } from "../components/MessageCard.tsx";
import { Composer } from "../components/Composer.tsx";
import { rindle } from "../rindle-tanstack.ts";
export const Route = createFileRoute("/r/$id")({
loader: rindle.loader({ query: ({ params }) => roomDetailQuery(params.id) }),
component: RoomView,
});
function RoomView() {
const { id } = Route.useParams();
const [room, { status }] = useRoot(roomDetailQuery, id);
if (!room) {
return (
{status === "complete" ? "Room not found." : "Loading room…"}
← Back to rooms
);
}
const messages = room.messages ?? [];
return (