index.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. import { Wallet, cleanBounsApi, getUserMoneyApi, toggleUserBounsApi } from "@/api/user";
  2. import { useWalletStore } from "@/stores/useWalletStore";
  3. import { percentage } from "@/utils/methods";
  4. import { Dialog, ProgressBar, Switch, Toast } from "antd-mobile";
  5. import { useTranslations } from "next-intl";
  6. import React from "react";
  7. import "./style.scss";
  8. const Progress = ({ percent, textColor = "#fff" }: { percent: number; textColor?: string }) => {
  9. return (
  10. <div className="flex">
  11. <ProgressBar
  12. percent={percent}
  13. className={"mr-[0.0694rem] flex-1"}
  14. style={{
  15. "--fill-color": "#00f6ff",
  16. "--track-color": "#94a2dc",
  17. "--track-width": "0.0694rem",
  18. }}
  19. />
  20. <span className={"text-[#fff]"}>{percent.toFixed(2)}%</span>
  21. </div>
  22. );
  23. };
  24. export const WalletContent = ({
  25. percentage,
  26. type,
  27. difference,
  28. current,
  29. textColor = "#fff",
  30. }: {
  31. percentage: number;
  32. type: string;
  33. difference: number;
  34. current: number;
  35. textColor?: string;
  36. }) => {
  37. const t = useTranslations("ProfilePage");
  38. return (
  39. <div>
  40. <div className={"walletContentTitle mb-[0.12rem] text-[0.12rem]"}>
  41. <span className={"mr-[10px]"}>{type}</span>
  42. <i className={"mr-[10px] indent-[10px] text-[0.1528rem] font-bold"}>R$</i>
  43. <span>{current}</span>
  44. </div>
  45. <Progress percent={percentage} textColor={textColor} />
  46. <div className={`text-[${textColor}]`}>
  47. <span>{t("modalBottomTips")}</span>
  48. <span>{difference.toFixed(2)}</span>
  49. </div>
  50. </div>
  51. );
  52. };
  53. // 现金
  54. export const BalanceContent = (props: { wallet: Wallet }) => {
  55. const { wallet } = props;
  56. const t = useTranslations("ProfilePage");
  57. return (
  58. <>
  59. <WalletContent
  60. difference={wallet.target_score_rollover - wallet.current_score_rollover}
  61. type={t("balance")}
  62. current={wallet.score || 0}
  63. percentage={percentage(wallet.current_score_rollover, wallet.target_score_rollover)}
  64. />
  65. </>
  66. );
  67. };
  68. export const BonusContent = (props: { wallet: Wallet; handleAcquire?: any }) => {
  69. const { wallet, handleAcquire } = props;
  70. const [switchValue, setSwitchValue] = React.useState<boolean>(
  71. wallet.is_open_no_bonus === 1 || false
  72. );
  73. const [isLoading, setIsLoading] = React.useState<boolean>(false);
  74. const { setWallet } = useWalletStore((state) => ({ setWallet: state.setWallet }));
  75. const t = useTranslations("ProfilePage");
  76. const changeValue = async (value: boolean) => {
  77. const confirmRes = await Dialog.confirm({
  78. content: (
  79. <div className="text-[#fff]">{value ? t("switchOpen") : t("switchClose")}</div>
  80. ),
  81. confirmText: t("sure"),
  82. cancelText: t("cancel"),
  83. bodyStyle: {
  84. backgroundColor: "#373737",
  85. color: "#fff",
  86. },
  87. bodyClassName: "customConfirm",
  88. });
  89. if (!confirmRes) return;
  90. setIsLoading(true);
  91. try {
  92. const res = await toggleUserBounsApi(value ? 1 : 0);
  93. if (!(res?.code && res?.data?.code === 0)) {
  94. throw new Error("error");
  95. }
  96. setSwitchValue(value);
  97. } finally {
  98. setIsLoading(false);
  99. }
  100. };
  101. const doHandle = async () => {
  102. const confirmRes = await Dialog.confirm({
  103. content: <div className="text-[#fff]">{t("clean")}</div>,
  104. confirmText: t("sure"),
  105. cancelText: t("cancel"),
  106. bodyStyle: {
  107. backgroundColor: "#373737",
  108. color: "#fff",
  109. },
  110. bodyClassName: "customConfirm",
  111. });
  112. if (!confirmRes) return;
  113. const res = await cleanBounsApi(1);
  114. if (res?.code && [6001, 6002].includes(res?.data?.code)) {
  115. const str = t(`bouns${res?.data?.code}`);
  116. Toast.show({
  117. content: str,
  118. icon: "fail",
  119. });
  120. }
  121. Toast.show({
  122. content: t("success"),
  123. icon: "success",
  124. });
  125. const walletRes = await getUserMoneyApi();
  126. setWallet(walletRes?.data);
  127. };
  128. return (
  129. <div>
  130. <WalletContent
  131. difference={wallet.target_point_rollover - wallet.current_point_rollover}
  132. type={t("bonus")}
  133. current={wallet.point || 0}
  134. percentage={percentage(wallet.current_point_rollover, wallet.target_point_rollover)}
  135. />
  136. <p className={"text-center text-[#fff]"}>{t("bonusArticle")}</p>
  137. <ul className={"ml-[0.1389rem] list-decimal pl-[0.1rem] text-[0.12rem] text-[#fff]"}>
  138. <li className="mt-[.06rem]">{t("bonusDesc1")}</li>
  139. <li className="mt-[.06rem]">{t("bonusDesc2")}</li>
  140. <li className="mt-[.06rem]">{t("bonusDesc3")}</li>
  141. </ul>
  142. <div className="mt-[.15rem] rounded-[8px] border-[1px] border-[#e540ff] bg-[#2f4cc8] shadow-[0_-10px_25px_#e641ff_inset]">
  143. <div className="flex flex-row items-center justify-between border-b-[1px] border-[#e540ff] p-[8px]">
  144. <span className="text-[#fff]">{t("bounsTitle1")}</span>
  145. <Switch
  146. loading={isLoading}
  147. style={{
  148. "--checked-color": "#a195d2",
  149. "--height": "24px",
  150. "--width": "48px",
  151. }}
  152. checked={switchValue}
  153. onChange={changeValue}
  154. ></Switch>
  155. </div>
  156. <ul
  157. className={
  158. "ml-[0.1389rem] list-decimal pl-[0.1rem] pt-[.1rem] text-[0.12rem] text-[#fff]"
  159. }
  160. >
  161. <li className="mt-[.06rem]">{t("bonusDesc4")}</li>
  162. <li className="mt-[.06rem]">{t("bonusDesc5")}</li>
  163. <li className="mt-[.06rem]">{t("bonusDesc6")}</li>
  164. </ul>
  165. <div className="mt-[.1rem] flex items-center justify-center pb-[.2rem]">
  166. <a
  167. onClick={doHandle}
  168. className="rounded-[20px] border-[1px] border-[#46e3ff] bg-[#4234a8] px-[.1rem] py-[.06rem] text-[#00f6ff] shadow-[0_0_25px_#435cb9_inset]"
  169. >
  170. {t("boundsBtn")}
  171. </a>
  172. </div>
  173. </div>
  174. {handleAcquire && (
  175. <a
  176. className={`carteira-box ${wallet.is_point_transfer ? "active" : ""}`}
  177. onClick={() => handleAcquire(2, wallet.is_point_transfer)}
  178. >
  179. <span>{t("carteira")}</span>
  180. </a>
  181. )}
  182. </div>
  183. );
  184. };
  185. export const FreeContent = ({
  186. wallet,
  187. handleAcquire,
  188. textColor = "#fff",
  189. }: {
  190. wallet: Wallet;
  191. handleAcquire?: any;
  192. textColor?: string;
  193. }) => {
  194. // const { wallet, handleAcquire } = props;
  195. const t = useTranslations("ProfilePage");
  196. return (
  197. <div>
  198. <WalletContent
  199. difference={wallet.target_free_score_rollover - wallet.current_free_score_rollover}
  200. type={t("free")}
  201. current={wallet.free_score || 0}
  202. percentage={percentage(
  203. wallet.current_free_score_rollover,
  204. wallet.target_free_score_rollover
  205. )}
  206. />
  207. <p className={`text-center text-[${textColor}]`}>{t("freeArticle")}</p>
  208. <ul
  209. className={`"ml-[0.1389rem] list-decimal pl-[0.1rem] text-[0.12rem] text-[${textColor}]`}
  210. >
  211. <li className="mt-[.06rem]">{t("freeDesc1")}</li>
  212. <li className="mt-[.06rem]">{t("freeDesc2")}</li>
  213. <li className="mt-[.06rem]">
  214. {t("freeDesc3")}
  215. {wallet?.free_transfer_ratio}:1
  216. </li>
  217. <li className="mt-[.06rem]">
  218. {t("freeDesc4", { n: wallet.free_transfer_max ?? 0 })}
  219. </li>
  220. </ul>
  221. {handleAcquire && (
  222. <a
  223. className={`carteira-box ${wallet.is_free_transfer && wallet.free_score >= (wallet?.free_transfer_min || 0) ? "active" : ""}`}
  224. onClick={() => handleAcquire(3, wallet.is_free_transfer)}
  225. >
  226. <span>{t("carteira")}</span>
  227. </a>
  228. )}
  229. <p className={`mt-[.06rem] text-center text-[0.12rem] text-[${textColor}]`}>
  230. Valor minimo de transferência de {wallet?.free_transfer_min}
  231. </p>
  232. </div>
  233. );
  234. };
  235. export const ReplayContent = ({
  236. wallet,
  237. handleAcquire,
  238. textColor = "#fff",
  239. }: {
  240. wallet: Wallet;
  241. handleAcquire?: any;
  242. textColor?: string;
  243. }) => {
  244. const t = useTranslations("ProfilePage");
  245. return (
  246. <div>
  247. <WalletContent
  248. difference={wallet.target_lose_score_rollover - wallet.current_lose_score_rollover}
  249. type={t("replay")}
  250. current={wallet.lose_score || 0}
  251. percentage={percentage(
  252. wallet.current_lose_score_rollover,
  253. wallet.target_lose_score_rollover
  254. )}
  255. />
  256. <p className={`text-center text-[${textColor}]`}>{t("replayArticle")}</p>
  257. <ul
  258. className={`ml-[0.1389rem] list-decimal pl-[0.1rem] text-[0.12rem] text-[${textColor}]`}
  259. >
  260. <li className="mt-[.06rem]">{t("replayDesc1")}</li>
  261. <li className="mt-[.06rem]">{t("replayDesc2")}</li>
  262. <li className="mt-[.06rem]">
  263. {t("replayDesc3")}
  264. {wallet?.lose_transfer_ratio}:1
  265. </li>
  266. <li className="mt-[.06rem]">
  267. {t("replayDesc4", { n: wallet.lose_transfer_max ?? 0 })}
  268. </li>
  269. </ul>
  270. {handleAcquire && (
  271. <a
  272. className={`carteira-box ${wallet.is_lose_transfer && wallet.lose_score >= (wallet?.lose_transfer_min || 0) ? "active" : ""}`}
  273. onClick={() => handleAcquire(4, wallet.is_lose_transfer)}
  274. >
  275. <span>{t("carteira")}</span>
  276. </a>
  277. )}
  278. <p className={`mt-[.06rem] text-center text-[0.12rem] text-[${textColor}]`}>
  279. Valor minimo de transferência de {wallet?.lose_transfer_min}
  280. </p>
  281. </div>
  282. );
  283. };
  284. // const WalletDescribeModal = () => {
  285. // const [tipsStatus, setTipsStatus] = useState<keyof typeof WalletEnum>("Bonus");
  286. // const tipsRef = useRef<ModalProps>(null);
  287. // const wallet: any = {};
  288. // const t = useTranslations("ProfilePage");
  289. //
  290. // return (
  291. // <TipsModal
  292. // ref={tipsRef}
  293. // title={
  294. // <div className={"flex items-center"}>
  295. // <i className={"iconfont icon-liwuhuodong mr-[0.0694rem] text-[0.2778rem]"}></i>
  296. // {t("modalTitle")}
  297. // </div>
  298. // }
  299. // >
  300. // {/*现金*/}
  301. // {tipsStatus === WalletEnum.Balance ? <BalanceContent wallet={wallet} /> : null}
  302. // {/* 彩金*/}
  303. // {tipsStatus === WalletEnum.Bonus ? <BonusContent wallet={wallet} /> : null}
  304. // {/* 免费币 */}
  305. // {tipsStatus === WalletEnum.Free ? <FreeContent wallet={wallet} /> : null}
  306. // {/* 重玩币 */}
  307. // {tipsStatus === WalletEnum.Replay ? <ReplayContent wallet={wallet} /> : null}
  308. // </TipsModal>
  309. // );
  310. // };
  311. // export default WalletDescribeModal;