feat(calls): toast the fork's screenshare reminders (EC #39)
CI / Build & Quality Checks (push) Successful in 1m39s
CI / Docker image build & smoke test (push) Skipped
CI / Secret scan (gitleaks) (push) Successful in 11s
CI / Trigger Desktop Build (push) Successful in 3s
CI / Playwright smoke (e2e) (push) Successful in 10m4s
CI / Build & Quality Checks (push) Successful in 1m39s
CI / Docker image build & smoke test (push) Skipped
CI / Secret scan (gitleaks) (push) Successful in 11s
CI / Trigger Desktop Build (push) Successful in 3s
CI / Playwright smoke (e2e) (push) Successful in 10m4s
io.lotus.screenshare_notice → "Screen sharing stopped — the shared window was closed.", "Your screen share is showing nothing — the shared window may be minimised or hidden.", and a sticky "Still sharing?" after 30 min with nobody else in the call (fork ≥ 0.25.0-lotus.12). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
This commit is contained in:
@@ -50,6 +50,7 @@ import { useCallPolicyRevokedToast } from '../hooks/useCallPolicyRevokedToast';
|
|||||||
import { useCallEndedToast } from '../hooks/useCallEndedToast';
|
import { useCallEndedToast } from '../hooks/useCallEndedToast';
|
||||||
import { useCallRejoin } from '../hooks/useCallRejoin';
|
import { useCallRejoin } from '../hooks/useCallRejoin';
|
||||||
import { usePttHaptics } from '../hooks/usePttHaptics';
|
import { usePttHaptics } from '../hooks/usePttHaptics';
|
||||||
|
import { useScreenshareNotices } from '../hooks/useScreenshareNotices';
|
||||||
import { useCallAnnouncements } from '../hooks/useCallAnnouncements';
|
import { useCallAnnouncements } from '../hooks/useCallAnnouncements';
|
||||||
import { useMutedTalkWarning } from '../hooks/useMutedTalkWarning';
|
import { useMutedTalkWarning } from '../hooks/useMutedTalkWarning';
|
||||||
import { callAnnouncementAtom } from '../state/callAnnouncement';
|
import { callAnnouncementAtom } from '../state/callAnnouncement';
|
||||||
@@ -748,6 +749,7 @@ function CallUtils({ embed, joined }: { embed: CallEmbed; joined: boolean }) {
|
|||||||
useCallJoinLeaveSounds(embed);
|
useCallJoinLeaveSounds(embed);
|
||||||
useCallPolicyRevokedToast(embed, joined);
|
useCallPolicyRevokedToast(embed, joined);
|
||||||
useCallEndedToast(embed);
|
useCallEndedToast(embed);
|
||||||
|
useScreenshareNotices(embed);
|
||||||
usePttHaptics();
|
usePttHaptics();
|
||||||
useCallAnnouncements(embed, joined);
|
useCallAnnouncements(embed, joined);
|
||||||
useMutedTalkWarning(embed, joined);
|
useMutedTalkWarning(embed, joined);
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
import { useEffect } from 'react';
|
||||||
|
import { useSetAtom } from 'jotai';
|
||||||
|
import { Icons } from 'folds';
|
||||||
|
import { CallEmbed } from '../plugins/call';
|
||||||
|
import { toastQueueAtom } from '../state/toast';
|
||||||
|
|
||||||
|
export type ScreenshareNoticeKind = 'ended' | 'no-frames' | 'alone';
|
||||||
|
|
||||||
|
export const describeScreenshareNotice = (kind: ScreenshareNoticeKind): string | undefined => {
|
||||||
|
switch (kind) {
|
||||||
|
case 'ended':
|
||||||
|
return 'Screen sharing stopped — the shared window was closed.';
|
||||||
|
case 'no-frames':
|
||||||
|
return 'Your screen share is showing nothing — the shared window may be minimised or hidden.';
|
||||||
|
case 'alone':
|
||||||
|
return "Still sharing? You've been sharing your screen for 30 minutes with nobody else in the call.";
|
||||||
|
default:
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [Gitea EC#39] Toast the fork's io.lotus.screenshare_notice: shared window
|
||||||
|
* closed, no frames for a while, or a long share with nobody watching.
|
||||||
|
*/
|
||||||
|
export function useScreenshareNotices(embed: CallEmbed): void {
|
||||||
|
const setToast = useSetAtom(toastQueueAtom);
|
||||||
|
useEffect(
|
||||||
|
() =>
|
||||||
|
embed.listenAction<{ data?: { kind?: ScreenshareNoticeKind } }>(
|
||||||
|
'io.lotus.screenshare_notice',
|
||||||
|
(evt) => {
|
||||||
|
const body = describeScreenshareNotice(evt.detail?.data?.kind as ScreenshareNoticeKind);
|
||||||
|
if (!body) return;
|
||||||
|
setToast({
|
||||||
|
id: `screenshare-${evt.detail?.data?.kind}-${Date.now()}`,
|
||||||
|
iconSrc: Icons.ScreenShare,
|
||||||
|
displayName: 'Screen share',
|
||||||
|
body,
|
||||||
|
roomName: embed.room.name ?? 'Voice call',
|
||||||
|
roomId: embed.roomId,
|
||||||
|
sticky: evt.detail?.data?.kind === 'alone',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
[embed, setToast],
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user