From e80ee0cad1e79383e9365d8f59ff20bb2333a16e Mon Sep 17 00:00:00 2001 From: hzm <934585316@qq.com> Date: Mon, 16 Mar 2026 13:27:21 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"fix:=20=E4=BF=AE=E5=A4=8D=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=96=B9=E6=B3=95"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit ab9e8a5072d2fa012a0a56e1ebd2d58b1b4f169b. --- app/components/PcFundTable.jsx | 33 +++++++++++++------- app/page.jsx | 57 +++++++++++++++++++++++++++++----- 2 files changed, 71 insertions(+), 19 deletions(-) diff --git a/app/components/PcFundTable.jsx b/app/components/PcFundTable.jsx index ae36876..66abcf0 100644 --- a/app/components/PcFundTable.jsx +++ b/app/components/PcFundTable.jsx @@ -1007,31 +1007,40 @@ export default function PcFundTable({ --row-bg: var(--bg); background-color: var(--row-bg) !important; } - - /* 斑马纹行背景(非 hover 状态) */ .table-row-scroll:nth-child(even), .table-row-scroll.row-even { background-color: var(--table-row-alt-bg) !important; } + .table-row-scroll:hover { + --row-bg: var(--table-row-hover-bg); + background-color: var(--row-bg) !important; + } - /* Pinned cells 继承所在行的背景(非 hover 状态) */ + /* Pinned cells inherit from parent row */ .table-row-scroll .pinned-cell { background-color: var(--row-bg) !important; } .table-row-scroll:nth-child(even) .pinned-cell, - .table-row-scroll.row-even .pinned-cell, + .table-row-scroll.row-even .pinned-cell { + background-color: var(--table-row-alt-bg) !important; + } + .table-row-scroll:hover .pinned-cell { + background-color: var(--table-row-hover-bg) !important; + } + .table-row-scroll:nth-child(even) { + background-color: var(--table-row-alt-bg); + } + .table-row-scroll:hover { + --row-bg: var(--table-row-hover-bg); + } + + /* Pinned cells in even rows */ .row-even .pinned-cell { background-color: var(--table-row-alt-bg) !important; } - /* Hover 状态优先级最高,覆盖斑马纹和 pinned 背景 */ - .table-row-scroll:hover, - .table-row-scroll.row-even:hover { - --row-bg: var(--table-row-hover-bg); - background-color: var(--table-row-hover-bg) !important; - } - .table-row-scroll:hover .pinned-cell, - .table-row-scroll.row-even:hover .pinned-cell { + /* Pinned cells on hover */ + .table-row-scroll:hover .pinned-cell { background-color: var(--table-row-hover-bg) !important; } diff --git a/app/page.jsx b/app/page.jsx index d45a5e4..d0e25ae 100644 --- a/app/page.jsx +++ b/app/page.jsx @@ -3109,6 +3109,25 @@ export default function HomePage() { if (nextFunds.length) { const codes = Array.from(new Set(nextFunds.map((f) => f.code))); if (codes.length) await refreshAll(codes); + // 刷新完成后,强制同步本地localStorage 的 funds 数据到云端 + const currentUserId = userIdRef.current || user?.id; + if (currentUserId) { + try { + const latestFunds = JSON.parse(localStorage.getItem('funds') || '[]'); + const localSig = getFundCodesSignature(latestFunds, ['gztime']); + const cloudSig = getFundCodesSignature(Array.isArray(cloudData.funds) ? cloudData.funds : [], ['gztime']); + if (localSig !== cloudSig) { + await syncUserConfig( + currentUserId, + false, + { funds: Array.isArray(latestFunds) ? latestFunds : [] }, + true + ); + } + } catch (e) { + console.error('刷新后强制同步 funds 到云端失败', e); + } + } } const payload = collectLocalPayload(); @@ -3121,10 +3140,9 @@ export default function HomePage() { const fetchCloudConfig = async (userId, checkConflict = false) => { if (!userId) return; try { - // 一次查询同时拿到 meta 与 data,方便两种模式复用 const { data: meta, error: metaError } = await supabase .from('user_configs') - .select('id, data, updated_at') + .select(`id, updated_at${checkConflict ? ', data' : ''}`) .eq('user_id', userId) .maybeSingle(); @@ -3138,19 +3156,44 @@ export default function HomePage() { setCloudConfigModal({ open: true, userId, type: 'empty' }); return; } - - // 冲突检查模式:使用 meta.data 弹出冲突确认弹窗 if (checkConflict) { setCloudConfigModal({ open: true, userId, type: 'conflict', cloudData: meta.data }); return; } - // 非冲突检查模式:直接复用上方查询到的 meta 数据,覆盖本地 - if (meta.data && isPlainObject(meta.data) && Object.keys(meta.data).length > 0) { - await applyCloudConfig(meta.data, meta.updated_at); + const localUpdatedAt = window.localStorage.getItem('localUpdatedAt'); + if (localUpdatedAt && meta.updated_at && new Date(meta.updated_at) < new Date(localUpdatedAt)) { return; } + const { data, error } = await supabase + .from('user_configs') + .select('id, data, updated_at') + .eq('user_id', userId) + .maybeSingle(); + + if (error) throw error; + + if (data?.data && isPlainObject(data.data) && Object.keys(data.data).length > 0) { + const localPayload = collectLocalPayload(); + const localComparable = getComparablePayload(localPayload); + const cloudComparable = getComparablePayload(data.data); + + if (localComparable !== cloudComparable) { + // 如果数据不一致 + if (checkConflict) { + // 只有明确要求检查冲突时才提示(例如刚登录时) + setCloudConfigModal({ open: true, userId, type: 'conflict', cloudData: data.data }); + return; + } + // 否则直接覆盖本地(例如已登录状态下的刷新) + await applyCloudConfig(data.data, data.updated_at); + return; + } + + await applyCloudConfig(data.data, data.updated_at); + return; + } setCloudConfigModal({ open: true, userId, type: 'empty' }); } catch (e) { console.error('获取云端配置失败', e);