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 index;
|
||||
pub mod not_found;
|
||||
pub mod search;
|
||||
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