utils.js 8.0 KB

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