/** * 基础工具库 * author jiang_wz */ // @ts-nocheck import { useEffect, useCallback, useRef } from 'react'; import { Dimensions, Platform, PixelRatio, StatusBar, ToastAndroid, DeviceEventEmitter, findNodeHandle, UIManager, NativeModules, Keyboard, StyleSheet } from 'react-native'; import { getStatusBarHeight } from 'react-native-iphone-x-helper'; import { store } from "../reducx/store/store" import DeviceInfo from 'react-native-device-info'; import { getDeviceInfo } from '../reducx/action/action'; import AsyncStorage from "@react-native-community/async-storage" import Clipboard from '@react-native-clipboard/clipboard'; // import { navigate } from '../NavigationService'; const height = Number(Dimensions.get('window').height); const width = Number(Dimensions.get('window').width); const version = { //版本标识 type: 2, //1 内测-test 2 预览-rlease 3-api 正式预选版本 4-api正式上线版本 version_counter: 47, //版本号x version_name: 'v3.0.8', //版本名 rcVersion: 0, //预选版本 platform: 'huawei' }; // apple | xiaomi | huawei | oppo | tencent | vivo | other // const BaseUrl = ''; //线上正式环境 // const BaseUrl = ''; //内测预览环境? const BaseUrl = 'http://192.168.2.13:8080'; //开发调试环境 const size = { base_width: 375, head_height: px2dp(46), tab_height: px2dp(56), } const wxConfig = { webpageUrl: 'https://www.haitunshenghuo.com', userName: 'gh_4257b70293d5' }; const colors = { themeColor: '#ff426e', yellow: '#FF6600', red: '#E71F19', opacityRed: '#FFEFF3', btnRed: '#FF5262', redText: '#FF0000', sloganRed: '#FF235E', yel: '#FFA800', brown: '#D16700', brownText: '#FFC38D', priceColor: '#FF245F', bgColor: '#f5f5f5', borderColor: '#eee', greenColor: '#22C19B', blueColor: '#086BFF', chatRoomBgColor: 'rgb(245,246,247)', chatThemeColor: '#55D48B', shopThemeColor: '#ff4b76' }; function px2dp(px: Number) { let w = px * width / 375; w = Number(w.toFixed(2)) - 0; return Number(w); //1080px }; // 60 / 375 * 360 // iPhoneX & XS const X_WIDTH = 375; const X_HEIGHT = 812; // iPhoneXR & XsMax const XR_WIDTH = 414; const XR_HEIGHT = 896; const { height: D_HEIGHT, width: D_WIDTH } = Dimensions.get('window'); function isIphoneX() { return ( Platform.OS === 'ios' && ((D_HEIGHT === X_HEIGHT && D_WIDTH === X_WIDTH) || (D_HEIGHT === X_WIDTH && D_WIDTH === X_HEIGHT)) ); }; //判断是否为iphoneXR或XsMAX function isIphoneXR() { return ( Platform.OS === 'ios' && ((D_HEIGHT === XR_HEIGHT && D_WIDTH === XR_WIDTH) || (D_HEIGHT === XR_WIDTH && D_WIDTH === XR_HEIGHT)) ) }; var iosHeight: number = getStatusBarHeight(); const platStatusBarHeight: any = StatusBar.currentHeight; const statusBarHeight: number = (Platform.OS === 'ios' ? iosHeight : platStatusBarHeight); const onePx = 1 / PixelRatio.get(); //获取真实1px 3 1/3px function isIos() { if (Platform.OS === 'ios') { return true } return false; } function getTime(nS: any) { try { let date = new Date(nS * 1000); let year = date.getFullYear(); let month = (date.getMonth() + 1).toString(); let day = date.getDate().toString(); let hour = date.getHours().toString(); let minute = date.getMinutes().toString(); if (Number(minute) < 10) { minute = '0' + minute; } return year + '-' + month + '-' + day + ' ' + hour + ':' + minute } catch (e) { return '时间解析失败' } }; function getFullTime(nS: any) { //getSeconds try { let date = new Date(nS * 1000); let year = date.getFullYear(); let month = (date.getMonth() + 1).toString(); let day = date.getDate().toString(); let hour = date.getHours().toString(); let minute = date.getMinutes().toString(); let seconds = date.getSeconds().toString(); if (Number(hour) < 10) { hour = '0' + hour; } if (Number(minute) < 10) { minute = '0' + minute; }; if (Number(seconds) < 10) { seconds = '0' + seconds; } return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds; } catch (e) { return '时间解析失败'; } } function getLocalTime(type: 'year' | 'month' | 'day' | 'YY:MM:DD', nS) { var now; //console.log(nS) if (nS) { //console.log('走nS') now = new Date(nS); } else { //console.log("不nS") now = new Date(); //获得当前时间 }; let month = (now.getMonth() + 1).toString(); let day = now.getDate().toString(); if (Number(month) < 10) { month = '0' + month; }; if (Number(day) < 10) { day = '0' + day; } switch (type) { case 'year': return now.getFullYear(); case 'month': return month; case 'day': return day; case 'YY:MM:DD': return now.getFullYear().toString() + '-' + month + '-' + day; }; }; function getChatLocalTime(nS: any) { var now = new Date(); //获得当前时间 var time = new Date(nS); //解析时间戳 let dateStart = now.getDate(); //当前日 let monthEnd = time.getMonth() + 1; //结束月 let dateEnd = time.getDate(); //时间戳日 let hoursEnd = time.getHours(); //时间戳时 let minutesEnd = time.getMinutes(); //时间戳分 if (dateStart === dateEnd) { //说明是同一天 let period = ''; if (hoursEnd < 9 && hoursEnd >= 6) { period = '早上'; } else if (hoursEnd >= 9 && hoursEnd < 12) { period = '上午'; } else if (hoursEnd >= 12 && hoursEnd < 18) { period = '下午'; hoursEnd -= 12; } else if (hoursEnd >= 18 && hoursEnd < 24) { period = '晚上'; hoursEnd -= 12; } else if (hoursEnd >= 0 && hoursEnd < 6) { period = '凌晨' } if (minutesEnd.toString().length === 1) { //@ts-ignore minutesEnd = '0' + minutesEnd; } return period + hoursEnd + ':' + minutesEnd } else if (dateStart - dateEnd === 1) { //说明是昨天的消息 return '昨天' } else { return monthEnd + '月' + dateEnd + '日' } }; /** * * @param dateStart YYYY--MM--DD * @param dateEnd YYYY--MM--DD */ const checkMaxDate = (dateStart, dateEnd) => { var _dateStart = new Date(dateStart); var _dateEnd = new Date(dateEnd); console.log("对比时间:", dateStart, dateEnd, _dateStart, _dateEnd) if (_dateStart.getTime() === _dateEnd.getTime()) { return true } if (_dateStart.getTime() < _dateEnd.getTime()) {//转换成毫秒进行比较 //第一个小 //console.log('开始时间小于结束时间'); return true; } else { //console.log('开始时间大于结束时间'); return false; //第一个大 }; }; const getDate2NsAsDate = (dateString) => { let date = new Date(dateString); let month = (date.getMonth() + 1).toString(); let day = date.getDate().toString(); if (Number(month) < 10) { month = '0' + month; }; if (Number(day) < 10) { day = '0' + day; } dateString = date.getFullYear().toString() + '-' + month + '-' + day; console.log('dateString:', dateString) return dateString }; const toast = (msg?: any, title?: String) => { Keyboard.dismiss(); DeviceEventEmitter.emit('customer-toast-status', { msg, title }) } const toastHide = (msg?: String, title?: String) => { Keyboard.dismiss(); DeviceEventEmitter.emit('customer-toast-status-hide', { msg, title }) } const toastWithHandler = (msg: String, handler: Function) => { Keyboard.dismiss(); DeviceEventEmitter.emit('customer-toast', { msg: msg ? msg + "" : "啊哦,出错了~", handler }) } const toastStatus = (msg: String, status?: 'success' | 'faild', description?: string) => { DeviceEventEmitter.emit('customer-toast', { msg: msg ? msg + "" : "啊哦,出错了~", }) }; const loadingShow = (msg?: string) => { DeviceEventEmitter.emit("loading-addlisten", { msg: msg }) } const loadingHide = () => { DeviceEventEmitter.emit("loading-addlisten-hide") } const loadingToastShow = () => { DeviceEventEmitter.emit("loading-toast-addlisten", { }) } const loadingToastHide = () => { DeviceEventEmitter.emit("loading-toast-addlisten-hide") } const toastShort = (msg: string) => { if (!isIos()) { DeviceEventEmitter.emit('easy-toast', { msg: msg + '' }) } else { //@ts-ignore ToastAndroid.showWithGravityAndOffset(msg, ToastAndroid.SHORT, ToastAndroid.BOTTOM, 0, 225) } }; /** * * @param {Object} data title, confirmText, confirmFun || 标题, 确认文本,确认执行方法 * */ const myConfirm = (data: Object) => { DeviceEventEmitter.emit('customer-confirm', { data: data }) } function GetClear(str: String) { if (str == null || str == undefined) { return ''; } else { var tempStr = str .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, "\"") .replace(/'/g, "'") .replace(/&/g, "&") .replace(/ /g, '').replace(/<\/?.+?\/?>/g, '').replace(/<[^>]+>/g, "") return tempStr; } }; function jsQueryFileName(url: String) { url = url.split('?')[0]; // 只要?号前的 var urlSlashCount = url.split('/').length; // 统计有几个斜杠 return url.split('/')[urlSlashCount - 1].toLowerCase(); //获取数组最后一个 }; const moveTaskToBack = (): any => { //@ts-ignore NativeModules.ActivityResult.MoveTaskToBack(e => { }) } const getLayout = (ref: any): any => { const handle = findNodeHandle(ref); return new Promise((resolve) => { //@ts-ignore UIManager.measure(handle, (x, y, width, height, pageX, pageY) => { resolve({ x, y, width, height, pageX, pageY }); }); }); }; /** * * @param {String} name 用户昵称 */ function hideUserName(name: string) { var newStr; if (name.length === 2) { newStr = name.substr(0, 1) + '*'; } else if (name.length > 2) { var char = ''; newStr = name.substr(0, 1) + '**' // for (let i = 0, len = name.length - 2; i < len; i++) { // char += '*'; // } // newStr = name.substr(0, 1) + char + name.substr(-1, 1); } else { newStr = name; } return newStr; } function hideTel(tel: string) { try { return tel.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2') } catch (e) { return tel; } }; /** * * @param {String} string */ function hideAccount(string: string) { var newStr; var char = ''; for (let i = 0, len = string.length - 8; i < len; i++) { char += '*'; } newStr = string.substr(0, 4) + char + string.substr(string.length - 4, 4); return newStr; } function clearToast(): void { DeviceEventEmitter.emit('clear-toast') } //@ts-ignore const handleUrl = (url, params) => { if (params) { //@ts-ignore let paramsArray = [] Object.keys(params).forEach(key => paramsArray.push(key + '=' + encodeURIComponent(params[key]))); if (url.search(/\?/) === -1) { //@ts-ignore typeof (params) === 'object' ? url += '?' + paramsArray.join('&') : url; } else { //@ts-ignore url += '&' + paramsArray.join('&'); } }; return url; }; const debounce = (func: Function, time: number) => { let timer: any = null return (...args: any) => { clearTimeout(timer); timer = setTimeout(() => { //以集合形式传递参数,用apply //@ts-ignore func.apply(this, args); }, time) } } function useDebounce(fn: any, delay: any, dep = []) { const { current } = useRef({ fn, timer: null }); useEffect(function () { current.fn = fn; }, [fn]); return useCallback(function f(...args) { if (current.timer) { //@ts-ignore clearTimeout(current.timer); } //@ts-ignore current.timer = setTimeout(() => { //@ts-ignore current.fn.call(this, ...args); }, delay); }, dep) }; const isEmpty = (value: any) => { try { if (value === null || value === undefined || value === "" || JSON.stringify(value) === '{}') { return true }; return false; } catch (e) { return true; } }; const getFileType = (file_path: string) => { try { let index = file_path.lastIndexOf("."); return '.' + file_path.substr(index + 1); } catch (e) { return '' } }; const filterSqlRows = (res) => { var len = res.rows.length; let rows = new Array; for (let i = 0; i < len; i++) { let row = res.rows.item(i); rows.push(row); // console.log(`Employee name: ${row.name}, Dept Name: ${row.deptName}`); }; return rows; } const goImagePreviewer = (previewerImages, index: number) => { navigate('ImagePreViewer', { imgs: previewerImages, index }) }; const copyText = (text = '') => { try { Clipboard.setString(text); toastShort("复制成功!") } catch (e) { toastShort("很抱歉,复制失败!") } }; const checkIsJSON = (json_value: string) => { try { JSON.parse(json_value); return true; } catch (e) { return false; } }; const sizeof = (str, charset) => { var total = 0, charCode, i, len; charset = charset ? charset.toLowerCase() : ''; if (charset === 'utf-16' || charset === 'utf16') { for (i = 0, len = str.length; i < len; i++) { charCode = str.charCodeAt(i); if (charCode <= 0xffff) { total += 2; } else { total += 4; } } } else { for (i = 0, len = str.length; i < len; i++) { charCode = str.charCodeAt(i); if (charCode <= 0x007f) { total += 1; } else if (charCode <= 0x07ff) { total += 2; } else if (charCode <= 0xffff) { total += 3; } else { total += 4; } } } return total; }; const deepCopy = (data: any): any => { return JSON.parse(JSON.stringify(data)); } const formatTime = (nS: number, type: 'YY' | 'MM' | 'DD' | 'HH' | 'MIN' | 'SS', mode: 'normal' | 'fit') => { const date = new Date(Number(nS) * 1000); switch (type) { case 'YY': return date.getFullYear().toString(); case 'MM': let mm = date.getMonth() + 1 + ''; if (Number(mm) < 10 && mode === 'fit') { mm = '0' + mm; } return mm case 'DD': let dd = date.getDate().toString(); if (Number(dd) < 10 && mode === 'fit') { dd = '0' + dd; } return dd; case 'HH': let hh = date.getHours().toString(); if (Number(hh) < 10 && mode === 'fit') { hh = '0' + hh } return hh; case 'MIN': let min = date.getMinutes().toString(); if (Number(min) < 10 && mode === 'fit') { min = '0' + min; }; // console.log("转换好的", min) return min; case 'SS': return date.getSeconds(); default: return date.getFullYear(); } }; const mregeArr = (arr1: Array, arr2: Array, attr: string) => { let newArr = arr1.concat(arr2); let tempArr = new Array; for (const item1 of newArr) { //循环数组对象的内容 let flag = true; //建立标记,判断数据是否重复,true为不重复 for (const item2 of newArr) { //循环新数组的内容 if (item1[attr] == item2[attr]) { //让数组对象的内容与新数组的内容作比较,相同的话,改变标记为false flag = false; } } if (flag) { //判断是否重复 tempArr.push(item1); //不重复的放入新数组。 新数组的内容会继续进行上边的循环。 } }; return tempArr; }; const trimStrSpace = (str) => { return str.replace(/(^\s*)|(\s*$)/g, ""); } const isInteger = (value) => { return value % 1 === 0 } const rstr2b64 = (input) => { try { b64pad } catch (e) { b64pad = ''; } let tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; let output = ""; let len = input.length; for (let i = 0; i < len; i += 3) { let triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0); for (let j = 0; j < 4; j++) { if (i * 8 + j * 6 > input.length * 8) output += b64pad; else output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F); } } return output; }; const filterPriceDot = (value: any): number => { return parseFloat(Number(value)); }; const layout = StyleSheet.create({ page: { flex: 1, justifyContent: 'center', alignItems: "center" // paddingHorizontal: px2dp(12.5), // paddingTop: px2dp(10) } }) //生成固定长度数组 const generateArray = (n) => { let arr = new Array(n); for (let i = 0; i < n; i++) { arr[i] = i; } return arr; } const deviceInfo = () => { try { // console.log("获取设备信息成功") let deviceInfo = { deviceId: DeviceInfo.getDeviceId(), uniqueId: DeviceInfo.getUniqueId(), Manufacturer: DeviceInfo.getManufacturerSync(), phoneNum: DeviceInfo.getPhoneNumberSync(), //SIM主卡手机号 osVersion: DeviceInfo.getBaseOsSync(), userAgent: DeviceInfo.getUserAgentSync(), sysVersion: DeviceInfo.getSystemVersion(), }; // console.log("deviceInfo", deviceInfo) store.dispatch(getDeviceInfo(deviceInfo)) return deviceInfo // getDeviceInfo(deviceInfo) } catch (error) { console.log("错误是:", error) toast("错误是:", error) } } const replaceSymbol = (str: any) => { // if(typeof) // let s="" // s.replace() // let s = str.replace(/[^0-9]/ig, "") // console.log("替换:", s) // str.replace(/[^0-9]/ig, "") return str.replace(/[^0-9]/ig, "") } const urlTextCheck = (str: any) => { let letterPattern = /[a-zA-Z]+/g; // let matches = str.match(letterPattern); let matches = str.replace(letterPattern, "") // let string = matches[0]; // return matches console.log("matches:", matches, str) } const getLength = (str) => { return str.replace(/[\u0391-\uFFE5]/g, "aa").length; //先把中文替换成两个字节的英文,在计算长度 }; //计算字符串字节数 const getBytesLength = (str) => { return str.replace(/[^\x00-\xff]/g, 'xx').length; } class StorageUtil { //使用的时候需要加 await 才可取到值 static get = (key) => { return AsyncStorage.getItem(key).then((value) => { let jsonValue = JSON.parse(value); console.log(1111) return jsonValue; }); } static save = async (key, value) => { // try { // console.log("到这里了11", value) return AsyncStorage.setItem(key, JSON.stringify(value)); // } catch (e) { // // 保存失败 // console.log("保存失败:", e) // } } static update(key, value) { return StorageUtil.get(key).then((item) => { value = typeof value === 'string' ? value : Object.assign({ }, item, value); return AsyncStorage.setItem(key, JSON.stringify(value)); }); } static delete(key) { return AsyncStorage.removeItem(key); } } // 检测数据类型的函数 const typeString = (obj) => { var cons = Object.prototype.toString.call(obj).slice(8, -1) return (cons === 'Array' || cons === 'Object') } // 实现深度拷贝 Array/Object const deepClone = (oldObj) => { if (typeString(oldObj)) { var newObj = oldObj.constructor() for (let i in oldObj) { if (oldObj.hasOwnProperty(i)) { newObj[i] = typeString(oldObj[i]) ? deepClone(oldObj[i]) : oldObj[i] } } return newObj; } else { return oldObj } } export { version, size, width, height, statusBarHeight, colors, onePx, BaseUrl, wxConfig, px2dp, getTime, toast, isIos, isIphoneX, GetClear, myConfirm, jsQueryFileName, toastShort, getLayout, moveTaskToBack, hideUserName, hideTel, clearToast, handleUrl, debounce, useDebounce, hideAccount, getLocalTime, getFullTime, checkMaxDate, getDate2NsAsDate, isEmpty, getFileType, getChatLocalTime, filterSqlRows, goImagePreviewer, copyText, checkIsJSON, sizeof, deepCopy, formatTime, mregeArr, trimStrSpace, isInteger, rstr2b64, toastWithHandler, filterPriceDot, layout, generateArray, deviceInfo, replaceSymbol, toastHide, urlTextCheck, loadingShow, loadingHide, StorageUtil, loadingToastShow, loadingToastHide, getLength, getBytesLength, deepClone }