lotus(#6): render avatar decorations on in-call tiles
CI / Build embedded bundle (push) Failing after 12m11s
CI / Publish to Gitea npm registry (push) Has been skipped

Adds io.lotus.decorations (toWidget): the host pushes a userId->image-URL
map and EC overlays the profile decoration on each tile avatar
(TileAvatar), keyed by userId, with a useSyncExternalStore-backed store.
Makes A6 first-class in-call instead of absent. URLs are validated
https/blob. Additive: no-op unless the host sends decorations.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Lotus CI
2026-06-29 23:38:45 -04:00
co-authored by Claude Opus 4.8
parent 7d792c33bf
commit 70358d442b
5 changed files with 118 additions and 1 deletions
+4
View File
@@ -33,6 +33,7 @@ import { startLotusCallState } from "../lotus/lotusCallState";
import { startLotusFocus } from "../lotus/lotusFocus";
import { startLotusAudioInject } from "../lotus/lotusAudioInject";
import { startLotusQuality } from "../lotus/lotusQuality";
import { startLotusDecorations } from "../lotus/lotusDecorations";
import styles from "./InCallView.module.css";
import { GridTile } from "../tile/GridTile";
import { SettingsModal, defaultSettingsTab } from "../settings/SettingsModal";
@@ -295,6 +296,9 @@ export const InCallView: FC<InCallViewProps> = ({
// [lotus] Handle the host's io.lotus.set_quality action to cap audio/
// screenshare encoding bitrate/framerate (#7). No-op unless the host sends it.
useEffect(() => startLotusQuality(vm), [vm]);
// [lotus] Receive per-user avatar-decoration URLs from the host and render
// them on in-call tile avatars (#6). No-op unless the host sends them.
useEffect(() => startLotusDecorations(), []);
const fatalCallError = useBehavior(vm.fatalError$);
// Stop the rendering and throw for the error boundary