AddressCom.jsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import * as WebBrowser from 'expo-web-browser';
  2. import * as React from 'react';
  3. import { StyleSheet, View } from 'react-native';
  4. import {
  5. Div,
  6. Button,
  7. Select,
  8. Image,
  9. Text,
  10. Avatar,
  11. Icon,
  12. } from 'react-native-magnus';
  13. import { ScrollView } from 'react-native-gesture-handler';
  14. import { Modal, Portal, TouchableRipple, Badge } from 'react-native-paper';
  15. import { useRequest, useCreation, useUnmount } from '@umijs/hooks';
  16. import { useNavigation, useFocusEffect } from '@react-navigation/native';
  17. import useModel from 'flooks';
  18. import AddressModel from './model'; // detail模块通用方法
  19. const AddressItem = ({ info, editEvent, isChoose, leftEvent }) => {
  20. return (
  21. <>
  22. <Div row alignItems="center" py={15}>
  23. <Button bg="white" onPress={leftEvent}>
  24. {isChoose ? (
  25. <Icon name="check-circle" color="#FFC21C" size={16} />
  26. ) : (
  27. <Icon name="circle-thin" color="#787878" size={16} />
  28. )}
  29. </Button>
  30. <Div flex={1} mx={15}>
  31. <Text fontSize="sm" textAlign="left">
  32. {info.addressName}
  33. </Text>
  34. <Text fontSize="xs" textAlign="left">
  35. {info.addressInfo}
  36. </Text>
  37. <Div row>
  38. <Text fontSize="xs" color="gray300" textAlign="left">
  39. {info.name}
  40. </Text>
  41. <Text ml={15} fontSize="xs" color="gray300" textAlign="left">
  42. {info.phone}
  43. </Text>
  44. </Div>
  45. </Div>
  46. <Button onPress={editEvent} bg="white">
  47. <Icon name="edit" color="#787878" size={20} />
  48. </Button>
  49. </Div>
  50. <Div h={1} bg="gray200" />
  51. </>
  52. );
  53. };
  54. export default function AddressCom() {
  55. const {
  56. addressList,
  57. getAddressList,
  58. goEdit,
  59. setShow,
  60. chooseAddressId,
  61. setChoose,
  62. } = useModel(AddressModel, ['addressList', 'goEdit', 'chooseAddressId']);
  63. const addressRequest = useRequest(getAddressList);
  64. const [visible, setvisible] = React.useState(false);
  65. const navigation = useNavigation();
  66. useUnmount(() => {
  67. setShow(false);
  68. });
  69. useFocusEffect(
  70. React.useCallback(() => {
  71. if (goEdit) {
  72. setvisible(true);
  73. }
  74. }, [goEdit])
  75. );
  76. const chooseaddressInfo = useCreation(() => {
  77. if (chooseAddressId) {
  78. return addressList.find((item) => {
  79. return item.id === chooseAddressId;
  80. });
  81. } else {
  82. return {};
  83. }
  84. }, [chooseAddressId, addressList]);
  85. return (
  86. <>
  87. <TouchableRipple
  88. onPress={() => {
  89. setvisible(true);
  90. }}
  91. >
  92. <Div row alignItems="center" minH={56} py={10}>
  93. {chooseAddressId ? (
  94. <Div flex={1} overflow="hidden">
  95. <Text
  96. fontSize="xl"
  97. textAlign="left"
  98. // numberOfLines={1}
  99. // ellipsizeMode="tail"
  100. >
  101. {chooseaddressInfo.addressName}
  102. </Text>
  103. <Text fontSize="sm" color="gray300" textAlign="left">
  104. {chooseaddressInfo.number}
  105. </Text>
  106. <Div row>
  107. <Text fontSize="xs" color="gray300" textAlign="left">
  108. {chooseaddressInfo.name}
  109. </Text>
  110. <Text mx={10} fontSize="xs" color="gray300" textAlign="left">
  111. {chooseaddressInfo.sex}
  112. </Text>
  113. <Text fontSize="xs" color="gray300" textAlign="left">
  114. {chooseaddressInfo.phone}
  115. </Text>
  116. </Div>
  117. </Div>
  118. ) : (
  119. <>
  120. <Text color="gray300">请选择地址</Text>
  121. <Div flex={1} />
  122. </>
  123. )}
  124. <Icon name="right" color="#000" />
  125. </Div>
  126. </TouchableRipple>
  127. <Div h={1} bg="gray200" />
  128. <Portal>
  129. <Modal
  130. visible={visible}
  131. contentContainerStyle={{
  132. position: 'absolute',
  133. left: 0,
  134. right: 0,
  135. bottom: 0,
  136. maxHeight: '70%',
  137. zIndex: 2,
  138. justifyContent: 'flex-end',
  139. }}
  140. onDismiss={() => {
  141. setvisible(false);
  142. setShow(false);
  143. }}
  144. >
  145. <Div bg="white" px={15} mt={56}>
  146. <Div py={15}>
  147. <Text textAlign="center">选择收货地址</Text>
  148. </Div>
  149. <Div h={1} bg="gray200" />
  150. {addressList.map((item) => {
  151. return (
  152. <AddressItem
  153. key={item.id}
  154. info={item}
  155. isChoose={chooseAddressId === item.id}
  156. leftEvent={() => {
  157. setChoose(item.id);
  158. setvisible(false);
  159. setShow(false);
  160. }}
  161. editEvent={() => {
  162. setvisible(false);
  163. navigation.navigate('EditAddress', { id: item.id });
  164. setShow(true);
  165. }}
  166. />
  167. );
  168. })}
  169. {addressList.length === 0 && (
  170. <Div p={30}>
  171. <Text color="gray300" textAlign="center">
  172. 暂无数据111
  173. </Text>
  174. </Div>
  175. )}
  176. <Button
  177. bg="white"
  178. position="absolute"
  179. right={20}
  180. top={15}
  181. onPress={() => {
  182. setvisible(false);
  183. navigation.navigate('EditAddress');
  184. setShow(true);
  185. }}
  186. >
  187. <Icon name="plus" color="#b5b5b5" size={16} />
  188. </Button>
  189. </Div>
  190. </Modal>
  191. </Portal>
  192. </>
  193. );
  194. }