~vpzom/hitide

d405e70b780e1b8bc7e2014962624911b42b32ad — Colin Reeder 5 days ago 4eba40c
Add sorting options for community posts
5 files changed, 71 insertions(+), 2 deletions(-)

M res/lang/en.ftl
M res/lang/eo.ftl
M res/main.css
M src/main.rs
M src/routes/communities.rs
M res/lang/en.ftl => res/lang/en.ftl +3 -0
@@ 58,6 58,9 @@ reply = reply
reply_submit = Reply
reply_to = Reply to
score = { $score } likes
sort = Sort:
sort_hot = hot
sort_new = new
submit = Submit
submitted = Submitted
text_with_markdown = Text (markdown supported)

M res/lang/eo.ftl => res/lang/eo.ftl +3 -0
@@ 58,6 58,9 @@ reply = respondi
reply_submit = Respondi
reply_to = Respondo al
score = { $score } ŝatantoj
sort = Ordigi:
sort_hot = furora
sort_new = nova
submit = Sendi
submitted = Afiŝita
text_with_markdown = Teksto (markdown estas permesita)

M res/main.css => res/main.css +8 -0
@@ 62,6 62,14 @@ body {
	padding-left: 5px;
}

.sortOptions {
	margin-top: 1em;
}

.sortOptions > * {
	margin-right: .5em;
}

@media (max-width: 768px) {
	.communitySidebar {
		display: none; /* TODO still show this somewhere */

M src/main.rs => src/main.rs +26 -0
@@ 1,6 1,7 @@
#![allow(unused_braces)]

use crate::resp_types::RespLoginInfo;
use serde_derive::Deserialize;
use std::borrow::Cow;
use std::collections::HashMap;
use std::sync::Arc;


@@ 11,6 12,31 @@ mod resp_types;
mod routes;
mod util;

#[derive(Deserialize, PartialEq, Clone, Copy)]
#[serde(rename_all = "snake_case")]
pub enum SortType {
    Hot,
    New,
}

impl SortType {
    pub const VALUES: &'static [SortType] = &[SortType::Hot, SortType::New];

    pub fn as_str(&self) -> &'static str {
        match self {
            SortType::Hot => "hot",
            SortType::New => "new",
        }
    }

    pub fn lang_key(&self) -> &'static str {
        match self {
            SortType::Hot => "sort_hot",
            SortType::New => "sort_new",
        }
    }
}

pub type HttpClient = hyper::Client<hyper_tls::HttpsConnector<hyper::client::HttpConnector>>;

pub struct RouteContext {

M src/routes/communities.rs => src/routes/communities.rs +31 -2
@@ 93,6 93,18 @@ async fn page_community(
) -> Result<hyper::Response<hyper::Body>, crate::Error> {
    let (community_id,) = params;

    fn default_sort() -> crate::SortType {
        crate::SortType::Hot
    }

    #[derive(Deserialize)]
    struct Query {
        #[serde(default = "default_sort")]
        sort: crate::SortType,
    }

    let query: Query = serde_urlencoded::from_str(req.uri().query().unwrap_or(""))?;

    let lang = crate::get_lang_for_req(&req);
    let cookies = get_cookie_map_for_req(&req)?;



@@ 130,8 142,10 @@ async fn page_community(
        ctx.http_client
            .request(for_client(
                hyper::Request::get(format!(
                    "{}/api/unstable/communities/{}/posts",
                    ctx.backend_host, community_id
                    "{}/api/unstable/communities/{}/posts?sort={}",
                    ctx.backend_host,
                    community_id,
                    query.sort.as_str(),
                ))
                .body(Default::default())?,
                req.headers(),


@@ 215,6 229,21 @@ async fn page_community(
                }
                <p>{community_info.description.as_ref()}</p>
            </div>
            <div class={"sortOptions"}>
                <span>{lang.tr("sort", None)}</span>
                {
                    crate::SortType::VALUES.iter()
                        .map(|value| {
                            let name = lang.tr(value.lang_key(), None);
                            if query.sort == *value {
                                render::rsx! { <span>{name}</span> }
                            } else {
                                render::rsx! { <a href={format!("/communities/{}?sort={}", community_id, value.as_str())}>{name}</a> }
                            }
                        })
                        .collect::<Vec<_>>()
                }
            </div>
            {
                if posts.is_empty() {
                    Some(render::rsx! { <p>{lang.tr("nothing", None)}</p> })