A couple things :3
parent
b3cf350d3f
commit
d2a905b67f
@ -0,0 +1,48 @@
|
|||||||
|
use crate::components::header::{Header, HeaderLink};
|
||||||
|
|
||||||
|
use maud::{html, Markup, PreEscaped, DOCTYPE};
|
||||||
|
|
||||||
|
pub async fn render() -> Markup {
|
||||||
|
html! {
|
||||||
|
(DOCTYPE)
|
||||||
|
title {"About | Voltpad"};
|
||||||
|
meta name="viewport" content="width=device-width, initial-scale=1.0";
|
||||||
|
style {(PreEscaped(
|
||||||
|
grass::include!("./css/index.scss")
|
||||||
|
))}
|
||||||
|
(
|
||||||
|
Header(vec![
|
||||||
|
HeaderLink {
|
||||||
|
name: "Home".to_string(),
|
||||||
|
path: "/".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
HeaderLink {
|
||||||
|
name: "Search".to_string(),
|
||||||
|
path: "/search".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
HeaderLink {
|
||||||
|
name: "History".to_string(),
|
||||||
|
path: "/history".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
HeaderLink {
|
||||||
|
name: "About".to_string(),
|
||||||
|
path: "/about".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
], "/about".to_string())
|
||||||
|
)
|
||||||
|
div .index-content {
|
||||||
|
h1 { "About Us" }
|
||||||
|
p {
|
||||||
|
"Voltpad is a custom-made Wattpad frontend, designed to avoid the problems of the official website and app while giving users (slightly more) privacy and a better overall experience."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,6 @@
|
|||||||
|
pub mod about;
|
||||||
pub mod history;
|
pub mod history;
|
||||||
pub mod index;
|
pub mod index;
|
||||||
pub mod not_found;
|
pub mod not_found;
|
||||||
|
pub mod search;
|
||||||
pub mod story;
|
pub mod story;
|
||||||
|
@ -0,0 +1,163 @@
|
|||||||
|
use axum::extract::Query;
|
||||||
|
use maud::{html, Markup, PreEscaped, DOCTYPE};
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
components::header::{Header, HeaderLink},
|
||||||
|
WATTPAD,
|
||||||
|
};
|
||||||
|
|
||||||
|
use wattpad::{SearchSort, SearchType};
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct SearchParams {
|
||||||
|
query: Option<String>,
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
search_type: Option<String>,
|
||||||
|
#[serde(rename = "sort")]
|
||||||
|
search_sort: Option<String>,
|
||||||
|
#[serde(rename = "page")]
|
||||||
|
page_number: Option<i64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if let Some(query) = params.query {
|
||||||
|
let search_type = params.search_type.unwrap_or("text".to_string());
|
||||||
|
let search_sort = params.search_sort.unwrap_or("hot".to_string());
|
||||||
|
} else {
|
||||||
|
|
||||||
|
} */
|
||||||
|
|
||||||
|
pub async fn render(Query(params): Query<SearchParams>) -> Markup {
|
||||||
|
let search_type = params.search_type.unwrap_or("text".to_string());
|
||||||
|
let search_sort = params.search_sort.unwrap_or("hot".to_string());
|
||||||
|
html! {
|
||||||
|
(DOCTYPE)
|
||||||
|
title {"Search | Voltpad"};
|
||||||
|
meta name="viewport" content="width=device-width, initial-scale=1.0";
|
||||||
|
style {(PreEscaped(
|
||||||
|
grass::include!("./css/index.scss")
|
||||||
|
))}
|
||||||
|
(
|
||||||
|
Header(vec![
|
||||||
|
HeaderLink {
|
||||||
|
name: "Home".to_string(),
|
||||||
|
path: "/".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
HeaderLink {
|
||||||
|
name: "Search".to_string(),
|
||||||
|
path: "/search".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
HeaderLink {
|
||||||
|
name: "History".to_string(),
|
||||||
|
path: "/history".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
HeaderLink {
|
||||||
|
name: "About".to_string(),
|
||||||
|
path: "/about".to_string(),
|
||||||
|
prefix: None,
|
||||||
|
postfix: None
|
||||||
|
},
|
||||||
|
], "/search".to_string())
|
||||||
|
)
|
||||||
|
div .index-content {
|
||||||
|
h1 { "Search" }
|
||||||
|
form method="GET" .search-form {
|
||||||
|
div {
|
||||||
|
input
|
||||||
|
#query
|
||||||
|
type="text"
|
||||||
|
name="query"
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder="Search Query"
|
||||||
|
value=[params.query.clone()];
|
||||||
|
div {
|
||||||
|
div {
|
||||||
|
input
|
||||||
|
#text
|
||||||
|
type="radio"
|
||||||
|
name="type"
|
||||||
|
value="text"
|
||||||
|
checked=[(search_type == "text").then_some(80)]; // IS 80 ENOUGH PROOF FOR YOU?
|
||||||
|
label for="text" { "Text search" }
|
||||||
|
}
|
||||||
|
div {
|
||||||
|
input
|
||||||
|
#tag
|
||||||
|
type="radio"
|
||||||
|
name="type"
|
||||||
|
value="tag"
|
||||||
|
checked=[(search_type == "tag").then_some(80)];
|
||||||
|
label for="tag" { "Tag search" }
|
||||||
|
}
|
||||||
|
div {
|
||||||
|
select #sort name="sort" {
|
||||||
|
option
|
||||||
|
value="hot"
|
||||||
|
selected=[(search_sort == "hot").then_some(80)] { "Hot" };
|
||||||
|
option
|
||||||
|
value="new"
|
||||||
|
selected=[(search_sort == "new").then_some(80)] { "New" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
input class="submit-search" type="submit" value="Submit";
|
||||||
|
}
|
||||||
|
|
||||||
|
@if let Some(query) = params.query.clone() {
|
||||||
|
({
|
||||||
|
let page_number = params.page_number.unwrap_or(0);
|
||||||
|
|
||||||
|
let enumified_search_type = match search_type.as_str() {
|
||||||
|
"text" => SearchType::Text,
|
||||||
|
"title" => SearchType::Title,
|
||||||
|
"tag" => SearchType::Tag,
|
||||||
|
_ => SearchType::Text
|
||||||
|
};
|
||||||
|
let enumified_search_sort = match search_sort.as_str() {
|
||||||
|
"hot" => SearchSort::Hot,
|
||||||
|
"new" => SearchSort::New,
|
||||||
|
_ => SearchSort::Hot
|
||||||
|
};
|
||||||
|
|
||||||
|
let search = WATTPAD.search(&query, enumified_search_type, enumified_search_sort, 30)
|
||||||
|
.await
|
||||||
|
.expect("Failed to create search");
|
||||||
|
|
||||||
|
let results = search.page(page_number)
|
||||||
|
.await
|
||||||
|
.expect("Failed to get search results");
|
||||||
|
|
||||||
|
html! {
|
||||||
|
div .story-list {
|
||||||
|
@for result in results.stories.clone() {
|
||||||
|
a .listed-story href=(format!("/story?id={}", result.id)) {
|
||||||
|
img src=(result.cover);
|
||||||
|
div {
|
||||||
|
h3 { (result.title) }
|
||||||
|
p { (PreEscaped(result.description.replace('\n', "<br/>"))) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
div .story-nav {
|
||||||
|
@if page_number > 0 {
|
||||||
|
a href=(format!("/search?query={}&type={}&sort={}&page={}", query, search_type, search_sort, page_number-1)) { "<" }
|
||||||
|
}
|
||||||
|
" | "
|
||||||
|
@if results.stories.clone().len() == 30 {
|
||||||
|
a href=(format!("/search?query={}&type={}&sort={}&page={}", query, search_type, search_sort, page_number+1)) { ">" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue