index.tsx 12 KB

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