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