import {View, Image, StyleSheet, TouchableOpacity} from "react-native"; import {responsiveHeight, responsiveWidth} from "react-native-responsive-dimensions"; import DText from "../../components/DText/DText"; import {RFPercentage} from "react-native-responsive-fontsize"; import DTitle from "../../components/DTitle/DTitle"; import BasicButton from "../../components/BasicButton/BasicButton"; 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 printingApi from "../../api/printingApi"; import PrintingService from "../../utils/PrintingService"; import OrderProductsList from "../../components/OrderCard/OrderProductsList"; import { confirmAssembly, endAssembly, selectProduct, setAssembled, setAssembly, setOrder, startAssembly } from "../../features/assembly/assemblySlice"; import AcceptModal from "../../components/Modals/AcceptModal/AcceptModal"; import {Order} from "../../types/order"; import acceptModal from "../../components/Modals/AcceptModal/AcceptModal"; import printingService from "../../utils/PrintingService"; import ReprintModal from "../../components/Modals/ReprintModal/ReprintModal"; import {setPrinterName} from "../../features/printing/printingSlice"; import {openReprintModal} from "../../features/reprintModal/reprintModalSlice"; import {ASSEMBLY_STATE} from "../../types/assembly"; 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 toast from "../../components/Toast/Toast"; import {openImageZoomModal, setImages} from "../../features/imageZoomModal/loadingModalSlice"; type AssemblyPeriod = { started: Date; ended: Date; } const NoOrderScreen: FC = () => { return ( Заказ не выбран! { // @ts-ignore navigator.navigate("Box"); }} label={"На главную"}/> ) } const noOrderStyles = StyleSheet.create({ container: { justifyContent: "center", flex: 1, rowGap: responsiveHeight(5) }, title: { textAlign: "center", fontSize: responsiveWidth(5) }, buttonWrapper: { paddingHorizontal: responsiveWidth(20), } }) type OrderScreenProps = { order: Order; } const OrderScreen: FC = ({order}) => { const navigator = useNavigation(); const dispatch = useDispatch(); const assembly = useSelector((state: RootState) => state.assembly.assembly); const assemblyState = useSelector((state: RootState) => state.assembly.localState); const initialOrder = useSelector((state: RootState) => state.assembly.initialOrder); const selectedProduct = useSelector((state: RootState) => state.assembly.selectedProduct); const [acceptModalVisible, setAcceptModalVisible] = useState(false); const [skipConfirmButtonVisible, setSkipConfirmButtonVisible] = useState(false); const _confirmAssembly = async () => { if (!assembly) return; dispatch(setLoadingText('Подтверждение сборки...')) dispatch(openLoadingModal()); assemblyApi.confirm(assembly.databaseId).then(({ok, message}) => { dispatch(closeLoadingModal()); Toast.show({ type: ok ? 'success' : 'error', text1: 'Подтверждение сборки', text2: message }) if (ok) { dispatch(confirmAssembly()); } else { setSkipConfirmButtonVisible(true); } }) } const getButtons = () => { switch (assemblyState) { case ASSEMBLY_STATE.NOT_STARTED: return ( setAcceptModalVisible(true)} label={"Начать сборку"}/>) case ASSEMBLY_STATE.ASSEMBLING_PRODUCTS: return ( { if (!selectedProduct) return; dispatch(setAssembled({orderProductId: selectedProduct.databaseId})) }} />) case ASSEMBLY_STATE.ALL_PRODUCTS_ASSEMBLED: return ( <> { _confirmAssembly(); }} containerStyle={styles.buttonContainer} label={"Подтвердить сборку"} /> {skipConfirmButtonVisible && { dispatch(confirmAssembly()); }} style={{backgroundColor: 'orange'}} containerStyle={styles.buttonContainer} label={"Пропустить подтверждение сборки"} />} ) case ASSEMBLY_STATE.CONFIRMED: return ( <> printLabel()} containerStyle={styles.buttonContainer} label={"Печать этикетки"} /> { if (!assembly) return; assemblyApi.close(assembly.databaseId).then(({ok, message}) => { Toast.show({ type: ok ? 'success' : 'error', text1: 'Завершение сборки', text2: message }); dispatch(endAssembly()); }) }}/> ) case ASSEMBLY_STATE.ENDED: return ( { }}/> ) } } const printLabel = () => { if (!order) return; let printer = printingService.getInstance().getPrinter(order.baseMarketplace); dispatch(setLoadingText('Идет печать этикетки...')) dispatch(openLoadingModal()) printingApi.getLabel(order.databaseId).then(pdfData => { printingService.getInstance().printPdf(printer, pdfData).then((response) => { dispatch(closeLoadingModal()); if (response) return; dispatch(setPrinterName({printerName: printer})); dispatch(openReprintModal()); }); }) } useEffect(() => { if (!assembly) return; assemblyApi.updateState(assembly.databaseId, Number(assemblyState)).then(ok => { if (ok) return; Toast.show({ type: 'error', text1: 'Обновление состояния', text2: 'Неудалось обновить состояние текущей сборки на сервере' }) }); }, [assemblyState]); useEffect(() => { if (!order) return; dispatch(selectProduct(0)); }, [initialOrder]); return ( { if (!order) return; dispatch(selectProduct(productId)) }}/> { if (!selectedProduct) return; dispatch(setImages([selectedProduct.imageUrl])); dispatch(openImageZoomModal()); }}> Заказ Номер заказа: {order.orderNumber} Маркетплейс: {order.marketplaceName} Селлер: {order.sellerName} {} Товар Артикул DENCO: {selectedProduct?.dencoArticle} Поставщик: {selectedProduct?.supplierName} Номер товара: {0} {/*{}*/} {/*Сборка*/} {getButtons()} { setAcceptModalVisible(false); assemblyApi.create(order.databaseId).then(creationResult => { Toast.show({ type: creationResult.ok ? 'success' : 'error', text1: 'Создание сборки', text2: creationResult.message }); if (!creationResult.ok) return; assemblyApi.getActive().then(activeAssembly => { dispatch(setAssembly(activeAssembly)); dispatch(startAssembly()) }) }) }} onRefused={() => { setAcceptModalVisible(false); }}/> ) } export const OrderScreenController: FC = () => { const order: Order | undefined = useSelector((state: RootState) => state.assembly.order); if (!order) return return } const styles = StyleSheet.create({ orderProductsListWrapper: { flex: 0.5, backgroundColor: "white", borderRadius: RFPercentage(3), padding: RFPercentage(2), }, buttonContainer: { flex: 1, }, dataContainer: { backgroundColor: "white", padding: RFPercentage(2), flex: 0.5, borderRadius: RFPercentage(3), }, buttonsContainer: { backgroundColor: "white", padding: RFPercentage(2), flex: 0.5, borderRadius: RFPercentage(3), rowGap: responsiveHeight(2) }, contentContainer: { flex: 1, borderRadius: RFPercentage(3), flexDirection: "row", columnGap: responsiveWidth(3), }, container: { width: "100%", height: "100%", display: "flex", paddingHorizontal: responsiveWidth(5), paddingBottom: responsiveHeight(10), rowGap: responsiveHeight(2) }, productsContainer: { display: "flex", flexDirection: "row", columnGap: responsiveWidth(3), height: responsiveHeight(30) }, buttonsWrapper: { rowGap: responsiveHeight(3) }, imageWrapper: { flex: 0.5, backgroundColor: "white", padding: RFPercentage(2), borderRadius: RFPercentage(3) }, image: { flex: 1, resizeMode: "contain" }, contentWrapper: { display: "flex", flexDirection: "column", gap: 0, }, contentTitle: { alignSelf: "center" }, articleText: { color: 'blue', textDecorationLine: 'underline' } }) export default OrderScreen;