|
@@ -1,51 +1,155 @@
|
|
|
+"use client";
|
|
|
+import { EmailNoticeRep } from "@/api/home";
|
|
|
+import GlobalNotify from "@/components/ModalPopup/GlobalNotifyModal";
|
|
|
+import { ClaimActiveErrorMap } from "@/enums";
|
|
|
+import { server } from "@/utils/client";
|
|
|
+import { formatAmount } from "@/utils/index";
|
|
|
+import { timeFormat } from "@/utils/methods";
|
|
|
+import { Toast } from "antd-mobile";
|
|
|
+import { useTranslations } from "next-intl";
|
|
|
+import { useSearchParams } from "next/navigation";
|
|
|
+import React from "react";
|
|
|
import styles from "./page.module.scss";
|
|
|
+
|
|
|
+const getEmailNotices = () => {
|
|
|
+ return server.request<EmailNoticeRep[]>({
|
|
|
+ url: "/v1/api/user/mail/getMailList",
|
|
|
+ method: "POST",
|
|
|
+ data: {},
|
|
|
+ });
|
|
|
+};
|
|
|
+const changeStatus = (params: { ids: number[]; status: 1 | 0 }) => {
|
|
|
+ return server.request<EmailNoticeRep[]>({
|
|
|
+ url: "/v1/api/user/mail/setStatus",
|
|
|
+ method: "POST",
|
|
|
+ data: params,
|
|
|
+ });
|
|
|
+};
|
|
|
+///v1/api/user/mail/setStatus
|
|
|
+const receiveGift = (ids: number[]) => {
|
|
|
+ return server.request<any>({
|
|
|
+ url: "/v1/api/user/mail/claimMailReward",
|
|
|
+ method: "POST",
|
|
|
+ data: { ids },
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const CoinMap = new Map([
|
|
|
+ [1, "Solad"],
|
|
|
+ [2, "GOLD"],
|
|
|
+ [3, "SILVER"],
|
|
|
+]);
|
|
|
+
|
|
|
const EmailDetail = () => {
|
|
|
+ const t = useTranslations();
|
|
|
+ const searchParams = useSearchParams();
|
|
|
+ const [data, setData] = React.useState<EmailNoticeRep[]>([]);
|
|
|
+ const [amount, setAmount] = React.useState<any>({});
|
|
|
+ const [visible, setVisible] = React.useState<boolean>(false);
|
|
|
+
|
|
|
+ React.useEffect(() => {
|
|
|
+ getData();
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ const curData = React.useMemo(() => {
|
|
|
+ const id = Number(searchParams.get("id"));
|
|
|
+ const res = data?.filter((item) => {
|
|
|
+ return item.id === id;
|
|
|
+ });
|
|
|
+ if (!res?.length) return {} as EmailNoticeRep;
|
|
|
+ return res[0];
|
|
|
+ }, [data, searchParams]);
|
|
|
+
|
|
|
+ const getData = async () => {
|
|
|
+ const id = Number(searchParams.get("id"));
|
|
|
+ changeStatus({
|
|
|
+ ids: [id],
|
|
|
+ status: 1,
|
|
|
+ });
|
|
|
+ const res = await getEmailNotices();
|
|
|
+ if (res?.code === 200) {
|
|
|
+ setData(res.data);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const doReceive = async () => {
|
|
|
+ Toast.show({ icon: "loading" });
|
|
|
+ try {
|
|
|
+ const res = await receiveGift([curData.id]);
|
|
|
+
|
|
|
+ if (res.code === 200 && res?.data?.code === 0) {
|
|
|
+ const amountObj: any = {};
|
|
|
+ if (res?.data?.reward) {
|
|
|
+ res?.data?.reward.forEach((item: any) => {
|
|
|
+ amountObj[`coin_${item.coin_type}`] = formatAmount(item.amount);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (res?.data?.extra_reward) {
|
|
|
+ res?.data?.extra_reward.forEach((item: any) => {
|
|
|
+ amountObj[`coin_${item.coin_type}`] = formatAmount(
|
|
|
+ new BigNumber(amountObj[`coin_${item.coin_type}`] || 0)
|
|
|
+ .plus(item.amount)
|
|
|
+ .toString()
|
|
|
+ );
|
|
|
+ });
|
|
|
+ }
|
|
|
+ setAmount(amountObj);
|
|
|
+ setVisible(true);
|
|
|
+ } else {
|
|
|
+ throw new Error(ClaimActiveErrorMap.get(res.data.code) || t(`code.400`));
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ getData();
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
return (
|
|
|
<div className={styles.emailDetail}>
|
|
|
- <div className={styles.title}>
|
|
|
- O texto do título do e-mail é exibido aqui. Se o texto for longo
|
|
|
- </div>
|
|
|
- <div className={styles.date}>27/03/25 14:22:30</div>
|
|
|
+ <div className={styles.title}>{curData?.title}</div>
|
|
|
+ <div className={styles.date}>{timeFormat(curData?.create_at)}</div>
|
|
|
<div className={styles.content}>
|
|
|
- <img
|
|
|
- src="https://img1.baidu.com/it/u=2076262900,1204832320&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=678"
|
|
|
- alt=""
|
|
|
- className={styles.img}
|
|
|
- />
|
|
|
- <div
|
|
|
- className={styles.contentText}
|
|
|
- dangerouslySetInnerHTML={{
|
|
|
- __html: `Texto do e-mail:\r\n
|
|
|
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum
|
|
|
- laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo.
|
|
|
- Proin sodales pulvinar sic tempor. Sociis natoque penatibus et magnis dis
|
|
|
- parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra
|
|
|
- vulputate, felis tellus mollis orci, sed rhoncus pronin sapien nunc accuan eget.`,
|
|
|
- }}
|
|
|
- ></div>
|
|
|
+ {curData?.image && <img src={curData?.image} alt="" className={styles.img} />}
|
|
|
+ {curData?.content && (
|
|
|
+ <div
|
|
|
+ className={styles.contentText}
|
|
|
+ dangerouslySetInnerHTML={{
|
|
|
+ __html: `${curData?.content}`,
|
|
|
+ }}
|
|
|
+ ></div>
|
|
|
+ )}
|
|
|
</div>
|
|
|
<div className={styles.more}><Pular texto></div>
|
|
|
- <div className={styles.giftBox}>
|
|
|
- <div className={styles.giftItem}>
|
|
|
- <img src="/notice/gift2.png" alt="" />
|
|
|
- <div className={styles.giftDesc}>
|
|
|
- <div>O nome da recompensa é mostrado aqui</div>
|
|
|
- <div>prêmio R$1</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className={styles.giftItem}>
|
|
|
- <img src="/notice/gift2.png" alt="" />
|
|
|
- <div className={styles.giftDesc}>
|
|
|
- <div>O nome da recompensa é mostrado aqui</div>
|
|
|
- <div>prêmio R$1</div>
|
|
|
+ {curData.status !== 2 && (
|
|
|
+ <div className={styles.giftBox}>
|
|
|
+ {!!curData?.attach?.length &&
|
|
|
+ curData.attach.map((item, idx) => {
|
|
|
+ return (
|
|
|
+ <div
|
|
|
+ className={styles.giftItem}
|
|
|
+ key={`${item.coin_type}_${item.amount}`}
|
|
|
+ >
|
|
|
+ <img src="/notice/gift2.png" alt="" />
|
|
|
+ <div className={styles.giftDesc}>
|
|
|
+ <div>O nome da recompensa é mostrado aqui</div>
|
|
|
+ <div>prêmio R${item.amount.toString()}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ })}
|
|
|
+
|
|
|
+ <div className={styles.btnBox}>
|
|
|
+ <button onClick={doReceive}>
|
|
|
+ <span>Receber</span>
|
|
|
+ </button>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div className={styles.btnBox}>
|
|
|
- <button>
|
|
|
- <span>Receber</span>
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <GlobalNotify
|
|
|
+ amount={amount}
|
|
|
+ visible={visible}
|
|
|
+ onChange={() => setVisible(false)}
|
|
|
+ deraction={5000}
|
|
|
+ ></GlobalNotify>
|
|
|
</div>
|
|
|
);
|
|
|
};
|