import { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { cn, getBackgroundImage, getStaticImage } from "@/lib/utils"; import { usePuzzleStore } from "@/store/puzzleStore"; import { getPuzzlePieceLayout } from "@/config/puzzleLayout"; import { getPuzzlePieceData } from "@/config/puzzleData"; import { Image } from "@/components"; export interface PuzzleSystemProps { /** 是否可见 */ visible: boolean; /** 关闭回调 */ onClose: () => void; /** 故居名称,如 'chenyun' */ residence: string; } /** * 拼图系统组件 * - 全屏弹窗,显示拼图碎片 * - 4x4网格布局(16块碎片) * - 已解锁显示正常图片,未解锁显示遮罩 * - 点击碎片可跳转到对应页面 */ const PuzzleSystem = ({ visible, onClose, residence }: PuzzleSystemProps) => { const navigate = useNavigate(); const { moduleName } = useParams<{ moduleName: string }>(); const { isPuzzleUnlocked, getPuzzleCollectProgress } = usePuzzleStore(); const [selectedPiece, setSelectedPiece] = useState(null); // 当弹窗关闭时重置选中状态 useEffect(() => { if (!visible) { setSelectedPiece(null); } }, [visible]); if (!visible) return null; // 背景图片 const backgroundImage = getStaticImage("puzzle/底图"); // 处理碎片点击 const handlePieceClick = (pieceId: number) => { const isUnlocked = isPuzzleUnlocked(residence, pieceId); if (isUnlocked) { // 显示选中效果,更新详情框 setSelectedPiece(pieceId); } else { // 未解锁的碎片,可以显示提示或不做任何操作 // 暂时不做处理,或者可以添加提示 } }; // 处理前往按钮点击 const handleGoToPage = () => { if (moduleName && selectedPiece) { // console.log(residence, selectedPiece, moduleName); // const route = getPuzzleRoute(residence, selectedPiece, moduleName); // console.log(route); const route = selectedPieceData?.route; if (route) { navigate(`/${moduleName}/${residence}/${route}`); onClose(); } } }; // 获取当前选中碎片的数据 const selectedPieceData = selectedPiece ? getPuzzlePieceData(residence, selectedPiece) : null; // 生成16块碎片(1-16) const pieces = Array.from({ length: 16 }, (_, i) => i + 1); // 获取收集进度 const collectProgress = getPuzzleCollectProgress(residence); return (
{ // 点击背景关闭 if (e.target === e.currentTarget) { onClose(); } }} > {/* 背景图片 */}
{/* 关闭按钮 */} 关闭 {/* 收集进度 */}
陈云故居碎片 碎片装饰
{/* 收集进度 */} {collectProgress.toFixed(2) == "1.00" ? "已集齐" : `收集进度${collectProgress.toFixed(2)}%`}
{/* 完整拼图底图 - 作为背景显示所有碎片拼好的样子 */}
{/* 拼图容器 - 使用绝对定位,根据配置放置每个碎片 */}
{pieces.map((pieceId) => { const isUnlocked = isPuzzleUnlocked(residence, pieceId); const layout = getPuzzlePieceLayout(residence, pieceId); // 碎片图片路径 const pieceImage = getStaticImage( `puzzle/${residence}/${pieceId}` ); return (
handlePieceClick(pieceId)} >
{/* 碎片图片 - 始终显示,未解锁的用CSS变黑 */} {`碎片 {/* 选中效果遮罩 - 只对已解锁的碎片显示 */} {/* {isSelected && isUnlocked && (
)} */}
); })}
{selectedPieceData && (
{/* 标题 */} {selectedPieceData && (
{/* 空格换行 */} {selectedPieceData.title .split(" ") .map((word: string, index: number) => (
{word} {index < selectedPieceData.title.split(" ").length - 1 && " "}
))}
)} {/* 对应页面图片 */}
{selectedPieceData.title}
{/* 前往按钮 */} {selectedPieceData && ( 前往按钮 )}
)}
); }; export default PuzzleSystem;