panhui 5 年 前
コミット
8ba5c7c552
8 ファイル変更309 行追加236 行削除
  1. 14 12
      App.js
  2. 3 5
      components/FormInput.js
  3. 130 125
      models/httpModel.js
  4. 20 33
      models/loadingModel.js
  5. 18 4
      models/userModel.js
  6. 69 34
      screens/HomeScreen.js
  7. 3 1
      screens/OrderScreen.js
  8. 52 22
      screens/RegisterSeScreen.js

+ 14 - 12
App.js

@@ -148,18 +148,20 @@ export default function App(props) {
   }, [initApp]);
 
   React.useEffect(() => {
-    const { name } = navigationRef.current.getCurrentRoute();
-    if (name !== initRouteName && initRouteName) {
-      navigationRef.current.dispatch(
-        CommonActions.reset({
-          index: 0,
-          routes: [
-            {
-              name: initRouteName,
-            },
-          ],
-        })
-      );
+    if (navigationRef.current) {
+      const { name } = navigationRef.current.getCurrentRoute();
+      if (name !== initRouteName && initRouteName) {
+        navigationRef.current.dispatch(
+          CommonActions.reset({
+            index: 0,
+            routes: [
+              {
+                name: initRouteName,
+              },
+            ],
+          })
+        );
+      }
       clearLoading();
     }
   }, [initRouteName]);

+ 3 - 5
components/FormInput.js

@@ -84,7 +84,7 @@ function* flattenSelect(array, key) {
 }
 
 const FormInput = React.memo(props => {
-  const { appearance, type } = props;
+  const { appearance, type, selectList } = props;
   const [secureTextEntry, setSecureTextEntry] = React.useState(true);
   const { cancel, confirm } = useModel("wordsModel");
   const toggleSecureEntry = () => {
@@ -167,13 +167,11 @@ const FormInput = React.memo(props => {
   };
   const ForwardIcon = props => <Icon {...props} name="arrow-ios-forward" />;
 
-  const selectList = props.selectList ? props.selectList : [];
-
   const [bottomModalX, changeBottomModalx] = React.useState("");
   const [selectVal, setSelectVal] = React.useState("");
 
   const selectInfo = React.useMemo(() => {
-    if (type === "select" && props.value && selectList.length > 0) {
+    if (type === "select" && props.value && selectList) {
       const childrens = [...flattenSelect(selectList, "children")];
       return (
         childrens.find(item => {
@@ -182,7 +180,7 @@ const FormInput = React.memo(props => {
       );
     }
     return { name: " " };
-  }, [props.value, props.type, selectList]);
+  }, [props.value, type, selectList]);
 
   const [open, ChangeOpen] = React.useState(false);
 

+ 130 - 125
models/httpModel.js

@@ -4,133 +4,138 @@ import qs from "qs";
 import { AsyncStorage } from "react-native";
 
 export default {
-    state: {
-        baseUrl: "http://dingdong.izouma.com",
-        // baseUrl: "http://localhost:8080",
-        token: "",
-        config: {},
-        httpLoading: false,
-    },
-    actions: ({ model, setState }) => ({
-        getAxiosInstance() {
-            const {
-                baseUrl,
-                setConfig,
-                setConfigError,
-                successEvent,
-                errorEvent,
-            } = model();
-            const axiosInstance = axios.create({
-                baseURL: baseUrl,
-            });
-            axiosInstance.interceptors.request.use(
-                config => setConfig(config),
-                error => setConfigError(error)
-            );
+  state: {
+    baseUrl: "http://dingdong.izouma.com",
+    // baseUrl: "http://localhost:8080",
+    token: "",
+    config: {},
+    httpLoading: false,
+  },
+  actions: ({ model, setState }) => ({
+    getAxiosInstance() {
+      const {
+        baseUrl,
+        setConfig,
+        setConfigError,
+        successEvent,
+        errorEvent,
+      } = model();
+      const axiosInstance = axios.create({
+        baseURL: baseUrl,
+      });
+      axiosInstance.interceptors.request.use(
+        config => setConfig(config),
+        error => setConfigError(error)
+      );
 
-            axiosInstance.interceptors.response.use(
-                response => successEvent(response),
-                error => errorEvent(error)
-            );
-            return axiosInstance;
-        },
-        async setConfig(config) {
-            setState({ httpLoading: true });
-            config.headers = config.headers || {};
-            const token = await AsyncStorage.getItem("token");
-            if (token) {
-                config.headers.Authorization = `Bearer ${token}`;
+      axiosInstance.interceptors.response.use(
+        response => successEvent(response),
+        error => errorEvent(error)
+      );
+      return axiosInstance;
+    },
+    async setConfig(config) {
+      setState({ httpLoading: true });
+      config.headers = config.headers || {};
+      const token = await AsyncStorage.getItem("token");
+      if (token) {
+        config.headers.Authorization = `Bearer ${token}`;
+      }
+      return config;
+    },
+    setConfigError(error) {
+      return Promise.reject(error);
+    },
+    successEvent(response) {
+      return response;
+    },
+    errorEvent(error) {
+      if (error.response.status) {
+        error.response.data.status = error.response.status;
+      }
+      return Promise.reject(error.response.data);
+    },
+    httpGet(url, params, needWarning) {
+      const { getAxiosInstance } = model();
+      const { loading, warnning, clearLoading } = model("loadingModel");
+      params = params || {};
+      loading();
+      return new Promise((resolve, reject) => {
+        getAxiosInstance()
+          .get(url, {
+            params,
+          })
+          .then(res => {
+            resolve(res.data);
+            if (!needWarning) {
+              clearLoading();
             }
-            return config;
-        },
-        setConfigError(error) {
-            setState({ httpLoading: true });
-            return Promise.reject(error);
-        },
-        successEvent(response) {
-            setState({ httpLoading: false });
-            return response;
-        },
-        errorEvent(error) {
-            setState({ httpLoading: false });
-            if (error.response.status) {
-                error.response.data.status = error.response.status;
+          })
+          .catch(e => {
+            if (needWarning) {
+              warnning(e.error);
             }
-            return Promise.reject(error.response.data);
-        },
-        httpGet(url, params, needWarning) {
-            const { getAxiosInstance } = model();
-            const { warnning } = model("loadingModel");
-            params = params || {};
-            return new Promise((resolve, reject) => {
-                getAxiosInstance()
-                    .get(url, {
-                        params,
-                    })
-                    .then(res => {
-                        resolve(res.data);
-                    })
-                    .catch(e => {
-                        if (needWarning) {
-                            warnning(e.error);
-                        }
-                        reject(e);
-                    });
-            });
-        },
-        httpPost(url, body, options, needWarning) {
-            const { getAxiosInstance } = model();
-            const { warnning } = model("loadingModel");
-            options = options || {};
-            body = body || {};
-            if (!(body instanceof FormData)) {
-                if (options.body !== "json") {
-                    body = qs.stringify(body);
-                }
+            reject(e);
+          });
+      });
+    },
+    httpPost(url, body, options, needWarning) {
+      const { getAxiosInstance } = model();
+      const { loading, warnning, clearLoading } = model("loadingModel");
+      loading();
+      options = options || {};
+      body = body || {};
+      if (!(body instanceof FormData)) {
+        if (options.body !== "json") {
+          body = qs.stringify(body);
+        }
+      }
+      return new Promise((resolve, reject) => {
+        getAxiosInstance()
+          .post(url, body, { withCredentials: true })
+          .then(res => {
+            resolve(res.data);
+            if (!needWarning) {
+              clearLoading();
+            }
+          })
+          .catch(e => {
+            reject(e);
+            if (needWarning) {
+              warnning(e.error);
             }
-            return new Promise((resolve, reject) => {
-                getAxiosInstance()
-                    .post(url, body, { withCredentials: true })
-                    .then(res => {
-                        resolve(res.data);
-                    })
-                    .catch(e => {
-                        reject(e);
-                        if (needWarning) {
-                            warnning(e.error);
-                        }
-                    });
-            });
-        },
-        addAsyncStorage(key, value) {
-            return new Promise(async (resolve, reject) => {
-                try {
-                    await AsyncStorage.setItem(key, value);
-                    resolve();
-                } catch (e) {
-                    reject(e);
-                }
-            });
-        },
-        removeAsyncStorage(key) {
-            return new Promise(async (resolve, reject) => {
-                try {
-                    await AsyncStorage.removeItem(key);
-                    resolve();
-                } catch (e) {
-                    reject(e);
-                }
-            });
-        },
-        getAsyncStorage(key) {
-            return new Promise(async (resolve, reject) => {
-                try {
-                    const val = await AsyncStorage.getItem(key);
-                    resolve(val);
-                } catch (e) {
-                    reject(e);
-                }
-            });
-        },
-    }),
+          });
+      });
+    },
+    addAsyncStorage(key, value) {
+      return new Promise(async (resolve, reject) => {
+        try {
+          await AsyncStorage.setItem(key, value);
+          resolve();
+        } catch (e) {
+          reject(e);
+        }
+      });
+    },
+    removeAsyncStorage(key) {
+      return new Promise(async (resolve, reject) => {
+        try {
+          await AsyncStorage.removeItem(key);
+          resolve();
+        } catch (e) {
+          reject(e);
+        }
+      });
+    },
+    getAsyncStorage(key) {
+      return new Promise(async (resolve, reject) => {
+        try {
+          const val = await AsyncStorage.getItem(key);
+          resolve(val);
+        } catch (e) {
+          reject(e);
+        }
+      });
+    },
+  }),
 };

+ 20 - 33
models/loadingModel.js

@@ -6,48 +6,35 @@ export default {
     title: "成功",
     show: false,
     time: -1,
+    tKey: "",
   },
   actions: ({ model, setState }) => ({
     loading() {
-      const key = Toast.loading("Loading...", 0);
-      setState({
-        key,
-      });
+      const { tKey } = model();
+      if (!tKey) {
+        const newKey = Toast.loading("Loading...", 0);
+        setState({
+          tKey: newKey,
+        });
+      }
     },
     success(title) {
-      setState({
-        status: "success",
-        title,
-        show: true,
-        time: 3000,
-      });
-      const { setTime } = model();
-      setTime();
+      const { clearLoading } = model();
+      clearLoading();
+      Toast.success(title, 2);
     },
     warnning(title) {
-      setState({
-        status: "warn",
-        title,
-        show: true,
-        time: 3000,
-      });
-      const { setTime } = model();
-      setTime();
-    },
-    setTime() {
-      const { time, show, clear } = model();
-      if (time > 0 && show) {
-        setTimeout(() => {
-          if (show) {
-            clear();
-          }
-        }, time);
-      }
+      const { clearLoading } = model();
+      clearLoading();
+      Toast.info(title, 2);
     },
     clearLoading() {
-      const { key } = model();
-      if (key) {
-        Portal(key);
+      const { tKey } = model();
+      if (tKey) {
+        Portal.remove(tKey);
+        setState({
+          tKey: "",
+        });
       }
     },
   }),

+ 18 - 4
models/userModel.js

@@ -225,6 +225,11 @@ export default {
             let guideStep = res;
             if (status === "PASS" && !guideStep) {
               guideStep = "5";
+            } else if (
+              status === "DENY" &&
+              (!guideStep || guideStep === "finish")
+            ) {
+              guideStep = "5";
             }
             setState({ guideStep, isLogin: true });
             resolve(guideStep || "1");
@@ -267,8 +272,8 @@ export default {
         week,
         startTime,
         endTime,
-		merchantNatureId,
-		qualification,
+        merchantNatureId,
+        qualification,
         logo,
       } = model();
       return {
@@ -278,10 +283,19 @@ export default {
         week,
         startTime,
         endTime,
-		merchantNatureId,
-		qualification,
+        merchantNatureId,
+        qualification,
         logo,
       };
     },
+    checkAgain({ ...info }) {
+      const { updateMerchant, changeGuideStep } = model();
+      updateMerchant({
+        ...info,
+        status: "PENDING",
+      }).then(() => {
+        changeGuideStep("5");
+      });
+    },
   }),
 };

+ 69 - 34
screens/HomeScreen.js

@@ -6,6 +6,7 @@ import {
   TouchableOpacity,
   ImageBackground,
   ScrollView,
+  View,
 } from "react-native";
 import { useModel } from "flooks";
 import {
@@ -20,7 +21,7 @@ import {
   TopNavigation,
   TopNavigationAction,
 } from "@ui-kitten/components";
-import { NoticeBar } from "@ant-design/react-native";
+import { NoticeBar, Accordion } from "@ant-design/react-native";
 import { createMaterialTopTabNavigator } from "@react-navigation/material-top-tabs";
 import { useFocusEffect } from "@react-navigation/native";
 import Badge from "../components/Badge";
@@ -58,6 +59,11 @@ const styles = StyleSheet.create({
   banner: {
     height: 100,
     backgroundColor: "#E5E5E5",
+    position: "absolute",
+    left: 0,
+    right: 0,
+    top: 0,
+    zIndex: 1,
   },
   FlexRow: {
     flexDirection: "row",
@@ -83,28 +89,42 @@ const styles = StyleSheet.create({
     justifyContent: "center",
     paddingBottom: 10,
   },
+  allBadges1: {
+    marginHorizontal: 10,
+  },
+  allBadges: {
+    overflow: "hidden",
+    height: 20,
+    marginHorizontal: 10,
+  },
+  more: {
+    position: "absolute",
+    right: 5,
+    top: 57,
+  },
   badges: {
     flexDirection: "row",
-    justifyContent: "center",
+    flexWrap: "wrap",
+    alignSelf: "center",
+    backgroundColor: "rgba(0,0,0,0)",
   },
   badge: {
     marginRight: 15,
+    marginTop: 3,
   },
   labelText: {
     textAlign: "left",
     fontSize: 13,
     paddingHorizontal: 10,
-	minWidth: 120,
+    minWidth: 120,
   },
   homeCard: {
-    position: "absolute",
-    left: 13,
-    top: 66,
-    right: 13,
     zIndex: 2,
+    marginHorizontal: 15,
+    marginTop: 80,
   },
   mainContent: {
-    marginTop: 120,
+    marginTop: 0,
     backgroundColor: "transparent",
   },
   tab: {
@@ -171,6 +191,8 @@ export default function HomeScreen({ navigation, route }) {
   const { httpGet } = useModel("httpModel", true);
   const { getMyList } = useModel("couponModel", true);
 
+  const [showMore, changeShow] = React.useState(false);
+
   const [couponList, setCouponList] = React.useState([]);
   const couponTips = React.useMemo(() => {
     if (couponList.length > 0) {
@@ -233,7 +255,7 @@ export default function HomeScreen({ navigation, route }) {
             userLogout();
           }}
         />
-        <MenuItem title="05.29.0.2版本" />
+        <MenuItem title="05.29.0.3版本" />
       </OverflowMenu>
     </>
   );
@@ -252,6 +274,16 @@ export default function HomeScreen({ navigation, route }) {
       );
     });
   };
+
+  const CoupnbadgeList = list => {
+    return list.map((item, index) => {
+      return (
+        <Badge style={styles.badge} key={`coupon${index}`}>
+          {item.name}
+        </Badge>
+      );
+    });
+  };
   const [scrollRef, setScroll] = React.useState();
 
   React.useEffect(() => {
@@ -275,17 +307,6 @@ export default function HomeScreen({ navigation, route }) {
         accessoryLeft={renderBackAction}
         accessoryRight={renderRightActions}
       />
-      {couponList.length > 0 && (
-        <NoticeBar
-          mode="link"
-          onPress={() => {
-            RootNavigation.navigate("CouponList");
-          }}
-          marqueeProps={{ loop: true, style: { fontSize: 12, color: "red" } }}
-        >
-          店铺有新的优惠券了 {couponTips}
-        </NoticeBar>
-      )}
       <ScrollView contentContainerStyle={{ flexGrow: 1 }} ref={setScroll}>
         <Layout style={styles.container}>
           <ImageBackground source={{ uri: banner }} style={styles.banner}>
@@ -316,19 +337,6 @@ export default function HomeScreen({ navigation, route }) {
             <Layout style={styles.cardMain}>
               <Layout style={styles.cardTop}>
                 <Text>{showName}</Text>
-                {firstOrder != null && firstOrder !== "" && firstOrder > 0 && (
-                  <Button
-                    appearance="ghost"
-                    status="info"
-                    onPress={() => {
-                      RootNavigation.navigate("FirstOrder");
-                    }}
-                  >
-                    <Text category="h1" status="danger">
-                      新用户立减 {firstOrder}
-                    </Text>
-                  </Button>
-                )}
                 <Layout style={[styles.FlexRow]}>
                   <Layout style={[styles.FlexRow, styles.layItem]}>
                     <Image source={img1} style={styles.zanImg} />
@@ -350,9 +358,36 @@ export default function HomeScreen({ navigation, route }) {
                   </Layout>
                 </Layout>
               </Layout>
-              <Layout style={styles.badges}>{badgeList(fullReductions)}</Layout>
+              <View style={styles.more}>
+                <Icon
+                  fill="#000"
+                  style={{ width: 10, height: 10 }}
+                  name="arrow-ios-downward"
+                />
+              </View>
+              <TouchableOpacity
+                key="event"
+                style={[showMore ? styles.allBadges1 : styles.allBadges]}
+                onPress={() => {
+                  changeShow(!showMore);
+                }}
+              >
+                <Layout style={styles.badges}>
+                  {badgeList(fullReductions)}
+                  {firstOrder !== 0 &&
+                    firstOrder !== null &&
+                    firstOrder !== "" && (
+                      <Badge style={styles.badge} key="firstOrder">
+                        新用户立减
+                        {firstOrder}
+                      </Badge>
+                    )}
+                  {CoupnbadgeList(couponList)}
+                </Layout>
+              </TouchableOpacity>
             </Layout>
             <Button
+              key="boad"
               appearance="ghost"
               status="info"
               accessoryRight={NextIcon}

+ 3 - 1
screens/OrderScreen.js

@@ -62,6 +62,7 @@ export default function OrderScreen({ navigation }) {
   const [startState, changeStart] = React.useState(false);
   const [selectedIndex, setSelectedIndex] = React.useState(0);
   const { changeBackground } = useModel("barModel");
+  const { clearLoading } = useModel("loadingModel");
   useFocusEffect(
     React.useCallback(() => {
       changeBackground(theme["color-primary-500"]);
@@ -87,6 +88,7 @@ export default function OrderScreen({ navigation }) {
     };
     return getOrderList(page, size, query).then(res => {
       changeStart(false);
+      clearLoading();
       return Promise.resolve(res);
     });
   }
@@ -98,7 +100,7 @@ export default function OrderScreen({ navigation }) {
         <Layout style={styles.buttonGroup}>
           <Button
             style={{ marginRight: 10 }}
-            appearance={automaticOrder ? "outline" : "fill"}
+            appearance={automaticOrder ? "outline" : "filled"}
             onPress={() =>
               updateMerchant({
                 automaticOrder: !automaticOrder,

+ 52 - 22
screens/RegisterSeScreen.js

@@ -52,9 +52,13 @@ export default function RegisterScreen() {
   const theme = useTheme();
   const { changeBackground } = useModel("barModel");
   const { httpGet } = useModel("httpModel", true);
-  const { mid, registerSecend, registerInfo, getNowUser } = useModel(
-    "userModel"
-  );
+  const {
+    mid,
+    registerSecend,
+    registerInfo,
+    getNowUser,
+    checkAgain,
+  } = useModel("userModel");
   const {
     guideHome_title1,
     guideHome_title2,
@@ -101,7 +105,9 @@ export default function RegisterScreen() {
   React.useEffect(() => {
     if (mid) {
       let userInfo = getNowUser();
-      changeCategory(userInfo.category);
+      if (userInfo.category.length > 0) {
+        changeCategory(userInfo.category[0].id);
+      }
       changeAddress(userInfo.address);
       changeWeek(userInfo.week);
       changeLogo(userInfo.logo);
@@ -209,24 +215,48 @@ export default function RegisterScreen() {
               onChange={changeLogo}
             />
             <Layout style={styles.layoutLeft} level="1">
-              <Button
-                status="primary"
-                disabled={!canNext}
-                onPress={() =>
-                  registerSecend({
-                    category,
-                    address,
-                    week,
-                    startTime,
-                    endTime,
-                    qualification,
-                    merchantNatureId,
-                    logo,
-                  })
-                }
-              >
-                {next}
-              </Button>
+              {mid !== 0 ? (
+                <Button
+                  status="primary"
+                  disabled={!canNext}
+                  onPress={() => {
+                    let categorys = [...categoryList].filter(item => {
+                      return item.id === category;
+                    });
+                    checkAgain({
+                      category: categorys,
+                      address,
+                      week,
+                      startTime,
+                      endTime,
+                      qualification,
+                      merchantNatureId,
+                      logo,
+                    });
+                  }}
+                >
+                  提交审核
+                </Button>
+              ) : (
+                <Button
+                  status="primary"
+                  disabled={!canNext}
+                  onPress={() =>
+                    registerSecend({
+                      category,
+                      address,
+                      week,
+                      startTime,
+                      endTime,
+                      qualification,
+                      merchantNatureId,
+                      logo,
+                    })
+                  }
+                >
+                  {next}
+                </Button>
+              )}
             </Layout>
           </Card>
           <ConnectButton />