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." } } } } } } }