✨ feat(HeaderBar): ensure skeleton shows ≥500 ms and waits for real status data
The header’s skeleton screen now remains visible for at least 500 ms and only disappears after `/api/status` has successfully populated `StatusContext`. Changes include: • Added `loadingStartRef` to record the mount time. • Reworked loading effect to compute the remaining delay based on the elapsed time and the presence of real status data. • Removed the previous fixed‐timer logic, preventing premature content rendering and improving perceived loading consistency across pages.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import React, { useContext, useEffect, useState } from 'react';
|
import React, { useContext, useEffect, useState, useRef } from 'react';
|
||||||
import { Link, useNavigate, useLocation } from 'react-router-dom';
|
import { Link, useNavigate, useLocation } from 'react-router-dom';
|
||||||
import { UserContext } from '../../context/User/index.js';
|
import { UserContext } from '../../context/User/index.js';
|
||||||
import { useSetTheme, useTheme } from '../../context/Theme/index.js';
|
import { useSetTheme, useTheme } from '../../context/Theme/index.js';
|
||||||
@@ -47,6 +47,7 @@ const HeaderBar = ({ onMobileMenuToggle, drawerOpen }) => {
|
|||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const [noticeVisible, setNoticeVisible] = useState(false);
|
const [noticeVisible, setNoticeVisible] = useState(false);
|
||||||
const [unreadCount, setUnreadCount] = useState(0);
|
const [unreadCount, setUnreadCount] = useState(0);
|
||||||
|
const loadingStartRef = useRef(Date.now());
|
||||||
|
|
||||||
const systemName = getSystemName();
|
const systemName = getSystemName();
|
||||||
const logo = getLogo();
|
const logo = getLogo();
|
||||||
@@ -196,11 +197,15 @@ const HeaderBar = ({ onMobileMenuToggle, drawerOpen }) => {
|
|||||||
}, [i18n]);
|
}, [i18n]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const timer = setTimeout(() => {
|
if (statusState?.status !== undefined) {
|
||||||
setIsLoading(false);
|
const elapsed = Date.now() - loadingStartRef.current;
|
||||||
}, 500);
|
const remaining = Math.max(0, 500 - elapsed);
|
||||||
return () => clearTimeout(timer);
|
const timer = setTimeout(() => {
|
||||||
}, []);
|
setIsLoading(false);
|
||||||
|
}, remaining);
|
||||||
|
return () => clearTimeout(timer);
|
||||||
|
}
|
||||||
|
}, [statusState?.status]);
|
||||||
|
|
||||||
const handleLanguageChange = (lang) => {
|
const handleLanguageChange = (lang) => {
|
||||||
i18n.changeLanguage(lang);
|
i18n.changeLanguage(lang);
|
||||||
|
|||||||
Reference in New Issue
Block a user