diff --git a/web_frontend/src/filterlists.rs b/web_frontend/src/filterlists.rs index 5ff57d1..12a56fb 100644 --- a/web_frontend/src/filterlists.rs +++ b/web_frontend/src/filterlists.rs @@ -1,7 +1,8 @@ +use crate::{save_button, submit_banner, get_api_host}; use crate::save_button::BASE_BUTTON_CSS; use reqwasm::http::Request; - +use crate::filters::{AddFilterRequest,FilterGroup}; use serde::{Deserialize, Serialize}; use std::fmt::Debug; use wasm_bindgen_futures::spawn_local; @@ -10,6 +11,7 @@ use yew::prelude::*; use web_sys::HtmlInputElement; use yew::InputEvent; use yew::html::Scope; +use url::Url; #[derive(Serialize, Deserialize, PartialEq, Clone, Debug)] @@ -220,8 +222,31 @@ impl Component for SearchFilterList { }, SearchFilterMessage::Save => { if let Some(filter) = &self.selected_filter { - // todo: add logic to save the selected filter to the database using the API - // similar to the `AddFilterComponent` save logic + let parsed_url = match Url::parse(&filter.primary_view_url.clone().unwrap()) { + Ok(url) => url, + Err(err) => { + log::error!("Failed to parse URL: {}", err); + return false; + } + }; + let request_body: AddFilterRequest = AddFilterRequest::new(self.selected_filter.clone().unwrap().name, FilterGroup::Malware, parsed_url); + let request = Request::post(&format!("http://{}/filters", get_api_host())) + .header("Content-Type", "application/json") + .body(serde_json::to_string(&request_body).unwrap()); + spawn_local(async move { + match request.send().await { + Ok(response) => { + if response.ok() { + log::info!("Filter added successfully"); + } else { + log::error!("Failed to add filter: {:?}", response.status()); + } + } + Err(err) => { + log::error!("Request error: {:?}", err); + } + } + }) } self.is_open = false; }, @@ -255,7 +280,7 @@ impl Component for SearchFilterList { let filtered_filters: Vec<&FilterEntry> = self.filters.iter() - .filter(|filter| filter.name.contains(&self.filter_query)) + .filter(|filter| filter.name.to_lowercase().contains(&self.filter_query.to_lowercase())) .collect(); let total_pages = (filtered_filters.len() as f64 / self.results_per_page as f64).ceil() as usize; let start_index = (self.current_page - 1) * self.results_per_page; diff --git a/web_frontend/src/filters.rs b/web_frontend/src/filters.rs index bb3000c..67c1c3c 100644 --- a/web_frontend/src/filters.rs +++ b/web_frontend/src/filters.rs @@ -15,7 +15,7 @@ use yew::InputEvent; use url::Url; #[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)] -enum FilterGroup { +pub enum FilterGroup { Default, Regional, Ads, @@ -64,7 +64,7 @@ pub enum AddFilterMessage { #[serde_as] #[derive(Serialize)] -struct AddFilterRequest { +pub struct AddFilterRequest { enabled: bool, title: String, group: FilterGroup, @@ -72,6 +72,17 @@ struct AddFilterRequest { url: Url, } +impl AddFilterRequest { + pub fn new(title: String, group: FilterGroup, url: Url) -> Self { + Self { + enabled: true, + title, + group, + url, + } + } +} + pub struct AddFilterComponent { link: yew::html::Scope,