feat: 选择的分组记录在本地
This commit is contained in:
@@ -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>
|
||||
);
|
||||
},
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
23
app/page.jsx
23
app/page.jsx
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user