EditAddressScreen.jsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 (phone && name && addressName && number && longitude && latitude) {
  41. return true;
  42. } else {
  43. return false;
  44. }
  45. }, [
  46. phone,
  47. name,
  48. addressName,
  49. number,
  50. isDefaultEvent.state,
  51. sexEvent.state,
  52. addressTag,
  53. longitude,
  54. latitude,
  55. ]);
  56. useRequest(
  57. () => {
  58. if (id) {
  59. return `/address/get/${id}`;
  60. } else {
  61. return Promise.resolve(null);
  62. }
  63. },
  64. {
  65. refreshDeps: [id],
  66. onSuccess: (result) => {
  67. if (result) {
  68. setaddressInfo(result);
  69. } else {
  70. setaddressInfo({});
  71. }
  72. },
  73. }
  74. );
  75. React.useEffect(() => {
  76. if (addressInfo.id) {
  77. setName(addressInfo.name);
  78. setphone(addressInfo.phone);
  79. setaddressName(addressInfo.addressName);
  80. setnumber(addressInfo.number);
  81. isDefaultEvent.toggle(addressInfo.isDefault);
  82. setaddressTag(addressInfo.addressTag);
  83. setlatitude(addressInfo.latitude);
  84. setlongitude(addressInfo.longitude);
  85. }
  86. }, [addressInfo]);
  87. return (
  88. <>
  89. <Header title="编辑地址" noBack={false} />
  90. <ScrollView>
  91. <Div bg="white">
  92. <InputItem
  93. clear
  94. value={name}
  95. onChange={setName}
  96. placeholder="输入手机号"
  97. style={{ fontSize: 14 }}
  98. >
  99. <Text fontSize="xs" textAlign="left">
  100. 姓名
  101. </Text>
  102. </InputItem>
  103. <Div row py={15}>
  104. <Button
  105. onPress={() => sexEvent.setLeft()}
  106. h={30}
  107. ml={63}
  108. w={40}
  109. fontSize="xs"
  110. bg={sexEvent.state === '先生' ? 'brand500' : 'gray200'}
  111. color={sexEvent.state === '先生' ? 'white' : 'gray600'}
  112. >
  113. 先生
  114. </Button>
  115. <Button
  116. onPress={() => sexEvent.setRight()}
  117. h={30}
  118. w={40}
  119. ml={15}
  120. fontSize="xs"
  121. bg={sexEvent.state === '女士' ? 'brand500' : 'gray200'}
  122. color={sexEvent.state === '女士' ? 'white' : 'gray600'}
  123. >
  124. 女士
  125. </Button>
  126. </Div>
  127. <InputItem
  128. clear
  129. type="phone"
  130. value={phone}
  131. onChange={setphone}
  132. placeholder="输入手机号"
  133. style={{ fontSize: 14 }}
  134. >
  135. <Text fontSize="xs" textAlign="left">
  136. 手机号
  137. </Text>
  138. </InputItem>
  139. <Button
  140. bg="hide"
  141. block
  142. p={0}
  143. rounded="none"
  144. onPress={() =>
  145. navigation.navigate('SearchMap', {
  146. type: 'addAddress',
  147. })
  148. }
  149. >
  150. <Div
  151. flex={1}
  152. row
  153. py={15}
  154. ml={15}
  155. borderBottomWidth={1}
  156. borderColor="gray100"
  157. mr={0}
  158. >
  159. <Text fontSize="xs" w={71}>
  160. 收货地址
  161. </Text>
  162. <Text color={addressName ? 'gray600' : 'gray300'} flex={1}>
  163. {addressName || '请选址收货地址'}
  164. </Text>
  165. <Icon mr={15} fontSize="sm" name="right" color="#000" />
  166. </Div>
  167. </Button>
  168. <InputItem
  169. clear
  170. value={number}
  171. onChange={setnumber}
  172. placeholder="请输入门牌号"
  173. style={{ fontSize: 14 }}
  174. >
  175. <Text fontSize="xs" textAlign="left">
  176. 门牌号
  177. </Text>
  178. </InputItem>
  179. <Div row p={15} alignItems="center">
  180. <Text fontSize="xs" w={71} textAlign="left">
  181. 标签
  182. </Text>
  183. {[...AddressTag.keys()].map((key) => {
  184. const isChoose = key === addressTag;
  185. return (
  186. <Tag
  187. bg={isChoose ? 'brand500' : 'gray200'}
  188. color={isChoose ? 'white' : ''}
  189. fontSize="xs"
  190. mr={10}
  191. onPress={() => setaddressTag(key)}
  192. >
  193. {AddressTag.get(key).name}
  194. </Tag>
  195. );
  196. })}
  197. </Div>
  198. </Div>
  199. <Div row alignItems="center" p={15}>
  200. <Toggle
  201. on={isDefaultEvent.state}
  202. onPress={() => isDefaultEvent.toggle()}
  203. bg="gray200"
  204. circleBg="brand500"
  205. activeBg="brand500"
  206. h={30}
  207. w={60}
  208. />
  209. <Text ml={15}>设为默认</Text>
  210. </Div>
  211. <Button
  212. disabled={!canSub}
  213. bg="brand500"
  214. m={20}
  215. block
  216. onPress={() => {
  217. saveAddress(
  218. id,
  219. name,
  220. sexEvent.state,
  221. phone,
  222. addressName,
  223. number,
  224. addressTag,
  225. isDefaultEvent.state,
  226. latitude,
  227. longitude
  228. ).then(() => {
  229. navigation.goBack();
  230. });
  231. }}
  232. >
  233. 保存
  234. </Button>
  235. </ScrollView>
  236. </>
  237. );
  238. }