'use client'; import { useEffect, useState } from 'react'; import { AnimatePresence, motion, Reorder } from 'framer-motion'; import { createPortal } from 'react-dom'; import ConfirmModal from './ConfirmModal'; import { CloseIcon, DragIcon, ResetIcon, SettingsIcon } from './Icons'; /** * 移动端表格个性化设置弹框(底部抽屉) * @param {Object} props * @param {boolean} props.open - 是否打开 * @param {() => void} props.onClose - 关闭回调 * @param {Array<{id: string, header: string}>} props.columns - 非冻结列(id + 表头名称) * @param {Record} [props.columnVisibility] - 列显示状态映射(id => 是否显示) * @param {(newOrder: string[]) => void} props.onColumnReorder - 列顺序变更回调 * @param {(id: string, visible: boolean) => void} props.onToggleColumnVisibility - 列显示/隐藏切换回调 * @param {() => void} props.onResetColumnOrder - 重置列顺序回调 * @param {() => void} props.onResetColumnVisibility - 重置列显示/隐藏回调 * @param {boolean} [props.showFullFundName] - 是否展示完整基金名称 * @param {(show: boolean) => void} [props.onToggleShowFullFundName] - 切换是否展示完整基金名称回调 */ export default function MobileSettingModal({ open, onClose, columns = [], columnVisibility, onColumnReorder, onToggleColumnVisibility, onResetColumnOrder, onResetColumnVisibility, showFullFundName, onToggleShowFullFundName, }) { const [resetConfirmOpen, setResetConfirmOpen] = useState(false); useEffect(() => { if (!open) setResetConfirmOpen(false); }, [open]); useEffect(() => { if (open) { const prev = document.body.style.overflow; document.body.style.overflow = 'hidden'; return () => { document.body.style.overflow = prev; }; } }, [open]); const handleReorder = (newItems) => { const newOrder = newItems.map((item) => item.id); onColumnReorder?.(newOrder); }; const content = ( {open && ( e.stopPropagation()} >
个性化设置
{onToggleShowFullFundName && (
展示完整基金名称
)}

表头设置

拖拽调整列顺序

{(onResetColumnOrder || onResetColumnVisibility) && ( )}
{columns.length === 0 ? (
暂无可配置列
) : ( {columns.map((item, index) => (
{item.header} {onToggleColumnVisibility && ( )}
))}
)}
)} {resetConfirmOpen && ( { onResetColumnOrder?.(); onResetColumnVisibility?.(); setResetConfirmOpen(false); }} onCancel={() => setResetConfirmOpen(false)} confirmText="重置" /> )}
); if (typeof document === 'undefined') return null; return createPortal(content, document.body); }