feat(lotus): in-frame screenshare button where the host can't delegate (cinny #43)
Firefox, Safari and WebKitGTK have no Capability Delegation, so the host
can't start a share from its call bar: getDisplayMedia needs the click in
this frame. Until now the host clicked EC's hidden footer button through
the DOM, which only works while the frame is same-origin.
With lotusHostControls + lotusFrameScreenshare the fork now shows EC's own
screenshare button (floating bottom-right, footer still hidden), so the
click is native. controls_state reports frameScreenshare so the host hides
its own button. New toWidget io.lotus.set_frame_screenshare { visible }
lets the host hide it while the room's call policy forbids screensharing
(never while a share is live, so it can still be stopped).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
dfb72bd9a5
commit
0f93368a7e
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
Copyright 2026 Lotus Guild
|
||||
|
||||
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
||||
Please see LICENSE in the repository root for full details.
|
||||
*/
|
||||
|
||||
import { type FC } from "react";
|
||||
|
||||
import { ShareScreenButton } from "../button";
|
||||
import { type CallViewModel } from "../state/CallViewModel/CallViewModel";
|
||||
import { useBehavior } from "../useBehavior";
|
||||
import {
|
||||
lotusFrameScreenshareEnabled,
|
||||
lotusFrameScreenshareVisible$,
|
||||
} from "./lotusControls";
|
||||
import styles from "./LotusFrameScreenshare.module.css";
|
||||
|
||||
/**
|
||||
* [cinny #43] EC's screenshare button, shown inside the frame when the host
|
||||
* can't start a share for us (`lotusFrameScreenshare`). The rest of EC's
|
||||
* footer stays hidden behind the host's call bar.
|
||||
*/
|
||||
export const LotusFrameScreenshare: FC<{ vm: CallViewModel }> = ({ vm }) => {
|
||||
const sharing = useBehavior(vm.sharingScreen$);
|
||||
const visible = useBehavior(lotusFrameScreenshareVisible$);
|
||||
if (!lotusFrameScreenshareEnabled() || !vm.toggleScreenSharing) return null;
|
||||
// Hidden by the host's call policy, but never while a share is live: the
|
||||
// user must still be able to stop it.
|
||||
if (!visible && !sharing) return null;
|
||||
return (
|
||||
<div className={styles.floating}>
|
||||
<ShareScreenButton
|
||||
size="md"
|
||||
enabled={sharing}
|
||||
onClick={vm.toggleScreenSharing}
|
||||
data-testid="lotus_frame_screenshare"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user