dialtone_yew 0.1.0

Dialtone Yew Webapp
use crate::app_types::AppSiteConnection;
use crate::components::common::site_name::*;
use crate::components::pages::account::AccountRoute;
use crate::components::pages::register::RegisterRoute;
use crate::MainRoute;
use bounce::use_atom;
use dialtone_common::utils::make_acct::make_acct;
use yew::prelude::*;
use yew_router::prelude::*;

#[derive(Properties, Debug, PartialEq)]
pub struct MainLayoutProps {
    #[prop_or_default]
    pub children: Children,
}

#[function_component(MainLayout)]
pub fn main_layout(props: &MainLayoutProps) -> Html {
    let logo_svg = html! {
    <svg
            width="133.26295mm"
            height="94.757332mm"
            viewBox="0 0 133.26295 94.757332"
            version="1.1"
            id="svg8"
            class="dt-logo">
        <defs
                id="defs2" />
        <g
                id="layer1"
                transform="translate(-20.212842,-59.113652)">
            <rect
                    style="stroke-width:3.76499;stroke-linejoin:round;image-rendering:auto"
                    id="rect833"
                    width="129.49797"
                    height="90.99234"
                    x="22.095337"
                    y="60.996147"
                    ry="4.9131541"
                    class="logo-border" />
            <path
                    style="stroke-width:4.91396;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
                    d="M 33.871577,116.84568 76.98863,70.043132"
                    id="path839"
                    class="logo-color-action" />
            <path
                    style="stroke-width:7.30413;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
                    d="M 37.164318,140.93297 101.27819,71.392271"
                    id="path854"
                    class="logo-color-action" />
            <path
                    style="stroke-width:7.38753;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
                    d="M 64.569415,143.3627 129.39139,73.00204"
                    id="path856"
                    class="logo-color-primary" />
            <path
                    style="stroke-width:5.58259;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
                    d="M 90.885366,143.64697 140.05432,90.676453"
                    id="path858"
                    class="logo-color-primary" />
            <path
                    style="stroke-width:3.04679;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
                    d="m 116.90006,142.91526 26.55086,-29.21867"
                    id="path860"
                    class="logo-color-action" />
            <path
                    style="stroke-width:2.88811;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
                    d="M 31.313973,97.123117 57.070038,70.188029"
                    id="path862"
                    class="logo-color-primary" />
        </g>
    </svg>
    };
    let h = html! {
        <dt-main-layout>
            <div class="site_header_bar">
                <dt-site-name><SiteName short={false}/></dt-site-name>
                <dt-site-logo>{logo_svg}</dt-site-logo>
            </div>
            <div class="site_nav_bar">
                <div><Link<MainRoute> classes={classes!("in_page_action")} to={MainRoute::Home}>{"Home"}</Link<MainRoute>></div>
                <div><Link<MainRoute> classes={classes!("in_page_action")} to={MainRoute::About}>{"About"}</Link<MainRoute>></div>
                <div><Link<MainRoute> classes={classes!("in_page_action")} to={MainRoute::Themes}>{"Themes"}</Link<MainRoute>></div>
                <DtNavLogin/>
            </div>
            <dt-main-content>
                {props.children.clone()}
            </dt-main-content>
        </dt-main-layout>
    };
    h
}

#[function_component(DtNavLogin)]
fn site_login() -> Html {
    let user_name: UseStateHandle<Option<String>> = use_state_eq(|| None);
    let sc_atom = use_atom::<AppSiteConnection>();
    if let Some(n) = &sc_atom.0.user_name {
        user_name.set(Some(n.to_string()));
    } else {
        user_name.set(None);
    }
    match *user_name {
        Some(ref user_name) => {
            let acct = make_acct(user_name, sc_atom.0.host_name());
            html! {
                <>
                <div>{"("}<Link<AccountRoute> classes={classes!("in_page_action")} to={AccountRoute::Index{acct}}>{user_name}</Link<AccountRoute>>{")"}</div>
                <div><Link<MainRoute> classes={classes!("in_page_action")} to={MainRoute::Logout}>{"Logout"}</Link<MainRoute>></div>
                </>
            }
        }
        None => {
            html! {
                <>
                <div><Link<MainRoute> classes={classes!("in_page_action")} to={MainRoute::Login}>{"Login"}</Link<MainRoute>></div>
                <div><Link<RegisterRoute> classes={classes!("in_page_action")} to={RegisterRoute::Index}>{"Register"}</Link<RegisterRoute>></div>
                </>
            }
        }
    }
}