Skip to main content

yggdrasil/pages/admin/settings/
upload_section.rs

1//! 上传分区:素材上传弹窗的并发数。
2
3use 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/// 上传分区组件。
17#[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}