ebanutsya
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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>
|
||||
|
||||
)
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}}/>
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user