yggdrasil/pages/admin/settings/
upload_section.rs1use leptos::prelude::*;
4
5use super::kit::{use_section, SettingRow, SettingsCard};
6use super::SettingsSection;
7use crate::api::error::ApiError;
8use crate::api::settings::{get_upload_settings, update_upload_settings};
9use crate::components::ui::{SegmentedControl, SegmentedItem, SegmentedKind, SegmentedSize};
10use crate::models::settings::UploadSettings;
11
12async fn save(d: UploadSettings) -> Result<UploadSettings, ApiError> {
13 update_upload_settings(d.concurrency).await
14}
15
16#[component]
18pub fn UploadSection() -> impl IntoView {
19 let st = use_section(SettingsSection::Upload, get_upload_settings, save);
20 let items = Signal::stored(
21 (1..=8)
22 .map(|n| SegmentedItem::new(n, n.to_string()))
23 .collect::<Vec<_>>(),
24 );
25 view! {
26 <SettingsCard
27 section=SettingsSection::Upload
28 description="素材上传弹窗同时上传的张数。"
29 ready=st.ready()
30 load_failed=st.load_failed()
31 failed=st.failed()
32 >
33 <SettingRow
34 label="并发数"
35 hint="弹窗按并发数自动拉开张间间隔,聚合速率始终与上传限流对齐,不会触发 429。"
36 >
37 <SegmentedControl
38 items=items
39 value=st.field(|d| d.concurrency)
40 on_change=move |n| st.edit(|d| d.concurrency = n)
41 aria_label="上传并发数"
42 kind=SegmentedKind::Radio
43 size=SegmentedSize::Sm
44 class="settings-segmented-square"
45 />
46 </SettingRow>
47 </SettingsCard>
48 }
49}