fix(w7): always show the Recent Rooms card, with an empty state

The card was hidden entirely when there was no history, so on a fresh
build it appeared to be missing. Always render it (with a "No recent
rooms yet" hint when empty), mirroring the Friends card, so the feature
is discoverable before the first join. Drops the has_recents gating in
the home layout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 15:08:46 -04:00
co-authored by Claude Opus 4.8
parent cb936cdcbd
commit ffc2d6223d
+16 -18
View File
@@ -1396,13 +1396,10 @@ fn connect_card(state: &AppState) -> Element<'_, AppMessage> {
} }
/// The "Recent rooms" card (W7 P5): a one-click rejoin list, in its own card so a /// The "Recent rooms" card (W7 P5): a one-click rejoin list, in its own card so a
/// growing history never reflows the Connect card's Create/Join controls. Returns /// growing history never reflows the Connect card's Create/Join controls. Always
/// an empty element when there are no recents, so the home screen can omit it /// shown (with an empty-state hint when there's no history yet), mirroring the
/// entirely on a fresh install. Mirrors `friends_panel`'s self-contained styling. /// Friends card so the feature is discoverable on a fresh install.
fn recents_card(state: &AppState) -> Element<'_, AppMessage> { fn recents_card(state: &AppState) -> Element<'_, AppMessage> {
if state.config.recents.is_empty() {
return column![].into();
}
let pal = state.config.theme.palette(); let pal = state.config.theme.palette();
let color_crust = pal.crust; let color_crust = pal.crust;
let color_mantle = pal.mantle; let color_mantle = pal.mantle;
@@ -1443,6 +1440,13 @@ fn recents_card(state: &AppState) -> Element<'_, AppMessage> {
.map(|d| d.as_secs()) .map(|d| d.as_secs())
.unwrap_or(0); .unwrap_or(0);
let mut rows = column![].spacing(6).width(iced::Length::Fill); let mut rows = column![].spacing(6).width(iced::Length::Fill);
if state.config.recents.is_empty() {
rows = rows.push(
text("No recent rooms yet — they'll appear here after you join one.")
.size(12)
.color(color_subtext),
);
}
for r in &state.config.recents { for r in &state.config.recents {
let label = { let label = {
let n = crate::sanitize::sanitize_name(&r.name); let n = crate::sanitize::sanitize_name(&r.name);
@@ -2302,24 +2306,18 @@ fn view(state: &AppState) -> Element<'_, AppMessage> {
// The Recent-rooms card lives in the LEFT column under the Connect card // The Recent-rooms card lives in the LEFT column under the Connect card
// (both are about getting into a room), so it has its own card and a // (both are about getting into a room), so it has its own card and a
// growing history can't reflow the Create/Join controls. Friends stays on // growing history can't reflow the Create/Join controls. Friends stays on
// the right. Recents is omitted entirely (no stray gap) when empty. // the right. Always shown (empty-state hint when no history) for parity
// with the Friends card and so the feature is discoverable.
let body = responsive(move |size| { let body = responsive(move |size| {
let has_recents = !state.config.recents.is_empty();
let cards: Element<AppMessage> = if size.width < 900.0 { let cards: Element<AppMessage> = if size.width < 900.0 {
let mut col = column![connect_card(state)] column![connect_card(state), recents_card(state), friends_panel(state)]
.spacing(20) .spacing(20)
.align_x(iced::alignment::Horizontal::Center); .align_x(iced::alignment::Horizontal::Center)
if has_recents { .into()
col = col.push(recents_card(state));
}
col.push(friends_panel(state)).into()
} else { } else {
let mut left = column![connect_card(state)] let left = column![connect_card(state), recents_card(state)]
.spacing(20) .spacing(20)
.align_x(iced::alignment::Horizontal::Center); .align_x(iced::alignment::Horizontal::Center);
if has_recents {
left = left.push(recents_card(state));
}
row![left, friends_panel(state)] row![left, friends_panel(state)]
.spacing(20) .spacing(20)
.align_y(iced::alignment::Vertical::Top) .align_y(iced::alignment::Vertical::Top)