Files
cinny/src/app/state/callEmbed.ts
T
Lotus CIandClaude Opus 5.5 6e6213a43b
CI / Build & Quality Checks (push) Skipped
CI / Secret scan (gitleaks) (push) Skipped
CI / Playwright smoke (e2e) (push) Skipped
CI / Build & Quality Checks (pull_request) Successful in 3m31s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 11s
CI / Playwright smoke (e2e) (pull_request) Successful in 18m48s
feat(call): full-screen call when a phone is turned sideways (#126)
Landscape, at most 500px tall, touch input (a sideways phone is ~840px
wide, the Tablet size class, so the trigger is the screen shape), in this
room's joined call, chat closed: the call takes the whole screen. No room
header, sidebar or call-status bar; safe-area insets respected.

- Taps inside the call frame never reach the app, so while the controls
  are hidden a transparent layer covers the call: the first tap shows the
  call bar plus Chat / Exit full screen, which hide again after 4 s
  without a touch; with them up the call underneath stays usable.
- In an Android browser tab the first tap also enters the browser's own
  full screen (hides the address bar); left again on rotate back, hang
  up or exit. No effect on iPhone or the installed app.
- Exit full screen lasts until the phone is upright again.
- The frame is transparent (room wallpaper), so in full screen it gets an
  opaque base colour under the wallpaper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
2026-10-24 22:50:01 -04:00

24 lines
678 B
TypeScript

import { atom } from 'jotai';
import { CallEmbed } from '../plugins/call';
const baseCallEmbedAtom = atom<CallEmbed | undefined>(undefined);
export const callEmbedAtom = atom<CallEmbed | undefined, [CallEmbed | undefined], void>(
(get) => get(baseCallEmbedAtom),
(get, set, callEmbed) => {
const prevCallEmbed = get(baseCallEmbedAtom);
if (callEmbed === prevCallEmbed) return;
if (prevCallEmbed) {
prevCallEmbed.dispose();
}
set(baseCallEmbedAtom, callEmbed);
},
);
export const callChatAtom = atom<boolean>(false);
/** [Gitea #126] The call is full screen (phone turned sideways). */
export const immersiveCallAtom = atom<boolean>(false);