diff --git a/src/api/apiClient.ts b/src/api/apiClient.ts index e72b58b..69ecf11 100644 --- a/src/api/apiClient.ts +++ b/src/api/apiClient.ts @@ -5,8 +5,8 @@ import {logout} from "../features/auth/authSlice"; import {store} from "../redux/store"; const apiClient = axios.create({ - // baseURL: 'https://assemblr.denco.store', - baseURL: 'http://192.168.1.101:5000', + baseURL: 'https://assemblr.denco.store', + // baseURL: 'http://192.168.1.101:5000', }); apiClient.interceptors.request.use(async (config) => { diff --git a/src/api/ordersApi.ts b/src/api/ordersApi.ts index e68df74..0fa2846 100644 --- a/src/api/ordersApi.ts +++ b/src/api/ordersApi.ts @@ -1,6 +1,8 @@ import apiClient from "./apiClient"; import {Order} from "../types/order"; import * as inspector from "inspector"; +import {OrderStatus} from "../features/ordersFilter/ordersFilterSlice"; +import {ShippingWarehouse} from "../types/shippingWarehouse"; const router = '/orders'; @@ -17,8 +19,20 @@ const ordersApi = { let response = await apiClient.get(`${router}/getOrders`, {params}) return response.data; }, - getOrdersByProduct: async (productId: number): Promise => { - let response = await apiClient.get(`${router}/getByProductId?productId=${productId}`); + getOrdersByProduct: async (params: { + productId: number, + orderBy: "createdOn" | "shipmentDate", + desc: boolean, + status: OrderStatus, + shipmentDate: string, + shippingWarehouse: ShippingWarehouse + }): Promise => { + let response = await apiClient.get(`${router}/getByProductId`, { + params: { + ...params, + shippingWarehouse: params.shippingWarehouse.id + } + }); return response.data; }, getOrderById: async (orderId: number): Promise => { diff --git a/src/assets/adaptive-icon.png b/src/assets/adaptive-icon.png index a6967d5..c4ea1a0 100644 Binary files a/src/assets/adaptive-icon.png and b/src/assets/adaptive-icon.png differ diff --git a/src/assets/icon.png b/src/assets/icon.png index f9af95a..d7ab50c 100644 Binary files a/src/assets/icon.png and b/src/assets/icon.png differ diff --git a/src/assets/icons/filter.png b/src/assets/icons/filter.png new file mode 100644 index 0000000..17d1db1 Binary files /dev/null and b/src/assets/icons/filter.png differ diff --git a/src/components/OrderCard/OrderCard.tsx b/src/components/OrderCard/OrderCard.tsx index f1d57d9..c9da9ac 100644 --- a/src/components/OrderCard/OrderCard.tsx +++ b/src/components/OrderCard/OrderCard.tsx @@ -40,6 +40,9 @@ const OrderCard: FC = ({onPress, onSelect, order}) => { Селлер: {order.sellerName} Маркетплейс: {order.marketplaceName} Товаров в заказе: {order.products.length} + Создан: {order.createdOn} + Отгрузка: {order.shipmentDate} + diff --git a/src/components/SortingButton/SortingButton.tsx b/src/components/SortingButton/SortingButton.tsx index 56efdbb..5a9a088 100644 --- a/src/components/SortingButton/SortingButton.tsx +++ b/src/components/SortingButton/SortingButton.tsx @@ -12,10 +12,11 @@ const SortingButton: FC = ({onPress}) => { return ( + - + - Сортировка + Фильтр @@ -27,7 +28,7 @@ const styles = StyleSheet.create({ display: 'flex', flexDirection: 'row', alignItems: 'center', - columnGap: responsiveWidth(1) + columnGap: responsiveWidth(1), }, imageWrapper: { width: RFPercentage(3), diff --git a/src/features/assembly/assemblySlice.ts b/src/features/assembly/assemblySlice.ts index 2e385a1..71afcfc 100644 --- a/src/features/assembly/assemblySlice.ts +++ b/src/features/assembly/assemblySlice.ts @@ -51,7 +51,6 @@ export const assembly = createSlice({ }, confirmAssembly: (state) => { if (!state.assembly) return; - state.assembly.state = ASSEMBLY_STATE.CONFIRMED; state.localState = ASSEMBLY_STATE.CONFIRMED; }, diff --git a/src/features/ordersFilter/ordersFilterSlice.ts b/src/features/ordersFilter/ordersFilterSlice.ts index a88562b..9070d0a 100644 --- a/src/features/ordersFilter/ordersFilterSlice.ts +++ b/src/features/ordersFilter/ordersFilterSlice.ts @@ -50,7 +50,7 @@ export interface OrdersFilterState { const initialState: OrdersFilterState = { isVisible: false, orderBy: "shipmentDate", - desc: true, + desc: false, shipmentDate: (new Date()).toISOString(), status: OrderStatus.AWAITING_PACKAGING, page: 0, diff --git a/src/screens/BarcodeScreen/BarcodeScreen.tsx b/src/screens/BarcodeScreen/BarcodeScreen.tsx index 8cee1c4..d297d59 100644 --- a/src/screens/BarcodeScreen/BarcodeScreen.tsx +++ b/src/screens/BarcodeScreen/BarcodeScreen.tsx @@ -1,10 +1,10 @@ import {Button, StyleSheet, Text, View} from "react-native"; -import {useAppDispatch} from "../../redux/store"; +import {RootState, useAppDispatch} from "../../redux/store"; import * as process from "process"; import {responsiveHeight, responsiveWidth} from "react-native-responsive-dimensions"; import SearchBar from "../../components/SearchBar/SearchBar"; -import {useDispatch} from "react-redux"; -import {NavigationProp, useNavigation} from "@react-navigation/native"; +import {useDispatch, useSelector} from "react-redux"; +import {NavigationProp, useFocusEffect, useNavigation, useNavigationState} from "@react-navigation/native"; import {TabNavigatorParamList} from "../MainScreen/MainScreen"; import {FlashList} from "@shopify/flash-list"; import {Order} from "../../types/order"; @@ -15,23 +15,41 @@ import {useEffect, useState} from "react"; import {openScanModal} from "../../features/scanModal/scanModalSlice"; import ordersApi from "../../api/ordersApi"; import DTitle from "../../components/DTitle/DTitle"; +import {useNormalizedSnapPoints} from "@gorhom/bottom-sheet/lib/typescript/hooks"; +import SortingButton from "../../components/SortingButton/SortingButton"; +import useBarcodeOrders from "./useBarcodeOrders"; +import {openOrdersFilterModal} from "../../features/ordersFilter/ordersFilterSlice"; function BarcodeScreen() { const dispatch = useDispatch(); - const navigator = useNavigation>(); - const [orders, setOrders] = useState([]); + const [productId, setProductId] = useState(-1); + const {orders, isUpdating} = useBarcodeOrders({productId}); + const isScanModalVisible = useSelector((state: RootState) => state.scanModal.isVisible); + const navigator = useNavigation>(); + const navigationState = useNavigationState((state) => state); useEffect(() => { - dispatch(openScanModal()); - }, []); + console.log("state changed") + if (!navigationState.history) return; + // @ts-ignore + let currentTabKey: string = navigationState.history[navigationState.history.length - 1].key; + if (currentTabKey.startsWith("Barcode")) if (!isScanModalVisible) dispatch(openScanModal()); + }, [navigationState]); return ( { - ordersApi.getOrdersByProduct(product.productId).then(setOrders) + setProductId(product.productId); }}/> + { + dispatch(openOrdersFilterModal()); + }} + /> - {orders.length > 0 ? 0 || isUpdating ? { + }} keyboardShouldPersistTaps={"never"} data={orders} keyExtractor={(item: Order) => item.orderNumber.toString()} diff --git a/src/screens/BarcodeScreen/useBarcodeOrders.tsx b/src/screens/BarcodeScreen/useBarcodeOrders.tsx new file mode 100644 index 0000000..0b71580 --- /dev/null +++ b/src/screens/BarcodeScreen/useBarcodeOrders.tsx @@ -0,0 +1,47 @@ +import {useSelector} from "react-redux"; +import {RootState} from "../../redux/store"; +import {useEffect, useState} from "react"; +import {Order} from "../../types/order"; +import ordersApi from "../../api/ordersApi"; +import {setOrderBy} from "../../features/ordersFilter/ordersFilterSlice"; +import {setOrder} from "../../features/assembly/assemblySlice"; + +export type Props = { + productId: number; +} +const useBarcodeOrders = (props: Props) => { + const [orders, setOrders] = useState([]); + const [isUpdating, setIsUpdating] = useState(false); + const {productId} = props; + const { + orderBy, + isVisible, + desc, + shipmentDate, + status, + shippingWarehouse + } = useSelector((state: RootState) => state.ordersFilter); + const fetchOrders = async (): Promise => { + return ordersApi.getOrdersByProduct({productId, orderBy, shipmentDate, status, shippingWarehouse, desc}); + } + useEffect(() => { + if (isVisible || productId < 0) return; + setOrders([]); + setIsUpdating(true); + fetchOrders().then((fetchedOrders) => { + setOrders(fetchedOrders); + setIsUpdating(false); + }); + }, [ + productId, + isVisible, + desc, + orderBy, + shipmentDate, + status, + shippingWarehouse]); + + return {orders, isUpdating} +} + +export default useBarcodeOrders; \ No newline at end of file diff --git a/src/screens/MainScreen/MainScreen.tsx b/src/screens/MainScreen/MainScreen.tsx index 1578816..794ad65 100644 --- a/src/screens/MainScreen/MainScreen.tsx +++ b/src/screens/MainScreen/MainScreen.tsx @@ -99,7 +99,7 @@ function MainScreen() { name: tabScreen.name, component: tabScreen.component, icon: tabScreen.icon, - hidden: tabScreen.hidden + hidden: tabScreen.hidden, })}/> )} diff --git a/src/screens/OrderScreen/OrderScreen.tsx b/src/screens/OrderScreen/OrderScreen.tsx index 5df09b2..3920b28 100644 --- a/src/screens/OrderScreen/OrderScreen.tsx +++ b/src/screens/OrderScreen/OrderScreen.tsx @@ -1,4 +1,4 @@ -import {View, Image, StyleSheet, TouchableOpacity} from "react-native"; +import {View, Image, StyleSheet, TouchableOpacity, ScrollView} from "react-native"; import {responsiveHeight, responsiveWidth} from "react-native-responsive-dimensions"; import DText from "../../components/DText/DText"; import {RFPercentage} from "react-native-responsive-fontsize"; @@ -8,7 +8,7 @@ import React, {FC, useEffect, useState} from "react"; import {useDispatch, useSelector} from "react-redux"; import {RootState} from "../../redux/store"; import {closeLoadingModal, openLoadingModal, setLoadingText} from "../../features/loadingModal/loadingModalSlice"; -import {useNavigation} from "@react-navigation/native"; +import {NavigationProp, useNavigation} from "@react-navigation/native"; import printingApi from "../../api/printingApi"; import PrintingService from "../../utils/PrintingService"; import OrderProductsList from "../../components/OrderCard/OrderProductsList"; @@ -31,7 +31,7 @@ import {RenderTargetOptions} from "@shopify/flash-list"; import {createOnShouldStartLoadWithRequest} from "react-native-webview/lib/WebViewShared"; import assemblyApi from "../../api/assemblyApi"; import Toast from "react-native-toast-message"; -import mainScreen from "../MainScreen/MainScreen"; +import mainScreen, {TabNavigatorParamList} from "../MainScreen/MainScreen"; import toast from "../../components/Toast/Toast"; import {openImageZoomModal, setImages} from "../../features/imageZoomModal/loadingModalSlice"; @@ -42,16 +42,11 @@ type AssemblyPeriod = { } const NoOrderScreen: FC = () => { + + return ( Заказ не выбран! - - { - // @ts-ignore - navigator.navigate("Box"); - }} label={"На главную"}/> - - ) } @@ -74,7 +69,8 @@ type OrderScreenProps = { order: Order; } const OrderScreen: FC = ({order}) => { - const navigator = useNavigation(); + const navigator = useNavigation>(); + const dispatch = useDispatch(); const assembly = useSelector((state: RootState) => state.assembly.assembly); const assemblyState = useSelector((state: RootState) => state.assembly.localState); @@ -96,7 +92,6 @@ const OrderScreen: FC = ({order}) => { }) if (ok) { dispatch(confirmAssembly()); - } else { setSkipConfirmButtonVisible(true); } @@ -109,7 +104,6 @@ const OrderScreen: FC = ({order}) => { onPress={() => setAcceptModalVisible(true)} label={"Начать сборку"}/>) case ASSEMBLY_STATE.ASSEMBLING_PRODUCTS: - return ( = ({order}) => { case ASSEMBLY_STATE.CONFIRMED: return ( <> - printLabel()} containerStyle={styles.buttonContainer} @@ -161,6 +154,7 @@ const OrderScreen: FC = ({order}) => { text2: message }); dispatch(endAssembly()); + navigator.navigate('Barcode'); }) }}/> @@ -201,7 +195,17 @@ const OrderScreen: FC = ({order}) => { text2: 'Неудалось обновить состояние текущей сборки на сервере' }) }); - + switch (assemblyState) { + case ASSEMBLY_STATE.CONFIRMED: + printLabel(); + break; + case ASSEMBLY_STATE.ASSEMBLING_PRODUCTS: + if (!selectedProduct) return; + if (order.products.length == 1) { + dispatch(setAssembled({orderProductId: selectedProduct.databaseId})); + } + break; + } }, [assemblyState]); useEffect(() => { if (!order) return; @@ -230,17 +234,20 @@ const OrderScreen: FC = ({order}) => { - Заказ - Номер заказа: {order.orderNumber} - Маркетплейс: {order.marketplaceName} - Селлер: {order.sellerName} - {} - Товар - Артикул DENCO: {selectedProduct?.dencoArticle} - Поставщик: {selectedProduct?.supplierName} - Номер товара: {0} - {/*{}*/} - {/*Сборка*/} + + Заказ + Номер заказа: {order.orderNumber} + Маркетплейс: {order.marketplaceName} + Селлер: {order.sellerName} + Создан: {order.createdOn} + Отгрузка: {order.shipmentDate} + {} + Товар + Арт. DENCO: {selectedProduct?.dencoArticle} + Арт. поставщика: {selectedProduct?.supplierArticle} + Фасовка: {selectedProduct?.inBlock} шт. + Поставщик: {selectedProduct?.supplierName} + diff --git a/src/types/order.ts b/src/types/order.ts index a019c71..dc080c7 100644 --- a/src/types/order.ts +++ b/src/types/order.ts @@ -6,8 +6,8 @@ export type OrderProduct = { assembled: boolean; shipped: boolean imageUrl: string; - - + supplierArticle: string; + inBlock: number; }; export enum BaseMarketplace { @@ -24,5 +24,7 @@ export type Order = { sellerName: string; products: OrderProduct[]; status: number; + shipmentDate: string; + createdOn: string; };