CountryIcon.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  1. /**
  2. * 国家图标组件
  3. * @邠心vbe on 2021/10/08
  4. */
  5. import React from 'react';
  6. import { Image, StyleSheet, Text } from 'react-native';
  7. import countries from './countrys.json';
  8. import Button from './Button';
  9. import apiUser from '../api/apiUser';
  10. const RNCountryList = {
  11. AD: require('../images/country/AD.png'),
  12. AE: require('../images/country/AE.png'),
  13. AF: require('../images/country/AF.png'),
  14. AG: require('../images/country/AG.png'),
  15. AI: require('../images/country/AI.png'),
  16. AL: require('../images/country/AL.png'),
  17. AM: require('../images/country/AM.png'),
  18. AO: require('../images/country/AO.png'),
  19. AR: require('../images/country/AR.png'),
  20. AS: require('../images/country/AS.png'),
  21. AT: require('../images/country/AT.png'),
  22. AU: require('../images/country/AU.png'),
  23. AW: require('../images/country/AW.png'),
  24. AX: require('../images/country/AX.png'),
  25. AZ: require('../images/country/AZ.png'),
  26. BA: require('../images/country/BA.png'),
  27. BB: require('../images/country/BB.png'),
  28. BD: require('../images/country/BD.png'),
  29. BE: require('../images/country/BE.png'),
  30. BF: require('../images/country/BF.png'),
  31. BG: require('../images/country/BG.png'),
  32. BH: require('../images/country/BH.png'),
  33. BI: require('../images/country/BI.png'),
  34. BJ: require('../images/country/BJ.png'),
  35. BL: require('../images/country/BL.png'),
  36. BM: require('../images/country/BM.png'),
  37. BN: require('../images/country/BN.png'),
  38. BO: require('../images/country/BO.png'),
  39. BQ: require('../images/country/BQ.png'),
  40. BR: require('../images/country/BR.png'),
  41. BS: require('../images/country/BS.png'),
  42. BT: require('../images/country/BT.png'),
  43. BW: require('../images/country/BW.png'),
  44. BY: require('../images/country/BY.png'),
  45. BZ: require('../images/country/BZ.png'),
  46. CA: require('../images/country/CA.png'),
  47. CC: require('../images/country/CC.png'),
  48. CD: require('../images/country/CD.png'),
  49. CF: require('../images/country/CF.png'),
  50. CG: require('../images/country/CG.png'),
  51. CH: require('../images/country/CH.png'),
  52. CI: require('../images/country/CI.png'),
  53. CK: require('../images/country/CK.png'),
  54. CL: require('../images/country/CL.png'),
  55. CM: require('../images/country/CM.png'),
  56. CN: require('../images/country/CN.png'),
  57. CO: require('../images/country/CO.png'),
  58. CR: require('../images/country/CR.png'),
  59. CU: require('../images/country/CU.png'),
  60. CV: require('../images/country/CV.png'),
  61. CW: require('../images/country/CW.png'),
  62. CX: require('../images/country/CX.png'),
  63. CY: require('../images/country/CY.png'),
  64. CZ: require('../images/country/CZ.png'),
  65. DE: require('../images/country/DE.png'),
  66. DJ: require('../images/country/DJ.png'),
  67. DK: require('../images/country/DK.png'),
  68. DM: require('../images/country/DM.png'),
  69. DO: require('../images/country/DO.png'),
  70. DZ: require('../images/country/DZ.png'),
  71. EC: require('../images/country/EC.png'),
  72. EE: require('../images/country/EE.png'),
  73. EG: require('../images/country/EG.png'),
  74. EH: require('../images/country/EH.png'),
  75. ER: require('../images/country/ER.png'),
  76. ES: require('../images/country/ES.png'),
  77. ET: require('../images/country/ET.png'),
  78. FI: require('../images/country/FI.png'),
  79. FJ: require('../images/country/FJ.png'),
  80. FK: require('../images/country/FK.png'),
  81. FM: require('../images/country/FM.png'),
  82. FO: require('../images/country/FO.png'),
  83. FR: require('../images/country/FR.png'),
  84. GA: require('../images/country/GA.png'),
  85. GB: require('../images/country/GB.png'),
  86. GD: require('../images/country/GD.png'),
  87. GE: require('../images/country/GE.png'),
  88. GF: require('../images/country/GF.png'),
  89. GG: require('../images/country/GG.png'),
  90. GH: require('../images/country/GH.png'),
  91. GI: require('../images/country/GI.png'),
  92. GM: require('../images/country/GM.png'),
  93. GN: require('../images/country/GN.png'),
  94. GP: require('../images/country/GP.png'),
  95. GQ: require('../images/country/GQ.png'),
  96. GR: require('../images/country/GR.png'),
  97. GT: require('../images/country/GT.png'),
  98. GU: require('../images/country/GU.png'),
  99. GW: require('../images/country/GW.png'),
  100. GY: require('../images/country/GY.png'),
  101. HK: require('../images/country/HK.png'),
  102. HN: require('../images/country/HN.png'),
  103. HR: require('../images/country/HR.png'),
  104. HT: require('../images/country/HT.png'),
  105. HU: require('../images/country/HU.png'),
  106. ID: require('../images/country/ID.png'),
  107. IE: require('../images/country/IE.png'),
  108. IL: require('../images/country/IL.png'),
  109. IM: require('../images/country/IM.png'),
  110. IN: require('../images/country/IN.png'),
  111. IO: require('../images/country/IO.png'),
  112. IQ: require('../images/country/IQ.png'),
  113. IR: require('../images/country/IR.png'),
  114. IS: require('../images/country/IS.png'),
  115. IT: require('../images/country/IT.png'),
  116. JE: require('../images/country/JE.png'),
  117. JM: require('../images/country/JM.png'),
  118. JO: require('../images/country/JO.png'),
  119. JP: require('../images/country/JP.png'),
  120. KE: require('../images/country/KE.png'),
  121. KG: require('../images/country/KG.png'),
  122. KH: require('../images/country/KH.png'),
  123. KI: require('../images/country/KI.png'),
  124. KM: require('../images/country/KM.png'),
  125. KN: require('../images/country/KN.png'),
  126. KP: require('../images/country/KP.png'),
  127. KR: require('../images/country/KR.png'),
  128. KS: require('../images/country/KS.png'),
  129. KW: require('../images/country/KW.png'),
  130. KY: require('../images/country/KY.png'),
  131. KZ: require('../images/country/KZ.png'),
  132. LA: require('../images/country/LA.png'),
  133. LB: require('../images/country/LB.png'),
  134. LC: require('../images/country/LC.png'),
  135. LI: require('../images/country/LI.png'),
  136. LK: require('../images/country/LK.png'),
  137. LR: require('../images/country/LR.png'),
  138. LS: require('../images/country/LS.png'),
  139. LT: require('../images/country/LT.png'),
  140. LU: require('../images/country/LU.png'),
  141. LV: require('../images/country/LV.png'),
  142. LY: require('../images/country/LY.png'),
  143. MA: require('../images/country/MA.png'),
  144. MC: require('../images/country/MC.png'),
  145. MD: require('../images/country/MD.png'),
  146. ME: require('../images/country/ME.png'),
  147. MF: require('../images/country/MF.png'),
  148. MG: require('../images/country/MG.png'),
  149. MH: require('../images/country/MH.png'),
  150. MK: require('../images/country/MK.png'),
  151. ML: require('../images/country/ML.png'),
  152. MM: require('../images/country/MM.png'),
  153. MN: require('../images/country/MN.png'),
  154. MO: require('../images/country/MO.png'),
  155. MP: require('../images/country/MP.png'),
  156. MQ: require('../images/country/MQ.png'),
  157. MR: require('../images/country/MR.png'),
  158. MS: require('../images/country/MS.png'),
  159. MT: require('../images/country/MT.png'),
  160. MU: require('../images/country/MU.png'),
  161. MV: require('../images/country/MV.png'),
  162. MW: require('../images/country/MW.png'),
  163. MX: require('../images/country/MX.png'),
  164. MY: require('../images/country/MY.png'),
  165. MZ: require('../images/country/MZ.png'),
  166. NA: require('../images/country/NA.png'),
  167. NC: require('../images/country/NC.png'),
  168. NE: require('../images/country/NE.png'),
  169. NF: require('../images/country/NF.png'),
  170. NG: require('../images/country/NG.png'),
  171. NI: require('../images/country/NI.png'),
  172. NL: require('../images/country/NL.png'),
  173. NO: require('../images/country/NO.png'),
  174. NP: require('../images/country/NP.png'),
  175. NR: require('../images/country/NR.png'),
  176. NU: require('../images/country/NU.png'),
  177. NZ: require('../images/country/NZ.png'),
  178. OM: require('../images/country/OM.png'),
  179. PA: require('../images/country/PA.png'),
  180. PE: require('../images/country/PE.png'),
  181. PF: require('../images/country/PF.png'),
  182. PG: require('../images/country/PG.png'),
  183. PH: require('../images/country/PH.png'),
  184. PK: require('../images/country/PK.png'),
  185. PL: require('../images/country/PL.png'),
  186. PM: require('../images/country/PM.png'),
  187. PR: require('../images/country/PR.png'),
  188. PS: require('../images/country/PS.png'),
  189. PT: require('../images/country/PT.png'),
  190. PW: require('../images/country/PW.png'),
  191. PY: require('../images/country/PY.png'),
  192. QA: require('../images/country/QA.png'),
  193. RE: require('../images/country/RE.png'),
  194. RO: require('../images/country/RO.png'),
  195. RS: require('../images/country/RS.png'),
  196. RU: require('../images/country/RU.png'),
  197. RW: require('../images/country/RW.png'),
  198. SA: require('../images/country/SA.png'),
  199. SB: require('../images/country/SB.png'),
  200. SC: require('../images/country/SC.png'),
  201. SD: require('../images/country/SD.png'),
  202. SE: require('../images/country/SE.png'),
  203. SG: require('../images/country/SG.png'),
  204. SH: require('../images/country/SH.png'),
  205. SI: require('../images/country/SI.png'),
  206. SJ: require('../images/country/SJ.png'),
  207. SK: require('../images/country/SK.png'),
  208. SL: require('../images/country/SL.png'),
  209. SM: require('../images/country/SM.png'),
  210. SN: require('../images/country/SN.png'),
  211. SO: require('../images/country/SO.png'),
  212. SR: require('../images/country/SR.png'),
  213. SS: require('../images/country/SS.png'),
  214. ST: require('../images/country/ST.png'),
  215. SV: require('../images/country/SV.png'),
  216. SX: require('../images/country/SX.png'),
  217. SY: require('../images/country/SY.png'),
  218. SZ: require('../images/country/SZ.png'),
  219. TC: require('../images/country/TC.png'),
  220. TD: require('../images/country/TD.png'),
  221. TG: require('../images/country/TG.png'),
  222. TH: require('../images/country/TH.png'),
  223. TJ: require('../images/country/TJ.png'),
  224. TK: require('../images/country/TK.png'),
  225. TL: require('../images/country/TL.png'),
  226. TM: require('../images/country/TM.png'),
  227. TN: require('../images/country/TN.png'),
  228. TO: require('../images/country/TO.png'),
  229. TR: require('../images/country/TR.png'),
  230. TT: require('../images/country/TT.png'),
  231. TV: require('../images/country/TV.png'),
  232. TW: require('../images/country/TW.png'),
  233. TZ: require('../images/country/TZ.png'),
  234. UA: require('../images/country/UA.png'),
  235. UG: require('../images/country/UG.png'),
  236. US: require('../images/country/US.png'),
  237. UY: require('../images/country/UY.png'),
  238. UZ: require('../images/country/UZ.png'),
  239. VA: require('../images/country/VA.png'),
  240. VC: require('../images/country/VC.png'),
  241. VE: require('../images/country/VE.png'),
  242. VG: require('../images/country/VG.png'),
  243. VI: require('../images/country/VI.png'),
  244. VN: require('../images/country/VN.png'),
  245. VU: require('../images/country/VU.png'),
  246. WF: require('../images/country/WF.png'),
  247. WS: require('../images/country/WS.png'),
  248. YE: require('../images/country/YE.png'),
  249. YT: require('../images/country/YT.png'),
  250. ZA: require('../images/country/ZA.png'),
  251. ZM: require('../images/country/ZM.png'),
  252. ZW: require('../images/country/ZW.png')
  253. }
  254. //const RNCurrencyList = ['SG', 'US', 'MY', 'HK', 'AU', 'CA', 'PH', 'ID', 'NZ', 'JP']
  255. export const CountryIcon = (
  256. {
  257. style={},
  258. width=24,
  259. height=16,
  260. borderRadius=2,
  261. countryCode='SG'
  262. }
  263. ) => (
  264. <Image
  265. style={
  266. {
  267. width: width,
  268. height: height,
  269. borderRadius: borderRadius,
  270. ...style //Any image styles
  271. }
  272. }
  273. source={
  274. //**SG
  275. RNCountryList[countryCode ?? 'SG']
  276. }
  277. />
  278. )
  279. export const GetCountryList = (back) => {
  280. if (global.ComCountryList === undefined) {
  281. console.log('--------------------------------------------------------');
  282. console.log('--START--', 'GetCountryList');
  283. const list = []
  284. //const curl = []
  285. //console.log('原始国家', countries.length);
  286. apiUser.getCountryList().then(res => {
  287. if (res.data && res.data.length) {
  288. res.data.forEach(item => {
  289. const country = {
  290. countryNum: item.callingCode,
  291. countryCode: item.countryCode,
  292. countryName: item.countryName,
  293. currency: item.currency,
  294. currencySign: item.currencySymbol
  295. };
  296. list.push(country);
  297. })
  298. if (list.length > 0) {
  299. global.ComCountryList = list;
  300. if (back) back(global.ComCountryList);
  301. }
  302. }
  303. }).catch(err => {
  304. countries.forEach(item => {
  305. if (RNCountryList[item.countryCode] !== undefined && item.region !== 'Antarctic' && item.subregion !== 'Polynesia' && !item.exclude) {
  306. //item.subregion === 'Eastern Asia' || item.subregion === 'South-Eastern Asia') {
  307. const country = {
  308. countryNum: item.callingCode[0],
  309. countryCode: item.countryCode,
  310. countryName: item.countryName,
  311. currencySign: item.currencySign,
  312. currency: item.currency[0]
  313. };
  314. list.push(country);
  315. /*if (RNCurrencyList.indexOf(item.countryCode) >= 0) {
  316. curl.push(country);
  317. }*/
  318. }
  319. })
  320. //console.log('最终国家', list.length);
  321. if (list.length > 0) {
  322. global.ComCountryList = list;
  323. //global.CurCountryList = curl;
  324. if (back) back(global.ComCountryList);
  325. }
  326. });
  327. } else {
  328. if (back) back(global.ComCountryList);
  329. }
  330. }
  331. export const GetCurrencyCountryList = (back) => {
  332. if (global.CurCountryList === undefined) {
  333. GetCountryList(list => {
  334. if (back) back(global.CurCountryList);
  335. })
  336. } else {
  337. if (back) back(global.CurCountryList);
  338. }
  339. }
  340. /**
  341. * 根据国家代码查询国家信息
  342. * @param {*} countryCode 国家代码
  343. * @returns 国家信息
  344. */
  345. export const GetCountryByCode = (countryCode, back) => {
  346. if (countryCode) {
  347. GetCountryList(list => {
  348. for (let item of list) {
  349. //console.log(item.countryCode, item.countryCode === countryCode);
  350. if (item.countryCode === countryCode) {
  351. if (back) back(item);
  352. break;
  353. }
  354. }
  355. })
  356. } else {
  357. if (back) back(undefined);
  358. }
  359. }
  360. /**
  361. * 根据国家代码查询国家信息
  362. * @param {*} countryCode 国家代码
  363. * @returns 国家信息
  364. */
  365. export const GetCountryByNum = (countryNum, back) => {
  366. if (global.ComCountryList && countryNum) {
  367. for (let item of global.ComCountryList) {
  368. //console.log(item.countryNum, item.countryNum === countryNum);
  369. if (item.countryNum === countryNum) {
  370. if (back) back(item);
  371. break;
  372. }
  373. }
  374. } else {
  375. if (back) back(undefined);
  376. }
  377. }
  378. /**
  379. * CallingCode下拉框组件
  380. * @param {*} param0 国家信息{country, value, onClick}
  381. * @returns 下拉框组件
  382. */
  383. export const CountryDropNum = ({country, value, onClick}) => {
  384. return (
  385. <Button
  386. style={styles.countryDropItem}
  387. viewStyle={styles.countryDropItemView}
  388. onClick={onClick}>
  389. <CountryIcon
  390. borderRadius={0}
  391. style={styles.iconBorder}
  392. countryCode={country.countryCode}/>
  393. <Text style={styles.countryDropItemText}>{country.countryName} ({'+'+country.countryNum})</Text>
  394. { value == country.countryNum &&
  395. <MaterialIcons
  396. name='check-circle'
  397. color={colorAccent}
  398. size={20}/>
  399. }
  400. </Button>
  401. )
  402. }
  403. /**
  404. * 国家名称下拉框组件
  405. * @param {*} param0 国家信息{country, value, onClick}
  406. * @returns 下拉框组件
  407. */
  408. export const CountryDropCode = ({country, value, onClick}) => {
  409. return (
  410. <Button
  411. style={styles.countryDropItem}
  412. viewStyle={styles.countryDropItemView}
  413. onClick={onClick}>
  414. <CountryIcon
  415. style={styles.iconBorder}
  416. borderRadius={0}
  417. countryCode={country.countryCode}/>
  418. <Text style={styles.countryDropItemText}>{country.countryName}</Text>
  419. { value == country.countryCode &&
  420. <MaterialIcons
  421. name='check-circle'
  422. color={colorAccent}
  423. size={20}/>
  424. }
  425. </Button>
  426. )
  427. }
  428. /**
  429. * 货币符号下拉框组件
  430. * @param {*} param0 国家信息{country, value, onClick}
  431. * @returns 下拉框组件
  432. */
  433. export const CountryDropCurrency = ({country, value, onClick}) => {
  434. return (
  435. <Button
  436. style={styles.countryDropItem}
  437. viewStyle={styles.countryDropItemView}
  438. onClick={onClick}>
  439. <CountryIcon
  440. style={styles.iconBorder}
  441. borderRadius={0}
  442. countryCode={country.countryCode}/>
  443. <Text style={styles.countryDropItemText}>{country.countryName} ({country.currencySign})</Text>
  444. { value == country.countryCode
  445. ? <MaterialIcons
  446. name='check-circle'
  447. color={colorAccent}
  448. size={20}/>
  449. : <Text style={styles.countryExchangeRate}>{country.exchangeRate}</Text>
  450. }
  451. </Button>
  452. )
  453. }
  454. const styles = StyleSheet.create({
  455. countryDropItem: {
  456. borderRadius: 0,
  457. backgroundColor: 'white'
  458. },
  459. countryDropItemView: {
  460. flex: 1,
  461. height: 50,
  462. paddingLeft: 16,
  463. paddingRight: 16,
  464. alignItems: 'center',
  465. flexDirection: 'row'
  466. },
  467. countryDropItemText: {
  468. flex: 1,
  469. color: '#333',
  470. fontSize: 14,
  471. paddingLeft: 16
  472. },
  473. countryExchangeRate: {
  474. color: '#999',
  475. fontSize: 10,
  476. },
  477. iconBorder: {
  478. borderWidth: 1,
  479. borderColor: 'rgba(100, 100, 100, .1)'
  480. },
  481. payIcon: {
  482. width: 50,
  483. height: 25
  484. }
  485. })