/** * @description 函数防抖 * @param fn 需要防抖的函数 * @param delay 延迟时间(毫秒) * @param immediate 是否立即执行 * @returns 防抖后的函数 */ import dayjs from "dayjs"; export function debounce any>( fn: T, delay = 200, immediate = false ): (...args: Parameters) => ReturnType | undefined { let timer: NodeJS.Timeout | null = null; let isInvoked = false; return function (this: ThisParameterType, ...args: Parameters) { const context = this; // 如果需要立即执行且未调用过 if (immediate && !isInvoked) { isInvoked = true; return fn.apply(context, args); } // 清除之前的定时器 if (timer) { clearTimeout(timer); } return new Promise>((resolve) => { timer = setTimeout(() => { const result = fn.apply(context, args); isInvoked = false; resolve(result); }, delay); }); }; } export const phoneConvert = (number: string) => { if (!number) return ""; let pat = /(\d{3})\d*(\d{3})/; return number.replace(pat, "$1****$2"); }; /** * @description 根据语言获取时区 */ const language = ["pt-BR", "zh-CN", "en-US"]; function getLang(utc: string) { let reg = new RegExp(utc, "i"); const i = language.findIndex((n, index) => { if (reg.test(n)) { return index; } }); let n = i < 0 ? 0 : i; return language[n]; } export const timeFormat = ( time: number, lang = "en", delimiter?: undefined | string, day = false ): string => { if (!time) return ""; const len = (time + "").length; if (len === 10) { time = time * 1000; } if (delimiter) { return dayjs(time).format("DD/MM/YYYY").replaceAll("/", delimiter); } // 月 /日 / 年 // 日 / 月 / 年 if (day) { return dayjs(time).format("DD/MM/YYYY"); } return dayjs(time).format("DD/MM/YYYY HH:mm:ss"); }; export const brTimeFormat = (time: number) => { if (!time) return ""; const len = (time + "").length; if (len === 10) { time = time * 1000; } const timeOffset = (new Date().getTimezoneOffset() - 3 * 60) * 60 * 1000; const brTime = time + timeOffset; return dayjs(brTime).format("DD/MM/YYYY HH:mm:ss"); }; /** * @description 复制文本 */ export let copyText = function (text: string) { if (navigator.clipboard) { copyText = (text: string) => { navigator.clipboard.writeText(text); }; } else { copyText = (text) => { const input = document.createElement("input"); input.setAttribute("value", text); document.body.appendChild(input); input.select(); document.execCommand("copy"); document.body.removeChild(input); }; } copyText(text); }; /** * @description 两个数值计算百分比 * @param {current} 当前值 * @param {source} 总值 * @return number */ export const percentage = (current: number, source: number) => { if (!source) return 0; const num = (current * 100) / source; return num > 100 ? 100 : flatPoint(num); }; /** * @description 保留两位数浮点数 */ export const flatPoint = (num: number) => { return Number(num.toFixed(2)); }; /** * @description 是否是移动端 */ export function isMobile(): boolean { try { document.createEvent("TouchEvent"); return true; } catch (e) { return false; } }