auto.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. "use client";
  2. import { PromotionRep } from "@/api/home";
  3. import { server } from "@/utils/client";
  4. import { getToken } from "@/utils/Cookies";
  5. import dayjs from "dayjs";
  6. import React from "react";
  7. import dialogManage from "./manager";
  8. //"ImgDialog","WheelSection", "SignInSection", "HomePromotion", "TextDialog"
  9. const getPromotions = async () => {
  10. return server
  11. .request<PromotionRep[], { summery: { showType: 1 | 2 } }>({
  12. url: "/v1/api/front/pop_list",
  13. method: "POST",
  14. })
  15. .then((res) => {
  16. if (res.code === 200) return res;
  17. });
  18. };
  19. const AutoShowDialog = () => {
  20. const [data, setData] = React.useState<PromotionRep[]>([]);
  21. React.useEffect(() => {
  22. getData();
  23. }, []);
  24. React.useEffect(() => {
  25. if (!data.length) return;
  26. setTimeout(() => {
  27. doShow();
  28. }, 300);
  29. // eslint-disable-next-line react-hooks/exhaustive-deps
  30. }, [data]);
  31. const getData = async () => {
  32. const res = await getPromotions();
  33. if (res?.code === 200 && res?.data?.length) {
  34. // res.data[0].content_type = 3;
  35. // res.data[0].action_params = 'dialogManage.showDialog("SignInSection")';
  36. // res.data[0].pop_type = 1;
  37. setData(res.data);
  38. }
  39. };
  40. const checkIsShowed = (data: PromotionRep) => {
  41. const showTime = localStorage.getItem(`dialog_${data.id}`);
  42. if (showTime) {
  43. const nextDay = dayjs(Number(showTime)).add(1, "day").format("YYYY-MM-DD");
  44. if ((dayjs(nextDay).isAfter(dayjs()), "day")) {
  45. return true;
  46. }
  47. }
  48. return false;
  49. };
  50. const doShow = async () => {
  51. //记录点击的索引
  52. let showIndex = sessionStorage.getItem("dialogShow");
  53. let startShow = showIndex ? Number(showIndex) : 0;
  54. if (startShow > data.length - 1) {
  55. startShow = 0;
  56. }
  57. for (let i = startShow; i < data.length; i++) {
  58. const curData = data[i];
  59. // 一天只展示一次
  60. if (curData.pop_type === 1 && checkIsShowed(curData)) continue;
  61. // 未登录的用户不展示
  62. if (curData.pop_type === 2 && !getToken()) continue;
  63. try {
  64. switch (curData.content_type) {
  65. // 图片展示
  66. case 1:
  67. await dialogManage.showDialog("ImgDialog", curData);
  68. break;
  69. // 富文本展示
  70. case 2:
  71. await dialogManage.showDialog("TextDialog", curData);
  72. break;
  73. // 直接调用方法
  74. case 3:
  75. curData?.action_params ? await eval(curData?.action_params || "") : "";
  76. break;
  77. }
  78. } catch {
  79. continue;
  80. }
  81. // 一天只展示一次
  82. if (curData.pop_type === 1) {
  83. localStorage.setItem(`dialog_${curData.id}`, Date.now().toString());
  84. }
  85. // 记录当前展示到几个了
  86. sessionStorage.setItem("dialogShow", `${i + 1}`);
  87. }
  88. };
  89. return null;
  90. };
  91. export default AutoShowDialog;