// 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 (
Rooms {room.name}

{room.name}

{messages.length === 0 ? (

No messages yet — say something below.

) : ( messages.map((message) => ) )}
); }