index.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * @description 函数防抖
  3. * @param fn 需要防抖的函数
  4. * @param delay 延迟时间(毫秒)
  5. * @param immediate 是否立即执行
  6. * @returns 防抖后的函数
  7. */
  8. import dayjs from "dayjs";
  9. export function debounce<T extends (...args: any[]) => any>(
  10. fn: T,
  11. delay = 200,
  12. immediate = false
  13. ): (...args: Parameters<T>) => ReturnType<T> | undefined {
  14. let timer: NodeJS.Timeout | null = null;
  15. let isInvoked = false;
  16. return function (this: ThisParameterType<T>, ...args: Parameters<T>) {
  17. const context = this;
  18. // 如果需要立即执行且未调用过
  19. if (immediate && !isInvoked) {
  20. isInvoked = true;
  21. return fn.apply(context, args);
  22. }
  23. // 清除之前的定时器
  24. if (timer) {
  25. clearTimeout(timer);
  26. }
  27. return new Promise<ReturnType<T>>((resolve) => {
  28. timer = setTimeout(() => {
  29. const result = fn.apply(context, args);
  30. isInvoked = false;
  31. resolve(result);
  32. }, delay);
  33. });
  34. };
  35. }
  36. export const phoneConvert = (number: string) => {
  37. if (!number) return "";
  38. let pat = /(\d{3})\d*(\d{3})/;
  39. return number.replace(pat, "$1****$2");
  40. };
  41. /**
  42. * @description 根据语言获取时区
  43. */
  44. const language = ["pt-BR", "zh-CN", "en-US"];
  45. function getLang(utc: string) {
  46. let reg = new RegExp(utc, "i");
  47. const i = language.findIndex((n, index) => {
  48. if (reg.test(n)) {
  49. return index;
  50. }
  51. });
  52. let n = i < 0 ? 0 : i;
  53. return language[n];
  54. }
  55. export const timeFormat = (
  56. time: number,
  57. lang = "en",
  58. delimiter?: undefined | string,
  59. day = false
  60. ): string => {
  61. if (!time) return "";
  62. const len = (time + "").length;
  63. if (len === 10) {
  64. time = time * 1000;
  65. }
  66. if (delimiter) {
  67. return dayjs(time).format("DD/MM/YYYY").replaceAll("/", delimiter);
  68. }
  69. // 月 /日 / 年
  70. // 日 / 月 / 年
  71. if (day) {
  72. return dayjs(time).format("DD/MM/YYYY");
  73. }
  74. return dayjs(time).format("DD/MM/YYYY HH:mm:ss");
  75. };
  76. export const brTimeFormat = (time: number) => {
  77. if (!time) return "";
  78. const len = (time + "").length;
  79. if (len === 10) {
  80. time = time * 1000;
  81. }
  82. const timeOffset = (new Date().getTimezoneOffset() - 3 * 60) * 60 * 1000;
  83. const brTime = time + timeOffset;
  84. return dayjs(brTime).format("DD/MM/YYYY HH:mm:ss");
  85. };
  86. /**
  87. * @description 复制文本
  88. */
  89. export let copyText = function (text: string) {
  90. if (navigator.clipboard) {
  91. copyText = (text: string) => {
  92. navigator.clipboard.writeText(text);
  93. };
  94. } else {
  95. copyText = (text) => {
  96. const input = document.createElement("input");
  97. input.setAttribute("value", text);
  98. document.body.appendChild(input);
  99. input.select();
  100. document.execCommand("copy");
  101. document.body.removeChild(input);
  102. };
  103. }
  104. copyText(text);
  105. };
  106. /**
  107. * @description 两个数值计算百分比
  108. * @param {current} 当前值
  109. * @param {source} 总值
  110. * @return number
  111. */
  112. export const percentage = (current: number, source: number) => {
  113. if (!source) return 0;
  114. const num = (current * 100) / source;
  115. return num > 100 ? 100 : flatPoint(num);
  116. };
  117. /**
  118. * @description 保留两位数浮点数
  119. */
  120. export const flatPoint = (num: number) => {
  121. return Number(num.toFixed(2));
  122. };
  123. /**
  124. * @description 是否是移动端
  125. */
  126. export function isMobile(): boolean {
  127. try {
  128. document.createEvent("TouchEvent");
  129. return true;
  130. } catch (e) {
  131. return false;
  132. }
  133. }