use std::collections::HashMap; use maud::{html, Markup, PreEscaped}; use peach_network::{network, network::AccessPoint}; use crate::{templates, utils::theme, AP_IFACE, WLAN_IFACE}; // 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(ap) { Ok(Some(state)) => state, _ => "Interface unavailable".to_string(), }; let wlan_ssid = match network::ssid(wlan) { Ok(Some(ssid)) => ssid, _ => "Not connected".to_string(), }; let network_list = match network::all_networks(wlan) { Ok(networks) => networks, Err(_) => HashMap::new(), }; (ap_state, wlan_ssid, network_list) } 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() -> PreEscaped { let (ap_state, wlan_ssid, network_list) = get_network_state_data(AP_IFACE, WLAN_IFACE); let list_template = 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 network_list.is_empty() { li class="list-item light-bg" { "No saved or available networks found." } } @else { @for (ssid, ap) in network_list { 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)) } } } } } } } }; let body = templates::nav::build_template(list_template, "WiFi Networks", Some("/settings/network")); let theme = theme::get_theme(); templates::base::build_template(body, theme) }