import { html, render } from "/js/lib/lit-html.js";
import { Component } from "/js/components/component.js";
import { profileFeedTemplate } from "/js/templates/profileFeed.template.js";
import { Signal, ReactiveStore, effect } from "/js/signals.js";
class PluginProfilesList extends Component {
static get observedAttributes() {
return ["dids", "empty-message"];
}
connectedCallback() {
if (this.initialized) return;
this.initialized = true;
this.state = new ReactiveStore("plugin-profiles-list");
this.state.$dids = new Signal.State(this.parseDids());
this.state.$emptyMessage = new Signal.State(
this.getAttribute("empty-message"),
);
this.state.$loaded = new Signal.State(false);
this.state.$profiles = new Signal.Computed(() => {
if (!this.state.$loaded.get()) return null;
const dids = this.state.$dids.get();
return dids
.map((did) => this.dataLayer.derived.$hydratedProfiles.get(did))
.filter(Boolean);
});
this.state.$error = new Signal.State(null);
this._disposers = [
effect(() => {
const error = this.state.$error.get();
const profiles = this.state.$profiles.get();
const emptyMessage = this.state.$emptyMessage.get();
const dids = this.state.$dids.get();
if (error) {
render(html`
${error}
`, this);
return;
}
render(
profileFeedTemplate({
profiles,
hasMore: false,
skeletonCount: dids.length,
emptyMessage,
showFollowButton: false,
}),
this,
);
}),
effect(() => {
this.state.$dids.get();
this.load();
}),
];
}
disconnectedCallback() {
if (!this.initialized) return;
this._disposers?.forEach((dispose) => dispose());
this._disposers = null;
}
attributeChangedCallback() {
if (this.initialized) {
this.state.$dids.set(this.parseDids());
this.state.$emptyMessage.set(this.getAttribute("empty-message"));
}
}
parseDids() {
const value = this.getAttribute("dids") ?? "";
return value
.split(",")
.map((did) => did.trim())
.filter(Boolean);
}
async load() {
const dids = this.state.$dids.get();
const requestToken = Symbol();
this._requestToken = requestToken;
this.state.$error.set(null);
if (dids.length === 0) {
this.state.$loaded.set(true);
return;
}
this.state.$loaded.set(false);
try {
await this.dataLayer.declarative.ensureDetailedProfiles(dids);
if (this._requestToken !== requestToken) return;
this.state.$loaded.set(true);
} catch (error) {
if (this._requestToken !== requestToken) return;
this.state.$error.set(error.message ?? String(error));
}
}
}
PluginProfilesList.register();