ebanutsya

This commit is contained in:
2023-10-27 06:03:46 +03:00
parent 4f25112b5e
commit 37d3fb5a78
34 changed files with 831 additions and 17841 deletions

View File

@@ -1,6 +1,5 @@
import {Button, Text, View} from "react-native";
import {useAppDispatch} from "../../redux/store";
import {logoutUser, useGetPokemonByNameQuery} from "../../features/auth/authSlice";
import * as process from "process";
function BarcodeScreen() {

View File

@@ -1,6 +1,6 @@
import {Button, Text, View} from "react-native";
import {useAppDispatch} from "../../redux/store";
import {logoutUser, useGetPokemonByNameQuery} from "../../features/auth/authSlice";
import {logoutUser, useGetPokemonByNameQuery} from "../../features/auth/authSlice.ts.back";
import * as process from "process";
function BoxScreen() {

View File

@@ -2,18 +2,48 @@ import {SafeAreaView, StyleSheet, View} from "react-native";
import LoginScreen from "../LoginScreen/LoginScreen";
import MainScreen from "../MainScreen/MainScreen";
import SearchBar from "../../components/SearchBar/SearchBar";
import React from "react";
import React, {useEffect} from "react";
import {background} from "../../css/colors";
import {useSelector} from "react-redux";
import {useDispatch, useSelector} from "react-redux";
import {RootState} from "../../redux/store";
import {login} from "../../features/auth/authSlice";
import * as SecureStore from 'expo-secure-store';
import Toast from "react-native-toast-message";
import toastConfig from "../../components/Toast/Toast";
import ScanModal from "../../components/SearchBar/ScanModal";
import {closeScanModal, setScannedData} from "../../features/scanModal/scanModalSlice";
function CommonPage() {
const dim = useSelector((state: RootState) => state.interface.dim);
const isAuthorized = useSelector((state: RootState) => state.auth.isAuthorized);
const isScanModalVisible = useSelector((state: RootState) => state.scanModal.isVisible);
const dispatch = useDispatch();
const loadSettings = async () => {
const token = await SecureStore.getItemAsync('accessToken');
if (!token) return;
dispatch(login({accessToken: token}));
}
useEffect(() => {
loadSettings();
}, []);
return (
<View style={styles.main}>
<MainScreen/>
{isAuthorized ? <MainScreen/> : <LoginScreen/>}
<View style={[styles.overlay, {display: dim ? 'flex' : 'none'}]}/>
<Toast config={toastConfig}/>
<ScanModal visible={isScanModalVisible}
onCancelButtonPress={() => {
dispatch(closeScanModal());
}}
onChanged={text => {
dispatch(setScannedData(text));
dispatch(closeScanModal());
}}/>
</View>
)

View File

@@ -3,27 +3,37 @@ import {StyleSheet, Text, View, ImageBackground, Linking} from 'react-native';
import TelegramAuthButton from "components/TelegramAuthButton/TelegramAuthButton";
import WebView from "react-native-webview";
import InputField from "./components/InputField";
import {useDispatch, useSelector} from "react-redux";
import {loadToken, loginUser} from "features/auth/authSlice";
import {AppDispatch, RootState, useAppDispatch} from "redux/store";
import * as SecureStore from 'expo-secure-store';
import {initializeUseSelector} from "react-redux/es/hooks/useSelector";
import HomeScreen from "../HomeScreen/HomeScreen";
import {useAppDispatch} from "redux/store";
import {RFPercentage, RFValue} from "react-native-responsive-fontsize";
import {responsiveWidth} from "react-native-responsive-dimensions";
import userApi from "../../api/userApi";
import {useDispatch} from "react-redux";
import {login} from "../../features/auth/authSlice";
import Toast from "react-native-toast-message";
import * as SecureStore from 'expo-secure-store';
function LoginScreen() {
const dispatch = useAppDispatch();
const [login, setLogin] = useState('');
const [password, setPassword] = useState('');
const {status, errorMessage, isAuthenticated} = useSelector((state: RootState) => state.auth);
const [loginValue, setLoginValue] = useState('dsnon');
const [passwordValue, setPasswordValue] = useState('ochko');
const handleLogin = async () => {
dispatch(loginUser({login: login, password: password}));
const response = await userApi.login(loginValue, passwordValue);
if (!response.ok) {
Toast.show({
type: 'error',
text1: 'Ошибка авторизации',
text2: 'Неудалось войти используя указанные данные!'
});
setLoginValue("");
setPasswordValue("");
return;
}
await SecureStore.setItemAsync('accessToken', response.accessToken);
dispatch(login({accessToken: response.accessToken}));
}
useEffect(() => {
dispatch(loadToken());
}, []);
return (
<>
@@ -32,10 +42,9 @@ function LoginScreen() {
style={styles.image}>
<View style={styles.block}>
<Text style={styles.authText}>Авторизация</Text>
<InputField onChange={setLogin} placeholder={"Логин"}/>
<InputField onChange={setPassword} secureTextEntry={false} placeholder={"Пароль"}/>
<InputField value={loginValue} onChange={setLoginValue} placeholder={"Логин"}/>
<InputField value={passwordValue} onChange={setPasswordValue} secureTextEntry={false} placeholder={"Пароль"}/>
<TelegramAuthButton onPress={handleLogin}/>
<Text style={{fontSize: 36}}>{errorMessage}</Text>
</View>
</ImageBackground>
</View>}
@@ -64,7 +73,6 @@ const styles = StyleSheet.create({
},
authText: {
color: '#2478F8',
fontFamily: 'SF Pro Text',
fontSize: RFPercentage(3),
fontStyle: 'normal',
fontWeight: '500',

View File

@@ -7,13 +7,15 @@ type Props = {
placeholder?: string;
onChange?: (text: string) => void,
secureTextEntry?: boolean
value?: string
}
const InputField: FC<Props> = ({placeholder, onChange, secureTextEntry = false}) => {
const InputField: FC<Props> = ({placeholder, onChange, value, secureTextEntry = false}) => {
return (
<View style={styles.fieldContainer}>
<View style={styles.textInputWrapper}>
<TextInput
value={value}
placeholder={placeholder}
autoCorrect={false}
autoCapitalize={"none"}

View File

@@ -1,6 +1,6 @@
import {Button, Text, View} from "react-native";
import {useAppDispatch} from "../../redux/store";
import {logoutUser, useGetPokemonByNameQuery} from "../../features/auth/authSlice";
import {logoutUser, useGetPokemonByNameQuery} from "../../features/auth/authSlice.ts.back";
import * as process from "process";
function MoneyScreen() {

View File

@@ -6,6 +6,7 @@ import DTitle from "../../components/DTitle/DTitle";
import BasicButton from "../../components/BasicButton/BasicButton";
import Hyperlink from "../../components/Hyperlink/Hyperlink";
import React, {useState} from "react";
import userApi from "../../api/userApi";
type ArticleTextProps = {
article: number
@@ -48,8 +49,9 @@ function OrderScreen() {
<View style={styles.buttonsWrapper}>
{!order.assembled &&
<BasicButton label={"Отметить как собранный"} onPress={() => {
setOrder({...order, assembled: true})
console.log(order);
userApi.test()
// setOrder({...order, assembled: true})
// console.log(order);
}}/>
}

View File

@@ -1,100 +1,83 @@
import {ScrollView, StyleSheet, View} from "react-native";
import {ActivityIndicator, FlatList, ScrollView, StyleSheet, View} from "react-native";
import SearchBar from "../../components/SearchBar/SearchBar";
import OrderCard from "../../components/OrderCard/OrderCard";
import {RFPercentage} from "react-native-responsive-fontsize";
import {responsiveHeight, responsiveWidth} from "react-native-responsive-dimensions";
import SortingButton from "../../components/SortingButton/SortingButton";
import {useDispatch} from "react-redux";
import {useDispatch, useSelector} from "react-redux";
import {enableDim, disableDim} from "../../features/interface/interfaceSlice";
import {BottomSheetModal} from "@gorhom/bottom-sheet";
import {useMemo, useRef, useState} from "react";
import {useEffect, useMemo, useRef, useState} from "react";
import {RadioButton, Button} from "react-native-paper";
import DText from "../../components/DText/DText";
import {blue} from "../../css/colors";
import {background, blue} from "../../css/colors";
import DTitle from "../../components/DTitle/DTitle";
import BasicButton from "../../components/BasicButton/BasicButton";
import authSlice from "../../features/auth/authSlice";
import {generateRandomOrders, Order} from "../../types/order";
import {FlashList} from "@shopify/flash-list";
import SortingModal, {
SortingModalElement,
SortingModalHandles
} from "../../components/Modals/SortingModal/SortingModal";
import sortingModal from "../../components/Modals/SortingModal/SortingModal";
import flashListSeparator from "../../components/FlashListSeparator/FlashListSeparator";
import {RootState} from "../../redux/store";
import ordersApi from "../../api/ordersApi";
function OrdersScreen() {
const dispatch = useDispatch();
const bottomSheetModalRef = useRef<BottomSheetModal>(null);
const snapPoints = useMemo(() => ['30%', '30%'], []);
const [sortingValue, setSortingValue] = useState("createdOn");
const [orders, setOrders] = useState<Order[]>([]);
const sortingModalRef = useRef<SortingModalHandles | null>(null);
const defaultSortingValue = 'createdOnAsc';
const sortingModalElements: SortingModalElement[] = [
{id: 'createdOnAsc', value: 'createdOnAsc', label: 'Дата создания по убыванию'},
{id: 'createdOnDesc', value: 'createdOnDesc', label: 'Дата создания по возрастанию'},
{id: 'shipmentDateAsc', value: 'shipmentDateAsc', label: 'Дата отгрузки по убыванию'},
{id: 'shipmentDateDesc', value: 'shipmentDateDesc', label: 'Дата отгрузки по возрастанию'},
];
const [sortingValue, setSortingValue] = useState(defaultSortingValue);
return (
<View style={styles.container}>
<SearchBar onSearch={() => {
}} onSupplierProductSelected={product => {
ordersApi.getOrdersBySupplierProduct(product.supplierProductId).then(setOrders)
}}/>
<View style={styles.sortingButtonWrapper}>
<SortingButton onPress={() => {
dispatch(enableDim());
bottomSheetModalRef.current?.present();
if (!sortingModalRef.current) return;
sortingModalRef.current.present();
}}/>
</View>
<View style={styles.content}>
<ScrollView keyboardShouldPersistTaps={"never"} showsHorizontalScrollIndicator={false}
showsVerticalScrollIndicator={false}
contentContainerStyle={styles.scrollContainer}>
<FlashList
keyboardShouldPersistTaps={"never"}
data={orders}
keyExtractor={(item: Order) => item.orderNumber.toString()}
renderItem={({item}) =>
<OrderCard order={item} onPress={() => {
<OrderCard/>
<OrderCard/>
<OrderCard/>
<OrderCard/>
<OrderCard/>
<OrderCard/>
<OrderCard/>
</ScrollView>
}}/>}
showsHorizontalScrollIndicator={false}
showsVerticalScrollIndicator={true}
onEndReachedThreshold={0.1}
estimatedItemSize={720}
onEndReached={() => {
}}
ItemSeparatorComponent={flashListSeparator}
/>
<SortingModal onChange={setSortingValue}
onClose={() => {
console.log("Closed")
}}
ref={sortingModalRef}
elements={sortingModalElements}
defaultElementId={defaultSortingValue}
/>
</View>
<BottomSheetModal
ref={bottomSheetModalRef}
snapPoints={snapPoints}
onDismiss={() => {
dispatch(disableDim());
}}>
<View style={styles.sortingModalContainer}>
<View style={styles.radioButtonContainer}>
<RadioButton
color={blue}
uncheckedColor={'black'}
value={'createdOn'}
status={sortingValue == 'createdOn' ? 'checked' : 'unchecked'}
onPress={() => setSortingValue('createdOn')}
/>
<DText>По дате создания</DText>
</View>
<View style={styles.radioButtonContainer}>
<RadioButton
color={blue}
uncheckedColor={'black'}
value={'shipmentDate'}
status={sortingValue == 'shipmentDate' ? 'checked' : 'unchecked'}
onPress={() => setSortingValue('shipmentDate')}
/>
<DText>По дате отгрузки</DText>
</View>
<View style={styles.radioButtonContainer}>
<RadioButton
color={blue}
uncheckedColor={'black'}
value={'shipmentDatee'}
status={sortingValue == 'shipmentDatee' ? 'checked' : 'unchecked'}
onPress={() => setSortingValue('shipmentDatee')}
/>
<DText>По дате дрочки</DText>
</View>
<View style={styles.sortingModalButton}>
<BasicButton onPress={() => {
bottomSheetModalRef.current?.dismiss();
}} label={'Применть'}/>
</View>
</View>
</BottomSheetModal>
</View>
)
}
@@ -112,8 +95,7 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContainer: {
rowGap: responsiveHeight(2)
rowGap: responsiveHeight(2),
},
radioButtonContainer: {
flexDirection: "row",

View File

@@ -1,4 +1,4 @@
import {Button, Text, View, StyleSheet, TouchableOpacity, Image, ScrollView} from "react-native";
import {Button, Text, View, StyleSheet, TouchableOpacity, Image, ScrollView, GestureResponderEvent} from "react-native";
import {useAppDispatch} from "../../redux/store";
import * as process from "process";
import {responsiveFontSize, responsiveHeight, responsiveWidth} from "react-native-responsive-dimensions";
@@ -10,14 +10,19 @@ import {ScreenStackHeaderLeftView} from "react-native-screens";
import Separator from "../../components/Separator/Separator";
import {BottomSheetModal} from "@gorhom/bottom-sheet";
import {useMemo, useRef, useState} from "react";
import {openApp} from "rn-openapp";
import SelectProductModal from "../../components/Modals/SelectProductModal/SelectProductModal";
import selectProductModal from "../../components/Modals/SelectProductModal/SelectProductModal";
type SettingsElementProps = {
icon: any;
title: string;
onPress?: (event: GestureResponderEvent) => void
}
const SettingsElement: React.FC<SettingsElementProps> = ({icon, title}) => {
const SettingsElement: React.FC<SettingsElementProps> = ({icon, title, onPress}) => {
return (
<TouchableOpacity>
<TouchableOpacity onPress={onPress}>
<View style={styles.actionsCarouselElementContainer}>
<View style={styles.actionsCarouselImageWrapper}>
@@ -49,6 +54,7 @@ const HistoryElement: React.FC<HistoryElementProps> = ({cost, description, color
}
function ProfileScreen() {
const bottomSheetModalRef = useRef<BottomSheetModal>(null);
const snapPoints = useMemo(() => ['25%', '40%'], []);
const [modalVisible, setModalVisible] = useState(false);
@@ -70,7 +76,9 @@ function ProfileScreen() {
>
<SettingsElement icon={require('assets/icons/settings/withdraw.png')} title={'Вывод'}/>
<SettingsElement icon={require('assets/icons/settings/statistics.png')} title={'Статистика'}/>
<SettingsElement icon={require('assets/icons/settings/printer.png')} title={'Принтеры'}/>
<SettingsElement onPress={() => {
openApp('assemblrprintingservice');
}} icon={require('assets/icons/settings/printer.png')} title={'Принтеры'}/>
</ScrollView>
</View>
<Separator/>
@@ -107,6 +115,7 @@ function ProfileScreen() {
</BottomSheetModal>
<View style={[styles.overlay, {display: modalVisible ? 'flex' : 'none'}]}/>
</View>
)
}