~ knotless Search/
↑↓ move↵ open⇧↵ all results

johnandersen777.bsky.social/atlibs-agents

agents and atirc modules for atlibs: launch agents from a composition, chat on atirc; pages and the agents service

0
0
main
27 lines · 1.3 KB Raw History
import { templated } from 'atlibs/component/index.js'

const Base = await templated(new URL('./atirc-messages.html', import.meta.url));

function line({ ts, nick, identity, text }) {
	const li = Base.templates.line.content.cloneNode(true);
	li.querySelector(".ts").textContent = new Date(ts).toLocaleTimeString();
	li.querySelector(".nick").textContent = nick;
	li.querySelector(".nick").title = identity ?? "";
	li.querySelector(".text").textContent = text;
	return li;
}

// All text goes in through textContent, so channel lines cannot inject markup.
// What it shows comes only from render(state), the page cubit's state.
customElements.define('atirc-messages', class extends Base {
	render(state, previous) {
		this.querySelector(".panel").style.display = state.session === "signed-in" ? "inherit" : "none";
		if (previous && previous.messages === state.messages) return;
		const { status, list, error } = state.messages;
		const lines = this.querySelector(".lines");
		if (status === "loading" || status === "idle") lines.setAttribute("aria-busy", "true");
		else lines.removeAttribute("aria-busy");
		this.querySelector(".error").textContent = status === "error" ? `Error reading channel: ${error}` : "";
		if (previous?.messages.list !== list) lines.replaceChildren(...list.map(line));
	}
});