summaryrefslogtreecommitdiffstats
path: root/src/components/timeago.rs
blob: 54dcb452861ed9337a8d63576cf1d8ad2da26f1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#[render::component]
pub fn TimeAgo<'a>(
    since: chrono::DateTime<chrono::offset::FixedOffset>,
    lang: &'a crate::Translator,
) {
    let since_str = since.to_rfc3339();

    let duration = chrono::offset::Utc::now().signed_duration_since(since);

    let (key, args) = {
        let weeks = duration.num_weeks();
        if weeks > 52 {
            let years = ((weeks as f32) / 52.18).floor() as u32;
            (
                "timeago_years",
                Some(fluent::fluent_args!["years" => years]),
            )
        } else if weeks > 5 {
            let months = (f32::from(weeks as i8) / 4.35).floor() as u8;
            (
                "timeago_months",
                Some(fluent::fluent_args!["months" => months]),
            )
        } else if weeks > 0 {
            (
                "timeago_weeks",
                Some(fluent::fluent_args!["weeks" => weeks]),
            )
        } else {
            let days = duration.num_days();
            if days > 0 {
                ("timeago_days", Some(fluent::fluent_args!["days" => days]))
            } else {
                let hours = duration.num_hours();
                if hours > 0 {
                    (
                        "timeago_hours",
                        Some(fluent::fluent_args!["hours" => hours]),
                    )
                } else {
                    let minutes = duration.num_minutes();
                    if minutes > 0 {
                        (
                            "timeago_minutes",
                            Some(fluent::fluent_args!["minutes" => minutes]),
                        )
                    } else {
                        let seconds = duration.num_seconds();

                        if seconds > 0 {
                            (
                                "timeago_seconds",
                                Some(fluent::fluent_args!["seconds" => seconds]),
                            )
                        } else if seconds < 0 {
                            ("timeago_future", None)
                        } else {
                            ("timeago_now", None)
                        }
                    }
                }
            }
        }
    };
    let text = lang.tr(key, args.as_ref()).into_owned();

    render::rsx! {
        <span title={since_str}>{text}</span>
    }
}