utils.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. import { Linking, Platform } from "react-native";
  2. import { showLocation } from 'react-native-map-link'
  3. import { host } from '../api/http';
  4. import apiUser from "../api/apiUser";
  5. import { getStorageSync, setStorage } from "./storage";
  6. import { PERMISSIONS } from "react-native-permissions";
  7. import app from '../../app.json';
  8. import { PageList } from "../pages/Router";
  9. import crashlytics from '@react-native-firebase/crashlytics';
  10. /**
  11. * 工具集
  12. * @邠心vbe on 2021/04/20
  13. */
  14. const formatNumber = (n) => {
  15. n = n.toString()
  16. return n[1] ? n : '0' + n
  17. }
  18. export default {
  19. getDistance(dis) {
  20. if (dis) {
  21. if (dis > 1000) {
  22. return Number((dis / 1000).toFixed(1)) + 'km';
  23. } else {
  24. return dis + 'm';
  25. }
  26. } else {
  27. return 'NA';
  28. }
  29. },
  30. directMaps(lat, lng, address) {
  31. if (isIOS) {
  32. showLocation({
  33. latitude: lat,
  34. longitude: lng,
  35. title: address,
  36. dialogMessage: "",
  37. googleForceLatLon: true
  38. }).catch(erros => {
  39. console.warn("directMaps", erros);
  40. });
  41. } else {
  42. var uri = "geo:" + lat + "," + lng + "?q=" + lat + "," + lng + "(" + address + ")";
  43. Linking.openURL(uri).catch(erros => {
  44. console.warn("directMaps", erros);
  45. });
  46. }
  47. },
  48. getSiteInfo(obj) {
  49. if (obj) {
  50. const acRates = [], dcRates = [];
  51. obj?.rates.forEach((item) => {
  52. if (item.type?.indexOf('AC') >= 0) {
  53. acRates.push(item)
  54. } else {
  55. dcRates.push(item)
  56. }
  57. })
  58. return {
  59. id: obj.sitePk,
  60. name: obj.siteName,
  61. address: obj.siteAddress,
  62. latitude: obj.locationLatitude,
  63. longitude: obj.locationLongitude,
  64. acConnector: obj.acConnector,
  65. allConnector: obj.allConnector,
  66. dcConnector: obj.dcConnector,
  67. distance: this.getDistance(obj.distance),
  68. favorite: obj.favorite,
  69. acRates: acRates,
  70. dcRates: dcRates,
  71. idleFee: obj.idleDetail,
  72. labels: obj.siteLabels,
  73. upcoming: obj.upcoming,
  74. rateList: obj.rates,
  75. siteType: obj.siteType,
  76. parkingFee: obj.parkingFee,
  77. hasDiscount: obj.hasDiscount,
  78. parkingFeeFree: obj.free,
  79. operatingHours: obj.operatingHours,
  80. additionalNotes: obj.additionalNotes,
  81. endlessService: obj.endlessService,
  82. serviceProvider: obj.serviceProvider,
  83. enableReservation: obj.enableReservation,
  84. payPerUseAmount: obj.payPerUseAmount
  85. }
  86. } else {
  87. return {id: 0}
  88. }
  89. },
  90. getNowHHmm() {
  91. const now = new Date();
  92. var month = now.getHours();
  93. var minute = now.getMinutes();
  94. return [month, minute].map(formatNumber).join(':');
  95. },
  96. getYYMMdd(date) {
  97. var year = date.getFullYear()
  98. var month = date.getMonth() + 1
  99. var day = date.getDate()
  100. //var hour = date.getHours()
  101. //var minute = date.getMinutes()
  102. //var second = date.getSeconds()
  103. return [year, month, day].map(formatNumber).join('/')
  104. },
  105. formatYYMM(date) {
  106. var year = date.getFullYear()
  107. var month = date.getMonth() + 1
  108. return [year, month].map(formatNumber).join('-')
  109. },
  110. hour2HHmm(hour) {
  111. if (hour) {
  112. if (hour > 0) {
  113. const h = parseInt(hour);
  114. const m = (hour - h) * 60;
  115. return h + ' hr ' + parseInt(m) + 'min';
  116. } else {
  117. const m = hour * 60;
  118. return parseInt(m) + 'min';
  119. }
  120. } else {
  121. return '0 min';
  122. }
  123. },
  124. minutes2HHmm(minutes) {
  125. if (minutes) {
  126. const m = Number(minutes);
  127. if (m > 60) {
  128. const h = m / 60;
  129. const mm = m % 60;
  130. return parseInt(h) + ' hr ' + parseInt(mm) + ' min';
  131. } else {
  132. return parseInt(minutes) + ' min';
  133. }
  134. } else {
  135. return '0 min';
  136. }
  137. },
  138. minutes2HHMM(minutes) {
  139. if (minutes) {
  140. const m = Number(minutes);
  141. if (m > 60) {
  142. const h = m / 60;
  143. const mm = m % 60;
  144. if (h >= 24) {
  145. const hh = h % 24;
  146. const d = h / 24;
  147. return parseInt(d) + "d " + formatNumber(parseInt(hh)) + ':' + formatNumber(parseInt(mm));
  148. } else {
  149. return formatNumber(parseInt(h)) + ':' + formatNumber(parseInt(mm));
  150. }
  151. } else {
  152. return '00:' + formatNumber(parseInt(minutes));
  153. }
  154. } else {
  155. return '00:00';
  156. }
  157. },
  158. /**
  159. * 判断指定对象是否为空
  160. * @param {*} str 判定对象(字符串、数字、JSON)
  161. * @param {Boolean} encNo 是否判定数字(为true则数字0判定为空)
  162. */
  163. isEmpty(str, encNo=false) {
  164. if (typeof str == 'number') {
  165. if (encNo) {
  166. return str === 0;
  167. } else {
  168. return false;
  169. }
  170. } else if (str) {
  171. if (typeof str == 'object') {
  172. return Object.keys(str).length == 0;
  173. } else if (Array.isArray(str)) {
  174. return str.length == 0;
  175. } else {
  176. if (str == undefined || str == null || str == "")
  177. return true;
  178. return false;
  179. }
  180. } else {
  181. return true;
  182. }
  183. },
  184. isNotEmpty(str, encNo) {
  185. return !this.isEmpty(str, encNo);
  186. },
  187. getParamsFromUrl(url) {
  188. var params = {}
  189. const list = url.split('&');
  190. for (let item of list) {
  191. if (item.indexOf('=') > 0) {
  192. const param = item.split('=');
  193. if (param.length == 2)
  194. params[param[0]] = param[1];
  195. }
  196. }
  197. return params;
  198. },
  199. /**
  200. * 将数组以指定分隔符组装为字符串
  201. * @param {Array} arrays 源数组
  202. * @param {String} spect 分隔符
  203. */
  204. join(arrays=[], spect="") {
  205. let str = ''
  206. if (arrays) {
  207. arrays.forEach((item, index) => {
  208. if (index == 0) {
  209. str += item;
  210. } else {
  211. str += spect + item;
  212. }
  213. });
  214. }
  215. return str;
  216. },
  217. /**
  218. * 将给定数字保留任意位小数
  219. * @param {number} text 源数字
  220. * @param {number} scape 小数位
  221. * @returns 小数
  222. */
  223. toFixed(text, scape) {
  224. if (text) {
  225. return Number(Number(text).toFixed(scape));
  226. } else {
  227. return text;
  228. }
  229. },
  230. /**
  231. * 16进制颜色转为RGB
  232. * @param {*} value 16进制颜色
  233. * @returns {Array} RGB数据
  234. */
  235. hexColorToRgb(value) {
  236. let sColor = value.toLowerCase()
  237. if (sColor && sColor.indexOf("#") >= 0) {
  238. if (sColor.length === 4) {
  239. let sColorNew = '#'
  240. for (let i = 1; i < 4; i += 1) {
  241. sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
  242. }
  243. sColor = sColorNew
  244. }
  245. // 处理1+6位的颜色值
  246. let sColorChange = []
  247. for (let i = 1; i < 7; i += 2) {
  248. sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2)))
  249. }
  250. return sColorChange;//'rgb(' + sColorChange.join(',') + ')'
  251. } else if (sColor && sColor.indexOf("0x") >= 0) {
  252. if (sColor.length === 4) {
  253. let sColorNew = '0x'
  254. for (let i = 1; i < 4; i += 1) {
  255. sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
  256. }
  257. sColor = sColorNew
  258. }
  259. // 处理2+6位的颜色值
  260. let sColorChange = []
  261. for (let i = 2; i < 8; i += 2) {
  262. sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2)))
  263. }
  264. return sColorChange;//'rgb(' + sColorChange.join(',') + ')'
  265. }
  266. return sColor
  267. },
  268. /**
  269. * 给颜色值添加透明度
  270. * @param {Array} colors 10进制颜色
  271. * @param {Number} alpha 透明度(0-1)
  272. */
  273. getRgbaColor(colors, alpha=1) {
  274. if (colors.length == 3) {
  275. return "rgba(" + this.join(colors, ",") + "," +alpha + ")";
  276. }
  277. },
  278. /**
  279. * 注册FCM通知token
  280. * @param {String} token 原始保存的Firebase令牌
  281. * @param {Function} back 执行结果(boolean)
  282. */
  283. async registerFirebaseToken(token, back) {
  284. const thisDate = this.formatYYMM(new Date()) + "-" + getUserId();
  285. const lastDate = await getStorageSync('RegisterTokenDate');
  286. console.log('>>>RegisterToken<<<', thisDate, lastDate + "●");
  287. if (thisDate != lastDate || token != notifyToken.token) {
  288. const params = {
  289. os: isIOS ? "ios": "android",
  290. googleToken: notifyToken.token
  291. }
  292. apiUser.setNotifyToken(params).then(res => {
  293. console.log('>>>RegisterToken-Suc<<<', res);
  294. setStorage('RegisterTokenDate', thisDate);
  295. if (back) back(true);
  296. }).catch(err => {
  297. console.log('>>>RegisterToken-Err<<<', err);
  298. if (back) back(false);
  299. });
  300. } else {
  301. if (back) back(false);
  302. }
  303. },
  304. setBackClick(routeNames, func) {
  305. global.pageBackFallback = {
  306. names: routeNames,
  307. callback: func
  308. }
  309. },
  310. getImageUrl(path) {
  311. if (path && path.indexOf("http") >= 0) {
  312. return path;
  313. } else {
  314. return host + path;
  315. }
  316. },
  317. getFilePermissionString() {
  318. if (Platform.Version >= 33) {
  319. return PERMISSIONS.ANDROID.READ_MEDIA_IMAGES;
  320. } else {
  321. return PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE;
  322. }
  323. },
  324. toChargeDetailPage(sitePk, action, form) {
  325. if (app.charge.version == 1) {
  326. startPage(PageList.chargeDetail, { stationInfo: {id: sitePk}, action: action, from: form});
  327. } else {
  328. startPage(PageList.chargeDetailPage, {stationInfo: {id: sitePk}, action: action, from: form});
  329. }
  330. },
  331. toChargingPage(connectorInfo) {
  332. startPage(app.charge.version == 4 ? PageList.chargingPageV4 : PageList.chargingPage, connectorInfo);
  333. },
  334. /**
  335. * 校验邮箱是否合法
  336. * @param {String} email 邮箱地址
  337. * @returns {Boolean}
  338. */
  339. isValidEmail(email) {
  340. const pattern = /^[a-zA-Z0-9]+[\S]*@[a-zA-Z0-9_-]+[\.][\Sa-zA-Z]+$/
  341. return pattern.test(email)
  342. },
  343. logEventTracking(event, message="") {
  344. if (app.debug && event && message) {
  345. console.log("已记录事件跟踪", event, message);
  346. if (message) {
  347. crashlytics().log(event + ": " + message);
  348. } else {
  349. crashlytics().log(event);
  350. }
  351. }
  352. }
  353. }