1pub fn format_duration(ms: u64) -> String {
5 if ms < 1000 {
6 format!("{}ms", ms)
7 } else if ms < 60000 {
8 format!("{:.1}s", ms as f64 / 1000.0)
9 } else {
10 let minutes = ms / 60000;
11 let seconds = (ms % 60000) / 1000;
12 format!("{}m {}s", minutes, seconds)
13 }
14}
15
16pub fn format_relative_time(timestamp: &str) -> String {
18 timestamp.to_string()
20}
21
22pub fn truncate(s: &str, max_len: usize) -> String {
24 if s.len() <= max_len {
25 s.to_string()
26 } else {
27 format!("{}...", &s[..max_len.saturating_sub(3)])
28 }
29}
30
31pub async fn copy_to_clipboard(text: &str) -> Result<(), String> {
33 let window = web_sys::window().ok_or("No window")?;
34 let navigator = window.navigator();
35 let clipboard = navigator.clipboard();
36
37 wasm_bindgen_futures::JsFuture::from(clipboard.write_text(text))
38 .await
39 .map_err(|_| "Failed to copy to clipboard")?;
40
41 Ok(())
42}