fix(write): address review feedback - backfill race, load errors, nav delay
This commit is contained in:
parent
2ecdc09138
commit
4805f915c7
@ -35,13 +35,22 @@ fn write_editor(post_id: Option<i32>) -> Element {
|
|||||||
let mut error = use_signal(|| None::<String>);
|
let mut error = use_signal(|| None::<String>);
|
||||||
let mut success = use_signal(|| false);
|
let mut success = use_signal(|| false);
|
||||||
let mut editor_content_set = 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::<String>);
|
||||||
|
|
||||||
// 编辑模式:加载文章数据
|
// 编辑模式:加载文章数据
|
||||||
let post_res = use_resource(move || async move {
|
let post_res = use_resource(move || async move {
|
||||||
if let Some(id) = post_id {
|
if let Some(id) = post_id {
|
||||||
match get_post_by_id(id).await {
|
match get_post_by_id(id).await {
|
||||||
Ok(SinglePostResponse { post }) => post,
|
Ok(SinglePostResponse { post: Some(post) }) => Some(post),
|
||||||
Err(_) => None,
|
Ok(SinglePostResponse { post: None }) => {
|
||||||
|
load_error.set(Some("文章不存在".to_string()));
|
||||||
|
None
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
load_error.set(Some(format!("加载失败: {}", e)));
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@ -50,11 +59,11 @@ fn write_editor(post_id: Option<i32>) -> Element {
|
|||||||
|
|
||||||
// 数据回填 effect
|
// 数据回填 effect
|
||||||
use_effect(move || {
|
use_effect(move || {
|
||||||
if !is_edit {
|
if !is_edit || has_backfilled() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if let Some(Some(post)) = post_res.read().as_ref() {
|
if let Some(Some(post)) = post_res.read().as_ref() {
|
||||||
if title().is_empty() {
|
has_backfilled.set(true);
|
||||||
title.set(post.title.clone());
|
title.set(post.title.clone());
|
||||||
summary.set(post.summary.clone().unwrap_or_default());
|
summary.set(post.summary.clone().unwrap_or_default());
|
||||||
slug.set(post.slug.clone());
|
slug.set(post.slug.clone());
|
||||||
@ -63,7 +72,6 @@ fn write_editor(post_id: Option<i32>) -> Element {
|
|||||||
status.set(post.status.as_str().to_string());
|
status.set(post.status.as_str().to_string());
|
||||||
content.set(post.content_md.clone());
|
content.set(post.content_md.clone());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 初始化 Tiptap 编辑器
|
// 初始化 Tiptap 编辑器
|
||||||
@ -245,10 +253,6 @@ fn write_editor(post_id: Option<i32>) -> Element {
|
|||||||
Ok(CreatePostResponse { success: true, .. }) => {
|
Ok(CreatePostResponse { success: true, .. }) => {
|
||||||
saving.set(false);
|
saving.set(false);
|
||||||
success.set(true);
|
success.set(true);
|
||||||
#[cfg(target_arch = "wasm32")]
|
|
||||||
{
|
|
||||||
let _ = js_sys::eval("new Promise(r => setTimeout(r, 800))");
|
|
||||||
}
|
|
||||||
let _ = dioxus::router::navigator().push(Route::Posts {});
|
let _ = dioxus::router::navigator().push(Route::Posts {});
|
||||||
}
|
}
|
||||||
Ok(CreatePostResponse { success: false, message, .. }) => {
|
Ok(CreatePostResponse { success: false, message, .. }) => {
|
||||||
@ -278,10 +282,6 @@ fn write_editor(post_id: Option<i32>) -> Element {
|
|||||||
Ok(CreatePostResponse { success: true, .. }) => {
|
Ok(CreatePostResponse { success: true, .. }) => {
|
||||||
saving.set(false);
|
saving.set(false);
|
||||||
success.set(true);
|
success.set(true);
|
||||||
#[cfg(target_arch = "wasm32")]
|
|
||||||
{
|
|
||||||
let _ = js_sys::eval("new Promise(r => setTimeout(r, 800))");
|
|
||||||
}
|
|
||||||
let _ = dioxus::router::navigator().push(Route::Admin {});
|
let _ = dioxus::router::navigator().push(Route::Admin {});
|
||||||
}
|
}
|
||||||
Ok(CreatePostResponse { success: false, message, .. }) => {
|
Ok(CreatePostResponse { success: false, message, .. }) => {
|
||||||
@ -367,6 +367,12 @@ fn write_editor(post_id: Option<i32>) -> Element {
|
|||||||
id: "tiptap-editor",
|
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() {
|
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",
|
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}"
|
"{err}"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user