utils.js 7.7 KB

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