The more I work on #ONI, which is basically a web components frontend for an as basic as possible #ActivityPub client to server service, the more I realize I'm just not built for JavaScript programming.

Despite having put in the hours every day for a number of months, the whole Promise paradigm just doesn't seem to click for me.

Now I'm struggling to create a throbber component (easy) while fetches happen in the background (easy) and then have it replaced (not easy) by actual content (easy).

😱 Gaaah!!!

#frontend #web_components #litjs #JavasScript

@mariusor FWIW, I'm working on a similar thing, and I've settled into a pattern like this - the component has a spinner, a viewer, and a no-data message, then have a dataBind() method like:
```
dataBind(data, binder) {
if (data) {
this.#spinner.style.display = 'none';
this.#viewer.style.display = null;
this.#noData.style.display = 'none';
} else {
this.#spinner.style.display = 'none';
this.#viewer.style.display = 'none';
this.#noData.style.display = null;
}
}
```

@OpinionatedGeek litjs has an idiomatic way of achieving this kind of logic.

It has an `until(promise, fallback)` function which waits for the promise to resolve and display fallback until then.

Even with this simple setup I still get issues. :D

It's definitely a "me" problem. I'm holding it wrong somehow, but I haven't seen any examples in the wild of "holding it right".

@mariusor That sounds so frustrating! (I feel your pain. I've given up in the past on libraries/add-ons that did complicated jobs but had no docs to tell me how to use them. I love examples!)

I do like the sound of that `until()` approach. I went with an ever-more-complex databinding approach that causes me some problems with large ActivityPub objects...

Hey @OpinionatedGeek I see you're working on ActivityPub stuff, is the code public to look at?
@mariusor Not yet - I still find it embarrassing to look at, and it probably only works with my own server at the moment. I do keep meaning to pick a license and put it up at the domain I got for it...

@OpinionatedGeek I finally got a workable version, though I am not very satisfied with it.

You can see it in action on my metal releases bot/ActivityPub playground: https://releases.bruta.link/outbox

The tab at the top corresponds to the outbox collection of the actor it gets loaded in the background to show an eventual icon/name change.

Daily Releases

@mariusor Nice! I like the way the data flows through the `it` attribute.

FWIW here's how your post looks in my C2S code. Depending on circumstances, each of the main bits (the profile picture, name, each addressee, the replied-to actor, and the content) may be demand-loaded.

@OpinionatedGeek nice, I like that you display explicitly the recipients.

So far everyone seems to want to paper over that whole mechanism with the "public" "followers" "mentions" model that Mastodon engendered.