cloudflare_dns/tasks/
submit_task.rs1use iocraft::prelude::*;
3use std::sync::Arc;
4
5use crate::api::CloudflareClient;
6use crate::api::models::DnsRecord;
7use crate::ui::state::{AppState, AppView};
8use crate::utils::{extract_unique_ips, format_records};
9
10pub struct SubmitParams {
12 pub client: Arc<CloudflareClient>,
13 pub state: Arc<AppState>,
14 pub record_id: String,
15 pub record_type: String,
16 pub name: String,
17 pub content: String,
18 pub ttl: i64,
19 pub proxied: bool,
20 pub records_display: State<String>,
21 pub status: State<String>,
22 pub view: State<AppView>,
23 pub form_name: State<String>,
24 pub form_content: State<String>,
25 pub is_submitting: State<bool>,
26}
27
28pub async fn submit_task(mut params: SubmitParams) {
30 let is_update = !params.record_id.is_empty();
31 let rec = DnsRecord {
32 id: if is_update {
33 Some(params.record_id.clone())
34 } else {
35 None
36 },
37 record_type: params.record_type.clone(),
38 name: params.name.clone(),
39 content: params.content.clone(),
40 ttl: Some(params.ttl),
41 proxied: Some(params.proxied),
42 comment: None,
43 };
44
45 let result = if is_update {
46 params.client.update_dns_record(&rec).await
47 } else {
48 params.client.create_dns_record(&rec).await
49 };
50
51 match result {
52 Ok(_) => {
53 params.state.dns_cache.lock().unwrap().invalidate();
55
56 let action = if is_update { "Updated" } else { "Created" };
57 params.status.set(format!(
58 "{} {} for {}",
59 action, params.record_type, params.name
60 ));
61 params.view.set(AppView::List);
62 params.form_name.set("".to_string());
63 params.form_content.set("".to_string());
64 params.is_submitting.set(false);
65
66 if let Ok(f) = params.client.list_dns_records().await {
67 params.records_display.set(format_records(&f));
68 *params.state.existing_ips.lock().unwrap() = extract_unique_ips(&f);
69 *params.state.records.lock().unwrap() = f.clone();
70 params.state.dns_cache.lock().unwrap().set(f);
71 } else {
72 params.status.set(format!(
73 "{} {} for {}, but refresh failed — press R to reload",
74 action, params.record_type, params.name
75 ));
76 }
77 }
78 Err(e) => {
79 params.status.set(format!("Failed: {}", e));
80 params.is_submitting.set(false);
81 }
82 }
83}