diff --git a/peach-web/src/routes/settings/network/list_aps.rs b/peach-web/src/routes/settings/network/list_aps.rs index e69de29..4eaeb37 100644 --- a/peach-web/src/routes/settings/network/list_aps.rs +++ b/peach-web/src/routes/settings/network/list_aps.rs @@ -0,0 +1,103 @@ +use std::collections::HashMap; + +use maud::{html, Markup, PreEscaped}; +use peach_network::{network, AccessPoint}; +use rouille::Request; + +use crate::{ + templates, + utils::{flash::FlashRequest, theme}, +}; + +// ROUTE: /settings/network/wifi + +/// Retrieve network state data required by the WiFi network list template. +fn get_network_state_data(ap: &str, wlan: &str) -> (String, String, HashMap) { + let ap_state = match network::state("ap0") { + Ok(Some(state)) => state, + Err(_) => "Interface unavailable".to_string(), + }; + + let wlan_ssid = match network::ssid("wlan0") { + Ok(Some(ssid)) => ssid, + Err(_) => "Not connected".to_string(), + }; + + let wlan_networks = match network::all_networks("wlan0") { + Ok(networks) => networks, + Err(_) => HashMap::new(), + }; + + (ap_state, wlan_ssid, wlan_networks) +} + +fn render_network_connected_elements(ssid: String) -> Markup { + let ap_detail_url = format!("/network/wifi?ssid={}", ssid); + + html! { + a class="list-item link primary-bg" href=(ap_detail_url) { + img id="netStatus" class="icon icon-active icon-medium list-icon" src="/icons/wifi.svg" alt="WiFi online"; + p class="list-text" { (ssid) } + label class="label-small list-label font-gray" for="netStatus" title="Status" { "Connected" } + } + } +} + +fn render_network_available_elements(ssid: String, ap_state: String) -> Markup { + let ap_detail_url = format!("/network/wifi?ssid={}", ssid); + + html! { + a class="list-item link light-bg" href=(ap_detail_url) { + img id="netStatus" class="icon icon-inactive icon-medium list-icon" src="/icons/wifi.svg" alt="WiFi offline"; + p class="list-text" { (ssid) } + label class="label-small list-label font-gray" for="netStatus" title="Status" { (ap_state) } + } + } +} + +fn render_network_unavailable_elements(ssid: String, ap_state: String) -> Markup { + let ap_detail_url = format!("/network/wifi?ssid={}", ssid); + + html! { + a class="list-item link" href=(ap_detail_url) { + img id="netStatus" class="icon icon-inactive icon-medium list-icon" src="/icons/wifi.svg" alt="WiFi offline"; + p class="list-text" { (ssid) } + label class="label-small list-label font-gray" for="netStatus" title="Status" { (ap_state) } + } + } +} + +/// WiFi network list template builder. +pub fn build_template(request: &Request) -> PreEscaped { + let (ap_state, wlan_ssid, wlan_networks) = get_network_state_data("ap0", "wlan0"); + + html! { + div class="card center" { + div class="center list-container" { + ul class="list" { + @if ap_state == "up" { + li class="list-item light-bg warning-border" { + "Enable WiFi client mode to view saved and available networks." + } + } @else if wlan_networks { + @for (ssid, ap) in wlan_networks { + li { + @if ssid == wlan_ssid { + (render_network_connected_elements(ssid)) + } @else if ap.state == "Available" { + (render_network_available_elements(ssid, ap.state)) + } @else { + (render_network_unavailable_elements(ssid, ap.state)) + } + } + } + } @else { + li class="list-item light-bg" { + "No saved or available networks found." + } + } + } + } + } + } +} diff --git a/peach-web/src/routes/settings/network/mod.rs b/peach-web/src/routes/settings/network/mod.rs index e9bf79e..ecba5d8 100644 --- a/peach-web/src/routes/settings/network/mod.rs +++ b/peach-web/src/routes/settings/network/mod.rs @@ -1,3 +1,4 @@ pub mod configure_dns; +pub mod list_aps; pub mod menu; pub mod modify_ap;