SummaryV2.js 22 KB

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