"use client"; import { receiveRedPacketApi } from "@/api/promo"; import { useRouter } from "@/i18n/routing"; import { getToken } from "@/utils/Cookies"; import { Mask } from "antd-mobile"; import clsx from "clsx"; import { useTranslations } from "next-intl"; import Image from "next/image"; import { forwardRef, Fragment, memo, useEffect, useImperativeHandle, useRef, useState, } from "react"; import styles from "./redpacked.module.scss"; const randomX = (len: number) => { return Math.floor(Math.random() * len); }; const mockData = Array(500) .fill(0) .map((item) => { return { phone: `55****${(randomX(99) + "").padEnd(2, "0")}`, num: `${(Math.random() * 20).toFixed(2)}`, time: "11:00", }; }); function getRandom(min: number, max: number) { const floatRandom = Math.random(); const difference = max - min; // 介于 0 和差值之间的随机数 const random = Math.round(difference * floatRandom); return random + min; } /** * @description 描述 */ type DescProps = { onClose: () => void; }; const Desc = (props: DescProps) => { const { onClose } = props; const [activeTab, setActiveTab] = useState(0); const tabs = [{ text: "Vezes de evento participado" }, { text: "Consulta de registo levado" }]; return (
{"close"}
{tabs.map((item, index) => { return ( setActiveTab(index)} className={`flex h-[100%] items-center ${index === activeTab ? "bg-[#8b3500] text-[#5f2600]" : ""}`} > {item.text} ); })}
{/* 动态内容 */}

Tempo regressivo

Começa amanhã às 11:00

{!activeTab ? ( <> {"time"} {"time"} ) : ( <>

Registro persoal

Nome do jogo Coleta cumulativa Participação total
55****26 R$ 100.00 1

Lista dos vencedores

ID do papel Valor obtido Hora obtida
{mockData.map((item, index) => { return (
{item.phone} R$ {item.num} {item.time}
); })}
)}
  • ·Cada sessão de chuva de dinheiro é distribuída gratuitamente por R$100.000.
  • ·Valor máximo de queda em dinheiro: Cada sessão de chuva de dinheiro é distribuída gratuitamente.
  • ·Membros recarregados podem reivindicar gratuitamente.
  • ·O dinheiro recebido pode ser utilizado para jogar ou sacar diretamente.
  • ·Quanto for maior o nível de associação VIP, será maior o valor recebido.
); }; // 红包掉落动画像下雨 const FallAnimation1 = (props: any) => { const { onClose } = props; const fallContentRef = useRef(null); const isActive = useRef(true); const getRandom = (min: number, max: number) => { return Math.random() * (max - min) + min; }; const createMoneyElement = (xPos: number) => { if (!fallContentRef.current || !isActive.current) return; const money = document.createElement('div'); // 基础样式 money.style.cssText = ` position: fixed; left: ${xPos}px; top: -100px; width: 60px; height: 60px; pointer-events: none; `; // 创建图片 const img = document.createElement('img'); img.src = `/9f/money${Math.floor(Math.random() * 3) + 1}.png`; img.style.cssText = ` width: 100%; height: 100%; object-fit: contain; `; money.appendChild(img); fallContentRef.current.appendChild(money); // 使用 requestAnimationFrame 确保元素已添加到 DOM 后再添加动画 requestAnimationFrame(() => { const scale = getRandom(0.4, 1); const duration = getRandom(8, 12); const delay = getRandom(0, 5); money.style.cssText += ` transform: scale(${scale}); z-index: ${Math.floor(scale * 100)}; animation: ${styles.fall} ${duration}s linear infinite, ${styles.sway} ${duration/2}s ease-in-out infinite alternate; animation-delay: ${delay}s; `; }); // 当动画完成一次循环后,重新设置位置 setInterval(() => { if (isActive.current) { money.style.left = `${getRandom(0, window.innerWidth)}px`; } }, 12000); }; useEffect(() => { console.log('FallAnimation1 mounted'); // 调试日志 if (!fallContentRef.current) return; // 设置容器样式 fallContentRef.current.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100vh; z-index: 1000; pointer-events: none; overflow: hidden; background: transparent; `; // 分批创建元素 const totalElements = 300; const batchSize = 20; let created = 0; const createBatch = () => { if (!isActive.current) return; for (let i = 0; i < batchSize && created < totalElements; i++) { const xPos = getRandom(0, window.innerWidth); createMoneyElement(xPos); created++; } if (created < totalElements) { setTimeout(createBatch, 200); } }; createBatch(); return () => { console.log('FallAnimation1 unmounting'); // 调试日志 isActive.current = false; }; }, []); return (
{ e.stopPropagation(); onClose?.(); }} /> ); }; const HbyInfoDetail = (props: any) => { const { iconImg, onCloseHby } = props; const router = useRouter(); const token = getToken(); const handler = () => { if (!token) { router.push("/login"); } onCloseHby(); }; return (
{/* {"close"} */}
{"detail"} {/*
Dinheiro como chuva
R$200.00 por vez, Máx queda R$7.777
tips
Começa às 23:00
  • Cada sessão de chuva de dinheiro é distribuída gratuitamente com R$200.000
  • Valor máximo de queda em dinheiro:Cada sessäo de chuva de dinheiro é distribuida gratuitamente com
  • Membros recarregados podem reivindicar gratuitamente
  • O dinheiro recebido pode ser utilizado para jogar ou sacado diretamente
  • Quanto maior o nivel de associacäo VP, maior o valor recebido
*/}
); }; const HbyInfo = (props: any) => { const { iconImg, onCloseHby, onReciveRed } = props; if (!iconImg) return; return (
{/* {"close"} */}
{"icon"} {/*
Chuva de dinheiro
  • Membros recarregados podem reivindicar gratuitamente.
  • Valor máximo de queda em dinheiro: R$7.777
AGARRAR
*/}
//
// {"close"} //
Chuva de dinheiro
//
1.96
//
Valor máximo de queda em dinheiro:Cada sessäo de chuva de dinheiro é
//
); }; const HbyInfo2 = (props: any) => { const { iconImg, onCloseHby, redAmount } = props; const hbyInfoClass = clsx( `${styles.redopen} absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-no-repeat bg-cover` ); const t = useTranslations("packetsPopup"); return (
{"close"}
{t("title")}
{redAmount}
{redAmount > 0 ? t("receiveSuccess") : t("receiveWarring")}
); }; type Props = { onAfterHandler?: () => void; }; export type RedPacketModalProps = { onClose: () => void; onOpen: (source: any[], index?: number) => void; }; /** * @description 红包的三种状态 * is_start 可领取 展示红包领取组件 * is_receive 已领取 展示领取情组件 * is_end 可展示 展示���明页 */ enum Status { is_start, is_receive, is_end, } const RedPacketModal = forwardRef(function RedPacketModal(props, ref) { const { onAfterHandler } = props; const [visible, setVisible] = useState(false); const [iconLists, setIconLists] = useState([]); // 初始状态为is_end, 展示活动详情页 const [status, setStatus] = useState(Status.is_end); const packetCurrent = useRef({}); const packets = useRef([]); const [redAmount, setRedAmount] = useState(1); const activeIndex = useRef(0); const token = getToken(); const element = useRef(null); useImperativeHandle(ref, () => { return { onClose: () => setVisible(false), onOpen: (source, index?: number) => { packets.current = source; if (index !== null && index !== undefined) { activeIndex.current = index; } getRedPacketInfo().then((res) => { setVisible(true); }); }, }; }); const getRedPacketInfo = async () => { try { let actList = packets.current; // 是否开始但是没领过的红包 let packetsFilter = actList .filter((aItem: any) => { return aItem.can_receive && aItem.is_start && !aItem.is_receive; }) .sort((pre: any, next: any) => pre.end_time - next.end_time); // 有可领取红包 if (packetsFilter.length > 0) { let current = packetsFilter[activeIndex.current]; let iconList = JSON.parse(current.icon); // 红包 packetCurrent.current = current; // 有可领取红包 setIconLists(iconList); if (!token) { setStatus(Status.is_end); } else { setStatus(Status.is_start); } } else { // 无可领取红包 // 展示最近可领红包详情 let packets = actList.sort((pre: any, next: any) => pre.end_time - next.end_time); packetCurrent.current = packets[0]; setIconLists(JSON.parse(packets[0].icon)); // 无可领取红包展示详情 setStatus(Status.is_end); } } catch (error) { console.log("redPacketInfo===>error:", error); } }; const onReciveRed = async () => { try { let paramsData = { id: packetCurrent.current?.id, index: packetCurrent.current?.index, }; let receiveRedPacketInfo = await receiveRedPacketApi(paramsData); let redNum = receiveRedPacketInfo.data; if (onAfterHandler) { onAfterHandler(); } setStatus(Status.is_receive); setRedAmount(redNum?.amount); } catch (error) { console.log("redPacketInfo===>error:", error); } }; useEffect(() => { element.current = document.getElementById("app"); }, []); return ( setVisible(false)} /> {/* setVisible(false)} />*/} {status === Status.is_start ? ( setVisible(false)} onReciveRed={onReciveRed} iconImg={iconLists[1]} /> ) : status === Status.is_receive ? ( setVisible(false)} redAmount={redAmount} iconImg={iconLists[2]} /> ) : ( setVisible(false)} iconImg={iconLists[0]} /> )} ); }); export default memo(RedPacketModal);