auto.tsx 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. "use client";
  2. import { PromotionRep } from "@/api/home";
  3. import Agent, { AgentSuffix } from "@/components/Agent";
  4. import { ModalEnum } from "@/components/Box/types";
  5. import feedback from "@/feedback";
  6. import { usePathname } from "@/i18n/routing";
  7. import { useUserInfoStore } from "@/stores/useUserInfoStore";
  8. import useWheelStore from "@/stores/useWheelStore";
  9. import { commonMask, sleep } from "@/utils";
  10. import { server } from "@/utils/client";
  11. import { getToken } from "@/utils/Cookies";
  12. import { Local } from "@/utils/storage";
  13. import { useDebounceEffect } from "ahooks";
  14. import dayjs from "dayjs";
  15. import React from "react";
  16. import dialogManage from "./manager";
  17. const keyMap: any = {
  18. 0: "ban_pop_type_0",
  19. 1: "ban_pop_type_1",
  20. 2: "pop_type_2",
  21. 3: "pop_type_3",
  22. };
  23. const doFun = async (data: PromotionRep) => {
  24. switch (data.action_type) {
  25. case 2:
  26. window.open(data.action_params, "_blank");
  27. break;
  28. case 3:
  29. let path = data.action_params;
  30. if (data.activity_id) {
  31. path = `${data.action_params}?activity_id=${data.activity_id}`;
  32. }
  33. if (path) {
  34. window.nextRouter.push(path);
  35. }
  36. break;
  37. case 4:
  38. if (data.action_params === ModalEnum.red_packet) {
  39. dialogManage.showDialog("RedPacket");
  40. }
  41. if (data.action_params === ModalEnum.pwa_install) {
  42. dialogManage.showDialog("PwaInstall");
  43. }
  44. break;
  45. case 5:
  46. data?.action_params ? await eval(data?.action_params || "") : "";
  47. break;
  48. default:
  49. break;
  50. }
  51. };
  52. export const showProxy1 = async () => {
  53. await feedback.showModal({
  54. content: () => <Agent step={1}></Agent>,
  55. width: "90%",
  56. useDefaultFooter: false,
  57. suffix: () => <AgentSuffix></AgentSuffix>,
  58. });
  59. };
  60. export const showProxy2 = async () => {
  61. await feedback.showModal({
  62. content: <Agent step={2}></Agent>,
  63. width: "90%",
  64. useDefaultFooter: false,
  65. suffix: <AgentSuffix></AgentSuffix>,
  66. });
  67. };
  68. const getPromotions = async () => {
  69. return server
  70. .request<PromotionRep[], { summery: { showType: 1 | 2 } }>({
  71. url: "/v1/api/front/pop_list",
  72. method: "POST",
  73. })
  74. .then((res) => {
  75. if (res.code === 200) return res;
  76. });
  77. };
  78. const AutoShowDialog = () => {
  79. const pathName = usePathname();
  80. const [data, setData] = React.useState<PromotionRep[]>([]);
  81. const { userInfo } = useUserInfoStore();
  82. const wheelState = useWheelStore((state) => state);
  83. const [cacheUserInfo, setCacheUserInfo] = React.useState<any>({});
  84. useDebounceEffect(() => {
  85. if (cacheUserInfo?.id !== userInfo?.id || !userInfo?.id) {
  86. getData();
  87. if (userInfo?.id) {
  88. setCacheUserInfo(userInfo);
  89. }
  90. }
  91. }, [userInfo, cacheUserInfo]);
  92. React.useEffect(() => {
  93. if (!data?.length) {
  94. return;
  95. }
  96. setTimeout(() => {
  97. doShow();
  98. }, 300);
  99. // eslint-disable-next-line react-hooks/exhaustive-deps
  100. }, [data]);
  101. const getData = async () => {
  102. commonMask.show();
  103. try {
  104. const res = await getPromotions();
  105. if (res?.code === 200 && res?.data?.length) {
  106. setData(res.data);
  107. if (!res.data?.length) {
  108. commonMask.hide();
  109. }
  110. } else {
  111. throw new Error(res?.code?.toString());
  112. }
  113. } catch {
  114. commonMask.hide();
  115. }
  116. };
  117. React.useEffect(() => {
  118. data.forEach((item) => {
  119. if (item.content_type === 1) {
  120. const img = new Image();
  121. if (item?.content?.image) img.src = item?.content?.image;
  122. }
  123. });
  124. }, [data]);
  125. const checkIsCanShow = (data: PromotionRep) => {
  126. const toId = userInfo?.id || "-1";
  127. // debugger;
  128. if (!data?.id) return false;
  129. if (data.pop_type === 2 && !getToken()) return false;
  130. if (data.pop_type === 3) {
  131. const popSession = sessionStorage.getItem(`pupupNotShow_${data.id}`);
  132. // 今天不再展示
  133. if (popSession && dayjs(Number(popSession)).add(1, "day").isAfter(dayjs(), "day")) {
  134. return false;
  135. }
  136. }
  137. if (data.pop_type === 1) {
  138. let popData = Local.getKey(keyMap[data.pop_type]);
  139. if (!popData) return true;
  140. try {
  141. const isCurDay = dayjs(popData.date).add(1, "day").isAfter(dayjs(), "day");
  142. if (isCurDay && popData[toId][data.id]) {
  143. return false;
  144. }
  145. } catch {}
  146. }
  147. return true;
  148. };
  149. const saveCache = (type: 1 | 2 | 3 | 0, popid: number) => {
  150. const toId = userInfo?.id || -1;
  151. const cachedData = Local.getKey(keyMap[type]);
  152. let popData: any = {
  153. date: Date.now(),
  154. };
  155. if (cachedData) {
  156. try {
  157. if (dayjs(cachedData.date).isSame(Date.now(), "day")) {
  158. popData = cachedData;
  159. } else {
  160. Local.removeKey(keyMap[type]);
  161. }
  162. } catch {}
  163. }
  164. if (!popData[toId]) {
  165. popData[toId] = {};
  166. }
  167. popData[toId][popid] = true;
  168. Local.setKey(keyMap[type], JSON.stringify(popData));
  169. };
  170. const saveShowIndex = (idx: number) => {
  171. sessionStorage.setItem("dialogShow", `${idx + 1}`);
  172. };
  173. const doShow = async () => {
  174. setTimeout(() => {
  175. commonMask.hide();
  176. }, 500);
  177. //记录点击的索引
  178. let showIndex = sessionStorage.getItem("dialogShow");
  179. let startShow = showIndex ? Number(showIndex) : 0;
  180. if (startShow > data.length - 1) {
  181. startShow = 0;
  182. }
  183. for (let i = startShow; i < data.length; i++) {
  184. if (window.location.pathname.length > 3) break;
  185. const curData = data[i];
  186. if (!checkIsCanShow(curData)) {
  187. // saveShowIndex(i);
  188. continue;
  189. }
  190. // await dialogManage.showDialog("ReceiveGift", curData); //周返现
  191. // await dialogManage.showDialog('WheelSection', curData); //轮盘
  192. // await dialogManage.showDialog('SignInSection', curData); //签到
  193. // await dialogManage.showDialog("SignInSection", curData);
  194. try {
  195. let res: any = "";
  196. switch (curData.content_type) {
  197. // 图片展示
  198. case 1:
  199. // res = await dialogManage.showDialog("ImgDialog", {
  200. // ...curData,
  201. // isShowNotShow: curData.pop_type === 3,
  202. // });
  203. const imgUrl = curData?.content?.image;
  204. if (imgUrl) {
  205. res = await feedback.showImage({
  206. imgUrl,
  207. showAgain: true,
  208. });
  209. }
  210. break;
  211. // 富文本展示
  212. case 2:
  213. // res = await dialogManage.showDialog("TextDialog", curData);
  214. const text = curData?.content?.text;
  215. if (text) {
  216. res = await feedback.showText({
  217. text,
  218. showAgain: true,
  219. });
  220. }
  221. break;
  222. case 3:
  223. // 轮盘特殊处理 dialogManage.showDialog('WheelSection')
  224. if (curData?.action_params?.includes("WheelSection")) {
  225. await wheelState.setWheel();
  226. console.log(useWheelStore.getState());
  227. if (useWheelStore.getState().status != 1) {
  228. break;
  229. }
  230. }
  231. if (curData.action_type === 5) {
  232. res = curData?.action_params
  233. ? await eval(curData?.action_params || "")
  234. : "";
  235. }
  236. break;
  237. }
  238. if (res.isCheck) {
  239. sessionStorage.setItem(`pupupNotShow_${curData.id}`, `${Date.now()}`);
  240. }
  241. if (res.bodyClick) {
  242. doFun(curData);
  243. return;
  244. }
  245. // if (Array.isArray(res)) {
  246. // const [_, closeType] = res[0].split("_");
  247. // if (closeType == 1) {
  248. // sessionStorage.setItem(`pupupNotShow_${curData.id}`, `${Date.now()}`);
  249. // }
  250. // }
  251. if (res === "target") {
  252. return;
  253. }
  254. } catch (err) {
  255. // saveShowIndex(i);
  256. continue;
  257. }
  258. // 记录当前展示到几个了
  259. // saveShowIndex(i);
  260. if (curData.id) saveCache(curData.pop_type, curData.id);
  261. await sleep(300);
  262. }
  263. };
  264. return null;
  265. };
  266. export default AutoShowDialog;