utils.js 9.4 KB

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