feat: 选择的分组记录在本地

This commit is contained in:
hzm
2026-03-02 20:45:44 +08:00
parent 0504b9ae06
commit d6d64f1897
3 changed files with 30 additions and 6 deletions

View File

@@ -37,7 +37,7 @@ const MOBILE_NON_FROZEN_COLUMN_IDS = [
const MOBILE_COLUMN_HEADERS = {
latestNav: '最新净值',
estimateNav: '估算净值',
yesterdayChangePercent: '昨日涨跌幅',
yesterdayChangePercent: '昨/今日涨跌幅',
estimateChangePercent: '估值涨跌幅',
todayProfit: '当日收益',
holdingProfit: '持有收益',
@@ -455,7 +455,7 @@ export default function MobileFundTable({
},
{
accessorKey: 'yesterdayChangePercent',
header: '昨日涨跌幅',
header: '昨/今日涨跌幅',
cell: (info) => {
const original = info.row.original || {};
const value = original.yesterdayChangeValue;
@@ -480,13 +480,14 @@ export default function MobileFundTable({
const value = original.estimateChangeValue;
const isMuted = original.estimateChangeMuted;
const time = original.estimateTime ?? '-';
const displayTime = typeof time === 'string' && time.length > 5 ? time.slice(5) : time;
const cls = isMuted ? 'muted' : value > 0 ? 'up' : value < 0 ? 'down' : '';
return (
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-end', gap: 0 }}>
<span className={cls} style={{ fontWeight: 700 }}>
{info.getValue() ?? '—'}
</span>
<span className="muted" style={{ fontSize: '10px' }}>{time}</span>
<span className="muted" style={{ fontSize: '10px' }}>{displayTime}</span>
</div>
);
},

View File

@@ -39,7 +39,7 @@ const NON_FROZEN_COLUMN_IDS = [
const COLUMN_HEADERS = {
latestNav: '最新净值',
estimateNav: '估算净值',
yesterdayChangePercent: '昨日涨跌幅',
yesterdayChangePercent: '昨/今日涨跌幅',
estimateChangePercent: '估值涨跌幅',
holdingAmount: '持仓金额',
todayProfit: '当日收益',
@@ -103,7 +103,7 @@ function SortableRow({ row, children, isTableDragging, disabled }) {
* code?: string; // 基金代码(可选,只用于展示在名称下方)
* latestNav: string|number; // 最新净值
* estimateNav: string|number; // 估算净值
* yesterdayChangePercent: string|number; // 昨日涨跌幅
* yesterdayChangePercent: string|number; // 昨/今日涨跌幅
* estimateChangePercent: string|number; // 估值涨跌幅
* holdingAmount: string|number; // 持仓金额
* todayProfit: string|number; // 当日收益
@@ -452,7 +452,7 @@ export default function PcFundTable({
},
{
accessorKey: 'yesterdayChangePercent',
header: '昨日涨跌幅',
header: '昨/今日涨跌幅',
size: 135,
minSize: 100,
cell: (info) => {

View File

@@ -343,6 +343,7 @@ export default function HomePage() {
const [favorites, setFavorites] = useState(new Set());
const [groups, setGroups] = useState([]); // [{ id, name, codes: [] }]
const [currentTab, setCurrentTab] = useState('all');
const hasLocalTabInitRef = useRef(false);
const [groupModalOpen, setGroupModalOpen] = useState(false);
const [groupManageOpen, setGroupManageOpen] = useState(false);
const [addFundToGroupOpen, setAddFundToGroupOpen] = useState(false);
@@ -1971,6 +1972,17 @@ export default function HomePage() {
if (Array.isArray(savedGroups)) {
setGroups(savedGroups);
}
// 读取用户上次选择的分组(仅本地存储,不同步云端)
const savedTab = localStorage.getItem('currentTab');
if (
savedTab === 'all' ||
savedTab === 'fav' ||
(savedTab && Array.isArray(savedGroups) && savedGroups.some((g) => g?.id === savedTab))
) {
setCurrentTab(savedTab);
} else if (savedTab) {
setCurrentTab('all');
}
// 加载持仓数据
const savedHoldings = JSON.parse(localStorage.getItem('holdings') || '{}');
if (isPlainObject(savedHoldings)) {
@@ -1993,11 +2005,22 @@ export default function HomePage() {
setTheme(savedTheme);
}
} catch { }
if (!cancelled) {
hasLocalTabInitRef.current = true;
}
};
init();
return () => { cancelled = true; };
}, [isSupabaseConfigured]);
// 记录用户当前选择的分组(仅本地存储,不同步云端)
useEffect(() => {
if (!hasLocalTabInitRef.current) return;
try {
localStorage.setItem('currentTab', currentTab);
} catch { }
}, [currentTab]);
// 主题同步到 document 并持久化
useEffect(() => {
document.documentElement.setAttribute('data-theme', theme);