From 9da060ac32533d817b2877b271b0a5320cb49bc1 Mon Sep 17 00:00:00 2001 From: xfy Date: Thu, 4 Jun 2026 15:11:08 +0800 Subject: [PATCH] refactor: extract sleep_ms to utils/time.rs, deduplicate in hooks and skeletons --- src/components/skeletons/delayed_skeleton.rs | 17 +---------------- src/hooks/delayed_loading.rs | 17 +---------------- src/main.rs | 1 + src/utils/mod.rs | 2 ++ src/utils/text.rs | 1 + src/utils/time.rs | 15 +++++++++++++++ 6 files changed, 21 insertions(+), 32 deletions(-) create mode 100644 src/utils/mod.rs create mode 100644 src/utils/text.rs create mode 100644 src/utils/time.rs diff --git a/src/components/skeletons/delayed_skeleton.rs b/src/components/skeletons/delayed_skeleton.rs index 8d184b9..003883e 100644 --- a/src/components/skeletons/delayed_skeleton.rs +++ b/src/components/skeletons/delayed_skeleton.rs @@ -1,25 +1,10 @@ use dioxus::prelude::*; +use crate::utils::time::sleep_ms; /// 骨架屏 pulse 动画延迟(毫秒) /// 加载时间低于此值时骨架屏只显示静态灰色块,避免 pulse 动画一闪而过 const SKELETON_PULSE_DELAY_MS: u32 = 200; -#[cfg(target_arch = "wasm32")] -async fn sleep_ms(ms: u32) { - use wasm_bindgen::JsCast; - let js_code = format!("new Promise(r => setTimeout(r, {}))", ms); - if let Ok(promise_val) = js_sys::eval(&js_code) { - if let Ok(promise) = promise_val.dyn_into::() { - let _ = wasm_bindgen_futures::JsFuture::from(promise).await; - } - } -} - -#[cfg(not(target_arch = "wasm32"))] -async fn sleep_ms(ms: u32) { - tokio::time::sleep(std::time::Duration::from_millis(ms as u64)).await; -} - /// 延迟 pulse 动画的骨架屏包装组件 /// /// 骨架屏区域**立即显示**(灰色静态占位块),避免空白闪烁。 diff --git a/src/hooks/delayed_loading.rs b/src/hooks/delayed_loading.rs index 691f9ed..7852b5e 100644 --- a/src/hooks/delayed_loading.rs +++ b/src/hooks/delayed_loading.rs @@ -1,24 +1,9 @@ use dioxus::prelude::*; +use crate::utils::time::sleep_ms; /// 骨架屏最小显示延迟(毫秒)。加载时间低于此值时不会显示骨架屏,避免闪烁。 pub const MIN_SKELETON_DELAY_MS: u32 = 200; -#[cfg(target_arch = "wasm32")] -async fn sleep_ms(ms: u32) { - use wasm_bindgen::JsCast; - let js_code = format!("new Promise(r => setTimeout(r, {}))", ms); - if let Ok(promise_val) = js_sys::eval(&js_code) { - if let Ok(promise) = promise_val.dyn_into::() { - let _ = wasm_bindgen_futures::JsFuture::from(promise).await; - } - } -} - -#[cfg(not(target_arch = "wasm32"))] -async fn sleep_ms(ms: u32) { - tokio::time::sleep(std::time::Duration::from_millis(ms as u64)).await; -} - /// 延迟加载状态 Hook。 /// /// 当 `is_loading` 返回 true 时,延迟 `MIN_SKELETON_DELAY_MS` 毫秒后才返回 true; diff --git a/src/main.rs b/src/main.rs index 0e058b4..8bf8c98 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod pages; mod router; mod tasks; mod theme; +mod utils; fn main() { #[cfg(feature = "server")] diff --git a/src/utils/mod.rs b/src/utils/mod.rs new file mode 100644 index 0000000..c3578c1 --- /dev/null +++ b/src/utils/mod.rs @@ -0,0 +1,2 @@ +pub mod time; +pub mod text; diff --git a/src/utils/text.rs b/src/utils/text.rs new file mode 100644 index 0000000..34ca8be --- /dev/null +++ b/src/utils/text.rs @@ -0,0 +1 @@ +// Placeholder for text utilities (will be created in a later task) diff --git a/src/utils/time.rs b/src/utils/time.rs new file mode 100644 index 0000000..e84cef9 --- /dev/null +++ b/src/utils/time.rs @@ -0,0 +1,15 @@ +#[cfg(target_arch = "wasm32")] +pub async fn sleep_ms(ms: u32) { + use wasm_bindgen::JsCast; + let js_code = format!("new Promise(r => setTimeout(r, {}))", ms); + if let Ok(promise_val) = js_sys::eval(&js_code) { + if let Ok(promise) = promise_val.dyn_into::() { + let _ = wasm_bindgen_futures::JsFuture::from(promise).await; + } + } +} + +#[cfg(not(target_arch = "wasm32"))] +pub async fn sleep_ms(ms: u32) { + tokio::time::sleep(std::time::Duration::from_millis(ms as u64)).await; +}