357 lines
15 KiB
Rust
357 lines
15 KiB
Rust
|
//! # Rust Info Site Frontend
|
||
|
//!
|
||
|
//! Rendering functions for the site using [Dioxus](https://dioxuslabs.com/).
|
||
|
|
||
|
#![allow(non_snake_case)]
|
||
|
|
||
|
// use utils::{prop_structs::PoemDatabase, user_prefs::UserPrefs};
|
||
|
// use manganis;
|
||
|
|
||
|
pub mod components;
|
||
|
pub mod utils;
|
||
|
|
||
|
// Urls are relative to your Cargo.toml file
|
||
|
const _TAILWIND_URL: &str = manganis::mg!(file("public/tailwind.css"));
|
||
|
|
||
|
/// A module that handles the functions needed
|
||
|
/// to render the site.
|
||
|
pub mod info_app {
|
||
|
|
||
|
// import the prelude to get access to the `rsx!` macro and the `Scope` and `Element` types
|
||
|
pub use dioxus::prelude::*;
|
||
|
|
||
|
// use crate::components::void_buttons::*;
|
||
|
// use crate::components::void_content::*;
|
||
|
// use crate::components::void_footer::*;
|
||
|
use crate::components::basic_page::*;
|
||
|
use crate::components::home_page::*;
|
||
|
use crate::components::identity_button::*;
|
||
|
use crate::components::introduction_card::*;
|
||
|
use crate::components::page_button::*;
|
||
|
use crate::components::project_card::*;
|
||
|
use crate::components::title_card::*;
|
||
|
use crate::components::werefox_card::*;
|
||
|
use crate::utils::prop_structs::*;
|
||
|
// use crate::components::void_poem::*;
|
||
|
// use crate::components::void_title::*;
|
||
|
// use crate::utils::helpers;
|
||
|
// use crate::utils::user_prefs::*;
|
||
|
// use crate::{components::basic_page::*, utils::prop_structs::PageProps};
|
||
|
|
||
|
use dioxus_router::prelude::*;
|
||
|
// use dioxus_use_storage::use_local_storage;
|
||
|
|
||
|
#[derive(Routable, PartialEq, Clone)]
|
||
|
pub enum Route {
|
||
|
#[route("/")]
|
||
|
#[redirect("/:..segments", |segments: Vec<String>| Route::Home {})]
|
||
|
Home {},
|
||
|
#[route("/projects")]
|
||
|
Projects {},
|
||
|
#[route("/testimonials")]
|
||
|
Testimonials {},
|
||
|
#[route("/hrt")]
|
||
|
Hrt {},
|
||
|
#[route("/faq")]
|
||
|
Faq {},
|
||
|
#[route("/support")]
|
||
|
Support {},
|
||
|
}
|
||
|
pub fn DioxusApp() -> Element {
|
||
|
rsx! { Router::<Route> {} }
|
||
|
}
|
||
|
|
||
|
// #[cfg(target_family = "wasm")]
|
||
|
// fn PageNotFound() -> Element {
|
||
|
// rsx! {
|
||
|
// p { "That page doesn't exist, sorry!" }
|
||
|
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
#[component]
|
||
|
/// Renders the app and returns the rendered Element.
|
||
|
pub fn Home() -> Element {
|
||
|
let identity_list = [
|
||
|
(
|
||
|
"29",
|
||
|
ImageProps {
|
||
|
src: "/emoji/18_plus.svg".to_string(),
|
||
|
alt: "Over 18 emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Transfemme",
|
||
|
ImageProps {
|
||
|
src: "/emoji/female_symbol.svg".to_string(),
|
||
|
alt: "Female symbol emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"She/It",
|
||
|
ImageProps {
|
||
|
src: "/emoji/speech_bubble_left.svg".to_string(),
|
||
|
alt: "A speech bubble emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Pansexual",
|
||
|
ImageProps {
|
||
|
src: "/emoji/pansexual_flag.svg".to_string(),
|
||
|
alt: "Pansexual flag emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Lesbian",
|
||
|
ImageProps {
|
||
|
src: "/emoji/lesbian_flag.svg".to_string(),
|
||
|
alt: "Lesbian flag emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Dragon",
|
||
|
ImageProps {
|
||
|
src: "/emoji/:alicehappy:.png".to_string(),
|
||
|
alt: "Alice happy emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
];
|
||
|
let project_list = [
|
||
|
(
|
||
|
"Stuff I Do!",
|
||
|
Route::Projects {},
|
||
|
ImageProps {
|
||
|
src: "/emoji/crt_prompt.svg".to_string(),
|
||
|
alt: "CRT prompt emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"See Testimonials!",
|
||
|
Route::Testimonials {},
|
||
|
ImageProps {
|
||
|
src: "/emoji/awoo.svg".to_string(),
|
||
|
alt: "Awoo emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"HRT Tracker!",
|
||
|
Route::Hrt {},
|
||
|
ImageProps {
|
||
|
src: "/emoji/trans_heart.png".to_string(),
|
||
|
alt: "Transgender heart emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"FAQ",
|
||
|
Route::Faq {},
|
||
|
ImageProps {
|
||
|
src: "/emoji/red_question_mark.svg".to_string(),
|
||
|
alt: "Red question mark emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Support Me?",
|
||
|
Route::Support {},
|
||
|
ImageProps {
|
||
|
src: "/emoji/green_money.svg".to_string(),
|
||
|
alt: "Green money emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
];
|
||
|
rsx! {
|
||
|
HomePage { page_title: "About a Werefox", card_title: "Hi! I'm Alice Werefox!",
|
||
|
WerefoxCard { card_title: "Basic Info".to_string(), title_emoji: None,
|
||
|
div { class: "grid xl:grid-rows-1 xl:grid-cols-6 sm:grid-rows-2 sm:grid-cols-3 grid-rows-9 grid-cols-1 sm:gap-2 gap-0",
|
||
|
for e in identity_list {
|
||
|
IdentityButton { button_text: e.0, image_props: e.1 }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
WerefoxCard { card_title: "Welcome to my little info site!", title_emoji: None, IntroductionCard {} }
|
||
|
WerefoxCard { card_title: "Neat Pages!", title_emoji: None,
|
||
|
div { class: "flex flex-col space-y-4",
|
||
|
for e in project_list {
|
||
|
PageButton { button_text: e.0, button_route: e.1, image_props: e.2 }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[component]
|
||
|
pub fn Projects() -> Element {
|
||
|
let project_list = [
|
||
|
(
|
||
|
"Streaming",
|
||
|
"I stream regularly! Sometimes randomizers, sometimes just a chill time with a fun game.",
|
||
|
"https://twitch.tv/alice_werefox",
|
||
|
ImageProps {
|
||
|
src: "/emoji/twitch-logo.png".to_string(),
|
||
|
alt: "Twitch logo".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Poetry",
|
||
|
"Sometimes, I write poetry. It's not always the happiest, but I am proud of it. It would mean a lot to me if you took a look!",
|
||
|
"https://void.werefox.cafe",
|
||
|
ImageProps {
|
||
|
src: "/emoji/pen.svg".to_string(),
|
||
|
alt: "Pen emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Programming",
|
||
|
"Much like this site, sometimes I program things! Gotta at least try and put that Comp. Sci. degree to good use!",
|
||
|
"https://gitea.werefox.cafe/ada",
|
||
|
ImageProps {
|
||
|
src: "/emoji/laptop.svg".to_string(),
|
||
|
alt: "Laptop emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"Valentine's Day Letter",
|
||
|
"Here's a little treat I put together for Valentine's Day one year, and I decided to just keep it up all year. Feel free to take a look if you ever need a little pick-me-up.",
|
||
|
"https://letter.werefox.cafe",
|
||
|
ImageProps {
|
||
|
src: "/emoji/red_heart.svg".to_string(),
|
||
|
alt: "Red heart emoji".to_string(),
|
||
|
},
|
||
|
),
|
||
|
];
|
||
|
rsx! {
|
||
|
BasicPage { page_title: "Some stuff I do!",
|
||
|
div { class: "rounded-lg ring-2 ring-alice-werefox-grey dark:ring-alice-werefox-grey-darker bg-alice-werefox-grey-light dark:bg-alice-werefox-grey",
|
||
|
WerefoxCard { card_title: "Personal Projects",
|
||
|
for project in project_list {
|
||
|
ProjectCard { project_title: project.0, project_description: project.1, project_link: project.2, image_props: project.3 }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#[component]
|
||
|
pub fn Testimonials() -> Element {
|
||
|
rsx! { div {} }
|
||
|
}
|
||
|
|
||
|
#[component]
|
||
|
pub fn Hrt() -> Element {
|
||
|
rsx! { div {} }
|
||
|
}
|
||
|
|
||
|
#[component]
|
||
|
pub fn Faq() -> Element {
|
||
|
rsx! { div {} }
|
||
|
}
|
||
|
|
||
|
#[component]
|
||
|
pub fn Support() -> Element {
|
||
|
rsx! { div {} }
|
||
|
}
|
||
|
|
||
|
// Renders the app and returns the rendered Element.
|
||
|
// pub fn PoemListPage(props: VoidProps) -> Element {
|
||
|
// #[cfg(target_family = "wasm")]
|
||
|
// let poem_database = POEM_DATABASE
|
||
|
// .get()
|
||
|
// .expect("Poem database is not initialized")
|
||
|
// .clone();
|
||
|
// #[cfg(any(target_family = "unix", target_family = "windows"))]
|
||
|
// let poem_database = props.poem_database.clone();
|
||
|
// let user_prefs = props.user_prefs.clone();
|
||
|
// let (user_theme, user_font) = user_prefs.get_pref_classes(ThemedComponent::Page);
|
||
|
// rsx! {
|
||
|
// div { class: "{user_theme} {user_font}",
|
||
|
// PageBase {
|
||
|
// Title { title: "A Letter to the Void".to_string(), is_html: false, user_prefs: user_prefs.clone() }
|
||
|
// BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() }
|
||
|
// PoemList { poem_database: poem_database.clone(), user_prefs: user_prefs.clone() }
|
||
|
// BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() }
|
||
|
// Footer { theme: user_prefs.clone().get_theme(), font: user_prefs.get_font() }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// pub fn PoemPage(props: VoidProps) -> Element {
|
||
|
// #[cfg(target_family = "wasm")]
|
||
|
// let poem_database = POEM_DATABASE
|
||
|
// .get()
|
||
|
// .expect("Poem database is not initialized")
|
||
|
// .clone();
|
||
|
// #[cfg(any(target_family = "unix", target_family = "windows"))]
|
||
|
// let poem_database = props.poem_database.clone();
|
||
|
// let user_prefs = props.user_prefs.clone();
|
||
|
// let (user_theme, user_font) = user_prefs.get_pref_classes(ThemedComponent::Page);
|
||
|
// // #[cfg(any(target_family = "unix", target_family = "windows"))]
|
||
|
// let slug = props
|
||
|
// .slug
|
||
|
// .as_ref()
|
||
|
// .expect("A slug was given in the props.")
|
||
|
// .clone();
|
||
|
// // #[cfg(target_family = "wasm")]
|
||
|
// // let slug = String::from(
|
||
|
// // use_route()
|
||
|
// // .segment("slug")
|
||
|
// // .expect("No slug specified."),
|
||
|
// // );
|
||
|
// rsx! {
|
||
|
// div { class: "{user_theme} {user_font}",
|
||
|
// PageBase {
|
||
|
// BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() }
|
||
|
// GetPoem { slug: slug.clone(), poem_database: poem_database.clone(), user_prefs: user_prefs.clone() }
|
||
|
// ButtonGroup {
|
||
|
// NavigationButton { title: "Oldest".to_string(), slug: poem_database.get_oldest_entry(slug.clone()), user_prefs: user_prefs.clone() }
|
||
|
// NavigationButton { title: "Previous".to_string(), slug: poem_database.get_previous_entry(slug.clone()), user_prefs: user_prefs.clone() }
|
||
|
// NavigationButton { title: "Random".to_string(), slug: poem_database.get_random_entry(), user_prefs: user_prefs.clone() }
|
||
|
// NavigationButton { title: "Next".to_string(), slug: poem_database.get_next_entry(slug.clone()), user_prefs: user_prefs.clone() }
|
||
|
// NavigationButton { title: "Latest".to_string(), slug: poem_database.get_latest_entry(slug.clone()), user_prefs: user_prefs.clone() }
|
||
|
// }
|
||
|
// BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() }
|
||
|
// Footer { theme: user_prefs.clone().get_theme(), font: user_prefs.get_font() }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
// pub fn SettingsPage(props: UserPrefs) -> Element {
|
||
|
// let user_prefs = props.clone();
|
||
|
// let (user_theme, user_font) = user_prefs.get_pref_classes(ThemedComponent::Page);
|
||
|
// // Get rid of this and create a general card component with children.
|
||
|
// let (user_theme_card, user_font_card) = user_prefs.get_pref_classes(ThemedComponent::Card);
|
||
|
// rsx! {
|
||
|
// div { class: "{user_theme} {user_font}",
|
||
|
// PageBase {
|
||
|
// Title { title: "Settings".to_string(), is_html: false, user_prefs: user_prefs.clone() }
|
||
|
// BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.clone().get_font() }
|
||
|
// div { class: "p-4 flex flex-col space-y-4 mx-auto max-w-full justify-center",
|
||
|
// div { class: "p-4 flex flex-col space-y-4 text-xl text-center ring-4 {user_theme_card} {user_font_card}",
|
||
|
// p {
|
||
|
// "Theme"
|
||
|
// }
|
||
|
// ButtonGroup {
|
||
|
// NavigationButton { title: "Light".to_string(), slug: "/settings/?theme=light".to_string(), user_prefs: user_prefs.clone() }
|
||
|
// NavigationButton { title: "Dark".to_string(), slug: "/settings/?theme=dark".to_string(), user_prefs: user_prefs.clone() }
|
||
|
// NavigationButton { title: "Auto".to_string(), slug: "/settings/?theme=auto".to_string(), user_prefs: user_prefs.clone() }
|
||
|
// }
|
||
|
// }
|
||
|
// div { class: "p-4 flex flex-col space-y-4 text-xl text-center ring-4 {user_theme_card} {user_font_card}",
|
||
|
// p {
|
||
|
// "Font"
|
||
|
// }
|
||
|
// ButtonGroup {
|
||
|
// NavigationButton { title: "Nerd Font".to_string(), slug: "/settings/?font=nerd".to_string(), user_prefs: user_prefs.clone(), override_font: "font-nerd".to_string() }
|
||
|
// NavigationButton { title: "Open Dyslexic".to_string(), slug: "/settings/?font=open".to_string(), user_prefs: user_prefs.clone(), override_font: "font-open".to_string() }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// BackToHomePage { theme: user_prefs.clone().get_theme(), font: user_prefs.get_font() }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
// }
|
||
|
}
|