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

+9 -3
View File
@@ -104,14 +104,14 @@ impl MemberList {
}
}
/// The groups `members` fall in, online first, each by name; empty groups drop out.
/// The groups `members` fall in, online first, each by name whatever its case; empty groups drop out.
fn grouped(members: &[Member]) -> Vec<(&'static str, Vec<&Member>)> {
let group = |online: bool| {
let mut group: Vec<&Member> = members
.iter()
.filter(|member| (member.presence != Presence::Offline) == online)
.collect();
group.sort_by(|a, b| a.name.cmp(&b.name));
group.sort_by_key(|member| member.name.to_lowercase());
group
};
[("Online", group(true)), ("Offline", group(false))]
@@ -250,13 +250,19 @@ mod tests {
Member::new("d", "Dev", Presence::Offline),
Member::new("a", "Ana", Presence::Away),
Member::new("b", "Ben", Presence::Online),
Member::new("e", "bea", Presence::Online),
];
assert_eq!(
names(&members),
[
(
"Online",
vec!["Ana".to_string(), "Ben".into(), "Chloé".into()]
vec![
"Ana".to_string(),
"bea".into(),
"Ben".into(),
"Chloé".into()
]
),
("Offline", vec!["Dev".into()])
]