panhui 5 лет назад
Родитель
Сommit
b37aac32a3

+ 1 - 1
App.js

@@ -53,7 +53,7 @@ export default function App() {
           routes: [
             {
               name: initName,
-              // name: 'RewardRider',
+              // name: 'Search',
             },
           ],
         })

+ 1 - 4
screens/Main/Home/HomeHeader.js

@@ -93,10 +93,7 @@ export default function Header() {
             }}
             title={local ? TchangeToChinese : TchangeToth}
           />
-          <Menu.Item
-            onPress={() => {}}
-            title="版本07.14.1(订单取消和打赏模块)"
-          />
+          <Menu.Item onPress={() => {}} title="版本07.14.2(首页搜索)" />
         </Menu>
       </Appbar.Header>
     </>

+ 25 - 0
screens/Main/Home/model.js

@@ -155,6 +155,31 @@ const HomeModel = (now) => ({
     const { getData } = now();
     getData();
   },
+  searchHome(val, type, page) {
+    const { chooseInfo } = now(MapModel);
+    const { location } = chooseInfo;
+    const { loading, warnning, clearLoading } = now(Toast);
+    loading();
+    const params = { latitude: location.lat, longitude: location.lng, page };
+    if (type === 'popularTag') {
+      params.popularTag = val;
+    } else {
+      params.search = val;
+    }
+    return request
+      .get('/settings/search', {
+        params,
+      })
+      .then((res) => {
+        clearLoading();
+        return Promise.resolve(res);
+      })
+      .catch((e) => {
+        clearLoading();
+        // warnning(e.error);
+        return Promise.reject();
+      });
+  },
 });
 
 export default HomeModel;

+ 148 - 13
screens/Main/SearchScreen.jsx

@@ -1,26 +1,161 @@
 import * as WebBrowser from 'expo-web-browser';
 import * as React from 'react';
-import { Div, Button, Image, Text, Avatar } from 'react-native-magnus';
-import { ScrollView } from 'react-native-gesture-handler';
+import { StatusBar } from 'expo-status-bar';
+import {
+  Div,
+  Button,
+  Image,
+  Text,
+  Avatar,
+  Input,
+  Icon,
+  Tag,
+} from 'react-native-magnus';
+import { FlatList } from 'react-native-gesture-handler';
 
 import useModel from 'flooks';
-import User from '../../flooks/User'; // detail模块通用方法
+import HomeModel from './Home/model';
+import MerchantCom from './Home/MerchantCom';
 
 import Header from '../../components/Header';
 
-export default function SearchScreen() {
-  const { userInfo } = useModel(User, ['id']);
+import { filterMap } from '../../Utils/MerchantUtils';
+export default function SearchScreen({ navigation }) {
+  const { searchHome } = useModel(HomeModel, ['searchHome']);
+
+  const [isSearch, setIsSearch] = React.useState(false);
+  const [searchType, setsearchType] = React.useState('');
+  const [empty, setEmpty] = React.useState(false);
+  const [last, setLast] = React.useState(false);
+  const [searchVal, setsearchVal] = React.useState('');
+
+  const [searchKey, setsearchKey] = React.useState('');
+  const [page, setPage] = React.useState(0);
+  const [list, setlist] = React.useState([]);
+
+  function search() {
+    if (searchHome.loading) {
+      return false;
+    }
+    setIsSearch(true);
+    setEmpty(false);
+    setLast(false);
+    searchHome(searchVal, searchType, page)
+      .then((res) => {
+        if (!res.last) {
+          setPage(page + 1);
+        } else {
+          setLast(true);
+        }
+        if (res.empty) {
+          setEmpty(true);
+        }
+        if (page === 0) {
+          setlist(res.content);
+        } else {
+          setlist(list.concat(res.content));
+        }
+      })
+      .catch(() => {
+        setlist([]);
+        setLast(true);
+        setEmpty(true);
+      });
+  }
+  function chooseTag(key) {
+    setsearchKey(filterMap.get(key).name);
+    setPage(0);
+    setsearchType('popularTag');
+    setsearchVal(key);
+    search();
+  }
 
   return (
     <>
-      <ScrollView
-        contentContainerStyle={{
-          flexGrow: 1,
-          backgroundColor: '#fff',
-        }}
-      >
-        <Div />
-      </ScrollView>
+      <StatusBar backgroundColor="transparent" style="dark" translucent />
+      <Div row bg="white" py={10} alignItems="center">
+        <Input
+          bg="gray200"
+          placeholder="想吃什么搜一搜"
+          p={10}
+          fontSize="xs"
+          flex={1}
+          ml={15}
+          autoFocus
+          blurOnSubmit
+          value={searchKey}
+          focusBorderColor="brand500"
+          prefix={<Icon name="search" color="gray300" fontFamily="Feather" />}
+          onChangeText={(text) => {
+            setsearchKey(text);
+          }}
+          onSubmitEditing={() => {
+            setPage(0);
+            setsearchType('search');
+            setsearchVal(searchKey);
+            search();
+          }}
+        />
+        <Div>
+          {isSearch ? (
+            <Button
+              w={60}
+              bg="hide"
+              color="brand500"
+              fontSize="xs"
+              onPress={() => {
+                setsearchKey('');
+                setIsSearch(false);
+              }}
+            >
+              取消
+            </Button>
+          ) : (
+            <Button
+              w={60}
+              bg="hide"
+              color="brand500"
+              fontSize="xs"
+              onPress={() => navigation.goBack()}
+            >
+              返回
+            </Button>
+          )}
+        </Div>
+      </Div>
+      {!isSearch && (
+        <Div bg="white" flex={1}>
+          <Div px={10} mt={10}>
+            <Text>热门搜索</Text>
+
+            <Div row flexWrap="wrap">
+              {[...filterMap.keys()].map((item, index) => {
+                return (
+                  <Div key={index} w="33.33%" px={3} mt={10}>
+                    <Button
+                      block
+                      bg="gray200"
+                      color="gray300"
+                      fontSize="xs"
+                      onPress={() => chooseTag(item)}
+                    >
+                      {filterMap.get(item).name}
+                    </Button>
+                  </Div>
+                );
+              })}
+            </Div>
+          </Div>
+        </Div>
+      )}
+      {isSearch && (
+        <FlatList
+          data={list}
+          renderItem={({ item }) => <MerchantCom info={item} />}
+          onEndReached={search}
+          ListEmptyComponent={() => empty && <Text>暂无数据</Text>}
+        />
+      )}
     </>
   );
 }

+ 3 - 3
screens/Order/ApplayCancelScreen.jsx

@@ -1,11 +1,11 @@
 import * as WebBrowser from 'expo-web-browser';
 import * as React from 'react';
 import { Platform } from 'react-native';
-import { Div, Button, Image, Text, Avatar, Icon } from 'react-native-magnus';
+import { Div, Button, Text, Icon } from 'react-native-magnus';
 import { ScrollView } from 'react-native-gesture-handler';
 import { TextareaItem } from '@ant-design/react-native';
 
-import { PullPicker } from 'teaset';
+// import { PullPicker } from 'teaset';
 
 import { useRoute } from '@react-navigation/native';
 import { useCreation } from '@umijs/hooks';
@@ -104,7 +104,7 @@ export default function ApplayCancelScreen({ navigation }) {
             my={5}
             onPress={() => {
               if (Platform.OS !== 'web') {
-                var list = [...reasonMap.keys()];
+                const list = [...reasonMap.keys()];
                 PullPicker.show(
                   '取消原因',
                   list,

+ 9 - 3
screens/Order/OrderScreen.jsx

@@ -9,6 +9,7 @@ import { useCreation, useRequest } from '@umijs/hooks';
 import { useFocusEffect } from '@react-navigation/native';
 import useModel from 'flooks';
 import Toast from '../../flooks/Toast';
+import Order from './model';
 
 import Header from './Header'; // 头部
 import Time from '../../Utils/TimeUtils';
@@ -18,7 +19,8 @@ import { getStatusInfo } from '../../Utils/OrderUtils';
 export default function OrderScreen({ navigation }) {
   const [orderList, setorderList] = React.useState();
 
-  const { success, warnning } = useModel(Toast, []);
+	const { success, warnning } = useModel(Toast, []);
+	const { again } = useModel(Order, []);
   const orderRequest = useRequest('/orderInfo/my?sort=id,desc', {
     manual: true,
     onSuccess: (result) => {
@@ -26,6 +28,8 @@ export default function OrderScreen({ navigation }) {
     },
   });
 
+
+
   useFocusEffect(
     React.useCallback(() => {
       orderRequest.run();
@@ -52,8 +56,10 @@ export default function OrderScreen({ navigation }) {
               });
             }}
             goMerchant={() => {
-              navigation.navigate('MerchantDetail', {
-                merchantId: item.merchantId,
+              again(item.id).then(() => {
+                navigation.navigate('MerchantDetail', {
+                  merchantId: item.merchantId,
+                });
               });
             }}
             index={index}

+ 2 - 1
screens/Order/RewardRiderScreen.jsx

@@ -1,6 +1,7 @@
+/* eslint-disable global-require */
 import * as WebBrowser from 'expo-web-browser';
 import * as React from 'react';
-import { Div, Button, Image, Text, Avatar } from 'react-native-magnus';
+import { Div, Button, Image, Text } from 'react-native-magnus';
 import { ScrollView } from 'react-native-gesture-handler';
 
 import useModel from 'flooks';

+ 22 - 0
screens/Order/model.js

@@ -87,6 +87,28 @@ const OrderModel = (now) => ({
         return Promise.reject();
       });
   },
+  again(orderId) {
+    const { loading, warnning, clearLoading } = now(Toast);
+    loading();
+    const { chooseInfo } = now(MapModel);
+    const { location } = chooseInfo;
+    return request
+      .get(`/shoppingCart/again`, {
+        params: {
+          orderId,
+          longitude: location.lng,
+          latitude: location.lat,
+        },
+      })
+      .then((res) => {
+        clearLoading();
+        return Promise.resolve(res);
+      })
+      .catch((e) => {
+        warnning(e.error);
+        return Promise.reject();
+      });
+  },
   cancelOrder(id, reason, remark, img) {
     const { loading, warnning, success } = now(Toast);
     loading();