|
|
@@ -17,21 +17,51 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
For commercial licensing, please contact support@quantumnous.com
|
|
|
*/
|
|
|
|
|
|
-import React from 'react';
|
|
|
-import { Tag, Space, Spin } from '@douyinfe/semi-ui';
|
|
|
+import React, { useState, useEffect, useRef } from 'react';
|
|
|
+import { Tag, Space, Skeleton } from '@douyinfe/semi-ui';
|
|
|
import { renderQuota } from '../../../helpers';
|
|
|
import CompactModeToggle from '../../common/ui/CompactModeToggle';
|
|
|
|
|
|
const LogsActions = ({
|
|
|
stat,
|
|
|
loadingStat,
|
|
|
+ showStat,
|
|
|
compactMode,
|
|
|
setCompactMode,
|
|
|
t,
|
|
|
}) => {
|
|
|
+ const [showSkeleton, setShowSkeleton] = useState(loadingStat);
|
|
|
+ const needSkeleton = !showStat || showSkeleton;
|
|
|
+ const loadingStartRef = useRef(Date.now());
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (loadingStat) {
|
|
|
+ loadingStartRef.current = Date.now();
|
|
|
+ setShowSkeleton(true);
|
|
|
+ } else {
|
|
|
+ const elapsed = Date.now() - loadingStartRef.current;
|
|
|
+ const remaining = Math.max(0, 500 - elapsed);
|
|
|
+ if (remaining === 0) {
|
|
|
+ setShowSkeleton(false);
|
|
|
+ } else {
|
|
|
+ const timer = setTimeout(() => setShowSkeleton(false), remaining);
|
|
|
+ return () => clearTimeout(timer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, [loadingStat]);
|
|
|
+
|
|
|
+ // Skeleton placeholder layout (three tag-size blocks)
|
|
|
+ const placeholder = (
|
|
|
+ <Space>
|
|
|
+ <Skeleton.Title style={{ width: 108, height: 26, borderRadius: 6 }} />
|
|
|
+ <Skeleton.Title style={{ width: 65, height: 26, borderRadius: 6 }} />
|
|
|
+ <Skeleton.Title style={{ width: 64, height: 26, borderRadius: 6 }} />
|
|
|
+ </Space>
|
|
|
+ );
|
|
|
+
|
|
|
return (
|
|
|
- <Spin spinning={loadingStat}>
|
|
|
- <div className="flex flex-col md:flex-row justify-between items-start md:items-center gap-2 w-full">
|
|
|
+ <div className="flex flex-col md:flex-row justify-between items-start md:items-center gap-2 w-full">
|
|
|
+ <Skeleton loading={needSkeleton} active placeholder={placeholder}>
|
|
|
<Space>
|
|
|
<Tag
|
|
|
color='blue'
|
|
|
@@ -68,14 +98,14 @@ const LogsActions = ({
|
|
|
TPM: {stat.tpm}
|
|
|
</Tag>
|
|
|
</Space>
|
|
|
+ </Skeleton>
|
|
|
|
|
|
- <CompactModeToggle
|
|
|
- compactMode={compactMode}
|
|
|
- setCompactMode={setCompactMode}
|
|
|
- t={t}
|
|
|
- />
|
|
|
- </div>
|
|
|
- </Spin>
|
|
|
+ <CompactModeToggle
|
|
|
+ compactMode={compactMode}
|
|
|
+ setCompactMode={setCompactMode}
|
|
|
+ t={t}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
);
|
|
|
};
|
|
|
|