EditAddressScreen.jsx 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import * as WebBrowser from 'expo-web-browser';
  2. import * as React from 'react';
  3. import { Div, Button, Text, Tag, Toggle, Icon } from 'react-native-magnus';
  4. import { ScrollView } from 'react-native-gesture-handler';
  5. import { InputItem } from '@ant-design/react-native';
  6. import { useRoute } from '@react-navigation/native';
  7. import { useRequest, useToggle, useBoolean, useCreation } from '@umijs/hooks';
  8. import useModel from 'flooks';
  9. import AddressModel from './model'; // detail模块通用方法
  10. import Header from '../../components/Header';
  11. const AddressTag = new Map([
  12. ['HOME', { name: '家', key: 'HOME' }],
  13. ['COMPANY', { name: '公司', key: 'COMPANY' }],
  14. ['SCHOOL', { name: '学校', key: 'SCHOOL' }],
  15. ]);
  16. export default function EditAddressScreen({ navigation }) {
  17. const route = useRoute();
  18. const { params } = route;
  19. const { id, locationInfo } = params || { id: 0 };
  20. const { saveAddress } = useModel(AddressModel, []);
  21. const [addressInfo, setaddressInfo] = React.useState({});
  22. const [phone, setphone] = React.useState('');
  23. const [name, setName] = React.useState('');
  24. const [addressName, setaddressName] = React.useState('');
  25. const [number, setnumber] = React.useState('');
  26. const isDefaultEvent = useBoolean();
  27. const [addressTag, setaddressTag] = React.useState('');
  28. const [longitude, setlongitude] = React.useState('');
  29. const [latitude, setlatitude] = React.useState('');
  30. const sexEvent = useToggle('先生', '女士');
  31. React.useEffect(() => {
  32. if (locationInfo) {
  33. const { poiaddress, poiname, latlng } = locationInfo;
  34. setaddressName(poiaddress + poiname);
  35. setlatitude(latlng.lat);
  36. setlongitude(latlng.lng);
  37. }
  38. }, [locationInfo]);
  39. const canSub = useCreation(() => {
  40. if (
  41. phone &&
  42. name &&
  43. addressName &&
  44. number &&
  45. longitude &&
  46. latitude &&
  47. addressTag
  48. ) {
  49. return true;
  50. } else {
  51. return false;
  52. }
  53. }, [
  54. phone,
  55. name,
  56. addressName,
  57. number,
  58. isDefaultEvent.state,
  59. sexEvent.state,
  60. addressTag,
  61. longitude,
  62. latitude,
  63. ]);
  64. useRequest(
  65. () => {
  66. if (id) {
  67. return `/address/get/${id}`;
  68. } else {
  69. return Promise.resolve(null);
  70. }
  71. },
  72. {
  73. refreshDeps: [id],
  74. onSuccess: (result) => {
  75. if (result) {
  76. setaddressInfo(result);
  77. } else {
  78. setaddressInfo({});
  79. }
  80. },
  81. }
  82. );
  83. React.useEffect(() => {
  84. if (addressInfo.id) {
  85. setName(addressInfo.name);
  86. setphone(addressInfo.phone);
  87. setaddressName(addressInfo.addressName);
  88. setnumber(addressInfo.number);
  89. isDefaultEvent.toggle(addressInfo.isDefault);
  90. setaddressTag(addressInfo.addressTag);
  91. setlatitude(addressInfo.latitude);
  92. setlongitude(addressInfo.longitude);
  93. }
  94. }, [addressInfo]);
  95. return (
  96. <>
  97. <Header title="编辑地址" noBack={false} />
  98. <ScrollView>
  99. <Div bg="white">
  100. <InputItem
  101. clear
  102. value={name}
  103. onChange={setName}
  104. placeholder="输入手机号"
  105. style={{ fontSize: 14 }}
  106. >
  107. <Text fontSize="xs" textAlign="left">
  108. 姓名
  109. </Text>
  110. </InputItem>
  111. <Div row py={15}>
  112. <Button
  113. onPress={() => sexEvent.setLeft()}
  114. h={30}
  115. ml={63}
  116. w={40}
  117. fontSize="xs"
  118. bg={sexEvent.state === '先生' ? 'brand500' : 'gray200'}
  119. color={sexEvent.state === '先生' ? 'white' : 'gray600'}
  120. >
  121. 先生
  122. </Button>
  123. <Button
  124. onPress={() => sexEvent.setRight()}
  125. h={30}
  126. w={40}
  127. ml={15}
  128. fontSize="xs"
  129. bg={sexEvent.state === '女士' ? 'brand500' : 'gray200'}
  130. color={sexEvent.state === '女士' ? 'white' : 'gray600'}
  131. >
  132. 女士
  133. </Button>
  134. </Div>
  135. <InputItem
  136. clear
  137. type="phone"
  138. value={phone}
  139. onChange={setphone}
  140. placeholder="输入手机号"
  141. style={{ fontSize: 14 }}
  142. >
  143. <Text fontSize="xs" textAlign="left">
  144. 手机号
  145. </Text>
  146. </InputItem>
  147. <Button
  148. bg="hide"
  149. block
  150. p={0}
  151. rounded="none"
  152. onPress={() =>
  153. navigation.navigate('SearchMap', {
  154. type: 'addAddress',
  155. })
  156. }
  157. >
  158. <Div
  159. flex={1}
  160. row
  161. py={15}
  162. ml={15}
  163. borderBottomWidth={1}
  164. borderColor="gray100"
  165. mr={0}
  166. >
  167. <Text fontSize="xs" w={71}>
  168. 收货地址
  169. </Text>
  170. <Text color={addressName ? 'gray600' : 'gray300'} flex={1}>
  171. {addressName || '请选址收货地址'}
  172. </Text>
  173. <Icon mr={15} fontSize="sm" name="right" color="#000" />
  174. </Div>
  175. </Button>
  176. <InputItem
  177. clear
  178. value={number}
  179. onChange={setnumber}
  180. placeholder="请输入门牌号"
  181. style={{ fontSize: 14 }}
  182. >
  183. <Text fontSize="xs" textAlign="left">
  184. 门牌号
  185. </Text>
  186. </InputItem>
  187. <Div row p={15} alignItems="center">
  188. <Text fontSize="xs" w={71} textAlign="left">
  189. 标签
  190. </Text>
  191. {[...AddressTag.keys()].map((key) => {
  192. const isChoose = key === addressTag;
  193. return (
  194. <Tag
  195. bg={isChoose ? 'brand500' : 'gray200'}
  196. color={isChoose ? 'white' : ''}
  197. fontSize="xs"
  198. mr={10}
  199. onPress={() => setaddressTag(key)}
  200. >
  201. {AddressTag.get(key).name}
  202. </Tag>
  203. );
  204. })}
  205. </Div>
  206. </Div>
  207. <Div row alignItems="center" p={15}>
  208. <Toggle
  209. on={isDefaultEvent.state}
  210. onPress={() => isDefaultEvent.toggle()}
  211. bg="gray200"
  212. circleBg="brand500"
  213. activeBg="brand500"
  214. h={30}
  215. w={60}
  216. />
  217. <Text ml={15}>设为默认</Text>
  218. </Div>
  219. <Button
  220. disabled={!canSub}
  221. bg="brand500"
  222. m={20}
  223. block
  224. onPress={() => {
  225. saveAddress(
  226. id,
  227. name,
  228. sexEvent.state,
  229. phone,
  230. addressName,
  231. number,
  232. addressTag,
  233. isDefaultEvent.state,
  234. latitude,
  235. longitude
  236. ).then(() => {
  237. navigation.goBack();
  238. });
  239. }}
  240. >
  241. 保存
  242. </Button>
  243. </ScrollView>
  244. </>
  245. );
  246. }