SummaryV3.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. /**
  2. * V3新版充电结算页面
  3. * @邠心vbe on 2023/12/22
  4. */
  5. import React, { Component } from 'react';
  6. import { View, Text, StyleSheet, ScrollView, RefreshControl } from 'react-native';
  7. import apiCharge from '../../api/apiCharge';
  8. import Button from '../../components/Button';
  9. import Dialog from '../../components/Dialog';
  10. import { MyRefreshProps } from '../../components/ThemesConfig';
  11. import utils from '../../utils/utils';
  12. import { PageList } from '../Router';
  13. import TextView from '../../components/TextView';
  14. import Skeleton from 'react-native-reanimated-skeleton';
  15. export default class SummaryV3 extends Component {
  16. constructor(props) {
  17. super(props);
  18. this.state = {
  19. loading: true,
  20. isActully: true,
  21. refreshing: false,
  22. summaryInfo: {
  23. top: {},
  24. station: {},
  25. connector: {},
  26. chargingFee: {},
  27. idleFee: {},
  28. reservationFee: {},
  29. payment: {}
  30. },
  31. chargingPk: "",
  32. isPendding: false
  33. };
  34. this.action = "";
  35. this.canBack = false;
  36. }
  37. componentDidMount() {
  38. const params = this.props.route.params;
  39. if (params.chargingPk) {
  40. //Dialog.showProgressDialog();
  41. this.setState({
  42. chargingPk: params.chargingPk
  43. })
  44. if (params.action && params.action == "view") {
  45. this.setState({
  46. isActully: false
  47. });
  48. setTimeout(() => {
  49. this.getSummaryData(params.chargingPk);
  50. }, 1000);
  51. } else {
  52. setTimeout(() => {
  53. this.getSummaryData(params.chargingPk);
  54. }, 3000);
  55. }
  56. }
  57. if (params.action) {
  58. this.action = params.action;
  59. }
  60. this.props.navigation.addListener('focus', e => {
  61. this.canBack = false;
  62. });
  63. this.props.navigation.addListener('beforeRemove', e => {
  64. if (this.state.isActully && !this.canBack) {
  65. this.toRating();
  66. e.preventDefault();
  67. }
  68. });
  69. }
  70. getSummaryData(chargingPk) {
  71. apiCharge.getChargeSummaryV2({
  72. chargingPk: chargingPk
  73. }).then(res => {
  74. //Dialog.dismissLoading();
  75. if (res.data) {
  76. this.setState({
  77. loading: false,
  78. refreshing: false,
  79. summaryInfo: res.data,
  80. isPendding: (res.data.hasSettled != true)
  81. });
  82. }
  83. }).catch((err) => {
  84. //Dialog.dismissLoading();
  85. toastShort(err);
  86. this.setState({
  87. isPendding: true,
  88. refreshing: false
  89. });
  90. });
  91. }
  92. onRefresh() {
  93. if (this.state.chargingPk) {
  94. this.setState({
  95. refreshing: true
  96. });
  97. this.getSummaryData(this.state.chargingPk);
  98. }
  99. }
  100. toRating() {
  101. this.canBack = true;
  102. if (this.action == "view") {
  103. goBack();
  104. } else {
  105. //routeUtil.resetToHome(this.props);
  106. startPage(PageList.home);
  107. //startPage(PageList.rating, this.state.stationInfo);
  108. }
  109. }
  110. toTransaction() {
  111. if (this.action == "view") {
  112. goBack();
  113. } else {
  114. startPage(PageList.wallet)
  115. }
  116. }
  117. getSummaryText(data) {
  118. if (this.state.summaryInfo?.paymentType == 'Fleet Credit') {
  119. return '-';
  120. } else {
  121. return currency + '' + (data ?? '0');
  122. }
  123. }
  124. getTaxTitle(title="") {
  125. if (this.state.summaryInfo?.taxRate) {
  126. return title.replace("$s", this.state.summaryInfo.taxRate)
  127. } else {
  128. return title;
  129. }
  130. }
  131. isLoading(precond) {
  132. return utils.isNotEmpty(precond) || this.state.loading;
  133. }
  134. getSkeletonLeft(size=3) {
  135. const list = [];
  136. for (let i = 0; i < size; i++) {
  137. list.push({width: i % 2 ==0 ? '100%' : '70%', height: 18, marginTop: 4, marginBottom: 4, borderRadius: 3});
  138. }
  139. return list;
  140. }
  141. getSkeletonRight(size=3) {
  142. const list = [];
  143. for (let i = 0; i < size; i++) {
  144. list.push({width: '100%', height: 18, marginTop: 4, marginBottom: 4, borderRadius: 3});
  145. }
  146. return list;
  147. }
  148. getSectionSkeleton(size) {
  149. if (this.state.loading) {
  150. return (
  151. <View style={[styles.sections, ui.flexc]}>
  152. <Skeleton
  153. containerStyle={ui.flex2}
  154. isLoading={this.state.loading}
  155. boneColor='#eeeeee'
  156. highlightColor='#f6f6f6'
  157. animationType="shiver"
  158. layout={this.getSkeletonLeft(size)}
  159. animationDirection={'horizontalRight'}>
  160. </Skeleton>
  161. <View style={ui.flex2}></View>
  162. <Skeleton
  163. containerStyle={ui.flex1}
  164. isLoading={this.state.loading}
  165. boneColor='#eeeeee'
  166. highlightColor='#f6f6f6'
  167. animationType="shiver"
  168. layout={this.getSkeletonRight(size)}
  169. animationDirection={'horizontalRight'}>
  170. </Skeleton>
  171. </View>
  172. )
  173. } else {
  174. return <></>
  175. }
  176. }
  177. render() {
  178. if (this.state.isPendding) {
  179. return (
  180. <View style={styles.container}>
  181. <View style={styles.processContent}>
  182. <TextView style={styles.processTitle}>{$t("receipt.processTitle")}</TextView>
  183. <TextView style={styles.processText}>{$t("receipt.processMessage1")}</TextView>
  184. <TextView style={styles.processText}>
  185. {$t("receipt.processMessage2")}
  186. <Text style={[ui.bold, ui.underline]} onPress={() => this.toTransaction()}>{$t("receipt.processMessage3")}</Text>.
  187. </TextView>
  188. <TextView style={styles.processText}>{$t("receipt.processMessage4")}</TextView>
  189. </View>
  190. <View style={styles.bottomButton}>
  191. <Button
  192. text={$t('home.done')}
  193. elevation={1.5}
  194. onClick={() => this.toRating()}/>
  195. </View>
  196. </View>
  197. )
  198. } else {
  199. return (
  200. <ScrollView
  201. style={styles.container}
  202. refreshControl={
  203. <RefreshControl
  204. {...MyRefreshProps()}
  205. refreshing={this.state.refreshing}
  206. onRefresh={() => this.onRefresh()}
  207. />
  208. }>
  209. { this.isLoading(this.state.summaryInfo.top) &&
  210. <View style={styles.headerView}>
  211. { this.state.isActully && <>
  212. <Skeleton
  213. isLoading={this.state.loading}
  214. boneColor='#eeeeee'
  215. highlightColor='#f6f6f6'
  216. animationType="shiver"
  217. layout={[{width: 56, height: 56, borderRadius: 56}]}
  218. animationDirection={'horizontalRight'}>
  219. <Octicons
  220. name="check-circle-fill"
  221. color={colorAccent}
  222. size={56}/>
  223. </Skeleton>
  224. <Skeleton
  225. isLoading={this.state.loading}
  226. boneColor='#eeeeee'
  227. highlightColor='#f6f6f6'
  228. animationType="shiver"
  229. layout={[{width: 60, height: 20, marginTop: 8, borderRadius: 3}]}
  230. animationDirection={'horizontalRight'}>
  231. <TextView style={styles.topTitle}>{$t('receipt.successful')}</TextView>
  232. </Skeleton>
  233. <Skeleton
  234. isLoading={this.state.loading}
  235. boneColor='#eeeeee'
  236. highlightColor='#f6f6f6'
  237. animationType="shiver"
  238. layout={[{width: 100, height: 18, marginTop: 4, marginBottom: 32, borderRadius: 3}]}
  239. animationDirection={'horizontalRight'}>
  240. <TextView style={styles.topDesc}>{$t('receipt.chargingSessionComplete')}</TextView>
  241. </Skeleton>
  242. </>}
  243. { utils.isNotEmpty(this.state.summaryInfo.top.company) &&
  244. <View style={styles.formRow}>
  245. <TextView style={styles.label}>{$t('sign.labelCompany')}:</TextView>
  246. <TextView style={styles.text}>{this.state.summaryInfo.top.company}</TextView>
  247. </View>
  248. }
  249. { utils.isNotEmpty(this.state.summaryInfo.top.registrationNo) &&
  250. <View style={styles.formRow}>
  251. <TextView style={styles.label}>{$t('receipt.labelRegistrationNo')}</TextView>
  252. <TextView style={styles.text}>{this.state.summaryInfo.top.registrationNo}</TextView>
  253. </View>
  254. }
  255. <View style={styles.formRow}>
  256. <Skeleton
  257. containerStyle={ui.flex1}
  258. isLoading={this.state.loading}
  259. boneColor='#eeeeee'
  260. highlightColor='#f6f6f6'
  261. animationType="shiver"
  262. layout={this.getSkeletonLeft()}
  263. animationDirection={'horizontalRight'}>
  264. </Skeleton>
  265. <View style={ui.flex2}></View>
  266. <Skeleton
  267. containerStyle={ui.flex1}
  268. isLoading={this.state.loading}
  269. boneColor='#eeeeee'
  270. highlightColor='#f6f6f6'
  271. animationType="shiver"
  272. layout={this.getSkeletonRight()}
  273. animationDirection={'horizontalRight'}>
  274. </Skeleton>
  275. </View>
  276. { utils.isNotEmpty(this.state.summaryInfo.top.transactionId) &&
  277. <View style={styles.formRow}>
  278. <TextView style={styles.label}>{$t('receipt.labelTransactionID')}</TextView>
  279. <TextView style={styles.text}>{this.state.summaryInfo.top.transactionId}</TextView>
  280. </View>
  281. }
  282. { utils.isNotEmpty(this.state.summaryInfo.top.referenceId) &&
  283. <View style={styles.formRow}>
  284. <TextView style={styles.label}>{$t('receipt.labelReferenceID')}</TextView>
  285. <TextView style={styles.text}>{this.state.summaryInfo.top.referenceId}</TextView>
  286. </View>
  287. }
  288. { utils.isNotEmpty(this.state.summaryInfo.top.dateTime) &&
  289. <View style={styles.formRow}>
  290. <TextView style={styles.label}>{$t('receipt.labelDateTime')}</TextView>
  291. <TextView style={styles.text}>{this.state.summaryInfo.top.dateTime}</TextView>
  292. </View>
  293. }
  294. </View>
  295. }
  296. {this.getSectionSkeleton(2)}
  297. { utils.isNotEmpty(this.state.summaryInfo.station) &&
  298. <View style={styles.sections}>
  299. <TextView style={styles.formTitle}>{$t('wallet.labelYourStation')}</TextView>
  300. <View style={styles.formRow}>
  301. <TextView style={styles.label}>{$t('wallet.labelStationId')}</TextView>
  302. <TextView style={styles.text}>{this.state.summaryInfo.station.stationId}</TextView>
  303. </View>
  304. <View style={styles.formRow}>
  305. <TextView style={styles.label}>{$t('receipt.labelSiteName')}</TextView>
  306. <TextView style={styles.text}>{this.state.summaryInfo.station.siteName ?? "-"}</TextView>
  307. </View>
  308. </View>
  309. }
  310. {this.getSectionSkeleton()}
  311. { utils.isNotEmpty(this.state.summaryInfo.connector) &&
  312. <View style={styles.sections}>
  313. <TextView style={styles.formTitle}>{$t('wallet.labelYourConnector')}</TextView>
  314. <View style={styles.formRow}>
  315. <TextView style={styles.label}>{$t('charging.labelType')}:</TextView>
  316. <TextView style={styles.text}>{this.state.summaryInfo.connector.type}</TextView>
  317. </View>
  318. <View style={styles.formRow}>
  319. <TextView style={styles.label}>{$t('charging.labelPower')}:</TextView>
  320. <TextView style={styles.text}>{this.state.summaryInfo.connector.power}</TextView>
  321. </View>
  322. <View style={styles.formRow}>
  323. <TextView style={styles.label}>{$t('charging.labelRates')}:</TextView>
  324. <TextView style={styles.text}>{this.state.summaryInfo.connector.rates}</TextView>
  325. </View>
  326. </View>
  327. }
  328. {this.getSectionSkeleton(1)}
  329. { utils.isNotEmpty(this.state.summaryInfo.payment?.pointsReward) &&
  330. <View style={styles.sections}>
  331. <TextView style={styles.formTitle}>{$t('receipt.labelPointsRewards')}</TextView>
  332. <View style={styles.formRow}>
  333. <TextView style={styles.label}>{$t('receipt.labelPointsRewarded')}:</TextView>
  334. <TextView style={styles.text}>{this.state.summaryInfo.payment.pointsReward + " " + $t('points.points')}</TextView>
  335. </View>
  336. </View>
  337. }
  338. {this.getSectionSkeleton(1)}
  339. { utils.isNotEmpty(this.state.summaryInfo.vouchers) &&
  340. <View style={styles.sections}>
  341. <TextView style={styles.formTitle}>{$t('receipt.labelVoucherUsage')}</TextView>
  342. { this.state.summaryInfo.vouchers?.map((item, index) => (
  343. <View style={styles.formRow} key={index}>
  344. <View style={ui.flex1}>
  345. <TextView style={styles.label}>{item.voucherName}</TextView>
  346. <TextView style={styles.voucherDesc}>{item.voucherDesc}</TextView>
  347. </View>
  348. <TextView style={styles.text}>{"(" + item.voucherCurrencySymbol + " " + item.voucherCredit + ")"}</TextView>
  349. </View>)
  350. )}
  351. </View>
  352. }
  353. {this.getSectionSkeleton()}
  354. { utils.isNotEmpty(this.state.summaryInfo.chargingFee) &&
  355. <View style={styles.sections}>
  356. <TextView style={styles.formTitle}>{$t('receipt.breakdownChargingFees')}</TextView>
  357. <View style={styles.formRow}>
  358. <TextView style={styles.label}>{$t('wallet.labelChargeTime')}</TextView>
  359. <TextView style={styles.text}>{this.state.summaryInfo.chargingFee.chargeTime ?? "-"}</TextView>
  360. </View>
  361. <View style={styles.formRow}>
  362. <TextView style={styles.label}>{$t('wallet.labelChargeDelivered')}</TextView>
  363. <TextView style={styles.text}>{this.state.summaryInfo.chargingFee.chargeDelivered ?? 0}</TextView>
  364. </View>
  365. <View style={styles.formRow}>
  366. <TextView style={styles.label}>{$t('receipt.labelChargTransSubtotal3')}</TextView>
  367. <TextView style={styles.text}>{this.state.summaryInfo.chargingFee.transactionSubtotal}</TextView>
  368. </View>
  369. </View>
  370. }
  371. {this.getSectionSkeleton()}
  372. { utils.isNotEmpty(this.state.summaryInfo.idleFee) &&
  373. <View style={styles.sections}>
  374. <TextView style={styles.formTitle}>{$t('receipt.breakdownIdlesFees')}</TextView>
  375. <View style={styles.formRow}>
  376. <TextView style={styles.label}>{$t('receipt.labelIdleStartTime')}</TextView>
  377. <TextView style={styles.text}>{this.state.summaryInfo.idleFee.startTime}</TextView>
  378. </View>
  379. <View style={styles.formRow}>
  380. <TextView style={styles.label}>{$t('receipt.labelIdleDuration')}</TextView>
  381. <TextView style={styles.text}>{this.state.summaryInfo.idleFee.duration}</TextView>
  382. </View>
  383. <View style={styles.formRow}>
  384. <TextView style={styles.label}>{$t('receipt.labelIdleFeeSubtotal3')}</TextView>
  385. <TextView style={styles.text}>{this.state.summaryInfo.idleFee.subtotal}</TextView>
  386. </View>
  387. </View>
  388. }
  389. {this.getSectionSkeleton()}
  390. { utils.isNotEmpty(this.state.summaryInfo.reservationFee) &&
  391. <View style={styles.sections}>
  392. <TextView style={styles.formTitle}>{$t('receipt.breakdownReservationFees')}</TextView>
  393. <View style={styles.formRow}>
  394. <TextView style={styles.label}>{$t('receipt.labelTimeReservation')}</TextView>
  395. <TextView style={styles.text}>{this.state.summaryInfo.reservationFee.reservationTime}</TextView>
  396. </View>
  397. <View style={styles.formRow}>
  398. <TextView style={styles.label}>{$t('receipt.labelDurationReservation')}</TextView>
  399. <TextView style={styles.text}>{this.state.summaryInfo.reservationFee.reservationDuration}</TextView>
  400. </View>
  401. <View style={styles.formRow}>
  402. <TextView style={styles.label}>{$t('receipt.labelReservationFeeSubtotal3')}</TextView>
  403. <TextView style={styles.text}>{this.state.summaryInfo.reservationFee.reservationFeeSubtotal}</TextView>
  404. </View>
  405. </View>
  406. }
  407. {this.getSectionSkeleton(8)}
  408. { utils.isNotEmpty(this.state.summaryInfo.payment) &&
  409. <View style={styles.sections}>
  410. <TextView style={styles.formTitle}>{$t('receipt.breakdownPayment')}</TextView>
  411. <View style={styles.formRow}>
  412. <TextView style={styles.label}>{$t('wallet.labelPaymentMadeBy')}</TextView>
  413. <TextView style={styles.text}>{this.state.summaryInfo.payment.paymentMadeBy ?? "-"}</TextView>
  414. </View>
  415. { utils.isNotEmpty(this.state.summaryInfo.payment.transactionSubtotal) &&
  416. <View style={styles.formRow}>
  417. <TextView style={styles.label}>{$t('receipt.labelChargTransSubtotal3')}</TextView>
  418. <TextView style={styles.text}>{this.state.summaryInfo.payment.transactionSubtotal}</TextView>
  419. </View>
  420. }
  421. { utils.isNotEmpty(this.state.summaryInfo.payment.idleFeeSubtotal) &&
  422. <View style={styles.formRow}>
  423. <TextView style={styles.label}>{$t('receipt.labelIdleFeeSubtotal3')}</TextView>
  424. <TextView style={styles.text}>{this.state.summaryInfo.payment.idleFeeSubtotal}</TextView>
  425. </View>
  426. }
  427. { utils.isNotEmpty(this.state.summaryInfo.payment.reservationFeeSubtotal) &&
  428. <View style={styles.formRow}>
  429. <TextView style={styles.label}>{$t('receipt.labelReservationFeeSubtotal3')}</TextView>
  430. <TextView style={styles.text}>{this.state.summaryInfo.payment.reservationFeeSubtotal}</TextView>
  431. </View>
  432. }
  433. { utils.isNotEmpty(this.state.summaryInfo.payment.finalPayment) &&
  434. <View style={styles.formRow}>
  435. <TextView style={styles.label}>
  436. { utils.isNotEmpty(this.state.summaryInfo.payment.discountCredit)
  437. ? $t('receipt.labelAfterDiscount')
  438. : $t('receipt.labelFinalPaymentAmount')
  439. }
  440. </TextView>
  441. <TextView style={styles.text}>{this.state.summaryInfo.payment.finalPayment ?? "-"}</TextView>
  442. </View>
  443. }
  444. { utils.isNotEmpty(this.state.summaryInfo.payment.exchangeRate) &&
  445. <View style={styles.formRow}>
  446. <TextView style={styles.label}>{$t('wallet.labelExchangeRate')}</TextView>
  447. <TextView style={styles.text}>{this.state.summaryInfo.payment.exchangeRate ?? "-"}</TextView>
  448. </View>
  449. }
  450. { utils.isNotEmpty(this.state.summaryInfo.payment.resultingBalance) &&
  451. <View style={styles.formRow}>
  452. <TextView style={styles.label}>{$t('wallet.labelResultingBalance')}</TextView>
  453. <TextView style={styles.text}>{this.state.summaryInfo.payment.resultingBalance ?? "-"}</TextView>
  454. </View>
  455. }
  456. { utils.isNotEmpty(this.state.summaryInfo.payment.refundAmount) &&
  457. <View style={styles.formRow}>
  458. <TextView style={styles.label}>{$t('wallet.labelRefundAmount')}</TextView>
  459. <TextView style={styles.text}>{this.state.summaryInfo.payment.refundAmount ?? "-"}</TextView>
  460. </View>
  461. }
  462. </View>
  463. }
  464. <EndView/>
  465. { (this.state.isActully && utils.isNotEmpty(this.state.summaryInfo.top)) &&
  466. <View style={styles.bottomButton}>
  467. <TextView
  468. style={styles.feedback}
  469. onPress={() => startPage(PageList.feedback)}>{$t('wallet.linkSubmitFeedback')}</TextView>
  470. {/* <Text style={styles.tipText}>{$t('wallet.tipsReceipt')}</Text> */}
  471. <Button
  472. text={$t('home.done')}
  473. elevation={1.5}
  474. onClick={() => this.toRating()}/>
  475. </View>
  476. }
  477. </ScrollView>
  478. );
  479. }
  480. }
  481. }
  482. const styles = StyleSheet.create({
  483. container: {
  484. flex: 1,
  485. paddingLeft: 16,
  486. paddingRight: 16,
  487. backgroundColor: colorLight
  488. },
  489. headerView: {
  490. alignItems: 'center',
  491. paddingTop: 16,
  492. paddingBottom: 24
  493. },
  494. topTitle: {
  495. color: textPrimary,
  496. fontSize: 16,
  497. paddingTop: 8,
  498. paddingLeft: 8,
  499. fontWeight: 'bold'
  500. },
  501. topDesc: {
  502. color: textPrimary,
  503. fontSize: 14,
  504. marginBottom: 32
  505. },
  506. sections: {
  507. borderRadius: 10,
  508. marginBottom: 12,
  509. backgroundColor: colorLight
  510. },
  511. sections2: {
  512. paddingTop: 0,
  513. paddingLeft: 0,
  514. paddingRight: 0,
  515. paddingBottom: 8,
  516. borderRadius: 10,
  517. marginBottom: 8,
  518. backgroundColor: colorLight
  519. },
  520. formTitle: {
  521. color: '#000',
  522. fontSize: 14,
  523. marginTop: -4,
  524. marginBottom: 6,
  525. paddingBottom: 6,
  526. fontWeight: 'bold',
  527. borderBottomWidth: 1,
  528. borderBottomColor: textPrimary
  529. },
  530. formRow: {
  531. paddingTop: 3,
  532. paddingBottom: 3,
  533. alignItems: 'center',
  534. flexDirection: 'row'
  535. },
  536. label: {
  537. flex: 1,
  538. color: textPrimary,
  539. fontSize: 13,
  540. },
  541. text: {
  542. color: textPrimary,
  543. fontSize: 12,
  544. fontWeight: 'bold'
  545. },
  546. stationInfoView: {
  547. padding: 12,
  548. marginBottom: 0,
  549. alignItems: 'center',
  550. flexDirection: 'row',
  551. justifyContent: 'space-between'
  552. },
  553. stationInfoText: {
  554. color: '#999',
  555. fontSize: 11
  556. },
  557. connectorView: {
  558. alignItems: 'center',
  559. flexDirection: 'row'
  560. },
  561. typeIcon: {
  562. width: 36,
  563. height: 36
  564. },
  565. feedback: {
  566. color: '#12A5F9',
  567. fontSize: 14,
  568. textAlign: 'center',
  569. marginBottom: 16,
  570. ...ui.underline
  571. },
  572. bottomButton: {
  573. marginTop: 16,
  574. marginBottom: 16
  575. },
  576. tipText: {
  577. color: textPrimary,
  578. fontSize: 12,
  579. textAlign: 'center',
  580. marginBottom: 8
  581. },
  582. processContent: {
  583. flex: 1,
  584. justifyContent: 'center'
  585. },
  586. processTitle: {
  587. color: textTitle,
  588. fontSize: 24,
  589. fontWeight: 'bold',
  590. textAlign: 'center'
  591. },
  592. processText: {
  593. color: textPrimary,
  594. fontSize: 14,
  595. textAlign: 'center',
  596. paddingTop: 16
  597. },
  598. voucherDesc: {
  599. flex: 1,
  600. color: textCancel,
  601. fontSize: 13
  602. }
  603. });