From cb14924de8a5eb92b8ee8a2dad1204a2d8b3cdd0 Mon Sep 17 00:00:00 2001 From: xfy Date: Mon, 22 Jun 2026 15:33:43 +0800 Subject: [PATCH] feat(write): add upload state signals for placeholder tracking --- src/pages/admin/write.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/pages/admin/write.rs b/src/pages/admin/write.rs index c2f8ce6..91ca43b 100644 --- a/src/pages/admin/write.rs +++ b/src/pages/admin/write.rs @@ -18,6 +18,21 @@ use crate::components::write_skeleton::WriteSkeleton; use crate::models::post::Post; use crate::router::Route; +/// 当前编辑器内进行中的上传计数(来自轮询 window.__tiptap_uploads.counts)。 +#[derive(Clone, Copy, Default)] +struct UploadsInFlight { + uploading: u32, + error: u32, +} + +/// 顶部堆叠的上传失败提示条目。 +#[derive(Clone, PartialEq)] +struct UploadErrorEntry { + id: String, + file_name: String, + message: String, +} + /// 新建文章页面组件。 /// /// 内部委托给 `write_editor`,以 `None` 表示新建模式。 @@ -68,6 +83,10 @@ fn write_editor(post_id: Option) -> Element { // 编辑模式:用于暂存从服务端加载的文章数据。 let mut edit_post = use_signal(|| None::); + // 上传状态:当前进行中计数(保存拦截)+ 顶部失败提示堆叠(用户手动关闭) + let mut uploads_in_flight = use_signal(UploadsInFlight::default); + let mut upload_errors: Signal> = use_signal(Vec::new); + // 编辑模式:文章数据加载完成后,将字段回填到表单信号。 use_effect(move || { if !is_edit || has_backfilled() {