Messaging · Calls: controls, tiles, a grid, a shared screen, a bar, a ringing dialog, a huddle

CallControls holds the microphone, camera and a shared screen as
toggles, then Leave. ParticipantTile shows a camera's frame from the
host or the person's initials, their name with a mark when muted, and a
ring while they speak. VideoCallGrid lays tiles in even rows as far as
they fit across its measured width; a short last row centers at the
full rows' width. ScreenShareView names who presents and offers Stop
presenting for your own share, the call's tiles beside or below.
VoiceCallBar tells where a call is, how long it has run and who is in
it, with the microphone and Leave. IncomingCallDialog rings with the
caller's picture; Accept or Decline answers each ring once, and Escape
declines. HuddleIndicator rings while a huddle is live; a press joins.

The recorder's device toggle and the camera's name chip now have one
home in media. People: member names sort whatever their case, a
status's words save trimmed, and a profile card's local time ticks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ZacharyZhang-NYandClaude Opus 5.5 committed 2026-09-26 22:33:54 -04:00
1 parent 37e56c7ab7
commit 48d02c4903
26 files changed
+1535 -51

No files matched your search

+21 -11
View File
@@ -25,6 +25,26 @@ pub(crate) fn lit(level: f32) -> usize {
(level * SEGMENTS as f32).round() as usize
}
/// A device toggle, such as a microphone's: its icon shows on or off, and a press flips it, logged under `owner`.
pub(crate) fn device_toggle(
owner: &'static str,
id: &ElementId,
key: &'static str,
icons: (IconName, IconName),
tip: &'static str,
(on, set): (bool, OnFlag),
) -> ToggleButton {
let item = ToggleItem::new(key)
.icon(if on { icons.0 } else { icons.1 })
.tooltip(tip);
ToggleButton::new((id.clone(), key), item, on)
.size(ControlSize::Sm)
.on_toggle(move |to, window, cx| {
log::info!("{owner}: {key} {}", if to { "on" } else { "off" });
set(to, window, cx)
})
}
/// Where a screen recording stands.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Recording {
@@ -177,17 +197,7 @@ impl RenderOnce for ScreenRecorderControls {
icons: (IconName, IconName),
tip: &'static str,
set: Option<(bool, OnFlag)>| {
set.map(|(on, set)| {
let item = ToggleItem::new(key)
.icon(if on { icons.0 } else { icons.1 })
.tooltip(tip);
ToggleButton::new((id.clone(), key), item, on)
.size(ControlSize::Sm)
.on_toggle(move |to, window, cx| {
log::info!("screen recorder: {key} {}", if to { "on" } else { "off" });
set(to, window, cx)
})
})
set.map(|set| device_toggle("screen recorder", &id, key, icons, tip, set))
};
let devices = self.mic.is_some() || self.camera.is_some();
div()