packages = new PackageList(this).getPackages();
26 | // Packages that cannot be autolinked yet can be added manually here, for example:
27 | // packages.add(new MyReactNativePackage());
28 | return packages;
29 | }
30 |
31 | @Override
32 | protected String getJSMainModuleName() {
33 | return "index";
34 | }
35 | };
36 |
37 | @Override
38 | public ReactNativeHost getReactNativeHost() {
39 | return mReactNativeHost;
40 | }
41 |
42 | @Override
43 | public void onCreate() {
44 | super.onCreate();
45 | SoLoader.init(this, /* native exopackage */ false);
46 | initializeFlipper(this); // Remove this line if you don't want Flipper enabled
47 | }
48 |
49 | /**
50 | * Loads Flipper in React Native templates.
51 | *
52 | * @param context
53 | */
54 | private static void initializeFlipper(Context context) {
55 | if (BuildConfig.DEBUG) {
56 | try {
57 | /*
58 | We use reflection here to pick up the class that initializes Flipper,
59 | since Flipper library is not available in release mode
60 | */
61 | Class> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper");
62 | aClass.getMethod("initializeFlipper", Context.class).invoke(null, context);
63 | } catch (ClassNotFoundException e) {
64 | e.printStackTrace();
65 | } catch (NoSuchMethodException e) {
66 | e.printStackTrace();
67 | } catch (IllegalAccessException e) {
68 | e.printStackTrace();
69 | } catch (InvocationTargetException e) {
70 | e.printStackTrace();
71 | }
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/src/Redux/Reducers/auth.js:
--------------------------------------------------------------------------------
1 | const initialState = {
2 | resultsLogin: [],
3 | resultsRegister: [],
4 | isLoading: false,
5 | isRejected: false,
6 | isFulfilled: false,
7 | };
8 |
9 | const auth = (state = initialState, action) => {
10 | switch (action.type) {
11 |
12 | //LOGIN
13 | case 'LOGIN_PENDING':
14 | return {
15 | ...state,
16 | isLoading: true,
17 | isRejected: false,
18 | isFulfilled: false,
19 | };
20 | case 'LOGIN_REJECTED':
21 | return {
22 | ...state,
23 | isLoading: false,
24 | isRejected: true,
25 | };
26 | case 'LOGIN_FULFILLED':
27 | return {
28 | ...state,
29 | isLoading: false,
30 | isFulfilled: true,
31 | resultsLogin: action.payload.data.status,
32 | };
33 |
34 | //REGISTER
35 | case 'REGISTER_PENDING':
36 | return {
37 | ...state,
38 | isLoading: true,
39 | isRejected: false,
40 | isFulfilled: false,
41 | };
42 | case 'REGISTER_REJECTED':
43 | return {
44 | ...state,
45 | isLoading: false,
46 | isRejected: true,
47 | };
48 | case 'REGISTER_FULFILLED':
49 | return {
50 | ...state,
51 | isLoading: false,
52 | isFulfilled: true,
53 | resultsRegister: action.payload,
54 | };
55 |
56 | //REGISTER
57 | case 'ITEM_PENDING':
58 | return {
59 | ...state,
60 | isLoading: true,
61 | isRejected: false,
62 | isFulfilled: false,
63 | };
64 | case 'ITEM_REJECTED':
65 | return {
66 | ...state,
67 | isLoading: false,
68 | isRejected: true,
69 | };
70 | case 'ITEM_FULFILLED':
71 | console.log("token",action.payload);
72 | return {
73 | ...state,
74 | isLoading: false,
75 | isFulfilled: true,
76 | resultsItem: JSON.parse(action.payload),
77 | };
78 |
79 | //DEFAULT STATE
80 | default:
81 | return {
82 | ...state,
83 | }
84 | }
85 | };
86 |
87 | export default auth;
88 |
--------------------------------------------------------------------------------
/src/screens/CobaTab.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Image } from 'react-native';
3 | import { createAppContainer } from 'react-navigation';
4 | import { createBottomTabNavigator } from 'react-navigation-tabs'
5 |
6 | //Content
7 | import Main from './Main';
8 | import History from './History';
9 | import Category from './Category';
10 | import Product from './Product';
11 | import User from './User';
12 |
13 | const BottomNavigator = createBottomTabNavigator({
14 | Main: {
15 | screen: Main,
16 | navigationOptions: {
17 | tabBarLabel: 'Main'
18 | }
19 | },
20 | Product: {
21 | screen: Product,
22 | navigationOptions: {
23 | tabBarLabel: 'Product',
24 | }
25 | },
26 | Category: {
27 | screen: Category,
28 | navigationOptions: {
29 | tabBarLabel: 'Category',
30 | }
31 | },
32 | History: {
33 | screen: History,
34 | navigationOptions: {
35 | tabBarLabel: 'History',
36 | }
37 | },
38 | User: {
39 | screen: User,
40 | navigationOptions: {
41 | tabBarLabel: 'Profile',
42 | }
43 | },
44 | },{
45 | //router config
46 | initialRouteName: 'Main',
47 | main: ['Main','Product','Category','History','User'],
48 | defaultNavigationOptions: ({ navigation }) => ({
49 | tabBarIcon: ({focused}) => {
50 | const { routeName } = navigation.state;
51 | let focus = focused ? {width: 30, height: 30} : {width: 26, height: 26};
52 | let sourceImage;
53 |
54 | if (routeName === 'Main') {
55 | sourceImage = focused ? require('../assets/icon/cart-actived.png') : require('../assets/icon/cart.png');
56 | } else if (routeName === 'Product') {
57 | sourceImage = focused ? require('../assets/icon/product-actived.png') : require('../assets/icon/product.png');
58 | } else if (routeName === 'Category') {
59 | sourceImage = focused ? require('../assets/icon/category-actived.png') : require('../assets/icon/category.png');
60 | } else if (routeName === 'User') {
61 | sourceImage = focused ? require('../assets/icon/user-actived.png') : require('../assets/icon/user.png');
62 | } else {
63 | sourceImage = focused ? require('../assets/icon/history-actived.png') : require('../assets/icon/history.png');
64 | }
65 |
66 | return ;
67 | },
68 | tabBarOptions: {
69 | activeTintColor: '#43AB4A',
70 | inactiveTintColor: '#545454',
71 | style: {
72 | borderTopWidth: 0,
73 | backgroundColor: '#FFFFFF',
74 | paddingBottom: 5,
75 | },
76 | },
77 | }),
78 | })
79 |
80 | const TabNavigation = createAppContainer(BottomNavigator);
81 | export default TabNavigation;
82 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | Pixos is an application in the form of a website and a mobile application for product management, category and has a cashier system (point of sale), this application is made using React Js and React Native. there is only a mobile application model if you interest website model you can visit this link [Web Pixos](https://github.com/Derida23/Easy-PointOfSale-ReactHook-Redux)
15 |
16 | ## Features
17 | Product Management
18 | - Create data table
19 | - View data product
20 | - Update product
21 | - Delete product
22 | - Search and sorting product
23 |
24 | Category Management
25 | - Create data table
26 | - View data category
27 | - Update category
28 | - Delete category
29 |
30 | Transaction is Under Maintanance
31 |
32 | ## Get Started
33 |
34 | 1. Check Backend RESTfull API from [PIXOS API](https://github.com/Derida23/PointOfSale-API-ExpressJS)
35 | 2. Backend can be accessed via the link in Heroku [Pixos API](https://pixos-api.herokuapp.com/)
36 | 3. Git clone [Pixos - Mobile Apps](https://github.com/Derida23/PIXOS-POS-ReactNative/) or download zip
37 | 4. Open in your code editor (vscode, atom or other)
38 | 5. npm Install & react-native run-android
39 |
40 |
41 | ## Download APK
42 | You can Download the APK [PIXOS APK](http://bit.ly/APK-Pixos)
43 |
44 |
45 | ## Build with React Native & Redux
46 |
47 |
48 |
49 | ## Showcase
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | platform :ios, '9.0'
2 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
3 |
4 | target 'PosReact' do
5 | # Pods for PosReact
6 | pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
7 | pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
8 | pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
9 | pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
10 | pod 'React', :path => '../node_modules/react-native/'
11 | pod 'React-Core', :path => '../node_modules/react-native/'
12 | pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
13 | pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
14 | pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
15 | pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
16 | pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
17 | pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
18 | pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
19 | pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
20 | pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
21 | pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
22 | pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
23 | pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
24 |
25 | pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
26 | pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
27 | pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
28 | pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
29 | pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon"
30 | pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
31 | pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
32 |
33 | pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
34 | pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
35 | pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
36 |
37 |
38 | target 'PosReactTests' do
39 | inherit! :search_paths
40 | # Pods for testing
41 | end
42 |
43 | use_native_modules!
44 | end
45 |
46 | target 'PosReact-tvOS' do
47 | # Pods for PosReact-tvOS
48 |
49 | target 'PosReact-tvOSTests' do
50 | inherit! :search_paths
51 | # Pods for testing
52 | end
53 |
54 | end
55 |
--------------------------------------------------------------------------------
/src/screens/Product.js:
--------------------------------------------------------------------------------
1 | import React, {useEffect, useState} from 'react';
2 | import {
3 | Text,
4 | View,
5 | ScrollView
6 | } from 'react-native';
7 | import { ListItem, Divider } from 'react-native-elements'
8 | import Icon from 'react-native-vector-icons/Entypo'
9 | import TouchableScale from 'react-native-touchable-scale';
10 |
11 | import { useDispatch } from 'react-redux'
12 | import { connect } from "react-redux";
13 | import { getProduct } from '../Redux/Actions/product';
14 |
15 | const Product = (props) => {
16 |
17 | const [page, setPage] = useState(0);
18 | const [infoPage, setInfoPage] = useState({maxPage: 0, totalAllProduct: 0});
19 | const [rowsPerPage, setRowsPerPage] = useState(20);
20 | const dispatch = useDispatch();
21 |
22 | const fetchDataProduct = async () => {
23 | try {
24 | const response = await dispatch(getProduct(rowsPerPage, page + 1, props.item.token))
25 | setInfoPage(response.value.data.data.infoPage);
26 | } catch (error) {
27 | console.log (error);
28 | }
29 | }
30 |
31 | useEffect(() => {
32 | fetchDataProduct ();
33 | },[page, rowsPerPage])
34 |
35 | return (
36 | <>
37 |
38 |
39 | PRODUCT LIST
40 | { props.navigation.navigate('AddProduct') }} name={'circle-with-plus'} size={26} color={'white'} style={{marginHorizontal:17}}/>
41 |
42 |
43 |
44 | {props.setProduct.map((data, index) => (
45 |
46 | props.navigation.navigate('EditProduct',{selectedRow : data})}
47 | Component={TouchableScale}
48 | friction={90} //
49 | tension={100} // These props are passed to the parent component (here TouchableScale)
50 | activeScale={0.95} //
51 | title={data.name}
52 | titleStyle={{ color: 'black', fontWeight: 'bold' }}
53 | subtitle= {
54 | Price : Rp.{data.price}
55 | Category : {data.category_name}
56 | }
57 | leftAvatar={{ source: { uri: data.image } }}
58 | badge={{ value: data.quantity, textStyle: { color: 'white', fontSize:17, marginHorizontal: 10} }}
59 | />
60 |
61 |
62 | )
63 | )}
64 |
65 | >
66 | )
67 | }
68 |
69 | const mapStateToProps = state => {
70 | return {
71 | item: state.auth.resultsItem,
72 | setProduct: state.product.viewProduct,
73 | };
74 | };
75 |
76 |
77 | export default connect(mapStateToProps) (Product)
78 |
--------------------------------------------------------------------------------
/android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem http://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
33 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
34 |
35 | @rem Find java.exe
36 | if defined JAVA_HOME goto findJavaFromJavaHome
37 |
38 | set JAVA_EXE=java.exe
39 | %JAVA_EXE% -version >NUL 2>&1
40 | if "%ERRORLEVEL%" == "0" goto init
41 |
42 | echo.
43 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
44 | echo.
45 | echo Please set the JAVA_HOME variable in your environment to match the
46 | echo location of your Java installation.
47 |
48 | goto fail
49 |
50 | :findJavaFromJavaHome
51 | set JAVA_HOME=%JAVA_HOME:"=%
52 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
53 |
54 | if exist "%JAVA_EXE%" goto init
55 |
56 | echo.
57 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
58 | echo.
59 | echo Please set the JAVA_HOME variable in your environment to match the
60 | echo location of your Java installation.
61 |
62 | goto fail
63 |
64 | :init
65 | @rem Get command-line arguments, handling Windows variants
66 |
67 | if not "%OS%" == "Windows_NT" goto win9xME_args
68 |
69 | :win9xME_args
70 | @rem Slurp the command line arguments.
71 | set CMD_LINE_ARGS=
72 | set _SKIP=2
73 |
74 | :win9xME_args_slurp
75 | if "x%~1" == "x" goto execute
76 |
77 | set CMD_LINE_ARGS=%*
78 |
79 | :execute
80 | @rem Setup the command line
81 |
82 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
83 |
84 | @rem Execute Gradle
85 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
86 |
87 | :end
88 | @rem End local scope for the variables with windows NT shell
89 | if "%ERRORLEVEL%"=="0" goto mainEnd
90 |
91 | :fail
92 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
93 | rem the _cmd.exe /c_ return code!
94 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
95 | exit /b 1
96 |
97 | :mainEnd
98 | if "%OS%"=="Windows_NT" endlocal
99 |
100 | :omega
101 |
--------------------------------------------------------------------------------
/src/Redux/Reducers/category.js:
--------------------------------------------------------------------------------
1 | const initialState = {
2 | viewCategory: [],
3 | isLoading: false,
4 | isRejected: false,
5 | isFulfilled: false,
6 | };
7 | const category = (state = initialState, action) => {
8 | switch (action.type) {
9 | case 'GET_CATEGORY_PENDING':
10 | return {
11 | ...state,
12 | isLoading: true,
13 | isRejected: false,
14 | isFulfilled: false,
15 | };
16 | case 'GET_CATEGORY_REJECTED':
17 | return {
18 | ...state,
19 | isLoading: false,
20 | isRejected: true,
21 | };
22 | case 'GET_CATEGORY_FULFILLED':
23 | return {
24 | ...state,
25 | isLoading: false,
26 | isFulfilled: true,
27 | viewCategory: action.payload.data.data.data,
28 | };
29 |
30 | // POST CATEGORIES
31 | case 'POST_CATEGORY_PENDING':
32 | return {
33 | ...state,
34 | isLoading: true,
35 | isRejected: false,
36 | isFulfilled: false,
37 | };
38 | case 'POST_CATEGORY_REJECTED':
39 | return {
40 | ...state,
41 | isLoading: false,
42 | isRejected: true,
43 | };
44 | case 'POST_CATEGORY_FULFILLED':
45 | if (action.payload.data.status == 200) {
46 | const addCategory=state.viewCategory.slice(0)
47 | addCategory.push(action.payload.data.data[0])
48 | return {
49 | ...state,
50 | isLoading: false,
51 | isFulfilled: true,
52 | viewCategory: addCategory
53 | }
54 | } else {
55 | return {
56 | ...state,
57 | isLoading: false,
58 | isFulfilled: true,
59 | }
60 | }
61 |
62 | // EDIT CATEGORIES
63 | case 'PUT_CATEGORY_PENDING':
64 | return {
65 | ...state,
66 | isLoading: true,
67 | isRejected: false,
68 | isFulfilled: false,
69 | };
70 | case 'PUT_CATEGORY_REJECTED':
71 | return {
72 | ...state,
73 | isLoading: false,
74 | isRejected: true,
75 | };
76 | case 'PUT_CATEGORY_FULFILLED':
77 | const listCategoryAfterPatch = state.viewCategory.map (category => {
78 | if (action.payload.data.status == 200) {
79 | if (category.id == action.payload.data.data[0].id) {
80 | return action.payload.data.data[0];
81 | }
82 | }
83 | return category;
84 | });
85 | return {
86 | ...state,
87 | isLoading: false,
88 | isFulfilled: true,
89 | viewCategory: listCategoryAfterPatch
90 | };
91 |
92 | // DELETE CATEGORIES
93 | case 'DELETE_CATEGORY_PENDING':
94 | return {
95 | ...state,
96 | isLoading: true,
97 | isRejected: false,
98 | isFulfilled: false,
99 | };
100 | case 'DELETE_CATEGORY_REJECTED':
101 | return {
102 | ...state,
103 | isLoading: false,
104 | isRejected: true,
105 | };
106 | case 'DELETE_CATEGORY_FULFILLED':
107 | const dataAfterDelete = state.viewCategory.filter((value) => {
108 | return value.id !== parseInt(action.payload.data.id) });
109 | return {
110 | ...state,
111 | isLoading: false,
112 | isFulfilled: true,
113 | viewCategory: dataAfterDelete,
114 | };
115 | default:
116 | return state;
117 | }
118 | };
119 |
120 | export default category;
121 |
--------------------------------------------------------------------------------
/ios/PosReact/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/Redux/Reducers/product.js:
--------------------------------------------------------------------------------
1 | const initialState = {
2 | viewProduct: [],
3 | isLoading: false,
4 | isRejected: false,
5 | isFulfilled: false,
6 | };
7 | const product = (state = initialState, action) => {
8 | switch (action.type) {
9 | case 'GET_PRODUCT_PENDING':
10 | return {
11 | ...state,
12 | isLoading: true,
13 | isRejected: false,
14 | isFulfilled: false,
15 | };
16 | case 'GET_PRODUCT_REJECTED':
17 | return {
18 | ...state,
19 | isLoading: false,
20 | isRejected: true,
21 | };
22 | case 'GET_PRODUCT_FULFILLED':
23 | return {
24 | ...state,
25 | isLoading: false,
26 | isFulfilled: true,
27 | viewProduct: action.payload.data.data.data,
28 | };
29 |
30 | // POST PRODUCT
31 | case 'POST_PRODUCT_PENDING':
32 | return {
33 | ...state,
34 | isLoading: true,
35 | isRejected: false,
36 | isFulfilled: false,
37 | };
38 | case 'POST_PRODUCT_REJECTED':
39 | return {
40 | ...state,
41 | isLoading: false,
42 | isRejected: true,
43 | };
44 | case 'POST_PRODUCT_FULFILLED':
45 | if (action.payload.data.status == 200) {
46 | const addProduct=state.viewProduct.slice(0)
47 | addProduct.push(action.payload.data.data[0])
48 | return {
49 | ...state,
50 | isLoading: false,
51 | isFulfilled: true,
52 | viewProduct: addProduct
53 | }
54 | } else {
55 | return {
56 | ...state,
57 | isLoading: false,
58 | isFulfilled: true,
59 | }
60 | }
61 |
62 | // EDIT PRODUCT
63 | case 'PUT_PRODUCT_PENDING':
64 | return {
65 | ...state,
66 | isLoading: true,
67 | isRejected: false,
68 | isFulfilled: false,
69 | };
70 | case 'PUT_PRODUCT_REJECTED':
71 | return {
72 | ...state,
73 | isLoading: false,
74 | isRejected: true,
75 | };
76 | case 'PUT_PRODUCT_FULFILLED':
77 | const listProductAfterPatch = state.viewProduct.map (product => {
78 | if (action.payload.data.status == 200) {
79 | if (product.id == action.payload.data.data[0].id) {
80 | return action.payload.data.data[0];
81 | }
82 | }
83 | return product;
84 | });
85 | return {
86 | ...state,
87 | isLoading: false,
88 | isFulfilled: true,
89 | viewProduct: listProductAfterPatch
90 | };
91 |
92 | // DELETE CATEGORIES
93 | case 'DELETE_PRODUCT_PENDING':
94 | return {
95 | ...state,
96 | isLoading: true,
97 | isRejected: false,
98 | isFulfilled: false,
99 | };
100 | case 'DELETE_PRODUCT_REJECTED':
101 | return {
102 | ...state,
103 | isLoading: false,
104 | isRejected: true,
105 | };
106 | case 'DELETE_PRODUCT_FULFILLED':
107 | const dataAfterDelete = state.viewProduct.filter((value) => {
108 | return value.id !== parseInt(action.payload.data.id) });
109 | return {
110 | ...state,
111 | isLoading: false,
112 | isFulfilled: true,
113 | viewProduct: dataAfterDelete,
114 | };
115 | default:
116 | return state;
117 | }
118 | };
119 |
120 | export default product;
121 |
--------------------------------------------------------------------------------
/ios/PosReact.xcodeproj/xcshareddata/xcschemes/PosReact.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
43 |
49 |
50 |
51 |
52 |
53 |
58 |
59 |
61 |
67 |
68 |
69 |
70 |
71 |
77 |
78 |
79 |
80 |
81 |
82 |
92 |
94 |
100 |
101 |
102 |
103 |
104 |
105 |
111 |
113 |
119 |
120 |
121 |
122 |
124 |
125 |
128 |
129 |
130 |
--------------------------------------------------------------------------------
/ios/PosReact.xcodeproj/xcshareddata/xcschemes/PosReact-tvOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
43 |
49 |
50 |
51 |
52 |
53 |
58 |
59 |
61 |
67 |
68 |
69 |
70 |
71 |
77 |
78 |
79 |
80 |
81 |
82 |
92 |
94 |
100 |
101 |
102 |
103 |
104 |
105 |
111 |
113 |
119 |
120 |
121 |
122 |
124 |
125 |
128 |
129 |
130 |
--------------------------------------------------------------------------------
/src/screens/User.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Text, View, Image, TouchableOpacity } from 'react-native';
3 |
4 | import { Container, Header, Content, Button, ListItem, Icon, Left, Body, Right, Switch } from 'native-base';
5 | import AsyncStorage from '@react-native-community/async-storage';
6 |
7 | const User = (props) => {
8 |
9 | const deleteToken = async () => {
10 | try {
11 | await AsyncStorage.removeItem('user')
12 | props.navigation.navigate('Login')
13 | } catch (err) {
14 | console.log(`The error is: ${err}`)
15 | }
16 | }
17 |
18 | return (
19 | <>
20 |
21 |
22 |
23 |
24 |
25 |
26 | Username
27 | Jonathan Patricson
28 |
29 |
30 |
31 | Last Login
32 | 20.00 : 09-11-2019
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | Theme
46 |
47 |
48 | Green Nature
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | Night Mode
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | Setting App
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 | Contact
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | Feedback
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 | Grade
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 | About us
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 | { deleteToken() }}>
150 | Logout
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
162 | >
163 | )
164 | }
165 |
166 | export default User;
167 |
--------------------------------------------------------------------------------
/src/screens/EditCategory.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from 'react';
2 | import {
3 | Text,
4 | View,
5 | ScrollView,
6 | TextInput,
7 | Image,
8 | TouchableOpacity,
9 | Modal,
10 | TouchableHighlight,
11 | } from 'react-native';
12 |
13 | import categoryLogo from '../assets/images/category-logo.png';
14 | import Icon from 'react-native-vector-icons/Ionicons';
15 |
16 | import { useDispatch } from 'react-redux';
17 | import { connect } from "react-redux";
18 | import { putCategory, deleteCategory } from '../Redux/Actions/category';
19 |
20 | const EditCategory = (props) => {
21 |
22 | const [input, setInput] = useState({id:'', name:''});
23 | const dispatch = useDispatch();
24 | const {navigation} = props;
25 |
26 | const [modalVisible, setModalVisible] = useState(false)
27 | const clickModalVisible = (visible) => {
28 | setModalVisible(visible)
29 | }
30 |
31 | const handleEdit = (event) => {
32 | dispatch(putCategory (input, props.item.token))
33 | .then(response => {
34 | if (response.value.status === 200) {
35 | props.navigation.navigate('Category');
36 | }
37 | })
38 | .catch(error => alert(error));
39 | };
40 |
41 | useEffect(()=>{
42 | setInput({
43 | id: navigation.state.params.selectedRow.id,
44 | name: navigation.state.params.selectedRow.name
45 | })
46 | },[])
47 |
48 | const handleDelete = (id) => {
49 | dispatch(deleteCategory (id, props.item.token))
50 | .then(response => {
51 | if (response.value.status === 200) {
52 | props.navigation.navigate('Category');
53 | } else {
54 | props.navigation.navigate('Category');
55 | }
56 | })
57 | .catch(error => alert(error));
58 | };
59 |
60 | return (
61 | <>
62 |
63 |
68 |
69 |
70 |
71 |
72 | Delete Category?
73 |
74 |
75 |
76 |
77 | WARNING :
78 | This action CANNOT be undone
79 |
80 |
81 |
82 |
83 |
84 | {
86 | clickModalVisible(!modalVisible);
87 | }}>
88 | Close
89 |
90 |
91 |
92 | handleDelete(input)}>
94 | Delete
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 | Edit Category
104 | {setModalVisible(true)}}>
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 | Name Category
116 |
117 |
118 |
119 | setInput({...input, name:category})}
121 | value={input.name}
122 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
123 | placeholder={'Your Name Category'}
124 | />
125 |
126 |
127 |
128 |
129 |
130 | Submit
131 |
132 |
133 | >
134 | )
135 | }
136 |
137 | const mapStateToProps = state => {
138 | return {
139 | item: state.auth.resultsItem,
140 | };
141 | };
142 |
143 | export default connect(mapStateToProps) (EditCategory)
144 |
--------------------------------------------------------------------------------
/src/screens/AddProduct.js:
--------------------------------------------------------------------------------
1 | import React, {useState} from 'react';
2 | import {
3 | Text,
4 | View,
5 | ScrollView,
6 | TextInput,
7 | Image,
8 | Picker,
9 | StyleSheet,
10 | TouchableOpacity
11 | } from 'react-native';
12 |
13 | import productLogo from '../assets/images/product-logo.jpg'
14 | import Icon from 'react-native-vector-icons/Ionicons'
15 |
16 | import { useDispatch } from 'react-redux'
17 | import { connect } from "react-redux";
18 | import { postProduct } from '../Redux/Actions/product';
19 |
20 | const AddProduct = (props) => {
21 |
22 | const [user, setUser] = useState('')
23 |
24 | const [input, setInput] = useState({id:"", name:"", description:"", image:"", category_id:"", price:"", quantity:""})
25 | const dispatch = useDispatch()
26 |
27 | const handlePost = (event) => {
28 | dispatch (postProduct (input, props.item.token))
29 | .then(response => {
30 | if (response.value.data.status === 200) {
31 | props.navigation.navigate('Product')
32 | } else {
33 | alert(response.value.data.data)
34 | }
35 | })
36 | .catch(error => alert(error))
37 | }
38 |
39 | return (
40 | <>
41 |
42 | New Product
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | Name Product
52 |
53 |
54 |
55 | setInput({...input, name:name})}
57 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
58 | placeholder={'Your Name Product'}/>
59 |
60 |
61 |
62 | Description
63 |
64 |
65 |
66 | setInput({...input, description:description})}
68 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
69 | placeholder={'Your Description Product'}/>
70 |
71 |
72 |
73 | Quantity
74 |
75 |
76 |
77 | setInput({...input, quantity:quantity})}
79 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
80 | placeholder={'Your Quantity Product'}
81 | keyboardType={'numeric'}/>
82 |
83 |
84 |
85 | Image Product
86 |
87 |
88 |
89 | setInput({...input, image:image})}
91 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
92 | placeholder={'Your Image Product'}/>
93 |
94 |
95 |
96 | Price
97 |
98 |
99 |
100 | setInput({...input, price:price})}
102 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
103 | placeholder={'Your Price Product'}
104 | keyboardType={'numeric'}/>
105 |
106 |
107 |
108 | Category
109 |
110 |
111 |
112 |
113 | setInput({...input, category_id:itemValue})}
116 | >
117 | {props.setCategory.map((item, index) => {
118 | return(
119 |
120 | )})
121 | }
122 |
123 |
124 |
125 |
126 |
127 |
128 | Submit
129 |
130 |
131 |
132 | >
133 | )
134 | }
135 |
136 | const mapStateToProps = state => {
137 | return {
138 | item: state.auth.resultsItem,
139 | setCategory: state.category.viewCategory,
140 | };
141 | };
142 |
143 | export default connect(mapStateToProps) (AddProduct)
144 |
--------------------------------------------------------------------------------
/src/screens/Signup.js:
--------------------------------------------------------------------------------
1 | import React, {useState} from 'react';
2 | import {
3 | StyleSheet,
4 | View,
5 | Text,
6 | StatusBar,
7 | ImageBackground,
8 | Image,
9 | TextInput,
10 | Dimensions,
11 | TouchableOpacity,
12 | AsyncStorage
13 | } from 'react-native';
14 |
15 | import { Item, Input, Form, Label, Toast } from 'native-base';
16 |
17 | import bgImage from '../assets/images/bgImage.jpg';
18 | import logoLogin from '../assets/images/pixos-login.png';
19 | import Icon from 'react-native-vector-icons/Ionicons';
20 |
21 | import { useDispatch, useSelector } from 'react-redux';
22 | import { connect } from "react-redux";
23 | import { register } from '../Redux/Actions/auth';
24 |
25 | const { width: WIDTH } = Dimensions.get('window')
26 |
27 | {/* READY FUNCTION SIGNUP */}
28 | const Signup = (props) => {
29 | const [data, setData] = useState({username: '', password: ''});
30 | const [showPass, setShowPass] = useState(true)
31 | const [press, setPress] = useState(false)
32 |
33 | const dispatch = useDispatch();
34 |
35 | {/* READY FUNCTION HANDLE REGISTER */}
36 | const handleRegister = async() => {
37 | await dispatch(register(data))
38 | .then(response => {
39 | if (response.value.data.status === 200) {
40 | showToast("Success Create New User", "success");
41 | setTimeout(() => {
42 | props.navigation.navigate('Login');
43 | }, 500);
44 | } else {
45 | showToast(response.value.data.error, "warning");
46 | }
47 | })
48 | .catch(error => alert(error.value.data.message));
49 | };
50 |
51 | {/* READY FUNCTION PASS */}
52 | const pass = () => {
53 | if (press == false){
54 | setShowPass(false)
55 | setPress(true)
56 | } else {
57 | setShowPass(true)
58 | setPress(false)
59 | }
60 | }
61 |
62 | {/* READY FUNCTION HANDLE INFO */}
63 | const showToast = (message, types) => {
64 | Toast.show({
65 | text: message,
66 | buttonText: "Okay",
67 | type: types == "warning" ? "warning":"success",
68 | duration: 10000,
69 | position: "bottom"
70 | })
71 | }
72 |
73 | return (
74 | <>
75 | {/* READY LOGO */}
76 |
77 |
78 |
79 | Move Fast and Get Rich
80 | SIGN UP
81 |
82 |
83 | {/* READY INPUT */}
84 |
85 |
87 | {setData({...data, username: text})}}
89 | value={data.username}
90 | style={styles.inputUsername}
91 | placeholder={'Username'}
92 | placeholderTextColor={'black'}
93 | underlineColorAndroid='transparent'
94 | />
95 |
96 |
97 |
98 |
100 | {setData({...data, password: text})}}
102 | value={data.password}
103 | style={styles.inputUsername}
104 | placeholder={'Password'}
105 | secureTextEntry={showPass}
106 | placeholderTextColor={'black'}
107 | underlineColorAndroid='transparent'
108 | />
109 |
110 | pass()}>
112 |
114 |
115 |
116 |
117 | {/* READY BUTTOM SUBMIT */}
118 | handleRegister()} >
119 | CREATE ACCOUNT
120 |
121 |
122 | {/* READY CHANGE LOGIN */}
123 |
124 | Already Have Account?
125 | { props.navigation.navigate('Login') }}>
126 | Login Now
127 |
128 |
129 |
130 | >
131 | );
132 | };
133 |
134 | const styles = StyleSheet.create({
135 | backgroundContainer:{
136 | flex: 1,
137 | width: null,
138 | height: null,
139 | justifyContent: 'center',
140 | alignItems: 'center',
141 | },
142 | logoLogin:{
143 | width: 120,
144 | height: 120,
145 | },
146 | logoContainer:{
147 | alignItems:'center',
148 | marginBottom: 50
149 | },
150 | logoText:{
151 | color: 'white',
152 | fontSize: 26,
153 | fontWeight: '500',
154 | marginTop: 10,
155 | opacity: 0.8
156 | },
157 | inputUsername:{
158 | width: WIDTH - 75,
159 | height: 45,
160 | borderRadius: 45,
161 | fontSize: 16,
162 | fontWeight: 'bold',
163 | backgroundColor: '#e3e3e3',
164 | color: 'black',
165 | paddingLeft: 48,
166 | marginTop: 15,
167 | marginHorizontal: 25,
168 | opacity: 0.5
169 | },
170 | inputIcon:{
171 | position: 'absolute',
172 | top: 21,
173 | left: 43
174 | },
175 | btnEye:{
176 | position: 'absolute',
177 | top: 24,
178 | right: 43
179 | },
180 | btnLogin:{
181 | width: WIDTH - 75,
182 | height: 45,
183 | borderRadius: 45,
184 | backgroundColor: '#2bb358',
185 | justifyContent: 'center',
186 | marginTop: 30
187 | },
188 | textsubmit: {
189 | color: 'white',
190 | fontSize: 18,
191 | textAlign: 'center',
192 | fontWeight: 'bold'
193 | },
194 | textLogin:{
195 | color: 'white',
196 | fontSize: 26,
197 | fontWeight: 'bold',
198 | marginTop: 30,
199 | }
200 | });
201 |
202 | export default Signup;
203 |
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # http://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 | # Determine the Java command to use to start the JVM.
86 | if [ -n "$JAVA_HOME" ] ; then
87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
88 | # IBM's JDK on AIX uses strange locations for the executables
89 | JAVACMD="$JAVA_HOME/jre/sh/java"
90 | else
91 | JAVACMD="$JAVA_HOME/bin/java"
92 | fi
93 | if [ ! -x "$JAVACMD" ] ; then
94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
95 |
96 | Please set the JAVA_HOME variable in your environment to match the
97 | location of your Java installation."
98 | fi
99 | else
100 | JAVACMD="java"
101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
102 |
103 | Please set the JAVA_HOME variable in your environment to match the
104 | location of your Java installation."
105 | fi
106 |
107 | # Increase the maximum file descriptors if we can.
108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
109 | MAX_FD_LIMIT=`ulimit -H -n`
110 | if [ $? -eq 0 ] ; then
111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
112 | MAX_FD="$MAX_FD_LIMIT"
113 | fi
114 | ulimit -n $MAX_FD
115 | if [ $? -ne 0 ] ; then
116 | warn "Could not set maximum file descriptor limit: $MAX_FD"
117 | fi
118 | else
119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
120 | fi
121 | fi
122 |
123 | # For Darwin, add options to specify how the application appears in the dock
124 | if $darwin; then
125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
126 | fi
127 |
128 | # For Cygwin, switch paths to Windows format before running java
129 | if $cygwin ; then
130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
132 | JAVACMD=`cygpath --unix "$JAVACMD"`
133 |
134 | # We build the pattern for arguments to be converted via cygpath
135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
136 | SEP=""
137 | for dir in $ROOTDIRSRAW ; do
138 | ROOTDIRS="$ROOTDIRS$SEP$dir"
139 | SEP="|"
140 | done
141 | OURCYGPATTERN="(^($ROOTDIRS))"
142 | # Add a user-defined pattern to the cygpath arguments
143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
145 | fi
146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
147 | i=0
148 | for arg in "$@" ; do
149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
151 |
152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
154 | else
155 | eval `echo args$i`="\"$arg\""
156 | fi
157 | i=$((i+1))
158 | done
159 | case $i in
160 | (0) set -- ;;
161 | (1) set -- "$args0" ;;
162 | (2) set -- "$args0" "$args1" ;;
163 | (3) set -- "$args0" "$args1" "$args2" ;;
164 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
165 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
166 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
167 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
168 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
169 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
170 | esac
171 | fi
172 |
173 | # Escape application args
174 | save () {
175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
176 | echo " "
177 | }
178 | APP_ARGS=$(save "$@")
179 |
180 | # Collect all arguments for the java command, following the shell quoting and substitution rules
181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
182 |
183 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
184 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
185 | cd "$(dirname "$0")"
186 | fi
187 |
188 | exec "$JAVACMD" "$@"
189 |
--------------------------------------------------------------------------------
/src/screens/Login.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from 'react';
2 | import {
3 | StyleSheet,
4 | View,
5 | Text,
6 | StatusBar,
7 | ImageBackground,
8 | Image,
9 | TextInput,
10 | Dimensions,
11 | TouchableOpacity,
12 | } from 'react-native';
13 |
14 | import AsyncStorage from '@react-native-community/async-storage';
15 | import { Item, Input, Form, Label, Toast} from 'native-base';
16 |
17 | import bgImage from '../assets/images/bgImage.jpg'
18 | import logoLogin from '../assets/images/pixos-login.png'
19 | import Icon from 'react-native-vector-icons/Ionicons'
20 |
21 | import { useDispatch, useSelector } from 'react-redux'
22 | import { connect } from "react-redux";
23 | import { login, getItem } from '../Redux/Actions/auth';
24 |
25 | const { width: WIDTH } = Dimensions.get('window')
26 |
27 | {/* READY FUNCTION LOGIN */}
28 | const Login = (props) => {
29 | const [dataLogin, setDataLogin] = useState({username: '', password: ''});
30 | const dispatch = useDispatch();
31 | const [showPass, setShowPass] = useState(true)
32 | const [press, setPress] = useState(false)
33 |
34 | {/* READY FUNCTION HANDLE LOGIN */}
35 | const handleLogin = () => {
36 | dispatch(login(dataLogin))
37 | .then(response => {
38 | if (response.value.data.status === 200) {
39 | AsyncStorage.setItem('user', JSON.stringify(response.value.data.data), () => {});
40 | showToast("Login Success", "success");
41 | checkUser();
42 | setTimeout(() => {
43 | props.navigation.navigate('CobaTab');
44 | }, 500);
45 | } else {
46 | showToast(response.value.data.data, "warning");
47 | }
48 | })
49 | .catch(error => alert(error.value.data.error));
50 | };
51 |
52 | {/* READY FUNCTION LOGIN AUTH */}
53 | const checkUser = () => {
54 | dispatch(getItem())
55 | .then(response => { console.log('asdasd',response.value);
56 | if (response.value != null) {
57 | props.navigation.navigate('CobaTab')
58 | showToast("Login Success, success")
59 | }
60 | })
61 | .catch(error => {
62 | console.log(error);
63 | })
64 | }
65 |
66 | useEffect(() => {
67 | const check = setTimeout(() => {
68 | checkUser()
69 | }, 0)
70 |
71 | return () => {
72 | clearTimeout(check)
73 | }
74 | },[])
75 | {/* READY FUNCTION HANDLE INFO */}
76 | const showToast = (message, types) => {
77 | Toast.show({
78 | text: message,
79 | buttonText: "Okay",
80 | type: types == "warning" ? "warning":"success",
81 | duration: 5000,
82 | position: "bottom"
83 | })
84 | }
85 |
86 | {/* READY FUNCTION SHOW PASSWORD */}
87 | const pass = () => {
88 | if (press == false){
89 | setShowPass(false)
90 | setPress(true)
91 | } else {
92 | setShowPass(true)
93 | setPress(false)
94 | }
95 | }
96 | return (
97 | <>
98 | {/* READY LOGO */}
99 |
100 |
101 |
102 | Move Fast and Get Rich
103 | LOGIN
104 |
105 |
106 | {/* READY INPUT */}
107 |
108 |
110 | { setDataLogin({...dataLogin, username: text})}}
112 | value={dataLogin.username}
113 | style={styles.inputUsername}
114 | placeholder={'Username'}
115 | placeholderTextColor={'black'}
116 | underlineColorAndroid='transparent'
117 | />
118 |
119 |
120 |
121 |
123 | {setDataLogin({...dataLogin, password: text})}}
125 | value={dataLogin.password}
126 | style={styles.inputUsername}
127 | placeholder={'Password'}
128 | secureTextEntry={showPass}
129 | placeholderTextColor={'black'}
130 | underlineColorAndroid='transparent'
131 | />
132 |
133 | pass()}>
135 |
137 |
138 |
139 |
140 | {/* READY BUTTOM SUBMIT */}
141 | handleLogin()}>
142 | LOGIN
143 |
144 |
145 | {/* READY ACCESS DASBOARD */}
146 |
147 | Dont Have Account?
148 | { props.navigation.navigate('Signup') }}>
149 | Register Now
150 |
151 |
152 |
153 | >
154 | );
155 | };
156 |
157 | const styles = StyleSheet.create({
158 | backgroundContainer:{
159 | flex: 1,
160 | width: null,
161 | height: null,
162 | justifyContent: 'center',
163 | alignItems: 'center',
164 | },
165 | logoLogin:{
166 | width: 120,
167 | height: 120,
168 | },
169 | logoContainer:{
170 | alignItems:'center',
171 | marginBottom: 50
172 | },
173 | logoText:{
174 | color: 'white',
175 | fontSize: 26,
176 | fontWeight: '500',
177 | marginTop: 10,
178 | opacity: 0.8
179 | },
180 | inputUsername:{
181 | width: WIDTH - 75,
182 | height: 45,
183 | borderRadius: 45,
184 | fontSize: 16,
185 | fontWeight: 'bold',
186 | backgroundColor: '#e3e3e3',
187 | color: 'black',
188 | paddingLeft: 48,
189 | marginTop: 15,
190 | marginHorizontal: 25,
191 | opacity: 0.5
192 | },
193 | inputIcon:{
194 | position: 'absolute',
195 | top: 21,
196 | left: 43
197 | },
198 | btnEye:{
199 | position: 'absolute',
200 | top: 24,
201 | right: 43
202 | },
203 | btnLogin:{
204 | width: WIDTH - 75,
205 | height: 45,
206 | borderRadius: 45,
207 | backgroundColor: '#2bb358',
208 | justifyContent: 'center',
209 | marginTop: 30,
210 | },
211 | textsubmit: {
212 | color: 'white',
213 | fontSize: 18,
214 | textAlign: 'center',
215 | fontWeight: 'bold'
216 | },
217 | textLogin:{
218 | color: 'white',
219 | fontSize: 26,
220 | fontWeight: 'bold',
221 | marginTop: 30,
222 | }
223 | });
224 |
225 | export default connect()(Login);
226 |
--------------------------------------------------------------------------------
/src/screens/Main.js:
--------------------------------------------------------------------------------
1 | import React, {useEffect, useState} from 'react'
2 | import {
3 | StyleSheet,
4 | View,
5 | Text,
6 | Image,
7 | TextInput,
8 | TouchableOpacity,
9 | Button,
10 | ScrollView
11 | } from 'react-native';
12 |
13 | import { useDispatch } from 'react-redux'
14 | import { connect } from "react-redux";
15 | import { getProduct } from '../Redux/Actions/product';
16 |
17 | const Main = (props) => {
18 |
19 | const [page, setPage] = useState(0);
20 | const [infoPage, setInfoPage] = useState({maxPage: 0, totalAllProduct: 0});
21 | const [rowsPerPage, setRowsPerPage] = useState(20);
22 | const dispatch = useDispatch();
23 |
24 | const fetchDataProduct = async () => {
25 | try {
26 | const response = await dispatch(getProduct(rowsPerPage, page + 1, props.item.token))
27 | setInfoPage (response.value.data.data.infoPage);
28 | } catch (error) {
29 | console.log (error);
30 | }
31 | }
32 |
33 | useEffect(() => {
34 | fetchDataProduct ();
35 | },[page, rowsPerPage])
36 |
37 | return(
38 | <>
39 |
40 |
41 |
42 | {/* SEARCH NAVIGATIONS */}
43 |
44 |
47 |
50 |
51 |
52 | {/* CHART ICONS */}
53 |
54 | { props.navigation.navigate('Cart') }}>
55 |
58 |
59 |
60 |
61 |
62 | {/* FEATURE APPS */}
63 |
64 |
65 |
66 | ORDER
67 |
68 |
69 |
70 |
71 |
72 |
73 | List
74 |
75 |
76 |
77 |
78 |
79 |
80 | New
81 |
82 |
83 |
84 |
85 |
86 |
87 | Category
88 |
89 |
90 |
91 |
92 |
93 |
94 | Name
95 |
96 |
97 |
98 |
99 |
100 |
101 | {/* PRODUCT APPS */}
102 |
103 | {props.setProduct.map((data, index) => (
104 |
105 |
106 |
110 |
111 | {data.name}
112 | {data.description}
113 |
114 | {data.price}
115 | {alert('You tapped the button!')}}
116 | style={styles.contentTouchable}
117 | >
118 | Add Cart
119 |
120 |
121 |
122 |
123 |
124 | )
125 | )}
126 |
127 |
128 | >
129 | )
130 | }
131 |
132 |
133 | const styles = StyleSheet.create({
134 | inputText:{
135 | borderWidth:1,
136 | borderColor:'#E8E8E8',
137 | borderRadius: 25,
138 | height: 50,
139 | fontSize: 13,
140 | paddingLeft: 45,
141 | paddingRight: 20,
142 | backgroundColor:'white',
143 | marginRight: 9
144 | },
145 | viewBody: {
146 | flex: 1,
147 | backgroundColor:'white'
148 | },
149 | viewSearchCart: {
150 | marginHorizontal: 17,
151 | flexDirection:'row',
152 | paddingTop:15
153 | },
154 | viewSearch: {
155 | position:'relative',
156 | flex:1
157 | },
158 | cartImage: {
159 | width:25,
160 | height:25,
161 | position:'absolute',
162 | top: 12,
163 | left: 12
164 | },
165 | viewCartIcons: {
166 | width:35,
167 | alignItems:'center',
168 | justifyContent:'center'
169 | },
170 | imageBasket: {
171 | width: 28,
172 | height: 28
173 | },
174 |
175 | // FEATURE APPS STYLE
176 | viewFeature: {
177 | marginHorizontal:17,
178 | marginTop: 15
179 | },
180 | viewLogo: {
181 | flexDirection: 'row',
182 | justifyContent:'space-between',
183 | backgroundColor:'#0DAC50',
184 | borderTopLeftRadius: 7,
185 | borderTopRightRadius: 7,
186 | padding:13
187 | },
188 | imageLogo: {
189 | width: 115,
190 | height: 20
191 | },
192 | textLogo: {
193 | fontSize: 18,
194 | fontWeight: 'bold',
195 | color: 'white'
196 | },
197 | viewMenu: {
198 | flexDirection: 'row',
199 | paddingTop:20,
200 | paddingBottom: 14,
201 | backgroundColor:'#1DBC60',
202 | borderBottomLeftRadius: 7,
203 | borderBottomRightRadius: 7
204 | },
205 |
206 | // MENU BLUE STYLE
207 | viewMenuBlue: {
208 | flex:1,
209 | alignItems:'center',
210 | justifyContent:'center'
211 | },
212 | TouchableOpacity:{
213 | backgroundColor: 'white',
214 | paddingRight:25,
215 | paddingLeft:25,
216 | paddingTop:3,
217 | paddingBottom:3,
218 | alignItems: 'center',
219 | justifyContent: 'center',
220 | borderRadius: 15
221 | },
222 | TouchableOpacityCategory:{
223 | backgroundColor: 'white',
224 | paddingRight:15,
225 | paddingLeft:15,
226 | paddingTop:3,
227 | paddingBottom:3,
228 | alignItems: 'center',
229 | justifyContent: 'center',
230 | borderRadius: 15
231 | },
232 | TouchableOpacityName:{
233 | backgroundColor: 'white',
234 | paddingRight:19,
235 | paddingLeft:19,
236 | paddingTop:3,
237 | paddingBottom:3,
238 | alignItems: 'center',
239 | justifyContent: 'center',
240 | borderRadius: 15
241 | },
242 | textMenu:{
243 | color: 'green'
244 | },
245 |
246 | // CONTENT APP STYLE
247 | scrollMargin: {
248 | marginTop:10,
249 | },
250 | viewContentImage: {
251 | marginHorizontal:17,
252 | marginTop: 10,
253 | flexDirection:'row',
254 | position:'relative'
255 | },
256 | imageContent: {
257 | width: 100,
258 | height:100,
259 | borderRadius:5
260 | },
261 | viewContentText:{
262 | marginHorizontal:17,
263 | width:'69%'
264 | },
265 | contentTitle:{
266 | fontSize: 18,
267 | fontWeight: 'bold',
268 | paddingTop:5
269 | },
270 | contentDesc:{
271 | fontSize: 15,
272 | paddingTop:5
273 | },
274 | viewContentPrice:{
275 | flexDirection:'row',
276 | justifyContent:'space-between'
277 | },
278 | textContent:{
279 | fontSize: 15,
280 | fontWeight: 'bold',
281 | paddingTop:15
282 | },
283 | contentTouchable:{
284 | borderRadius: 25,
285 | alignItems: 'center',
286 | justifyContent:'center',
287 | backgroundColor: '#0DAC50',
288 | padding: 5,
289 | paddingLeft:20,
290 | paddingRight:20
291 | },
292 | textCart:{
293 | fontWeight: 'bold',
294 | color:'white'
295 | }
296 | });
297 |
298 | const mapStateToProps = state => {
299 | return {
300 | item: state.auth.resultsItem,
301 | setProduct: state.product.viewProduct,
302 | userDetail: state.auth.resultsLogin
303 | };
304 | };
305 |
306 | export default connect(mapStateToProps) (Main)
307 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: "com.android.application"
2 |
3 | import com.android.build.OutputFile
4 |
5 | /**
6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7 | * and bundleReleaseJsAndAssets).
8 | * These basically call `react-native bundle` with the correct arguments during the Android build
9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10 | * bundle directly from the development server. Below you can see all the possible configurations
11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the
12 | * `apply from: "../../node_modules/react-native/react.gradle"` line.
13 | *
14 | * project.ext.react = [
15 | * // the name of the generated asset file containing your JS bundle
16 | * bundleAssetName: "index.android.bundle",
17 | *
18 | * // the entry file for bundle generation
19 | * entryFile: "index.android.js",
20 | *
21 | * // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
22 | * bundleCommand: "ram-bundle",
23 | *
24 | * // whether to bundle JS and assets in debug mode
25 | * bundleInDebug: false,
26 | *
27 | * // whether to bundle JS and assets in release mode
28 | * bundleInRelease: true,
29 | *
30 | * // whether to bundle JS and assets in another build variant (if configured).
31 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
32 | * // The configuration property can be in the following formats
33 | * // 'bundleIn${productFlavor}${buildType}'
34 | * // 'bundleIn${buildType}'
35 | * // bundleInFreeDebug: true,
36 | * // bundleInPaidRelease: true,
37 | * // bundleInBeta: true,
38 | *
39 | * // whether to disable dev mode in custom build variants (by default only disabled in release)
40 | * // for example: to disable dev mode in the staging build type (if configured)
41 | * devDisabledInStaging: true,
42 | * // The configuration property can be in the following formats
43 | * // 'devDisabledIn${productFlavor}${buildType}'
44 | * // 'devDisabledIn${buildType}'
45 | *
46 | * // the root of your project, i.e. where "package.json" lives
47 | * root: "../../",
48 | *
49 | * // where to put the JS bundle asset in debug mode
50 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
51 | *
52 | * // where to put the JS bundle asset in release mode
53 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release",
54 | *
55 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
56 | * // require('./image.png')), in debug mode
57 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
58 | *
59 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
60 | * // require('./image.png')), in release mode
61 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
62 | *
63 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means
64 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
65 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle
66 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
67 | * // for example, you might want to remove it from here.
68 | * inputExcludes: ["android/**", "ios/**"],
69 | *
70 | * // override which node gets called and with what additional arguments
71 | * nodeExecutableAndArgs: ["node"],
72 | *
73 | * // supply additional arguments to the packager
74 | * extraPackagerArgs: []
75 | * ]
76 | */
77 |
78 | project.ext.react = [
79 | entryFile: "index.js",
80 | enableHermes: false, // clean and rebuild if changing
81 | ]
82 |
83 | apply from: "../../node_modules/react-native/react.gradle"
84 |
85 | /**
86 | * Set this to true to create two separate APKs instead of one:
87 | * - An APK that only works on ARM devices
88 | * - An APK that only works on x86 devices
89 | * The advantage is the size of the APK is reduced by about 4MB.
90 | * Upload all the APKs to the Play Store and people will download
91 | * the correct one based on the CPU architecture of their device.
92 | */
93 | def enableSeparateBuildPerCPUArchitecture = false
94 |
95 | /**
96 | * Run Proguard to shrink the Java bytecode in release builds.
97 | */
98 | def enableProguardInReleaseBuilds = false
99 |
100 | /**
101 | * The preferred build flavor of JavaScriptCore.
102 | *
103 | * For example, to use the international variant, you can use:
104 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
105 | *
106 | * The international variant includes ICU i18n library and necessary data
107 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
108 | * give correct results when using with locales other than en-US. Note that
109 | * this variant is about 6MiB larger per architecture than default.
110 | */
111 | def jscFlavor = 'org.webkit:android-jsc:+'
112 |
113 | /**
114 | * Whether to enable the Hermes VM.
115 | *
116 | * This should be set on project.ext.react and mirrored here. If it is not set
117 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
118 | * and the benefits of using Hermes will therefore be sharply reduced.
119 | */
120 | def enableHermes = project.ext.react.get("enableHermes", false);
121 |
122 | android {
123 | compileSdkVersion rootProject.ext.compileSdkVersion
124 |
125 | compileOptions {
126 | sourceCompatibility JavaVersion.VERSION_1_8
127 | targetCompatibility JavaVersion.VERSION_1_8
128 | }
129 |
130 | packagingOptions {
131 | pickFirst '**/libjsc.so'
132 | }
133 |
134 | defaultConfig {
135 | applicationId "com.posreact"
136 | minSdkVersion rootProject.ext.minSdkVersion
137 | targetSdkVersion rootProject.ext.targetSdkVersion
138 | versionCode 1
139 | versionName "1.0"
140 | }
141 | splits {
142 | abi {
143 | reset()
144 | enable enableSeparateBuildPerCPUArchitecture
145 | universalApk false // If true, also generate a universal APK
146 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
147 | }
148 | }
149 | signingConfigs {
150 | debug {
151 | storeFile file('debug.keystore')
152 | storePassword 'android'
153 | keyAlias 'androiddebugkey'
154 | keyPassword 'android'
155 | }
156 | }
157 | buildTypes {
158 | debug {
159 | signingConfig signingConfigs.debug
160 | }
161 | release {
162 | // Caution! In production, you need to generate your own keystore file.
163 | // see https://facebook.github.io/react-native/docs/signed-apk-android.
164 | signingConfig signingConfigs.debug
165 | minifyEnabled enableProguardInReleaseBuilds
166 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
167 | }
168 | }
169 | // applicationVariants are e.g. debug, release
170 | applicationVariants.all { variant ->
171 | variant.outputs.each { output ->
172 | // For each separate APK per architecture, set a unique version code as described here:
173 | // https://developer.android.com/studio/build/configure-apk-splits.html
174 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
175 | def abi = output.getFilter(OutputFile.ABI)
176 | if (abi != null) { // null for the universal-debug, universal-release variants
177 | output.versionCodeOverride =
178 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
179 | }
180 |
181 | }
182 | }
183 | }
184 |
185 | dependencies {
186 | implementation fileTree(dir: "libs", include: ["*.jar"])
187 | implementation "com.facebook.react:react-native:+" // From node_modules
188 | implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
189 | implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
190 |
191 | if (enableHermes) {
192 | def hermesPath = "../../node_modules/hermes-engine/android/";
193 | debugImplementation files(hermesPath + "hermes-debug.aar")
194 | releaseImplementation files(hermesPath + "hermes-release.aar")
195 | } else {
196 | implementation jscFlavor
197 | }
198 | }
199 |
200 | // Run this once to be able to run the application with BUCK
201 | // puts all compile dependencies into folder libs for BUCK to use
202 | task copyDownloadableDepsToLibs(type: Copy) {
203 | from configurations.compile
204 | into 'libs'
205 | }
206 |
207 | apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
208 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
209 |
--------------------------------------------------------------------------------
/src/screens/EditProduct.js:
--------------------------------------------------------------------------------
1 | import React, {useState, useEffect} from 'react';
2 | import {
3 | Text,
4 | View,
5 | ScrollView,
6 | TextInput,
7 | Image,
8 | Picker,
9 | StyleSheet,
10 | Modal,
11 | TouchableOpacity
12 | } from 'react-native';
13 |
14 | import productLogo from '../assets/images/product-logo.jpg'
15 | import Icon from 'react-native-vector-icons/Ionicons'
16 |
17 | import { useDispatch } from 'react-redux'
18 | import { connect } from "react-redux";
19 | import { putProduct, deleteProduct } from '../Redux/Actions/product';
20 |
21 | const EditProduct = (props) => {
22 |
23 | const [input, setInput] = useState({id:"", name:"", description:"", image:"", category_id:"", price:"", quantity:""});
24 | const dispatch = useDispatch();
25 | const {navigation} = props;
26 |
27 | const [modalVisible, setModalVisible] = useState(false)
28 | const clickModalVisible = (visible) => {
29 | setModalVisible(visible)
30 | }
31 |
32 | const handleEdit = (event) => {
33 | dispatch(putProduct(input, props.item.token))
34 | .then(response => {
35 | if (response.value.status === 200) {
36 | props.navigation.navigate('Product');
37 | } else {
38 | alert(response.value.data.data)
39 | }
40 | })
41 | .catch(error => alert(error));
42 | }
43 |
44 | console.log(input);
45 |
46 | const handleDelete = (id) => {
47 | dispatch(deleteProduct (id, props.item.token))
48 | .then(response => {
49 | if (response.value.status === 200) {
50 | props.navigation.navigate('Product');
51 | } else {
52 | props.navigation.navigate('Product');
53 | }
54 | })
55 | .catch(error => alert(error));
56 | };
57 |
58 | useEffect(() => {
59 | setInput(navigation.state.params.selectedRow)
60 | },[])
61 |
62 | return (
63 | <>
64 |
69 |
70 |
71 |
72 |
73 | Delete Product?
74 |
75 |
76 |
77 |
78 | WARNING :
79 | This action CANNOT be undone
80 |
81 |
82 |
83 |
84 |
85 | {
87 | clickModalVisible(!modalVisible);
88 | }}>
89 | Close
90 |
91 |
92 | handleDelete(input)}>
94 | Delete
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 | Edit Product
103 | {setModalVisible(true)}}>
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | Name Product
115 |
116 |
117 |
118 | setInput({...input, name: name})}
120 | defaultValue={input.name}
121 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
122 | placeholder={'Your Name Product'}/>
123 |
124 |
125 |
126 | Description
127 |
128 |
129 |
130 | setInput({...input, description: description})}
132 | defaultValue={input.description}
133 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
134 | placeholder={'Your Description Product'}/>
135 |
136 |
137 |
138 | Quantity
139 |
140 |
141 |
142 | setInput({...input, quantity: quantity})}
144 | value={input.quantity.toString() }
145 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
146 | placeholder={'Your Quantity Product'}
147 | keyboardType={'numeric'}/>
148 |
149 |
150 |
151 | Image Product
152 |
153 |
154 |
155 | setInput({...input, image: image})}
157 | defaultValue={input.image}
158 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
159 | placeholder={'Your Image Product'}/>
160 |
161 |
162 |
163 | Price
164 |
165 |
166 |
167 | setInput({...input, price: price})}
169 | value={input.price.toString()}
170 | style={{ height: 40, paddingLeft: 8, borderColor: '#787878', borderWidth: 0.5, borderRadius: 7 }}
171 | placeholder={'Your Price Product'}
172 | keyboardType={'numeric'}/>
173 |
174 |
175 |
176 | Category
177 |
178 |
179 |
180 |
181 | setInput({...input, category_id:itemValue})}
184 | >
185 | {props.setCategory.map((item, index) => {
186 | return(
187 |
188 | )})
189 | }
190 |
191 |
192 | {/*{user} */}
193 |
194 |
195 |
196 |
197 |
198 |
199 | EDIT PRODUCT
200 |
201 |
202 |
203 | >
204 | )
205 | }
206 |
207 | const mapStateToProps = state => {
208 | return {
209 | item: state.auth.resultsItem,
210 | setCategory: state.category.viewCategory,
211 | };
212 | };
213 |
214 | export default connect(mapStateToProps) (EditProduct)
215 |
--------------------------------------------------------------------------------
/src/screens/Cart.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Text, View, Image, TouchableOpacity, ScrollView, Button } from 'react-native';
3 | import AsyncStorage from '@react-native-community/async-storage';
4 |
5 | import Icon from 'react-native-vector-icons/EvilIcons'
6 |
7 | const Cart = (props) => {
8 | return (
9 | <>
10 |
11 | CART LIST
12 | { props.navigation.navigate('Main') }}/>
13 |
14 |
15 |
16 | {/* READY CHECK MENU */}
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 | Padang Rice
25 | Food
26 |
27 |
28 | Rp.100.000
29 |
30 |
31 | {/* READY BUTTON PLUS */}
32 |
33 |
34 |
35 | 1
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | {/* READY CHECK MENU */}
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | Padang Rice
54 | Food
55 |
56 |
57 | Rp.100.000
58 |
59 |
60 | {/* READY BUTTON PLUS */}
61 |
62 |
63 |
64 | 1
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | {/* READY CHECK MENU */}
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 | Padang Rice
83 | Food
84 |
85 |
86 | Rp.100.000
87 |
88 |
89 | {/* READY BUTTON PLUS */}
90 |
91 |
92 |
93 | 1
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 | {/* READY CHECK MENU */}
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | Padang Rice
112 | Food
113 |
114 |
115 | Rp.100.000
116 |
117 |
118 | {/* READY BUTTON PLUS */}
119 |
120 |
121 |
122 | 1
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 | {/* READY CHECK MENU */}
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 | Padang Rice
141 | Food
142 |
143 |
144 | Rp.100.000
145 |
146 |
147 | {/* READY BUTTON PLUS */}
148 |
149 |
150 |
151 | 1
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 | {/* READY CHECK MENU */}
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 | Padang Rice
170 | Food
171 |
172 |
173 | Rp.100.000
174 |
175 |
176 | {/* READY BUTTON PLUS */}
177 |
178 |
179 |
180 | 1
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 | Total (Tax Include)
194 | 240.000
195 |
196 |
197 | { props.navigation.navigate('History') }}
198 | style={{
199 | width: 375,
200 | height: 45,
201 | borderRadius: 6,
202 | backgroundColor: 'white',
203 | alignItems: 'center',
204 | justifyContent: 'center',
205 | marginTop: 10,
206 | marginBottom: 30,
207 | }}>
208 | CHECKOUT
209 |
210 |
211 |
212 | >
213 | )
214 | }
215 |
216 | export default Cart;
217 |
--------------------------------------------------------------------------------
/ios/PosReact.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 00E356F31AD99517003FC87E /* PosReactTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* PosReactTests.m */; };
11 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
12 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
13 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
14 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
15 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
16 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
17 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
18 | 2DCD954D1E0B4F2C00145EB5 /* PosReactTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* PosReactTests.m */; };
19 | /* End PBXBuildFile section */
20 |
21 | /* Begin PBXContainerItemProxy section */
22 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
23 | isa = PBXContainerItemProxy;
24 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
25 | proxyType = 1;
26 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
27 | remoteInfo = PosReact;
28 | };
29 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
30 | isa = PBXContainerItemProxy;
31 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
32 | proxyType = 1;
33 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
34 | remoteInfo = "PosReact-tvOS";
35 | };
36 | /* End PBXContainerItemProxy section */
37 |
38 | /* Begin PBXFileReference section */
39 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
40 | 00E356EE1AD99517003FC87E /* PosReactTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PosReactTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
41 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
42 | 00E356F21AD99517003FC87E /* PosReactTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PosReactTests.m; sourceTree = ""; };
43 | 13B07F961A680F5B00A75B9A /* PosReact.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PosReact.app; sourceTree = BUILT_PRODUCTS_DIR; };
44 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = PosReact/AppDelegate.h; sourceTree = ""; };
45 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = PosReact/AppDelegate.m; sourceTree = ""; };
46 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
47 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = PosReact/Images.xcassets; sourceTree = ""; };
48 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = PosReact/Info.plist; sourceTree = ""; };
49 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = PosReact/main.m; sourceTree = ""; };
50 | 2D02E47B1E0B4A5D006451C7 /* PosReact-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PosReact-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
51 | 2D02E4901E0B4A5D006451C7 /* PosReact-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PosReact-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
52 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
53 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
54 | /* End PBXFileReference section */
55 |
56 | /* Begin PBXFrameworksBuildPhase section */
57 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
58 | isa = PBXFrameworksBuildPhase;
59 | buildActionMask = 2147483647;
60 | files = (
61 | );
62 | runOnlyForDeploymentPostprocessing = 0;
63 | };
64 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
65 | isa = PBXFrameworksBuildPhase;
66 | buildActionMask = 2147483647;
67 | files = (
68 | );
69 | runOnlyForDeploymentPostprocessing = 0;
70 | };
71 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = {
72 | isa = PBXFrameworksBuildPhase;
73 | buildActionMask = 2147483647;
74 | files = (
75 | );
76 | runOnlyForDeploymentPostprocessing = 0;
77 | };
78 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {
79 | isa = PBXFrameworksBuildPhase;
80 | buildActionMask = 2147483647;
81 | files = (
82 | );
83 | runOnlyForDeploymentPostprocessing = 0;
84 | };
85 | /* End PBXFrameworksBuildPhase section */
86 |
87 | /* Begin PBXGroup section */
88 | 00E356EF1AD99517003FC87E /* PosReactTests */ = {
89 | isa = PBXGroup;
90 | children = (
91 | 00E356F21AD99517003FC87E /* PosReactTests.m */,
92 | 00E356F01AD99517003FC87E /* Supporting Files */,
93 | );
94 | path = PosReactTests;
95 | sourceTree = "";
96 | };
97 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
98 | isa = PBXGroup;
99 | children = (
100 | 00E356F11AD99517003FC87E /* Info.plist */,
101 | );
102 | name = "Supporting Files";
103 | sourceTree = "";
104 | };
105 | 13B07FAE1A68108700A75B9A /* PosReact */ = {
106 | isa = PBXGroup;
107 | children = (
108 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
109 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
110 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
111 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
112 | 13B07FB61A68108700A75B9A /* Info.plist */,
113 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
114 | 13B07FB71A68108700A75B9A /* main.m */,
115 | );
116 | name = PosReact;
117 | sourceTree = "";
118 | };
119 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
120 | isa = PBXGroup;
121 | children = (
122 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
123 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
124 | );
125 | name = Frameworks;
126 | sourceTree = "";
127 | };
128 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
129 | isa = PBXGroup;
130 | children = (
131 | );
132 | name = Libraries;
133 | sourceTree = "";
134 | };
135 | 83CBB9F61A601CBA00E9B192 = {
136 | isa = PBXGroup;
137 | children = (
138 | 13B07FAE1A68108700A75B9A /* PosReact */,
139 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
140 | 00E356EF1AD99517003FC87E /* PosReactTests */,
141 | 83CBBA001A601CBA00E9B192 /* Products */,
142 | 2D16E6871FA4F8E400B85C8A /* Frameworks */,
143 | );
144 | indentWidth = 2;
145 | sourceTree = "";
146 | tabWidth = 2;
147 | usesTabs = 0;
148 | };
149 | 83CBBA001A601CBA00E9B192 /* Products */ = {
150 | isa = PBXGroup;
151 | children = (
152 | 13B07F961A680F5B00A75B9A /* PosReact.app */,
153 | 00E356EE1AD99517003FC87E /* PosReactTests.xctest */,
154 | 2D02E47B1E0B4A5D006451C7 /* PosReact-tvOS.app */,
155 | 2D02E4901E0B4A5D006451C7 /* PosReact-tvOSTests.xctest */,
156 | );
157 | name = Products;
158 | sourceTree = "";
159 | };
160 | /* End PBXGroup section */
161 |
162 | /* Begin PBXNativeTarget section */
163 | 00E356ED1AD99517003FC87E /* PosReactTests */ = {
164 | isa = PBXNativeTarget;
165 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "PosReactTests" */;
166 | buildPhases = (
167 | 00E356EA1AD99517003FC87E /* Sources */,
168 | 00E356EB1AD99517003FC87E /* Frameworks */,
169 | 00E356EC1AD99517003FC87E /* Resources */,
170 | );
171 | buildRules = (
172 | );
173 | dependencies = (
174 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
175 | );
176 | name = PosReactTests;
177 | productName = PosReactTests;
178 | productReference = 00E356EE1AD99517003FC87E /* PosReactTests.xctest */;
179 | productType = "com.apple.product-type.bundle.unit-test";
180 | };
181 | 13B07F861A680F5B00A75B9A /* PosReact */ = {
182 | isa = PBXNativeTarget;
183 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "PosReact" */;
184 | buildPhases = (
185 | FD10A7F022414F080027D42C /* Start Packager */,
186 | 13B07F871A680F5B00A75B9A /* Sources */,
187 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
188 | 13B07F8E1A680F5B00A75B9A /* Resources */,
189 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
190 | );
191 | buildRules = (
192 | );
193 | dependencies = (
194 | );
195 | name = PosReact;
196 | productName = "PosReact";
197 | productReference = 13B07F961A680F5B00A75B9A /* PosReact.app */;
198 | productType = "com.apple.product-type.application";
199 | };
200 | 2D02E47A1E0B4A5D006451C7 /* PosReact-tvOS */ = {
201 | isa = PBXNativeTarget;
202 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "PosReact-tvOS" */;
203 | buildPhases = (
204 | FD10A7F122414F3F0027D42C /* Start Packager */,
205 | 2D02E4771E0B4A5D006451C7 /* Sources */,
206 | 2D02E4781E0B4A5D006451C7 /* Frameworks */,
207 | 2D02E4791E0B4A5D006451C7 /* Resources */,
208 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,
209 | );
210 | buildRules = (
211 | );
212 | dependencies = (
213 | );
214 | name = "PosReact-tvOS";
215 | productName = "PosReact-tvOS";
216 | productReference = 2D02E47B1E0B4A5D006451C7 /* PosReact-tvOS.app */;
217 | productType = "com.apple.product-type.application";
218 | };
219 | 2D02E48F1E0B4A5D006451C7 /* PosReact-tvOSTests */ = {
220 | isa = PBXNativeTarget;
221 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "PosReact-tvOSTests" */;
222 | buildPhases = (
223 | 2D02E48C1E0B4A5D006451C7 /* Sources */,
224 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */,
225 | 2D02E48E1E0B4A5D006451C7 /* Resources */,
226 | );
227 | buildRules = (
228 | );
229 | dependencies = (
230 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,
231 | );
232 | name = "PosReact-tvOSTests";
233 | productName = "PosReact-tvOSTests";
234 | productReference = 2D02E4901E0B4A5D006451C7 /* PosReact-tvOSTests.xctest */;
235 | productType = "com.apple.product-type.bundle.unit-test";
236 | };
237 | /* End PBXNativeTarget section */
238 |
239 | /* Begin PBXProject section */
240 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
241 | isa = PBXProject;
242 | attributes = {
243 | LastUpgradeCheck = 0940;
244 | ORGANIZATIONNAME = Facebook;
245 | TargetAttributes = {
246 | 00E356ED1AD99517003FC87E = {
247 | CreatedOnToolsVersion = 6.2;
248 | TestTargetID = 13B07F861A680F5B00A75B9A;
249 | };
250 | 2D02E47A1E0B4A5D006451C7 = {
251 | CreatedOnToolsVersion = 8.2.1;
252 | ProvisioningStyle = Automatic;
253 | };
254 | 2D02E48F1E0B4A5D006451C7 = {
255 | CreatedOnToolsVersion = 8.2.1;
256 | ProvisioningStyle = Automatic;
257 | TestTargetID = 2D02E47A1E0B4A5D006451C7;
258 | };
259 | };
260 | };
261 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "PosReact" */;
262 | compatibilityVersion = "Xcode 3.2";
263 | developmentRegion = English;
264 | hasScannedForEncodings = 0;
265 | knownRegions = (
266 | en,
267 | Base,
268 | );
269 | mainGroup = 83CBB9F61A601CBA00E9B192;
270 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
271 | projectDirPath = "";
272 | projectRoot = "";
273 | targets = (
274 | 13B07F861A680F5B00A75B9A /* PosReact */,
275 | 00E356ED1AD99517003FC87E /* PosReactTests */,
276 | 2D02E47A1E0B4A5D006451C7 /* PosReact-tvOS */,
277 | 2D02E48F1E0B4A5D006451C7 /* PosReact-tvOSTests */,
278 | );
279 | };
280 | /* End PBXProject section */
281 |
282 | /* Begin PBXResourcesBuildPhase section */
283 | 00E356EC1AD99517003FC87E /* Resources */ = {
284 | isa = PBXResourcesBuildPhase;
285 | buildActionMask = 2147483647;
286 | files = (
287 | );
288 | runOnlyForDeploymentPostprocessing = 0;
289 | };
290 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
291 | isa = PBXResourcesBuildPhase;
292 | buildActionMask = 2147483647;
293 | files = (
294 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
295 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
296 | );
297 | runOnlyForDeploymentPostprocessing = 0;
298 | };
299 | 2D02E4791E0B4A5D006451C7 /* Resources */ = {
300 | isa = PBXResourcesBuildPhase;
301 | buildActionMask = 2147483647;
302 | files = (
303 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,
304 | );
305 | runOnlyForDeploymentPostprocessing = 0;
306 | };
307 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = {
308 | isa = PBXResourcesBuildPhase;
309 | buildActionMask = 2147483647;
310 | files = (
311 | );
312 | runOnlyForDeploymentPostprocessing = 0;
313 | };
314 | /* End PBXResourcesBuildPhase section */
315 |
316 | /* Begin PBXShellScriptBuildPhase section */
317 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
318 | isa = PBXShellScriptBuildPhase;
319 | buildActionMask = 2147483647;
320 | files = (
321 | );
322 | inputPaths = (
323 | );
324 | name = "Bundle React Native code and images";
325 | outputPaths = (
326 | );
327 | runOnlyForDeploymentPostprocessing = 0;
328 | shellPath = /bin/sh;
329 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
330 | };
331 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
332 | isa = PBXShellScriptBuildPhase;
333 | buildActionMask = 2147483647;
334 | files = (
335 | );
336 | inputPaths = (
337 | );
338 | name = "Bundle React Native Code And Images";
339 | outputPaths = (
340 | );
341 | runOnlyForDeploymentPostprocessing = 0;
342 | shellPath = /bin/sh;
343 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
344 | };
345 | FD10A7F022414F080027D42C /* Start Packager */ = {
346 | isa = PBXShellScriptBuildPhase;
347 | buildActionMask = 2147483647;
348 | files = (
349 | );
350 | inputFileListPaths = (
351 | );
352 | inputPaths = (
353 | );
354 | name = "Start Packager";
355 | outputFileListPaths = (
356 | );
357 | outputPaths = (
358 | );
359 | runOnlyForDeploymentPostprocessing = 0;
360 | shellPath = /bin/sh;
361 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
362 | showEnvVarsInLog = 0;
363 | };
364 | FD10A7F122414F3F0027D42C /* Start Packager */ = {
365 | isa = PBXShellScriptBuildPhase;
366 | buildActionMask = 2147483647;
367 | files = (
368 | );
369 | inputFileListPaths = (
370 | );
371 | inputPaths = (
372 | );
373 | name = "Start Packager";
374 | outputFileListPaths = (
375 | );
376 | outputPaths = (
377 | );
378 | runOnlyForDeploymentPostprocessing = 0;
379 | shellPath = /bin/sh;
380 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
381 | showEnvVarsInLog = 0;
382 | };
383 | /* End PBXShellScriptBuildPhase section */
384 |
385 | /* Begin PBXSourcesBuildPhase section */
386 | 00E356EA1AD99517003FC87E /* Sources */ = {
387 | isa = PBXSourcesBuildPhase;
388 | buildActionMask = 2147483647;
389 | files = (
390 | 00E356F31AD99517003FC87E /* PosReactTests.m in Sources */,
391 | );
392 | runOnlyForDeploymentPostprocessing = 0;
393 | };
394 | 13B07F871A680F5B00A75B9A /* Sources */ = {
395 | isa = PBXSourcesBuildPhase;
396 | buildActionMask = 2147483647;
397 | files = (
398 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
399 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
400 | );
401 | runOnlyForDeploymentPostprocessing = 0;
402 | };
403 | 2D02E4771E0B4A5D006451C7 /* Sources */ = {
404 | isa = PBXSourcesBuildPhase;
405 | buildActionMask = 2147483647;
406 | files = (
407 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,
408 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,
409 | );
410 | runOnlyForDeploymentPostprocessing = 0;
411 | };
412 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = {
413 | isa = PBXSourcesBuildPhase;
414 | buildActionMask = 2147483647;
415 | files = (
416 | 2DCD954D1E0B4F2C00145EB5 /* PosReactTests.m in Sources */,
417 | );
418 | runOnlyForDeploymentPostprocessing = 0;
419 | };
420 | /* End PBXSourcesBuildPhase section */
421 |
422 | /* Begin PBXTargetDependency section */
423 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
424 | isa = PBXTargetDependency;
425 | target = 13B07F861A680F5B00A75B9A /* PosReact */;
426 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
427 | };
428 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {
429 | isa = PBXTargetDependency;
430 | target = 2D02E47A1E0B4A5D006451C7 /* PosReact-tvOS */;
431 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;
432 | };
433 | /* End PBXTargetDependency section */
434 |
435 | /* Begin PBXVariantGroup section */
436 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
437 | isa = PBXVariantGroup;
438 | children = (
439 | 13B07FB21A68108700A75B9A /* Base */,
440 | );
441 | name = LaunchScreen.xib;
442 | path = PosReact;
443 | sourceTree = "";
444 | };
445 | /* End PBXVariantGroup section */
446 |
447 | /* Begin XCBuildConfiguration section */
448 | 00E356F61AD99517003FC87E /* Debug */ = {
449 | isa = XCBuildConfiguration;
450 | buildSettings = {
451 | BUNDLE_LOADER = "$(TEST_HOST)";
452 | GCC_PREPROCESSOR_DEFINITIONS = (
453 | "DEBUG=1",
454 | "$(inherited)",
455 | );
456 | INFOPLIST_FILE = PosReactTests/Info.plist;
457 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
458 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
459 | OTHER_LDFLAGS = (
460 | "-ObjC",
461 | "-lc++",
462 | "$(inherited)",
463 | );
464 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
465 | PRODUCT_NAME = "$(TARGET_NAME)";
466 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PosReact.app/PosReact";
467 | };
468 | name = Debug;
469 | };
470 | 00E356F71AD99517003FC87E /* Release */ = {
471 | isa = XCBuildConfiguration;
472 | buildSettings = {
473 | BUNDLE_LOADER = "$(TEST_HOST)";
474 | COPY_PHASE_STRIP = NO;
475 | INFOPLIST_FILE = PosReactTests/Info.plist;
476 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
477 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
478 | OTHER_LDFLAGS = (
479 | "-ObjC",
480 | "-lc++",
481 | "$(inherited)",
482 | );
483 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
484 | PRODUCT_NAME = "$(TARGET_NAME)";
485 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PosReact.app/PosReact";
486 | };
487 | name = Release;
488 | };
489 | 13B07F941A680F5B00A75B9A /* Debug */ = {
490 | isa = XCBuildConfiguration;
491 | buildSettings = {
492 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
493 | CURRENT_PROJECT_VERSION = 1;
494 | DEAD_CODE_STRIPPING = NO;
495 | INFOPLIST_FILE = PosReact/Info.plist;
496 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
497 | OTHER_LDFLAGS = (
498 | "$(inherited)",
499 | "-ObjC",
500 | "-lc++",
501 | );
502 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
503 | PRODUCT_NAME = PosReact;
504 | VERSIONING_SYSTEM = "apple-generic";
505 | };
506 | name = Debug;
507 | };
508 | 13B07F951A680F5B00A75B9A /* Release */ = {
509 | isa = XCBuildConfiguration;
510 | buildSettings = {
511 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
512 | CURRENT_PROJECT_VERSION = 1;
513 | INFOPLIST_FILE = PosReact/Info.plist;
514 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
515 | OTHER_LDFLAGS = (
516 | "$(inherited)",
517 | "-ObjC",
518 | "-lc++",
519 | );
520 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
521 | PRODUCT_NAME = PosReact;
522 | VERSIONING_SYSTEM = "apple-generic";
523 | };
524 | name = Release;
525 | };
526 | 2D02E4971E0B4A5E006451C7 /* Debug */ = {
527 | isa = XCBuildConfiguration;
528 | buildSettings = {
529 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
530 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
531 | CLANG_ANALYZER_NONNULL = YES;
532 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
533 | CLANG_WARN_INFINITE_RECURSION = YES;
534 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
535 | DEBUG_INFORMATION_FORMAT = dwarf;
536 | ENABLE_TESTABILITY = YES;
537 | GCC_NO_COMMON_BLOCKS = YES;
538 | INFOPLIST_FILE = "PosReact-tvOS/Info.plist";
539 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
540 | OTHER_LDFLAGS = (
541 | "$(inherited)",
542 | "-ObjC",
543 | "-lc++",
544 | );
545 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.PosReact-tvOS";
546 | PRODUCT_NAME = "$(TARGET_NAME)";
547 | SDKROOT = appletvos;
548 | TARGETED_DEVICE_FAMILY = 3;
549 | TVOS_DEPLOYMENT_TARGET = 9.2;
550 | };
551 | name = Debug;
552 | };
553 | 2D02E4981E0B4A5E006451C7 /* Release */ = {
554 | isa = XCBuildConfiguration;
555 | buildSettings = {
556 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
557 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
558 | CLANG_ANALYZER_NONNULL = YES;
559 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
560 | CLANG_WARN_INFINITE_RECURSION = YES;
561 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
562 | COPY_PHASE_STRIP = NO;
563 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
564 | GCC_NO_COMMON_BLOCKS = YES;
565 | INFOPLIST_FILE = "PosReact-tvOS/Info.plist";
566 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
567 | OTHER_LDFLAGS = (
568 | "$(inherited)",
569 | "-ObjC",
570 | "-lc++",
571 | );
572 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.PosReact-tvOS";
573 | PRODUCT_NAME = "$(TARGET_NAME)";
574 | SDKROOT = appletvos;
575 | TARGETED_DEVICE_FAMILY = 3;
576 | TVOS_DEPLOYMENT_TARGET = 9.2;
577 | };
578 | name = Release;
579 | };
580 | 2D02E4991E0B4A5E006451C7 /* Debug */ = {
581 | isa = XCBuildConfiguration;
582 | buildSettings = {
583 | BUNDLE_LOADER = "$(TEST_HOST)";
584 | CLANG_ANALYZER_NONNULL = YES;
585 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
586 | CLANG_WARN_INFINITE_RECURSION = YES;
587 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
588 | DEBUG_INFORMATION_FORMAT = dwarf;
589 | ENABLE_TESTABILITY = YES;
590 | GCC_NO_COMMON_BLOCKS = YES;
591 | INFOPLIST_FILE = "PosReact-tvOSTests/Info.plist";
592 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
593 | OTHER_LDFLAGS = (
594 | "$(inherited)",
595 | "-ObjC",
596 | "-lc++",
597 | );
598 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.PosReact-tvOSTests";
599 | PRODUCT_NAME = "$(TARGET_NAME)";
600 | SDKROOT = appletvos;
601 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PosReact-tvOS.app/PosReact-tvOS";
602 | TVOS_DEPLOYMENT_TARGET = 10.1;
603 | };
604 | name = Debug;
605 | };
606 | 2D02E49A1E0B4A5E006451C7 /* Release */ = {
607 | isa = XCBuildConfiguration;
608 | buildSettings = {
609 | BUNDLE_LOADER = "$(TEST_HOST)";
610 | CLANG_ANALYZER_NONNULL = YES;
611 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
612 | CLANG_WARN_INFINITE_RECURSION = YES;
613 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
614 | COPY_PHASE_STRIP = NO;
615 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
616 | GCC_NO_COMMON_BLOCKS = YES;
617 | INFOPLIST_FILE = "PosReact-tvOSTests/Info.plist";
618 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
619 | OTHER_LDFLAGS = (
620 | "$(inherited)",
621 | "-ObjC",
622 | "-lc++",
623 | );
624 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.PosReact-tvOSTests";
625 | PRODUCT_NAME = "$(TARGET_NAME)";
626 | SDKROOT = appletvos;
627 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PosReact-tvOS.app/PosReact-tvOS";
628 | TVOS_DEPLOYMENT_TARGET = 10.1;
629 | };
630 | name = Release;
631 | };
632 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
633 | isa = XCBuildConfiguration;
634 | buildSettings = {
635 | ALWAYS_SEARCH_USER_PATHS = NO;
636 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
637 | CLANG_CXX_LIBRARY = "libc++";
638 | CLANG_ENABLE_MODULES = YES;
639 | CLANG_ENABLE_OBJC_ARC = YES;
640 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
641 | CLANG_WARN_BOOL_CONVERSION = YES;
642 | CLANG_WARN_COMMA = YES;
643 | CLANG_WARN_CONSTANT_CONVERSION = YES;
644 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
645 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
646 | CLANG_WARN_EMPTY_BODY = YES;
647 | CLANG_WARN_ENUM_CONVERSION = YES;
648 | CLANG_WARN_INFINITE_RECURSION = YES;
649 | CLANG_WARN_INT_CONVERSION = YES;
650 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
651 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
652 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
653 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
654 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
655 | CLANG_WARN_STRICT_PROTOTYPES = YES;
656 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
657 | CLANG_WARN_UNREACHABLE_CODE = YES;
658 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
659 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
660 | COPY_PHASE_STRIP = NO;
661 | ENABLE_STRICT_OBJC_MSGSEND = YES;
662 | ENABLE_TESTABILITY = YES;
663 | GCC_C_LANGUAGE_STANDARD = gnu99;
664 | GCC_DYNAMIC_NO_PIC = NO;
665 | GCC_NO_COMMON_BLOCKS = YES;
666 | GCC_OPTIMIZATION_LEVEL = 0;
667 | GCC_PREPROCESSOR_DEFINITIONS = (
668 | "DEBUG=1",
669 | "$(inherited)",
670 | );
671 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
672 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
673 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
674 | GCC_WARN_UNDECLARED_SELECTOR = YES;
675 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
676 | GCC_WARN_UNUSED_FUNCTION = YES;
677 | GCC_WARN_UNUSED_VARIABLE = YES;
678 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
679 | MTL_ENABLE_DEBUG_INFO = YES;
680 | ONLY_ACTIVE_ARCH = YES;
681 | SDKROOT = iphoneos;
682 | };
683 | name = Debug;
684 | };
685 | 83CBBA211A601CBA00E9B192 /* Release */ = {
686 | isa = XCBuildConfiguration;
687 | buildSettings = {
688 | ALWAYS_SEARCH_USER_PATHS = NO;
689 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
690 | CLANG_CXX_LIBRARY = "libc++";
691 | CLANG_ENABLE_MODULES = YES;
692 | CLANG_ENABLE_OBJC_ARC = YES;
693 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
694 | CLANG_WARN_BOOL_CONVERSION = YES;
695 | CLANG_WARN_COMMA = YES;
696 | CLANG_WARN_CONSTANT_CONVERSION = YES;
697 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
698 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
699 | CLANG_WARN_EMPTY_BODY = YES;
700 | CLANG_WARN_ENUM_CONVERSION = YES;
701 | CLANG_WARN_INFINITE_RECURSION = YES;
702 | CLANG_WARN_INT_CONVERSION = YES;
703 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
704 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
705 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
706 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
707 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
708 | CLANG_WARN_STRICT_PROTOTYPES = YES;
709 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
710 | CLANG_WARN_UNREACHABLE_CODE = YES;
711 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
712 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
713 | COPY_PHASE_STRIP = YES;
714 | ENABLE_NS_ASSERTIONS = NO;
715 | ENABLE_STRICT_OBJC_MSGSEND = YES;
716 | GCC_C_LANGUAGE_STANDARD = gnu99;
717 | GCC_NO_COMMON_BLOCKS = YES;
718 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
719 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
720 | GCC_WARN_UNDECLARED_SELECTOR = YES;
721 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
722 | GCC_WARN_UNUSED_FUNCTION = YES;
723 | GCC_WARN_UNUSED_VARIABLE = YES;
724 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
725 | MTL_ENABLE_DEBUG_INFO = NO;
726 | SDKROOT = iphoneos;
727 | VALIDATE_PRODUCT = YES;
728 | };
729 | name = Release;
730 | };
731 | /* End XCBuildConfiguration section */
732 |
733 | /* Begin XCConfigurationList section */
734 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "PosReactTests" */ = {
735 | isa = XCConfigurationList;
736 | buildConfigurations = (
737 | 00E356F61AD99517003FC87E /* Debug */,
738 | 00E356F71AD99517003FC87E /* Release */,
739 | );
740 | defaultConfigurationIsVisible = 0;
741 | defaultConfigurationName = Release;
742 | };
743 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "PosReact" */ = {
744 | isa = XCConfigurationList;
745 | buildConfigurations = (
746 | 13B07F941A680F5B00A75B9A /* Debug */,
747 | 13B07F951A680F5B00A75B9A /* Release */,
748 | );
749 | defaultConfigurationIsVisible = 0;
750 | defaultConfigurationName = Release;
751 | };
752 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "PosReact-tvOS" */ = {
753 | isa = XCConfigurationList;
754 | buildConfigurations = (
755 | 2D02E4971E0B4A5E006451C7 /* Debug */,
756 | 2D02E4981E0B4A5E006451C7 /* Release */,
757 | );
758 | defaultConfigurationIsVisible = 0;
759 | defaultConfigurationName = Release;
760 | };
761 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "PosReact-tvOSTests" */ = {
762 | isa = XCConfigurationList;
763 | buildConfigurations = (
764 | 2D02E4991E0B4A5E006451C7 /* Debug */,
765 | 2D02E49A1E0B4A5E006451C7 /* Release */,
766 | );
767 | defaultConfigurationIsVisible = 0;
768 | defaultConfigurationName = Release;
769 | };
770 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "PosReact" */ = {
771 | isa = XCConfigurationList;
772 | buildConfigurations = (
773 | 83CBBA201A601CBA00E9B192 /* Debug */,
774 | 83CBBA211A601CBA00E9B192 /* Release */,
775 | );
776 | defaultConfigurationIsVisible = 0;
777 | defaultConfigurationName = Release;
778 | };
779 | /* End XCConfigurationList section */
780 | };
781 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
782 | }
783 |
--------------------------------------------------------------------------------