utils.js 8.5 KB

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