CountryIcon.js 19 KB

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