fix: home card save

This commit is contained in:
Slinetrac
2025-10-21 14:46:39 +08:00
parent 6d93e21bc7
commit bafe2ae164
2 changed files with 58 additions and 9 deletions

View File

@@ -36,6 +36,7 @@
- 启用 TUN 前等待服务就绪 - 启用 TUN 前等待服务就绪
- 卸载 TUN 时会先关闭 - 卸载 TUN 时会先关闭
- 优化应用启动页 - 优化应用启动页
- 优化首页当前节点对MATCH规则的支持
### 🐞 修复问题 ### 🐞 修复问题
@@ -63,6 +64,8 @@
- 修复规则配置项在不同配置文件间全局共享导致切换被重置的问题 - 修复规则配置项在不同配置文件间全局共享导致切换被重置的问题
- 修复 Linux Wayland 下部分 GPU 可能出现的 UI 渲染问题 - 修复 Linux Wayland 下部分 GPU 可能出现的 UI 渲染问题
- 修复自动更新使版本回退的问题 - 修复自动更新使版本回退的问题
- 修复首页自定义卡片在切换轻量模式时失效
- 修复悬浮跳转导航失效
## v2.4.2 ## v2.4.2

View File

@@ -80,6 +80,12 @@ interface HomeSettingsDialogProps {
onSave: (cards: HomeCardsSettings) => void; onSave: (cards: HomeCardsSettings) => void;
} }
const serializeCardFlags = (cards: HomeCardsSettings) =>
Object.keys(cards)
.sort()
.map((key) => `${key}:${cards[key] ? 1 : 0}`)
.join("|");
// 首页设置对话框组件 // 首页设置对话框组件
const HomeSettingsDialog = ({ const HomeSettingsDialog = ({
open, open,
@@ -209,6 +215,10 @@ const HomePage = () => {
// 设置弹窗的状态 // 设置弹窗的状态
const [settingsOpen, setSettingsOpen] = useState(false); const [settingsOpen, setSettingsOpen] = useState(false);
const [localHomeCards, setLocalHomeCards] = useState<{
value: HomeCardsSettings;
baseSignature: string;
} | null>(null);
// 卡片显示状态 // 卡片显示状态
const defaultCards = useMemo<HomeCardsSettings>( const defaultCards = useMemo<HomeCardsSettings>(
@@ -227,9 +237,29 @@ const HomePage = () => {
[], [],
); );
const [homeCards, setHomeCards] = useState<HomeCardsSettings>(() => { const vergeHomeCards = useMemo<HomeCardsSettings | null>(
return (verge?.home_cards as HomeCardsSettings) || defaultCards; () => (verge?.home_cards as HomeCardsSettings | undefined) ?? null,
}); [verge],
);
const remoteHomeCards = useMemo<HomeCardsSettings>(
() => vergeHomeCards ?? defaultCards,
[defaultCards, vergeHomeCards],
);
const remoteSignature = useMemo(
() => serializeCardFlags(remoteHomeCards),
[remoteHomeCards],
);
const pendingLocalCards = useMemo<HomeCardsSettings | null>(() => {
if (!localHomeCards) return null;
return localHomeCards.baseSignature === remoteSignature
? localHomeCards.value
: null;
}, [localHomeCards, remoteSignature]);
const effectiveHomeCards = pendingLocalCards ?? remoteHomeCards;
// 文档链接函数 // 文档链接函数
const toGithubDoc = useLockFn(() => { const toGithubDoc = useLockFn(() => {
@@ -243,7 +273,7 @@ const HomePage = () => {
const renderCard = useCallback( const renderCard = useCallback(
(cardKey: string, component: React.ReactNode, size: number = 6) => { (cardKey: string, component: React.ReactNode, size: number = 6) => {
if (!homeCards[cardKey]) return null; if (!effectiveHomeCards[cardKey]) return null;
return ( return (
<Grid size={size} key={cardKey}> <Grid size={size} key={cardKey}>
@@ -251,7 +281,7 @@ const HomePage = () => {
</Grid> </Grid>
); );
}, },
[homeCards], [effectiveHomeCards],
); );
const criticalCards = useMemo( const criticalCards = useMemo(
@@ -270,9 +300,21 @@ const HomePage = () => {
// 新增保存设置时用requestIdleCallback/setTimeout // 新增保存设置时用requestIdleCallback/setTimeout
const handleSaveSettings = (newCards: HomeCardsSettings) => { const handleSaveSettings = (newCards: HomeCardsSettings) => {
if (window.requestIdleCallback) { if (window.requestIdleCallback) {
window.requestIdleCallback(() => setHomeCards(newCards)); window.requestIdleCallback(() =>
setLocalHomeCards({
value: newCards,
baseSignature: remoteSignature,
}),
);
} else { } else {
setTimeout(() => setHomeCards(newCards), 0); setTimeout(
() =>
setLocalHomeCards({
value: newCards,
baseSignature: remoteSignature,
}),
0,
);
} }
}; };
@@ -316,7 +358,10 @@ const HomePage = () => {
], ],
[t, renderCard], [t, renderCard],
); );
const dialogKey = useMemo(
() => `${serializeCardFlags(effectiveHomeCards)}:${settingsOpen ? 1 : 0}`,
[effectiveHomeCards, settingsOpen],
);
return ( return (
<BasePage <BasePage
title={t("Label-Home")} title={t("Label-Home")}
@@ -353,9 +398,10 @@ const HomePage = () => {
{/* 首页设置弹窗 */} {/* 首页设置弹窗 */}
<HomeSettingsDialog <HomeSettingsDialog
key={dialogKey}
open={settingsOpen} open={settingsOpen}
onClose={() => setSettingsOpen(false)} onClose={() => setSettingsOpen(false)}
homeCards={homeCards} homeCards={effectiveHomeCards}
onSave={handleSaveSettings} onSave={handleSaveSettings}
/> />
</BasePage> </BasePage>