Show history source tab
This commit is contained in:
@@ -2,7 +2,7 @@ use std::time::SystemTime;
|
|||||||
|
|
||||||
use ely_browser_core::BrowserSnapshot;
|
use ely_browser_core::BrowserSnapshot;
|
||||||
use ely_design_system::colors;
|
use ely_design_system::colors;
|
||||||
use ely_domain::HistoryEntry;
|
use ely_domain::{ArchivedTab, BrowserTab, HistoryEntry};
|
||||||
use gpui::prelude::FluentBuilder;
|
use gpui::prelude::FluentBuilder;
|
||||||
use gpui::{
|
use gpui::{
|
||||||
AnyElement, Context, InteractiveElement, IntoElement, ParentElement, SharedString, Styled, div,
|
AnyElement, Context, InteractiveElement, IntoElement, ParentElement, SharedString, Styled, div,
|
||||||
@@ -245,18 +245,20 @@ fn render_history_list(snapshot: &BrowserSnapshot, cx: &mut Context<ElyShell>) -
|
|||||||
.iter()
|
.iter()
|
||||||
.rev()
|
.rev()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(index, entry)| render_history_row(index, entry, cx)),
|
.map(|(index, entry)| render_history_row(snapshot, index, entry, cx)),
|
||||||
)
|
)
|
||||||
.into_any_element()
|
.into_any_element()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_history_row(
|
fn render_history_row(
|
||||||
|
snapshot: &BrowserSnapshot,
|
||||||
index: usize,
|
index: usize,
|
||||||
entry: &HistoryEntry,
|
entry: &HistoryEntry,
|
||||||
cx: &mut Context<ElyShell>,
|
cx: &mut Context<ElyShell>,
|
||||||
) -> AnyElement {
|
) -> AnyElement {
|
||||||
let url = entry.url().clone();
|
let url = entry.url().clone();
|
||||||
let host = entry.url().host();
|
let host = entry.url().host();
|
||||||
|
let source_tab_label = history_source_tab_label(&snapshot.tabs, &snapshot.archived_tabs, entry);
|
||||||
|
|
||||||
div()
|
div()
|
||||||
.id(SharedString::from(format!("history-{index}")))
|
.id(SharedString::from(format!("history-{index}")))
|
||||||
@@ -300,7 +302,16 @@ fn render_history_row(
|
|||||||
div()
|
div()
|
||||||
.text_color(rgb(colors::MUTED_SOFT))
|
.text_color(rgb(colors::MUTED_SOFT))
|
||||||
.child(visited_at_label(entry.visited_at())),
|
.child(visited_at_label(entry.visited_at())),
|
||||||
),
|
)
|
||||||
|
.when_some(source_tab_label, |this, source_tab_label| {
|
||||||
|
this.child(div().text_color(rgb(colors::MUTED_SOFT)).child("-")).child(
|
||||||
|
div()
|
||||||
|
.max_w(px(180.0))
|
||||||
|
.truncate()
|
||||||
|
.text_color(rgb(colors::MUTED_SOFT))
|
||||||
|
.child(format!("Source: {source_tab_label}")),
|
||||||
|
)
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.child(
|
.child(
|
||||||
@@ -373,11 +384,31 @@ fn elapsed_label(value: u64, unit: &str) -> String {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn history_source_tab_label(
|
||||||
|
tabs: &[BrowserTab],
|
||||||
|
archived_tabs: &[ArchivedTab],
|
||||||
|
entry: &HistoryEntry,
|
||||||
|
) -> Option<String> {
|
||||||
|
tabs.iter()
|
||||||
|
.find(|tab| tab.id() == entry.source_tab_id())
|
||||||
|
.or_else(|| {
|
||||||
|
archived_tabs.iter().map(ArchivedTab::tab).find(|tab| tab.id() == entry.source_tab_id())
|
||||||
|
})
|
||||||
|
.map(|tab| tab.title().to_string())
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::time::{Duration, UNIX_EPOCH};
|
use std::{
|
||||||
|
error::Error,
|
||||||
|
time::{Duration, UNIX_EPOCH},
|
||||||
|
};
|
||||||
|
|
||||||
use super::visited_at_label_for;
|
use ely_domain::{
|
||||||
|
ArchiveSource, ArchivedTab, BrowserTab, HistoryEntry, ProfileId, SpaceId, TabId, UrlText,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::{history_source_tab_label, visited_at_label_for};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn visited_at_label_formats_recent_visit() {
|
fn visited_at_label_formats_recent_visit() {
|
||||||
@@ -395,4 +426,61 @@ mod tests {
|
|||||||
assert_eq!(visited_at_label_for(now - Duration::from_secs(345_600), now), "4 days ago");
|
assert_eq!(visited_at_label_for(now - Duration::from_secs(345_600), now), "4 days ago");
|
||||||
assert_eq!(visited_at_label_for(now - Duration::from_secs(691_200), now), "Earlier");
|
assert_eq!(visited_at_label_for(now - Duration::from_secs(691_200), now), "Earlier");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn history_source_tab_label_uses_open_tab_title() -> Result<(), Box<dyn Error>> {
|
||||||
|
let profile_id = ProfileId::new();
|
||||||
|
let space_id = SpaceId::new();
|
||||||
|
let tab_id = TabId::new();
|
||||||
|
let tab = BrowserTab::new(
|
||||||
|
tab_id,
|
||||||
|
space_id.clone(),
|
||||||
|
profile_id.clone(),
|
||||||
|
"Research Brief",
|
||||||
|
UrlText::parse("https://example.com/research")?,
|
||||||
|
);
|
||||||
|
let entry = HistoryEntry::new(
|
||||||
|
profile_id,
|
||||||
|
space_id,
|
||||||
|
tab.id().clone(),
|
||||||
|
"example.com",
|
||||||
|
UrlText::parse("https://example.com/research")?,
|
||||||
|
UNIX_EPOCH,
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
history_source_tab_label(&[tab], &[], &entry),
|
||||||
|
Some("Research Brief".to_string())
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn history_source_tab_label_uses_archived_tab_title() -> Result<(), Box<dyn Error>> {
|
||||||
|
let profile_id = ProfileId::new();
|
||||||
|
let space_id = SpaceId::new();
|
||||||
|
let tab_id = TabId::new();
|
||||||
|
let tab = BrowserTab::new(
|
||||||
|
tab_id,
|
||||||
|
space_id.clone(),
|
||||||
|
profile_id.clone(),
|
||||||
|
"Closed Research",
|
||||||
|
UrlText::parse("https://example.com/closed")?,
|
||||||
|
);
|
||||||
|
let entry = HistoryEntry::new(
|
||||||
|
profile_id,
|
||||||
|
space_id,
|
||||||
|
tab.id().clone(),
|
||||||
|
"example.com",
|
||||||
|
UrlText::parse("https://example.com/closed")?,
|
||||||
|
UNIX_EPOCH,
|
||||||
|
);
|
||||||
|
let archived_tab = ArchivedTab::new(tab, ArchiveSource::ManualClose);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
history_source_tab_label(&[], &[archived_tab], &entry),
|
||||||
|
Some("Closed Research".to_string())
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user