clientes
Freddy Heredia 2 years ago
parent 13f41ee7ae
commit 3ac1dd6b9d

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -11,7 +11,8 @@ module.exports = {
transform: {
experimentalImportSupport: false,
inlineRequires: true,
},
}
}),
},
};

87
package-lock.json generated

@ -9,6 +9,7 @@
"version": "0.0.1",
"dependencies": {
"@react-native-async-storage/async-storage": "^1.18.2",
"@react-navigation/bottom-tabs": "^6.5.7",
"@react-navigation/native-stack": "^6.9.12",
"@react-navigation/stack": "^6.3.16",
"buffer": "^6.0.3",
@ -21,6 +22,7 @@
"react-native-linear-gradient": "^2.6.2",
"react-native-safe-area-context": "^4.5.0",
"react-native-screens": "^3.20.0",
"react-native-vector-icons": "^9.2.0",
"tailwindcss": "^3.3.0"
},
"devDependencies": {
@ -32,6 +34,7 @@
"@types/jest": "^29.2.1",
"@types/node": "^18.15.11",
"@types/react": "^18.0.24",
"@types/react-native-vector-icons": "^6.4.13",
"@types/react-test-renderer": "^18.0.0",
"babel-jest": "^29.2.1",
"eslint": "^8.19.0",
@ -4446,6 +4449,23 @@
"resolved": "https://registry.npmjs.org/@react-native/polyfills/-/polyfills-2.0.0.tgz",
"integrity": "sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ=="
},
"node_modules/@react-navigation/bottom-tabs": {
"version": "6.5.7",
"resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.7.tgz",
"integrity": "sha512-9oZYyRu2z7+1pr2dX5V54rHFPmlj4ztwQxFe85zwpnGcPtGIsXj7VCIdlHnjRHJBBFCszvJGQpYY6/G2+DfD+A==",
"dependencies": {
"@react-navigation/elements": "^1.3.17",
"color": "^4.2.3",
"warn-once": "^0.1.0"
},
"peerDependencies": {
"@react-navigation/native": "^6.0.0",
"react": "*",
"react-native": "*",
"react-native-safe-area-context": ">= 3.0.0",
"react-native-screens": ">= 3.0.0"
}
},
"node_modules/@react-navigation/core": {
"version": "6.4.8",
"resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.8.tgz",
@ -4728,6 +4748,25 @@
"csstype": "^3.0.2"
}
},
"node_modules/@types/react-native": {
"version": "0.70.13",
"resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.70.13.tgz",
"integrity": "sha512-VnC/ny8Eynk3fvY4cnNKXpo/0zUhA2gO64RX51yzVofblOP6TR6jciga0kIjI4c+2eUyWNGrahmiolNm+QU6Cw==",
"dev": true,
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-native-vector-icons": {
"version": "6.4.13",
"resolved": "https://registry.npmjs.org/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.13.tgz",
"integrity": "sha512-1PqFoKuXTSzMHwGMAr+REdYJBQAbe9xrww3ecZR0FsHcD1K+vGS/rxuAriL4rsI6+p69sZQjDzpEVAbDQcjSwA==",
"dev": true,
"dependencies": {
"@types/react": "*",
"@types/react-native": "^0.70"
}
},
"node_modules/@types/react-test-renderer": {
"version": "18.0.0",
"resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz",
@ -13573,6 +13612,54 @@
"react-native": "*"
}
},
"node_modules/react-native-vector-icons": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-9.2.0.tgz",
"integrity": "sha512-wKYLaFuQST/chH3AJRjmOLoLy3JEs1JR6zMNgTaemFpNoXs0ztRnTxcxFD9xhX7cJe1/zoN5BpQYe7kL0m5yyA==",
"dependencies": {
"prop-types": "^15.7.2",
"yargs": "^16.1.1"
},
"bin": {
"fa5-upgrade": "bin/fa5-upgrade.sh",
"generate-icon": "bin/generate-icon.js"
}
},
"node_modules/react-native-vector-icons/node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"node_modules/react-native-vector-icons/node_modules/yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/react-native-vector-icons/node_modules/yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"engines": {
"node": ">=10"
}
},
"node_modules/react-native/node_modules/@jest/types": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",

@ -11,6 +11,7 @@
},
"dependencies": {
"@react-native-async-storage/async-storage": "^1.18.2",
"@react-navigation/bottom-tabs": "^6.5.7",
"@react-navigation/native-stack": "^6.9.12",
"@react-navigation/stack": "^6.3.16",
"buffer": "^6.0.3",
@ -23,6 +24,7 @@
"react-native-linear-gradient": "^2.6.2",
"react-native-safe-area-context": "^4.5.0",
"react-native-screens": "^3.20.0",
"react-native-vector-icons": "^9.2.0",
"tailwindcss": "^3.3.0"
},
"devDependencies": {
@ -34,6 +36,7 @@
"@types/jest": "^29.2.1",
"@types/node": "^18.15.11",
"@types/react": "^18.0.24",
"@types/react-native-vector-icons": "^6.4.13",
"@types/react-test-renderer": "^18.0.0",
"babel-jest": "^29.2.1",
"eslint": "^8.19.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -1,12 +1,24 @@
import React from 'react';
import { View } from 'react-native'
import { SafeAreaView, ScrollView} from 'react-native'
export const Background = ({ children }: {children: JSX.Element | JSX.Element[]}) => {
return (
<>
<View className='flex grow items-center bg-sky-50 p-4'>
{children}
</View>
<SafeAreaView className='flex grow justify-center'>
<ScrollView
contentContainerStyle={{
flexGrow: 1,
justifyContent: 'space-between',
alignItems: 'center'
}}>
{children}
</ScrollView>
</SafeAreaView>
</>
)
}
)
}

@ -8,7 +8,7 @@ type CardType = {
export const Card:FC<CardType> = ({ children , addClassName}) => {
let className = 'flex grow w-5/6 p-4 m-4 bg-white rounded-xl shadow-2xl shadow-slate-500';
let className = 'w-5/6 p-4 m-4 bg-white rounded-xl shadow-2xl shadow-slate-500';
className = className + " " + addClassName;
return (
<>

@ -0,0 +1,30 @@
import { FC } from 'react'
import { View, TouchableOpacity, Image, Text, ImageSourcePropType } from 'react-native'
import { useNavigation } from '@react-navigation/native';
interface Props {
require: (id: string) => any ,
label: string,
destino:string
}
export const MenuItem:FC <Props> = ({require,label, destino}) => {
const navitation = useNavigation();
return (
<>
<View className='mx-2'>
<TouchableOpacity
className='items-center'
onPress={()=>navitation.navigate(destino as never)}
>
<Image
source={require as ImageSourcePropType}
className='w-8 h-8 my-2'
/>
</TouchableOpacity>
{/*<Text className='text-xs text-center' >{label}</Text>*/}
</View>
</>
)
}

@ -0,0 +1,38 @@
import { FC } from 'react'
import { Image, Text, TouchableOpacity, View } from 'react-native'
import { Card } from '../Card';
import { MenuItem } from './MenuItem';
import { useNavigation } from '@react-navigation/native';
interface Props {
}
export const NavBar:FC <Props> = () => {
const navigation = useNavigation();
return (
<Card addClassName='flex-row p-0 self-center' >
<MenuItem destino='CompanyScreen' require={require('./tienda-alt.png')} label='Compañias' />
<MenuItem destino='CustomerScreen' require={require('./apreton-de-manos.png')} label='Clientes' />
<View className='mx-2 -translate-y-4'>
<TouchableOpacity
className='bg-sky-300 rounded-full p-3 items-center shadow-lg shadow-slate-800 -translate-y-2'
onPress={()=>navigation.navigate("SalesOrderScreen" as never) }
>
<Image
source={require('./lista.png')}
className='w-10 h-10 '
/>
</TouchableOpacity>
<Text className='text-xs text-center'>Pedidos</Text>
</View>
<MenuItem destino='ProductScreen' require={require('./caja-abierta.png')} label='Productos' />
<MenuItem destino='' require={require('./menu-puntos.png')} label='Mas' />
</Card>
)
}

@ -0,0 +1,26 @@
import { FC } from 'react'
import { View, TouchableOpacity, Image, Text, ImageSourcePropType } from 'react-native'
import { useNavigation } from '@react-navigation/native';
interface Props {
require: (id: string) => any,
focused?: boolean,
}
export const TabItem:FC <Props> = ({require,focused}) => {
let className = "w-8 h-8 ";
if (focused){
}
return (
<View className=''>
<Image
source={require as ImageSourcePropType}
className={className}
/>
</View>
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -2,21 +2,16 @@ import { FC, useContext, useState } from 'react'
import AsyncStorage from '@react-native-async-storage/async-storage';
import { LoginScreen } from '../screens/login/LoginScreen';
import { HomeScreen } from '../screens/home/HomeScreen';
import { SalesOrderScreen } from '../screens/salesorder/SalesOrderScreen';
import { ProductScreen } from '../screens/product/ProductScreen';
import { CompanyScreen } from '../screens/company/CompanyScreen';
import { CustomerScreen } from '../screens/customer/CustomerScreen';
import { TabScreen } from './TabScreen';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { AuthContext } from '../screens/login/AuthContext';
interface Props {
}
const Stack = createNativeStackNavigator();
export const MainStackNavitagor:FC <Props> = () => {
export const MainStackNavitagor:FC = () => {
const {isAuthenticated} = useContext(AuthContext)
@ -28,18 +23,14 @@ export const MainStackNavitagor:FC <Props> = () => {
headerShown: false,
}}
>
{isAuthenticated==false?(
{isAuthenticated==true?(
<>
<Stack.Screen name="LoginScreen" component={LoginScreen} />
</>
):(
<>
<Stack.Screen name="HomeScreen" component={HomeScreen} />
<Stack.Screen name="CustomerScreen" component={CustomerScreen} />
<Stack.Screen name="SalesOrderScreen" component={SalesOrderScreen} />
<Stack.Screen name="ProductScreen" component={ProductScreen} />
<Stack.Screen name="CompanyScreen" component={CompanyScreen} />
<Stack.Screen name="TabScreen" component={TabScreen} />
</>
)}

@ -0,0 +1,93 @@
import { FC } from 'react'
import { Dimensions, Text, View } from 'react-native'
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
import { CompanyScreen } from '../screens/company/CompanyScreen';
import { MenuItem } from '../components/navbar/MenuItem';
import { TabItem } from '../components/navbar/TabItem';
import { SalesOrderScreen } from '../screens/salesorder/SalesOrderScreen';
import { ProductScreen } from '../screens/product/ProductScreen';
import { ExitScreen } from '../screens/exit/ExitScreen';
import { CustomerListScreen } from '../screens/customer/CustomerListScreen';
import { CustomerStack } from '../screens/customer/CustomerStack';
interface Props {
}
export const TabScreen:FC <Props> = () => {
const Tab = createBottomTabNavigator();
const { width, height } = Dimensions.get("window")
return (
<View
className="h-screen"
>
<Tab.Navigator
initialRouteName="SalesOrderScreen"
screenOptions={{
headerShown: false,
tabBarActiveTintColor: '#1e40af',
tabBarHideOnKeyboard: true,
tabBarStyle: {
borderRadius: 20,
marginBottom: 30
}
}}
>
<Tab.Screen
name="Customer List Screen"
component={CustomerStack}
options={{
tabBarLabel: 'Clientes',
tabBarLabelStyle: {fontSize: 12},
tabBarIcon: ({ focused }) => (
<TabItem require={require('./apreton-de-manos.png')} focused={focused} />
),
}}
/>
<Tab.Screen
name="CompanyScreen"
component={CompanyScreen}
options={{
tabBarLabel: 'Compañias',
tabBarIcon: ({ focused}) => (
<TabItem require={require('./tienda-alt.png')} focused={focused} />
),
}}
/>
<Tab.Screen
name="SalesOrderScreen"
component={SalesOrderScreen}
options={{
tabBarLabel: 'Pedidos',
tabBarIcon: ({ focused }) => (
<TabItem require={require('./lista.png')} focused={focused} />
),
}}
/>
<Tab.Screen
name="ProductScreen"
component={ProductScreen}
options={{
tabBarLabel: 'Productos',
tabBarIcon: ({ focused }) => (
<TabItem require={require('./caja-abierta.png')} focused={focused} />
),
}}
/>
<Tab.Screen
name="ExitScreen"
component={ExitScreen}
options={{
tabBarLabel: 'Salir',
tabBarIcon: ({ focused }) => (
<TabItem require={require('./salida.png')} focused={focused} />
),
}}
/>
</Tab.Navigator>
</View>
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -1,4 +1,5 @@
import { FC } from 'react'
import { Text } from 'react-native'
interface Props {
}
@ -6,7 +7,7 @@ interface Props {
export const CompanyScreen:FC <Props> = () => {
return (
<>
<Text>Compañia</Text>
</>
)
}

@ -0,0 +1,33 @@
import { FC } from 'react'
import { Text } from 'react-native'
import { NavBar } from '../../components/navbar/NavBar'
import { Background } from '../../components/Background'
import { useNavigation } from '@react-navigation/native';
import { Button } from '../../components/Button';
import { Card } from '../../components/Card';
import { Input } from '../../components/Input';
import { useForm } from 'react-hook-form';
interface Props {
}
export const CustomerFormScreen:FC <Props> = () => {
const { control, handleSubmit, getValues, formState: { errors } } = useForm();
const navigation = useNavigation();
return (
<>
<Background >
<Card>
<Text className='text-xl text-center my-4'>Registro de clientes</Text>
<Input name="nombre" label='Nombre' control={control} />
<Input name="telefono" label='Telefono' control={control} />
<Button
title='Guardar'
onClick={()=>{navigation.navigate("ProductScreen" as never) }}
/>
</Card>
</Background>
</>
)
}

@ -0,0 +1,23 @@
import { FC } from 'react'
import { Text } from 'react-native'
import { Background } from '../../components/Background'
import { Card } from '../../components/Card'
import { Input } from '../../components/Input'
import { Button } from '../../components/Button'
import { useNavigation } from '@react-navigation/native';
interface Props {
}
export const CustomerListScreen:FC <Props> = () => {
const navigation = useNavigation();
return (
<Background >
<Card>
<Text className='text-xl text-center my-4'>Listado de clientes</Text>
<Button title='Nuevo' onClick={()=>navigation.navigate("CustomerFormScreen" as never)} />
</Card>
</Background>
)
}

@ -1,13 +0,0 @@
import { FC } from 'react'
import { Text } from 'react-native'
interface Props {
}
export const CustomerScreen:FC <Props> = () => {
return (
<>
<Text>CustomerScreen</Text>
</>
)
}

@ -0,0 +1,30 @@
import { FC, useContext, useState } from 'react'
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { AuthContext } from '../login/AuthContext';
import { CustomerFormScreen } from './CustomerFormScreen';
import { CustomerListScreen } from './CustomerListScreen';
interface Props {
}
const Stack = createNativeStackNavigator();
export const CustomerStack:FC <Props> = () => {
const {isAuthenticated} = useContext(AuthContext)
return (
<Stack.Navigator
screenOptions={{
headerShown: true,
}}
>
{!isAuthenticated&&(
<>
<Stack.Screen name="CustomerListScreen" component={CustomerListScreen} />
<Stack.Screen name="CustomerFormScreen" component={CustomerFormScreen} />
</>
)}
</Stack.Navigator>
)
}

@ -0,0 +1,29 @@
import { FC, useContext } from 'react'
import { Text } from 'react-native'
import { Background } from '../../components/Background'
import { NavBar } from '../../components/navbar/NavBar'
import { Button } from '../../components/Button'
import { AuthContext } from '../login/AuthContext';
interface Props {
}
export const ExitScreen:FC <Props> = () => {
const {isAuthenticated, logOut} = useContext(AuthContext);
const exit = () => {
logOut();
}
return (
<>
<Background >
<Text>Adios</Text>
<Button title='LogOut' onClick={()=>exit()} />
</Background>
</>
)
}

@ -1,29 +0,0 @@
import { FC, useContext } from 'react'
import { Text } from 'react-native'
import { Button } from '../../components/Button'
import { StackScreenProps } from '@react-navigation/stack';
import { View } from 'react-native';
import { AuthContext } from '../login/AuthContext';
interface Props extends StackScreenProps<any, any> {
}
export const HomeScreen:FC <Props> = ({navigation}) => {
const {isAuthenticated, logOut} = useContext(AuthContext);
console.debug(isAuthenticated)
const exit = () => {
logOut();
navigation.navigate("CustomerScreen");
}
return (
<View className='flex-1 items-center bg-white '>
<Text>Home</Text>
<Button title='Clientes' onClick={()=>navigation.navigate("CustomerScreen")}/>
<Button title='LogOut' onClick={()=>exit()} />
</View>
)
}

@ -46,12 +46,12 @@ export const LoginScreen:FC <Props> = ({ navigation }) => {
<>
<Background>
<Image
source={require('./logo.png')}
className='my-8 self-center'
/>
<Card >
<Card addClassName='flex-1'>
<Text className='my-6 text-center font-bold text-xl text-black'>Hola...</Text>
<Input name="user" label='Usuario' control={control}/>

@ -1,13 +1,34 @@
import { FC } from 'react'
import { FC, useContext } from 'react'
import { Text } from 'react-native'
import { Button } from '../../components/Button'
import { StackScreenProps } from '@react-navigation/stack';
import { View } from 'react-native';
import { AuthContext } from '../login/AuthContext';
import { Background } from '../../components/Background';
import { NavBar } from '../../components/navbar/NavBar';
interface Props extends StackScreenProps<any, any> {
interface Props {
}
export const SalesOrderScreen:FC <Props> = () => {
export const SalesOrderScreen:FC <Props> = ({navigation}) => {
const {isAuthenticated, logOut} = useContext(AuthContext);
const exit = () => {
logOut();
navigation.navigate("CustomerScreen");
}
return (
<>
<Text>Sales order</Text>
<Background >
<Text>Pedidos</Text>
<Button title='Clientes' onClick={()=>navigation.navigate("CustomerScreen")}/>
<Button title='LogOut' onClick={()=>exit()} />
</Background>
</>
)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Loading…
Cancel
Save