diff --git a/src/pages/admin/write.rs b/src/pages/admin/write.rs index 401954b..6f5243f 100644 --- a/src/pages/admin/write.rs +++ b/src/pages/admin/write.rs @@ -35,13 +35,22 @@ fn write_editor(post_id: Option) -> Element { let mut error = use_signal(|| None::); let mut success = use_signal(|| false); let mut editor_content_set = use_signal(|| false); + let mut has_backfilled = use_signal(|| false); + let mut load_error = use_signal(|| None::); // 编辑模式:加载文章数据 let post_res = use_resource(move || async move { if let Some(id) = post_id { match get_post_by_id(id).await { - Ok(SinglePostResponse { post }) => post, - Err(_) => None, + Ok(SinglePostResponse { post: Some(post) }) => Some(post), + Ok(SinglePostResponse { post: None }) => { + load_error.set(Some("文章不存在".to_string())); + None + } + Err(e) => { + load_error.set(Some(format!("加载失败: {}", e))); + None + } } } else { None @@ -50,19 +59,18 @@ fn write_editor(post_id: Option) -> Element { // 数据回填 effect use_effect(move || { - if !is_edit { + if !is_edit || has_backfilled() { return; } if let Some(Some(post)) = post_res.read().as_ref() { - if title().is_empty() { - title.set(post.title.clone()); - summary.set(post.summary.clone().unwrap_or_default()); - slug.set(post.slug.clone()); - tags.set(post.tags.join(", ")); - cover_image.set(post.cover_image.clone().unwrap_or_default()); - status.set(post.status.as_str().to_string()); - content.set(post.content_md.clone()); - } + has_backfilled.set(true); + title.set(post.title.clone()); + summary.set(post.summary.clone().unwrap_or_default()); + slug.set(post.slug.clone()); + tags.set(post.tags.join(", ")); + cover_image.set(post.cover_image.clone().unwrap_or_default()); + status.set(post.status.as_str().to_string()); + content.set(post.content_md.clone()); } }); @@ -245,10 +253,6 @@ fn write_editor(post_id: Option) -> Element { Ok(CreatePostResponse { success: true, .. }) => { saving.set(false); success.set(true); - #[cfg(target_arch = "wasm32")] - { - let _ = js_sys::eval("new Promise(r => setTimeout(r, 800))"); - } let _ = dioxus::router::navigator().push(Route::Posts {}); } Ok(CreatePostResponse { success: false, message, .. }) => { @@ -278,10 +282,6 @@ fn write_editor(post_id: Option) -> Element { Ok(CreatePostResponse { success: true, .. }) => { saving.set(false); success.set(true); - #[cfg(target_arch = "wasm32")] - { - let _ = js_sys::eval("new Promise(r => setTimeout(r, 800))"); - } let _ = dioxus::router::navigator().push(Route::Admin {}); } Ok(CreatePostResponse { success: false, message, .. }) => { @@ -367,6 +367,12 @@ fn write_editor(post_id: Option) -> Element { id: "tiptap-editor", } + if let Some(err) = load_error() { + div { class: "px-4 py-3 bg-red-50 dark:bg-red-900/20 text-red-600 dark:text-red-400 rounded-xl text-sm border border-red-100 dark:border-red-900/30", + "{err}" + } + } + if let Some(err) = error() { div { class: "px-4 py-3 bg-red-50 dark:bg-red-900/20 text-red-600 dark:text-red-400 rounded-xl text-sm border border-red-100 dark:border-red-900/30", "{err}"