}
}
fn count(n: usize) -> String {
match n {
1 => tr("1 point."),
n => tr(&format!("{n} points.")),
}
}
fn fit_opts() -> JsValue {
obj(&[
("padding", Array::of2(&40.into(), &40.into()).into()),
("maxZoom", 16.into()),
])
}
fn describe(p: &Person) -> String {
let Some(d) = p.last() else {
return tr("no position yet");
};
let l = &d.last;
let mut parts = vec![ago(l.ts)];
if p.devices.len() > 1 {
parts.push(d.name.clone());
}
match (p.precision_m, l.acc) {
(0, Some(acc)) => parts.push(format!("±{acc:.0} m")),
(0, None) => {}
(m @ ..1000, _) => parts.push(tr(&format!("approximate, {m} m"))),
(m, _) => parts.push(tr(&format!("approximate, {} km", m / 1000))),
}
if let Some(speed) = l.speed {
parts.push(format!("{:.0} km/h", speed * 3.6));
}
if let Some(b) = l.battery {
parts.push(tr(&format!("battery {b}%")));
}
parts.join(" · ")
}