From 7ad51ce22caa8bd05382a529fce6ed4697d51e48 Mon Sep 17 00:00:00 2001 From: justin k xavier Date: Wed, 9 Oct 2019 16:56:58 +0530 Subject: [PATCH 1/6] added basic navigation screens --- App.js | 114 ------ App/App.js | 81 +++++ App/containers/about/index.js | 16 + App/containers/details/index.js | 23 ++ App/containers/login/index.js | 26 ++ App/containers/profile/index.js | 17 + App/containers/sideMenu/index.js | 21 ++ App/navigation.js | 146 ++++++++ App/theme/global.js | 11 + App/theme/themeProvider.js | 4 + App/theme/themes.json | 22 ++ App/utils/navigationService.js | 23 ++ App/utils/storageService.js | 20 ++ android/app/build.gradle | 2 + .../reactnativeboilerplate/MainActivity.java | 13 +- index.js | 2 +- package-lock.json | 340 ++++++++++++++++-- package.json | 16 +- 18 files changed, 755 insertions(+), 142 deletions(-) delete mode 100644 App.js create mode 100644 App/App.js create mode 100644 App/containers/about/index.js create mode 100644 App/containers/details/index.js create mode 100644 App/containers/login/index.js create mode 100644 App/containers/profile/index.js create mode 100644 App/containers/sideMenu/index.js create mode 100644 App/navigation.js create mode 100644 App/theme/global.js create mode 100644 App/theme/themeProvider.js create mode 100644 App/theme/themes.json create mode 100644 App/utils/navigationService.js create mode 100644 App/utils/storageService.js diff --git a/App.js b/App.js deleted file mode 100644 index 0fc721a..0000000 --- a/App.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * Sample React Native App - * https://github.com/facebook/react-native - * - * @format - * @flow - */ - -import React from 'react'; -import { - SafeAreaView, - StyleSheet, - ScrollView, - View, - Text, - StatusBar, -} from 'react-native'; - -import { - Header, - LearnMoreLinks, - Colors, - DebugInstructions, - ReloadInstructions, -} from 'react-native/Libraries/NewAppScreen'; - -const App = () => { - return ( - <> - - - -
- {global.HermesInternal == null ? null : ( - - Engine: Hermes - - )} - - - Step One - - Edit App.js to change this - screen and then come back to see your edits. - - - - See Your Changes - - - - - - Debug - - - - - - Learn More - - Read the docs to discover what to do next: - - - - - - - - ); -}; - -const styles = StyleSheet.create({ - scrollView: { - backgroundColor: Colors.lighter, - }, - engine: { - position: 'absolute', - right: 0, - }, - body: { - backgroundColor: Colors.white, - }, - sectionContainer: { - marginTop: 32, - paddingHorizontal: 24, - }, - sectionTitle: { - fontSize: 24, - fontWeight: '600', - color: Colors.black, - }, - sectionDescription: { - marginTop: 8, - fontSize: 18, - fontWeight: '400', - color: Colors.dark, - }, - highlight: { - fontWeight: '700', - }, - footer: { - color: Colors.dark, - fontSize: 12, - fontWeight: '600', - padding: 4, - paddingRight: 12, - textAlign: 'right', - }, -}); - -export default App; diff --git a/App/App.js b/App/App.js new file mode 100644 index 0000000..b96fbcc --- /dev/null +++ b/App/App.js @@ -0,0 +1,81 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * + * @format + * @flow + */ + +import React from 'react'; +import { + SafeAreaView, + StyleSheet, + ScrollView, + View, + Text, + StatusBar, +} from 'react-native'; + +import { + Header, + LearnMoreLinks, + Colors, + DebugInstructions, + ReloadInstructions, +} from 'react-native/Libraries/NewAppScreen'; +import { Navigation } from './navigation'; +import NavigationService from './utils/navigationService'; + +const App = () => { + return ( + + + { + NavigationService.setTopLevelNavigator(navigatorRef); + }} + /> + + ); +}; + +const styles = StyleSheet.create({ + scrollView: { + backgroundColor: Colors.lighter, + }, + engine: { + position: 'absolute', + right: 0, + }, + body: { + backgroundColor: Colors.white, + }, + sectionContainer: { + marginTop: 32, + paddingHorizontal: 24, + }, + sectionTitle: { + fontSize: 24, + fontWeight: '600', + color: Colors.black, + }, + sectionDescription: { + marginTop: 8, + fontSize: 18, + fontWeight: '400', + color: Colors.dark, + }, + highlight: { + fontWeight: '700', + }, + footer: { + color: Colors.dark, + fontSize: 12, + fontWeight: '600', + padding: 4, + paddingRight: 12, + textAlign: 'right', + }, +}); + +export default App; diff --git a/App/containers/about/index.js b/App/containers/about/index.js new file mode 100644 index 0000000..e07b309 --- /dev/null +++ b/App/containers/about/index.js @@ -0,0 +1,16 @@ +import React, {PureComponent} from 'react'; +import {View, Text, Button} from 'react-native'; +import {GlobalStyle} from '../../theme/global'; + +export default class AboutScreen extends PureComponent { + render() { + return ( + + AboutScreen + + + ); + } +} diff --git a/App/containers/details/index.js b/App/containers/details/index.js new file mode 100644 index 0000000..9520990 --- /dev/null +++ b/App/containers/details/index.js @@ -0,0 +1,23 @@ +import React, {PureComponent} from 'react'; +import {View, Text, Button} from 'react-native'; + +export default class DetailsScreens extends PureComponent { + constructor(props) { + super(props); + } + render() { + return ( + + Details + + + ); + } +} diff --git a/App/containers/login/index.js b/App/containers/login/index.js new file mode 100644 index 0000000..87fddd0 --- /dev/null +++ b/App/containers/login/index.js @@ -0,0 +1,26 @@ +import React, {PureComponent} from 'react'; +import {View, Text, Button} from 'react-native'; +import NavigationService from '../../utils/navigationService'; +import storageService from '../../utils/storageService'; + +export default class LoginScreen extends PureComponent { + render() { + return ( + + Login + + + ); + } +} diff --git a/App/containers/profile/index.js b/App/containers/profile/index.js new file mode 100644 index 0000000..80cf1e4 --- /dev/null +++ b/App/containers/profile/index.js @@ -0,0 +1,17 @@ +import React, {PureComponent} from 'react'; +import {View, Text} from 'react-native'; + +export default class ProfileScreen extends PureComponent { + render() { + return ( + + Profile + + ); + } +} diff --git a/App/containers/sideMenu/index.js b/App/containers/sideMenu/index.js new file mode 100644 index 0000000..c922240 --- /dev/null +++ b/App/containers/sideMenu/index.js @@ -0,0 +1,21 @@ +import React from 'react'; +import SafeAreaView from 'react-native-safe-area-view'; +import {DrawerNavigatorItems} from 'react-navigation-drawer'; +import { StyleSheet, ScrollView } from 'react-native'; + + +export const SidemenuScreen = props => ( + + + + + +); + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, +}); diff --git a/App/navigation.js b/App/navigation.js new file mode 100644 index 0000000..c13fdbc --- /dev/null +++ b/App/navigation.js @@ -0,0 +1,146 @@ +import React, {PureComponent} from 'react'; +import createAnimatedSwitchNavigator from 'react-navigation-animated-switch'; +import {Transition} from 'react-native-reanimated'; +import {createAppContainer} from 'react-navigation'; +import {createStackNavigator} from 'react-navigation-stack'; +import {createDrawerNavigator} from 'react-navigation-drawer'; +import {createBottomTabNavigator} from 'react-navigation-tabs'; +import LoginScreen from './containers/login/index'; +import AboutScreen from './containers/about/index'; +import ProfileScreen from './containers/profile/index'; +import Ionicons from 'react-native-vector-icons/Ionicons'; +import {SidemenuScreen} from './containers/sideMenu/index.js'; +import {View, Text} from 'react-native'; +import NavigationAction from './utils/navigationService'; +import storageService from './utils/storageService'; +import { FluidNavigator } from 'react-navigation-fluid-transitions'; +import DetailsScreens from './containers/details/index' + + +const AboutStackNavigator = FluidNavigator( + { + about: AboutScreen, + details: DetailsScreens, + }, + { + headerMode: 'none', + navigationOptions: ({navigation}) => { + return { + tabBarVisible: navigation.state.routes.length > 1 ? false: true, + }; + } + }, +); + +const ProfileStackNavigator = FluidNavigator( + { + profile: ProfileScreen, + }, + { + headerMode: 'none', + navigationOptions: ({navigation}) => { + return { + tabBarVisible: navigation.state.routes.length > 1 ? false : true, + }; + }, + }, +); + +const TabBarNavigator = createBottomTabNavigator( + { + about: AboutStackNavigator, + profile: ProfileStackNavigator, + }, + { + initialRouteName: '', + defaultNavigationOptions: ({navigation}) => ({ + tabBarIcon: ({focused, tintColor}) => { + const {routeName} = navigation.state; + let iconName; + if (routeName === 'about') { + iconName = `ios-notifications`; + } else if (routeName === 'Home') { + iconName = `ios-home`; + } else if (routeName === 'profile') { + iconName = `ios-people`; + } + + // You can return any component that you like here! We usually use an + // icon component from react-native-vector-icons + return ( + + ); + }, + header: null, + tabBarLabel: navigation.state.routeName, + title: navigation.state.routeName, + }), + tabBarOptions: { + activeTintColor: 'red' + } + }, +); + +class LoadingScreen extends PureComponent { + constructor(props) { + super(props); + this._bootstrap(); + } + async _bootstrap() { + const apiKey = await storageService.getApiKey(); + NavigationAction.navigate(apiKey ? 'App' : 'Authentication'); + } + render() { + return ( + + loading... + + ); + } +} + +export const appDrawerNavigator = createDrawerNavigator( + { + Home: {screen: TabBarNavigator}, + }, + { + drawerPosition: 'left', + headerMode: 'none', + drawerType: 'slide', + contentComponent: SidemenuScreen, + }, +); + +const SwitchNavigation = createAnimatedSwitchNavigator( + { + loading: LoadingScreen, + App: appDrawerNavigator, + Authentication: LoginScreen, + }, + { + initialRouteName: 'loading', + // The previous screen will slide to the bottom while the next screen will fade in + transition: ( + + + + + ), + }, +); + +export const Navigation = createAppContainer(SwitchNavigation); diff --git a/App/theme/global.js b/App/theme/global.js new file mode 100644 index 0000000..a157aaf --- /dev/null +++ b/App/theme/global.js @@ -0,0 +1,11 @@ +import { StyleSheet } from 'react-native'; +import React from 'react'; + + +export const GlobalStyle = StyleSheet.create({ + mainContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + } +}) \ No newline at end of file diff --git a/App/theme/themeProvider.js b/App/theme/themeProvider.js new file mode 100644 index 0000000..d80d1eb --- /dev/null +++ b/App/theme/themeProvider.js @@ -0,0 +1,4 @@ +import THEMES from './themes.json'; + +export const themes = THEMES; +export const theme = THEMES[1]; diff --git a/App/theme/themes.json b/App/theme/themes.json new file mode 100644 index 0000000..bb8b7b1 --- /dev/null +++ b/App/theme/themes.json @@ -0,0 +1,22 @@ +[ + { + "key": "MAASTRICHT BLUE", + "backgroundColor": "#011627", + "color": "#ffffff" + }, + { + "key": "MAXIMUM BLUE GREEN", + "backgroundColor": "#2EC4B6", + "color": "#ffffff" + }, + { + "key": "ROSE MADDER", + "backgroundColor": "#E71D36", + "color": "#ffffff" + }, + { + "key": "BRIGHT YELLOW (CRAYOLA)", + "backgroundColor": "#FF9F1C", + "color": "#1F2D3D" + } +] \ No newline at end of file diff --git a/App/utils/navigationService.js b/App/utils/navigationService.js new file mode 100644 index 0000000..3d726fb --- /dev/null +++ b/App/utils/navigationService.js @@ -0,0 +1,23 @@ +import {NavigationActions} from 'react-navigation'; + +let _navigator; + +function setTopLevelNavigator(navigatorRef) { + _navigator = navigatorRef; +} + +function navigate(routeName, params) { + _navigator.dispatch( + NavigationActions.navigate({ + routeName, + params, + }), + ); +} + +// add other navigation functions that you need and export them + +export default { + navigate, + setTopLevelNavigator, +}; diff --git a/App/utils/storageService.js b/App/utils/storageService.js new file mode 100644 index 0000000..3aa40cb --- /dev/null +++ b/App/utils/storageService.js @@ -0,0 +1,20 @@ +import React from 'react'; +import AsyncStorage from '@react-native-community/async-storage'; + +const setApiKey = key => { + AsyncStorage.setItem('api_key', key); +}; + +const getApiKey = async () => { + try { + const apiKey = await AsyncStorage.getItem('api_key'); + return apiKey; + } catch (error) { + return error; + } +}; + +export default { + setApiKey, + getApiKey, +}; diff --git a/android/app/build.gradle b/android/app/build.gradle index bd6c3a3..7e1be46 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -189,6 +189,8 @@ dependencies { } else { implementation jscFlavor } + implementation 'androidx.appcompat:appcompat:1.1.0-rc01' +implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02' } // Run this once to be able to run the application with BUCK diff --git a/android/app/src/main/java/com/reactnativeboilerplate/MainActivity.java b/android/app/src/main/java/com/reactnativeboilerplate/MainActivity.java index 78fb9a9..27079e0 100644 --- a/android/app/src/main/java/com/reactnativeboilerplate/MainActivity.java +++ b/android/app/src/main/java/com/reactnativeboilerplate/MainActivity.java @@ -1,7 +1,9 @@ package com.reactnativeboilerplate; import com.facebook.react.ReactActivity; - +import com.facebook.react.ReactActivityDelegate; +import com.facebook.react.ReactRootView; +import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView; public class MainActivity extends ReactActivity { /** @@ -12,4 +14,13 @@ public class MainActivity extends ReactActivity { protected String getMainComponentName() { return "ReactNativeBoilerplate"; } + @Override + protected ReactActivityDelegate createReactActivityDelegate() { + return new ReactActivityDelegate(this, getMainComponentName()) { + @Override + protected ReactRootView createRootView() { + return new RNGestureHandlerEnabledRootView(MainActivity.this); + } + }; + } } diff --git a/index.js b/index.js index a850d03..c679865 100644 --- a/index.js +++ b/index.js @@ -3,7 +3,7 @@ */ import {AppRegistry} from 'react-native'; -import App from './App'; +import App from './App/App'; import {name as appName} from './app.json'; AppRegistry.registerComponent(appName, () => App); diff --git a/package-lock.json b/package-lock.json index 47d4f86..9c845f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1039,6 +1039,11 @@ "@types/yargs": "^13.0.0" } }, + "@react-native-community/async-storage": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.6.2.tgz", + "integrity": "sha512-EJGsbrHubK1mGxPjWB74AaHAd5m9I+Gg2RRPZzMK6org7QOU9WOBnIMFqoeVto3hKOaEPlk8NV74H6G34/2pZQ==" + }, "@react-native-community/cli-platform-android": { "version": "3.0.0-alpha.2", "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-3.0.0-alpha.2.tgz", @@ -1091,6 +1096,27 @@ "prettier": "1.16.4" } }, + "@react-navigation/core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-3.5.1.tgz", + "integrity": "sha512-q7NyhWVYOhVIWqL2GZKa6G78YarXaVTTtOlSDkvy4ZIggo40wZzamlnrJRvsaQX46gsgw45FAWb5SriHh8o7eA==", + "requires": { + "hoist-non-react-statics": "^3.3.0", + "path-to-regexp": "^1.7.0", + "query-string": "^6.4.2", + "react-is": "^16.8.6" + } + }, + "@react-navigation/native": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-3.6.2.tgz", + "integrity": "sha512-Cybeou6N82ZeRmgnGlu+wzlV3z5BZQR2dmYaNFV1TNLUGHqtvv8E7oNw9uYcz9Ox5LFbiX+FdNTn2d6ZPlK0kg==", + "requires": { + "hoist-non-react-statics": "^3.0.1", + "react-native-safe-area-view": "^0.14.1", + "react-native-screens": "^1.0.0 || ^1.0.0-alpha" + } + }, "@types/babel__core": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", @@ -2143,6 +2169,11 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.16.tgz", "integrity": "sha512-XPmqzWz/EJiaRHjBqSJ2s6hE/BUoCIHKgdS2QPtTQtKcS9E4/Qn0WomoH1lXanWCzri+g7zPcuNV4aTZ8PMORQ==" }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2300,8 +2331,7 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "encodeurl": { "version": "1.0.2", @@ -3171,13 +3201,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3190,18 +3218,15 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", @@ -3304,8 +3329,7 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "optional": true + "bundled": true }, "ini": { "version": "1.3.5", @@ -3315,7 +3339,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3328,20 +3351,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "optional": true + "bundled": true }, "minipass": { "version": "2.3.5", "bundled": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3358,7 +3378,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -3431,8 +3450,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", @@ -3442,7 +3460,6 @@ "once": { "version": "1.4.0", "bundled": true, - "optional": true, "requires": { "wrappy": "1" } @@ -3548,7 +3565,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3697,6 +3713,11 @@ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, "handlebars": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.3.tgz", @@ -3804,6 +3825,14 @@ "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.2.1.tgz", "integrity": "sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ==" }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, "hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", @@ -5135,11 +5164,20 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw=" + }, + "lodash.clamp": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash.clamp/-/lodash.clamp-4.0.3.tgz", + "integrity": "sha1-XCS+3u7vB1NWDcK0y0Zx+Qpt36o=" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, "lodash.throttle": { "version": "4.1.1", @@ -6465,6 +6503,21 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", @@ -6674,6 +6727,16 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "query-string": { + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.8.3.tgz", + "integrity": "sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==", + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -6726,6 +6789,11 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.2.tgz", "integrity": "sha512-INBT1QEgtcCCgvccr5/86CfD71fw9EPmDxgiJX4I2Ddr6ZsV6iFXsuby+qWJPtmNuMY0zByTsG4468P7nHuNWA==" }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, "react-native": { "version": "0.61.2", "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.61.2.tgz", @@ -6804,6 +6872,184 @@ } } }, + "react-native-gesture-handler": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.4.1.tgz", + "integrity": "sha512-Ffcs+SbEbkGaal0CClYL+v7A9y4OA5G5lW01qrzjxaqASp5C8BfnWSKuqYKE00s6bLwE5L4xnlHkG0yIxAtbrQ==", + "requires": { + "hammerjs": "^2.0.8", + "hoist-non-react-statics": "^2.3.1", + "invariant": "^2.2.4", + "prop-types": "^15.7.2" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + } + } + }, + "react-native-reanimated": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.3.0.tgz", + "integrity": "sha512-KFno6D0q09kx71IDuPa4qeC1t1msALsCMuli3/EN3YDf8XoM2CG53yzhVHMFtmcW0IUCySugHgxQiuT5BzwOPA==" + }, + "react-native-safe-area-view": { + "version": "0.14.8", + "resolved": "https://registry.npmjs.org/react-native-safe-area-view/-/react-native-safe-area-view-0.14.8.tgz", + "integrity": "sha512-MtRSIcZNstxv87Jet+UsPhEd1tpGe8cVskDXlP657x6rHpSrbrc+y13ZNXrwAgGNNhqQNX7UJT68ZIq//ZRmvw==", + "requires": { + "hoist-non-react-statics": "^2.3.1" + }, + "dependencies": { + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + } + } + }, + "react-native-screens": { + "version": "1.0.0-alpha.23", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-1.0.0-alpha.23.tgz", + "integrity": "sha512-tOxHGQUN83MTmQB4ghoQkibqOdGiX4JQEmeyEv96MKWO/x8T2PJv84ECUos9hD3blPRQwVwSpAid1PPPhrVEaw==", + "requires": { + "debounce": "^1.2.0" + } + }, + "react-native-tab-view": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/react-native-tab-view/-/react-native-tab-view-2.10.0.tgz", + "integrity": "sha512-qgexVz5eO4yaFjdkmn/sURXgVvaBo6pZD/q1eoca96SbPVbaH3WzVhF3bRUfeTHwZkXwznFTpS3JURqIFU8vQA==" + }, + "react-native-vector-icons": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-6.6.0.tgz", + "integrity": "sha512-MImKVx8JEvVVBnaShMr7/yTX4Y062JZMupht1T+IEgbqBj4aQeQ1z2SH4VHWKNtWtppk4kz9gYyUiMWqx6tNSw==", + "requires": { + "lodash": "^4.0.0", + "prop-types": "^15.6.2", + "yargs": "^13.2.2" + }, + "dependencies": { + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "react-navigation": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/react-navigation/-/react-navigation-4.0.10.tgz", + "integrity": "sha512-7PqvmsdQ7HIyxPUMYbd9Uq//VoMdniEOLAOSvIhb/ExtbAt/1INSjUF+RiMWOMCWLTCNvNPRvTz7xy7qwWureg==", + "requires": { + "@react-navigation/core": "^3.5.1", + "@react-navigation/native": "^3.6.2" + } + }, + "react-navigation-animated-switch": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/react-navigation-animated-switch/-/react-navigation-animated-switch-0.3.2.tgz", + "integrity": "sha512-WVkTbxvNkH/D6Rx89aEQXQ65Tkm2hWLiiP9RekNk1Uyhe/s53Xe0tvblAk1nq7tk9+n4ilfbADU5wPUkNPiK1Q==" + }, + "react-navigation-drawer": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-navigation-drawer/-/react-navigation-drawer-2.2.2.tgz", + "integrity": "sha512-KcFH7RRzT1XuREkTbNMCqfy7nK7yenzpGKvqp1dTvAE+DIyHHpf+Po959lsmITlt/njQBn+QxvdX1FZ9we3lNA==" + }, + "react-navigation-fluid-transitions": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/react-navigation-fluid-transitions/-/react-navigation-fluid-transitions-0.3.2.tgz", + "integrity": "sha512-2n7M5QU0vdzclPAOEKPefJ4/0nn8UpKyZYIDl/Y6wXWttLImZ5vMTYU2tR8fgxdCennj+rVkVZI2SND2ftIv/g==", + "requires": { + "lodash.chunk": "*", + "lodash.clamp": "*", + "lodash.sortby": "*", + "prop-types": "*" + } + }, + "react-navigation-stack": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/react-navigation-stack/-/react-navigation-stack-1.9.4.tgz", + "integrity": "sha512-0Iv8t99RPsznXVadlHGRwOJqLzJmj96PfWiwmZEhVnbNwMVXMLz3oOno0LL9tbiukQxEaFAKUIblElpd9izS6w==", + "requires": { + "prop-types": "^15.7.2" + } + }, + "react-navigation-tabs": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-navigation-tabs/-/react-navigation-tabs-2.5.5.tgz", + "integrity": "sha512-oIL5V4agCxcqbWNZzF1h/cm1bxKXNUeGrWaRQEEnuN3TXTEj1SVRz33CnKYg30pVvgF5L2p28sOk15Z4Ao01NQ==", + "requires": { + "hoist-non-react-statics": "^3.3.0", + "react-lifecycles-compat": "^3.0.4", + "react-native-safe-area-view": "^0.14.6", + "react-native-tab-view": "^2.9.0" + } + }, "react-proxy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", @@ -6814,6 +7060,19 @@ "react-deep-force-update": "^1.0.0" } }, + "react-redux": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.1.1.tgz", + "integrity": "sha512-QsW0vcmVVdNQzEkrgzh2W3Ksvr8cqpAv5FhEk7tNEft+5pp7rXxAudTz3VOPawRkLIepItpkEIyLcN/VVXzjTg==", + "requires": { + "@babel/runtime": "^7.5.5", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^16.9.0" + } + }, "react-refresh": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", @@ -6923,6 +7182,27 @@ "util.promisify": "^1.0.0" } }, + "redux": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.4.tgz", + "integrity": "sha512-vKv4WdiJxOWKxK0yRoaK3Y4pxxB0ilzVx6dszU2W8wLxlb2yikRph4iV/ymtdJ6ZxpBLFbyrxklnT5yBbQSl3Q==", + "requires": { + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" + }, + "dependencies": { + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + } + } + }, + "redux-devtools-extension": { + "version": "2.13.8", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.8.tgz", + "integrity": "sha512-8qlpooP2QqPtZHQZRhx3x3OP5skEV1py/zUdMY28WNAocbafxdG2tRD1MWE7sp8obGMNYuLWanhhQ7EQvT1FBg==" + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -7541,6 +7821,11 @@ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -7619,6 +7904,11 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + }, "string-length": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", diff --git a/package.json b/package.json index 7d1df1f..8414847 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,22 @@ "lint": "eslint ." }, "dependencies": { + "@react-native-community/async-storage": "^1.6.2", "react": "16.9.0", - "react-native": "0.61.2" + "react-native": "0.61.2", + "react-native-gesture-handler": "^1.4.1", + "react-native-reanimated": "^1.3.0", + "react-native-screens": "^1.0.0-alpha.23", + "react-native-vector-icons": "^6.6.0", + "react-navigation": "^4.0.10", + "react-navigation-animated-switch": "^0.3.2", + "react-navigation-drawer": "^2.2.2", + "react-navigation-fluid-transitions": "^0.3.2", + "react-navigation-stack": "^1.9.4", + "react-navigation-tabs": "^2.5.5", + "react-redux": "^7.1.1", + "redux": "^4.0.4", + "redux-devtools-extension": "^2.13.8" }, "devDependencies": { "@babel/core": "7.6.3", From e319903a5bd268c0a2cc88bf9d32e14b7b99e98e Mon Sep 17 00:00:00 2001 From: Justin K Xavier Date: Wed, 9 Oct 2019 23:05:39 +0530 Subject: [PATCH 2/6] fixed ios iocons and pod issues --- App/navigation.js | 5 +- index.js | 2 +- ios/Podfile | 1 + ios/Podfile.lock | 368 ++++++++++++++++++ .../project.pbxproj | 199 +++++++++- .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + ios/ReactNativeBoilerplate/Info.plist | 18 + package-lock.json | 41 +- 11 files changed, 652 insertions(+), 15 deletions(-) create mode 100644 ios/Podfile.lock create mode 100644 ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/ReactNativeBoilerplate.xcworkspace/contents.xcworkspacedata create mode 100644 ios/ReactNativeBoilerplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/App/navigation.js b/App/navigation.js index c13fdbc..03de99e 100644 --- a/App/navigation.js +++ b/App/navigation.js @@ -8,7 +8,7 @@ import {createBottomTabNavigator} from 'react-navigation-tabs'; import LoginScreen from './containers/login/index'; import AboutScreen from './containers/about/index'; import ProfileScreen from './containers/profile/index'; -import Ionicons from 'react-native-vector-icons/Ionicons'; +import Icon from 'react-native-vector-icons/Ionicons'; import {SidemenuScreen} from './containers/sideMenu/index.js'; import {View, Text} from 'react-native'; import NavigationAction from './utils/navigationService'; @@ -68,7 +68,7 @@ const TabBarNavigator = createBottomTabNavigator( // You can return any component that you like here! We usually use an // icon component from react-native-vector-icons return ( - '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' + pod 'RNVectorIcons', :path => '../node_modules/react-native-vector-icons' target 'ReactNativeBoilerplateTests' do inherit! :search_paths diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..4cd1365 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,368 @@ +PODS: + - boost-for-react-native (1.63.0) + - DoubleConversion (1.1.6) + - FBLazyVector (0.61.2) + - FBReactNativeSpec (0.61.2): + - Folly (= 2018.10.22.00) + - RCTRequired (= 0.61.2) + - RCTTypeSafety (= 0.61.2) + - React-Core (= 0.61.2) + - React-jsi (= 0.61.2) + - ReactCommon/turbomodule/core (= 0.61.2) + - Folly (2018.10.22.00): + - boost-for-react-native + - DoubleConversion + - Folly/Default (= 2018.10.22.00) + - glog + - Folly/Default (2018.10.22.00): + - boost-for-react-native + - DoubleConversion + - glog + - glog (0.3.5) + - RCTRequired (0.61.2) + - RCTTypeSafety (0.61.2): + - FBLazyVector (= 0.61.2) + - Folly (= 2018.10.22.00) + - RCTRequired (= 0.61.2) + - React-Core (= 0.61.2) + - React (0.61.2): + - React-Core (= 0.61.2) + - React-Core/DevSupport (= 0.61.2) + - React-Core/RCTWebSocket (= 0.61.2) + - React-RCTActionSheet (= 0.61.2) + - React-RCTAnimation (= 0.61.2) + - React-RCTBlob (= 0.61.2) + - React-RCTImage (= 0.61.2) + - React-RCTLinking (= 0.61.2) + - React-RCTNetwork (= 0.61.2) + - React-RCTSettings (= 0.61.2) + - React-RCTText (= 0.61.2) + - React-RCTVibration (= 0.61.2) + - React-Core (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.2) + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/CoreModulesHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/Default (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/DevSupport (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.2) + - React-Core/RCTWebSocket (= 0.61.2) + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - React-jsinspector (= 0.61.2) + - Yoga + - React-Core/RCTActionSheetHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTAnimationHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTBlobHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTImageHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTLinkingHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTNetworkHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTSettingsHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTTextHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTVibrationHeaders (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-Core/RCTWebSocket (0.61.2): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.2) + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsiexecutor (= 0.61.2) + - Yoga + - React-CoreModules (0.61.2): + - FBReactNativeSpec (= 0.61.2) + - Folly (= 2018.10.22.00) + - RCTTypeSafety (= 0.61.2) + - React-Core/CoreModulesHeaders (= 0.61.2) + - React-RCTImage (= 0.61.2) + - ReactCommon/turbomodule/core (= 0.61.2) + - React-cxxreact (0.61.2): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-jsinspector (= 0.61.2) + - React-jsi (0.61.2): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-jsi/Default (= 0.61.2) + - React-jsi/Default (0.61.2): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-jsiexecutor (0.61.2): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - React-jsinspector (0.61.2) + - React-RCTActionSheet (0.61.2): + - React-Core/RCTActionSheetHeaders (= 0.61.2) + - React-RCTAnimation (0.61.2): + - React-Core/RCTAnimationHeaders (= 0.61.2) + - React-RCTBlob (0.61.2): + - React-Core/RCTBlobHeaders (= 0.61.2) + - React-Core/RCTWebSocket (= 0.61.2) + - React-jsi (= 0.61.2) + - React-RCTNetwork (= 0.61.2) + - React-RCTImage (0.61.2): + - React-Core/RCTImageHeaders (= 0.61.2) + - React-RCTNetwork (= 0.61.2) + - React-RCTLinking (0.61.2): + - React-Core/RCTLinkingHeaders (= 0.61.2) + - React-RCTNetwork (0.61.2): + - React-Core/RCTNetworkHeaders (= 0.61.2) + - React-RCTSettings (0.61.2): + - React-Core/RCTSettingsHeaders (= 0.61.2) + - React-RCTText (0.61.2): + - React-Core/RCTTextHeaders (= 0.61.2) + - React-RCTVibration (0.61.2): + - React-Core/RCTVibrationHeaders (= 0.61.2) + - ReactCommon/jscallinvoker (0.61.2): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.2) + - ReactCommon/turbomodule/core (0.61.2): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-Core (= 0.61.2) + - React-cxxreact (= 0.61.2) + - React-jsi (= 0.61.2) + - ReactCommon/jscallinvoker (= 0.61.2) + - RNCAsyncStorage (1.6.2): + - React + - RNGestureHandler (1.4.1): + - React + - RNReanimated (1.3.0): + - React + - RNScreens (1.0.0-alpha.23): + - React + - RNVectorIcons (6.6.0): + - React + - Yoga (1.14.0) + +DEPENDENCIES: + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) + - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - ReactCommon/jscallinvoker (from `../node_modules/react-native/ReactCommon`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" + - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) + - RNReanimated (from `../node_modules/react-native-reanimated`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - boost-for-react-native + +EXTERNAL SOURCES: + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" + Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RNCAsyncStorage: + :path: "../node_modules/@react-native-community/async-storage" + RNGestureHandler: + :path: "../node_modules/react-native-gesture-handler" + RNReanimated: + :path: "../node_modules/react-native-reanimated" + RNScreens: + :path: "../node_modules/react-native-screens" + RNVectorIcons: + :path: "../node_modules/react-native-vector-icons" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c + DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2 + FBLazyVector: 68b6a76960fbd8ecd9fb7ce0aadd3329c3340a99 + FBReactNativeSpec: 5a764c60abdc3336a213e5310c40b74741f32839 + Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51 + glog: 1f3da668190260b06b429bb211bfbee5cd790c28 + RCTRequired: c639d59ed389cfb1f1203f65c2ea946d8ec586e2 + RCTTypeSafety: dc23fb655d6c77667c78e327bf661bc11e3b8aec + React: 7e586e5d7bec12b91c1a096826b0fc9ab1da7865 + React-Core: 8ddb9770b4a30a6ab4a754e6ed5ec76454e3d699 + React-CoreModules: b3d9eece8ad7df36c917a41f05c1168c52fe0b34 + React-cxxreact: 1f972757c0bd08d962ef78068e06613c27489a3f + React-jsi: 32285a21b1b24c36060493ed3057a34677d58d09 + React-jsiexecutor: 8909917ff7d8f21a57e443a866fd8d4560e50c65 + React-jsinspector: 111d7d342b07a904c400592e02a2b958f1098b60 + React-RCTActionSheet: 89b037c0fb7d2671607cb645760164e7e0c013f6 + React-RCTAnimation: e3cefa93c38c004c318f7ec04b883eb14b8b8235 + React-RCTBlob: d26ac0e313fbf14e7203473fd593ccaaeee8329e + React-RCTImage: 4bdd9588783fa9e48ef669ccd4f747224e208edf + React-RCTLinking: 65f0088ff463babd3d5d567964a65b74141eff3b + React-RCTNetwork: 0c1a73576c1cfeafe68396556de1b17d93c0c595 + React-RCTSettings: 4194f1f0edbddf3fd44d1714dc6578bb20379b60 + React-RCTText: e3ef6191cdb627855ff7fe8fa0c1e14094967fb8 + React-RCTVibration: fb54c732fd20405a76598e431aa2f8c2bf527de9 + ReactCommon: 5848032ed2f274fcb40f6b9ec24067787c42d479 + RNCAsyncStorage: 5ae4d57458804e99f73d427214442a6b10a53856 + RNGestureHandler: 4cb47a93019c1a201df2644413a0a1569a51c8aa + RNReanimated: 6abbbae2e5e72609d85aabd92a982a94566885f1 + RNScreens: f28b48b8345f2f5f39ed6195518291515032a788 + RNVectorIcons: 0bb4def82230be1333ddaeee9fcba45f0b288ed4 + Yoga: 14927e37bd25376d216b150ab2a561773d57911f + +PODFILE CHECKSUM: 3876b47149416be7da4792c01531f49d83d431df + +COCOAPODS: 1.6.1 diff --git a/ios/ReactNativeBoilerplate.xcodeproj/project.pbxproj b/ios/ReactNativeBoilerplate.xcodeproj/project.pbxproj index 347548f..a4f894c 100644 --- a/ios/ReactNativeBoilerplate.xcodeproj/project.pbxproj +++ b/ios/ReactNativeBoilerplate.xcodeproj/project.pbxproj @@ -12,10 +12,14 @@ 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 259C2141EE8BBBDF621517FD /* libPods-ReactNativeBoilerplateTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A7AF58989ABBDD96F7EE4260 /* libPods-ReactNativeBoilerplateTests.a */; }; 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2DCD954D1E0B4F2C00145EB5 /* ReactNativeBoilerplateTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ReactNativeBoilerplateTests.m */; }; + 5C77C64BE9EECA9F0D4A0699 /* libPods-ReactNativeBoilerplate.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B6E6C00A1679BE32C6B0409E /* libPods-ReactNativeBoilerplate.a */; }; + 95A439F4B9594F3D0814A8CC /* libPods-ReactNativeBoilerplate-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0B52DE84F0B67B7F8ACF77 /* libPods-ReactNativeBoilerplate-tvOSTests.a */; }; + 99A3CDED126ED3095EA0E4CE /* libPods-ReactNativeBoilerplate-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E737A8C693CB502525FC33DC /* libPods-ReactNativeBoilerplate-tvOS.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -47,8 +51,20 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ReactNativeBoilerplate/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ReactNativeBoilerplate/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ReactNativeBoilerplate/main.m; sourceTree = ""; }; + 1485377777FF8F300BC3B6E6 /* Pods-ReactNativeBoilerplate.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplate.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplate/Pods-ReactNativeBoilerplate.release.xcconfig"; sourceTree = ""; }; 2D02E47B1E0B4A5D006451C7 /* ReactNativeBoilerplate-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ReactNativeBoilerplate-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 2D02E4901E0B4A5D006451C7 /* ReactNativeBoilerplate-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "ReactNativeBoilerplate-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B7D245460BBDD884FCC299B /* Pods-ReactNativeBoilerplate-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplate-tvOS.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplate-tvOS/Pods-ReactNativeBoilerplate-tvOS.release.xcconfig"; sourceTree = ""; }; + 732E78FAC70C1082133E0DF7 /* Pods-ReactNativeBoilerplate-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplate-tvOSTests.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplate-tvOSTests/Pods-ReactNativeBoilerplate-tvOSTests.debug.xcconfig"; sourceTree = ""; }; + 802FECAC5FC4D7F143F6523F /* Pods-ReactNativeBoilerplate-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplate-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplate-tvOSTests/Pods-ReactNativeBoilerplate-tvOSTests.release.xcconfig"; sourceTree = ""; }; + 8F0B52DE84F0B67B7F8ACF77 /* libPods-ReactNativeBoilerplate-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeBoilerplate-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9AAAA247D8F5A95BAFF5B2AE /* Pods-ReactNativeBoilerplate.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplate.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplate/Pods-ReactNativeBoilerplate.debug.xcconfig"; sourceTree = ""; }; + A423B1A1FD63BBBB52D9E11C /* Pods-ReactNativeBoilerplateTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplateTests.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplateTests/Pods-ReactNativeBoilerplateTests.debug.xcconfig"; sourceTree = ""; }; + A7AF58989ABBDD96F7EE4260 /* libPods-ReactNativeBoilerplateTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeBoilerplateTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + B6E6C00A1679BE32C6B0409E /* libPods-ReactNativeBoilerplate.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeBoilerplate.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C86E2D935694D288EE31A380 /* Pods-ReactNativeBoilerplateTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplateTests.release.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplateTests/Pods-ReactNativeBoilerplateTests.release.xcconfig"; sourceTree = ""; }; + CBB0F70C382C80E126C23BC2 /* Pods-ReactNativeBoilerplate-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReactNativeBoilerplate-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-ReactNativeBoilerplate-tvOS/Pods-ReactNativeBoilerplate-tvOS.debug.xcconfig"; sourceTree = ""; }; + E737A8C693CB502525FC33DC /* libPods-ReactNativeBoilerplate-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-ReactNativeBoilerplate-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 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; }; /* End PBXFileReference section */ @@ -58,6 +74,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 259C2141EE8BBBDF621517FD /* libPods-ReactNativeBoilerplateTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -65,6 +82,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 5C77C64BE9EECA9F0D4A0699 /* libPods-ReactNativeBoilerplate.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -72,6 +90,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 99A3CDED126ED3095EA0E4CE /* libPods-ReactNativeBoilerplate-tvOS.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -79,6 +98,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 95A439F4B9594F3D0814A8CC /* libPods-ReactNativeBoilerplate-tvOSTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -121,10 +141,30 @@ children = ( ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED2971642150620600B7C4FE /* JavaScriptCore.framework */, + B6E6C00A1679BE32C6B0409E /* libPods-ReactNativeBoilerplate.a */, + E737A8C693CB502525FC33DC /* libPods-ReactNativeBoilerplate-tvOS.a */, + 8F0B52DE84F0B67B7F8ACF77 /* libPods-ReactNativeBoilerplate-tvOSTests.a */, + A7AF58989ABBDD96F7EE4260 /* libPods-ReactNativeBoilerplateTests.a */, ); name = Frameworks; sourceTree = ""; }; + 3577C6DA1F2EB4451C578EA2 /* Pods */ = { + isa = PBXGroup; + children = ( + 9AAAA247D8F5A95BAFF5B2AE /* Pods-ReactNativeBoilerplate.debug.xcconfig */, + 1485377777FF8F300BC3B6E6 /* Pods-ReactNativeBoilerplate.release.xcconfig */, + CBB0F70C382C80E126C23BC2 /* Pods-ReactNativeBoilerplate-tvOS.debug.xcconfig */, + 3B7D245460BBDD884FCC299B /* Pods-ReactNativeBoilerplate-tvOS.release.xcconfig */, + 732E78FAC70C1082133E0DF7 /* Pods-ReactNativeBoilerplate-tvOSTests.debug.xcconfig */, + 802FECAC5FC4D7F143F6523F /* Pods-ReactNativeBoilerplate-tvOSTests.release.xcconfig */, + A423B1A1FD63BBBB52D9E11C /* Pods-ReactNativeBoilerplateTests.debug.xcconfig */, + C86E2D935694D288EE31A380 /* Pods-ReactNativeBoilerplateTests.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( @@ -140,6 +180,7 @@ 00E356EF1AD99517003FC87E /* ReactNativeBoilerplateTests */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, + 3577C6DA1F2EB4451C578EA2 /* Pods */, ); indentWidth = 2; sourceTree = ""; @@ -164,6 +205,7 @@ isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ReactNativeBoilerplateTests" */; buildPhases = ( + 449008F312C725A5784EFDC5 /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, @@ -182,18 +224,20 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ReactNativeBoilerplate" */; buildPhases = ( + 12DCBB8701897BA75245463B /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + EFBE2A53D05C194209F0AE99 /* [CP] Copy Pods Resources */, ); buildRules = ( ); dependencies = ( ); name = ReactNativeBoilerplate; - productName = "ReactNativeBoilerplate"; + productName = ReactNativeBoilerplate; productReference = 13B07F961A680F5B00A75B9A /* ReactNativeBoilerplate.app */; productType = "com.apple.product-type.application"; }; @@ -201,6 +245,7 @@ isa = PBXNativeTarget; buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "ReactNativeBoilerplate-tvOS" */; buildPhases = ( + E3DECF8B328AF88D722CD537 /* [CP] Check Pods Manifest.lock */, FD10A7F122414F3F0027D42C /* Start Packager */, 2D02E4771E0B4A5D006451C7 /* Sources */, 2D02E4781E0B4A5D006451C7 /* Frameworks */, @@ -220,6 +265,7 @@ isa = PBXNativeTarget; buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "ReactNativeBoilerplate-tvOSTests" */; buildPhases = ( + B970F4EE12EFB5B48126032D /* [CP] Check Pods Manifest.lock */, 2D02E48C1E0B4A5D006451C7 /* Sources */, 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 2D02E48E1E0B4A5D006451C7 /* Resources */, @@ -263,6 +309,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -328,6 +375,28 @@ shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; + 12DCBB8701897BA75245463B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ReactNativeBoilerplate-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -342,6 +411,124 @@ shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; }; + 449008F312C725A5784EFDC5 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ReactNativeBoilerplateTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + B970F4EE12EFB5B48126032D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ReactNativeBoilerplate-tvOSTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E3DECF8B328AF88D722CD537 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ReactNativeBoilerplate-tvOS-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + EFBE2A53D05C194209F0AE99 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-ReactNativeBoilerplate/Pods-ReactNativeBoilerplate-resources.sh", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Entypo.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Feather.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Brands.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Fontisto.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Foundation.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", + "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + ); + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AntDesign.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Entypo.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EvilIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Feather.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Brands.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Regular.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/FontAwesome5_Solid.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Fontisto.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Foundation.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Ionicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialCommunityIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MaterialIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ReactNativeBoilerplate/Pods-ReactNativeBoilerplate-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -447,6 +634,7 @@ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = A423B1A1FD63BBBB52D9E11C /* Pods-ReactNativeBoilerplateTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -469,6 +657,7 @@ }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C86E2D935694D288EE31A380 /* Pods-ReactNativeBoilerplateTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; @@ -488,6 +677,7 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9AAAA247D8F5A95BAFF5B2AE /* Pods-ReactNativeBoilerplate.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; @@ -501,12 +691,14 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = ReactNativeBoilerplate; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1485377777FF8F300BC3B6E6 /* Pods-ReactNativeBoilerplate.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; @@ -519,12 +711,14 @@ ); PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = ReactNativeBoilerplate; + TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; 2D02E4971E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = CBB0F70C382C80E126C23BC2 /* Pods-ReactNativeBoilerplate-tvOS.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -552,6 +746,7 @@ }; 2D02E4981E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 3B7D245460BBDD884FCC299B /* Pods-ReactNativeBoilerplate-tvOS.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -579,6 +774,7 @@ }; 2D02E4991E0B4A5E006451C7 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 732E78FAC70C1082133E0DF7 /* Pods-ReactNativeBoilerplate-tvOSTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; @@ -605,6 +801,7 @@ }; 2D02E49A1E0B4A5E006451C7 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 802FECAC5FC4D7F143F6523F /* Pods-ReactNativeBoilerplate-tvOSTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CLANG_ANALYZER_NONNULL = YES; diff --git a/ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/ReactNativeBoilerplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/ReactNativeBoilerplate.xcworkspace/contents.xcworkspacedata b/ios/ReactNativeBoilerplate.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..4d4d250 --- /dev/null +++ b/ios/ReactNativeBoilerplate.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/ReactNativeBoilerplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/ReactNativeBoilerplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/ReactNativeBoilerplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/ReactNativeBoilerplate/Info.plist b/ios/ReactNativeBoilerplate/Info.plist index d944f3d..bb7ec2a 100644 --- a/ios/ReactNativeBoilerplate/Info.plist +++ b/ios/ReactNativeBoilerplate/Info.plist @@ -53,5 +53,23 @@ UIViewControllerBasedStatusBarAppearance + UIAppFonts + + AntDesign.ttf + Entypo.ttf + EvilIcons.ttf + Feather.ttf + FontAwesome.ttf + FontAwesome5_Brands.ttf + FontAwesome5_Regular.ttf + FontAwesome5_Solid.ttf + Foundation.ttf + Ionicons.ttf + MaterialIcons.ttf + MaterialCommunityIcons.ttf + SimpleLineIcons.ttf + Octicons.ttf + Zocial.ttf + diff --git a/package-lock.json b/package-lock.json index 9c845f9..b28d12a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3183,7 +3183,8 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3201,11 +3202,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3218,15 +3221,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3329,7 +3335,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3339,6 +3346,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3351,17 +3359,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -3378,6 +3389,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3450,7 +3462,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3460,6 +3473,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3535,7 +3549,8 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3565,6 +3580,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -3582,6 +3598,7 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -3620,11 +3637,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "optional": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "optional": true } } }, From 9ba2edeff362dc5f75530629d35afa8be48ed515 Mon Sep 17 00:00:00 2001 From: Justin K Xavier Date: Fri, 11 Oct 2019 00:45:54 +0530 Subject: [PATCH 3/6] added basic components --- App/App.js | 72 ++++-------------------- App/assets/images/fidisys.png | Bin 0 -> 16844 bytes App/components/container.js | 15 +++++ App/components/content.js | 16 ++++++ App/components/header.js | 22 ++++++++ App/components/index.js | 8 +++ App/containers/about/index.js | 13 ++++- App/containers/details/index.js | 14 +++-- App/containers/login/actions.js | 19 +++++++ App/containers/login/index.js | 57 ++++++++++++++++--- App/containers/login/reducer.js | 24 ++++++++ App/containers/login/sagas.js | 26 +++++++++ App/containers/login/types.js | 5 ++ App/navigation.js | 39 +++++++------ App/store/configureStore.js | 21 +++++++ App/store/finalReducer.js | 15 +++++ App/theme/global.js | 5 +- App/utils/config.js | 5 ++ App/utils/fetchService.js | 73 ++++++++++++++++++++++++ App/utils/storageService.js | 5 ++ package-lock.json | 95 ++++++++++++++++++++++++++++++++ package.json | 4 +- 22 files changed, 459 insertions(+), 94 deletions(-) create mode 100644 App/assets/images/fidisys.png create mode 100644 App/components/container.js create mode 100644 App/components/content.js create mode 100644 App/components/header.js create mode 100644 App/components/index.js create mode 100644 App/containers/login/actions.js create mode 100644 App/containers/login/reducer.js create mode 100644 App/containers/login/sagas.js create mode 100644 App/containers/login/types.js create mode 100644 App/store/configureStore.js create mode 100644 App/store/finalReducer.js create mode 100644 App/utils/config.js create mode 100644 App/utils/fetchService.js diff --git a/App/App.js b/App/App.js index b96fbcc..1d53106 100644 --- a/App/App.js +++ b/App/App.js @@ -7,75 +7,25 @@ */ import React from 'react'; -import { - SafeAreaView, - StyleSheet, - ScrollView, - View, - Text, - StatusBar, -} from 'react-native'; +import store from './store/configureStore'; +import { Provider } from 'react-redux'; + -import { - Header, - LearnMoreLinks, - Colors, - DebugInstructions, - ReloadInstructions, -} from 'react-native/Libraries/NewAppScreen'; import { Navigation } from './navigation'; import NavigationService from './utils/navigationService'; const App = () => { return ( - - - { - NavigationService.setTopLevelNavigator(navigatorRef); - }} - /> - + + + { + NavigationService.setTopLevelNavigator(navigatorRef); + }} + /> + ); }; -const styles = StyleSheet.create({ - scrollView: { - backgroundColor: Colors.lighter, - }, - engine: { - position: 'absolute', - right: 0, - }, - body: { - backgroundColor: Colors.white, - }, - sectionContainer: { - marginTop: 32, - paddingHorizontal: 24, - }, - sectionTitle: { - fontSize: 24, - fontWeight: '600', - color: Colors.black, - }, - sectionDescription: { - marginTop: 8, - fontSize: 18, - fontWeight: '400', - color: Colors.dark, - }, - highlight: { - fontWeight: '700', - }, - footer: { - color: Colors.dark, - fontSize: 12, - fontWeight: '600', - padding: 4, - paddingRight: 12, - textAlign: 'right', - }, -}); export default App; diff --git a/App/assets/images/fidisys.png b/App/assets/images/fidisys.png new file mode 100644 index 0000000000000000000000000000000000000000..b80a804e3a3cc0588d8fe0aecd46aef8394e260a GIT binary patch literal 16844 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 { + return ( + + + + {children} + + + ) +} \ No newline at end of file diff --git a/App/components/content.js b/App/components/content.js new file mode 100644 index 0000000..7144c6c --- /dev/null +++ b/App/components/content.js @@ -0,0 +1,16 @@ +import React from 'react'; +import { View,ScrollView } from 'react-native'; + + +export const Content = ({style,children}) => { + return ( + + {children} + + + ) +} \ No newline at end of file diff --git a/App/components/header.js b/App/components/header.js new file mode 100644 index 0000000..bf2de41 --- /dev/null +++ b/App/components/header.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { View,StatusBar } from 'react-native'; + + +export const Header = ({style,statusbarColor,barStyle,children}) => { + console.log(children) + return ( + + + {children} + + + ) +} \ No newline at end of file diff --git a/App/components/index.js b/App/components/index.js new file mode 100644 index 0000000..2636fff --- /dev/null +++ b/App/components/index.js @@ -0,0 +1,8 @@ +import { Container } from './container'; +import { Header } from './header'; +import { Content } from './content' +export { + Container, + Header, + Content +} \ No newline at end of file diff --git a/App/containers/about/index.js b/App/containers/about/index.js index e07b309..ea30094 100644 --- a/App/containers/about/index.js +++ b/App/containers/about/index.js @@ -1,16 +1,25 @@ import React, {PureComponent} from 'react'; import {View, Text, Button} from 'react-native'; import {GlobalStyle} from '../../theme/global'; +import { Container, Header, Content } from '../../components/index'; export default class AboutScreen extends PureComponent { render() { return ( - + +
+ Header +
+ AboutScreen -
+ + + ); } } diff --git a/App/containers/details/index.js b/App/containers/details/index.js index 9520990..5c5cd12 100644 --- a/App/containers/details/index.js +++ b/App/containers/details/index.js @@ -1,5 +1,6 @@ import React, {PureComponent} from 'react'; import {View, Text, Button} from 'react-native'; +import { Container, Header, Content } from '../../components/index'; export default class DetailsScreens extends PureComponent { constructor(props) { @@ -7,17 +8,22 @@ export default class DetailsScreens extends PureComponent { } render() { return ( - - Details - - + Details +
+ + ); } } diff --git a/App/containers/login/actions.js b/App/containers/login/actions.js new file mode 100644 index 0000000..0677cf8 --- /dev/null +++ b/App/containers/login/actions.js @@ -0,0 +1,19 @@ +import * as loginTypes from './types'; + +export const login = loginData => ({ + type: loginTypes.LOGIN, + loginData +}); + +export const LogOut = () => ({ + type: loginTypes.LOGOUT +}); + +export const loginSuccess = user =>({ + type: loginTypes.LOGIN_SUCCESS, + user +}); + +export const loginError = () =>({ + type: loginTypes.LOGIN_ERROR +}); \ No newline at end of file diff --git a/App/containers/login/index.js b/App/containers/login/index.js index 87fddd0..7ccf630 100644 --- a/App/containers/login/index.js +++ b/App/containers/login/index.js @@ -1,26 +1,67 @@ import React, {PureComponent} from 'react'; -import {View, Text, Button} from 'react-native'; +import {View, Text,Image, Button, StyleSheet} from 'react-native'; import NavigationService from '../../utils/navigationService'; import storageService from '../../utils/storageService'; +import { connect } from 'react-redux'; +import * as loginActions from './actions'; -export default class LoginScreen extends PureComponent { +class LoginScreen extends PureComponent { + constructor(props) { + super(props) + } render() { return ( - Login + + A React-Native Boilerplate with redux,saga and react navigation + title="Login"> ); } } + +const mapStateToProps = state => { + return { + ...state + }; +}; +const mapDispatchToProps = dispatch => { + return { + login: loginData => dispatch(loginActions.login(loginData)) + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(LoginScreen); + +export const style = StyleSheet.create({ + image:{ + width: 300, + height: 100, + resizeMode: 'cover', + }, + title: { + paddingHorizontal: 15, + fontWeight: 'bold', + textAlign: 'center', + color: '#754abc' + }, + button: { + backgroundColor: 'green' + } +}) \ No newline at end of file diff --git a/App/containers/login/reducer.js b/App/containers/login/reducer.js new file mode 100644 index 0000000..6e9cff9 --- /dev/null +++ b/App/containers/login/reducer.js @@ -0,0 +1,24 @@ +import * as loginTypes from './types'; + +const initialState = { + isLoggedIn: false, + user: { + + }, + showLoader: false +} + +export function loginReducer(state = initialState, action) { + switch (action.type) { + case loginTypes.LOGIN: + return { ...state, showLoader: true }; + case loginTypes.LOGIN_SUCCESS: + return { ...state, showLoader: false, isLoggedIn: true, user: action.user }; + case loginTypes.LOGIN_ERROR: + return { ...state, showLoader: false, isLoggedIn: false }; + case loginTypes.LOGOUT: + return {...state, isLoggedIn: false, showLoader: false, user: {}}; + default: + return state; + } +} \ No newline at end of file diff --git a/App/containers/login/sagas.js b/App/containers/login/sagas.js new file mode 100644 index 0000000..ce1d71e --- /dev/null +++ b/App/containers/login/sagas.js @@ -0,0 +1,26 @@ +import { takeLatest, call, put, all } from 'redux-saga/effects'; +import * as loginTypes from './types'; +import storageService from '../../utils/storageService'; +import request from '../../utils/fetchService'; +import * as loginActions from './actions'; +import NavigationService from '../../utils/navigationService'; + +export function* watcherSaga() { + yield all([ + takeLatest(loginTypes.LOGIN, loginSagas), + ]); +} +login = async (token) => { + await storageService.setApiKey(token); + NavigationService.navigate('Home'); +} +function* loginSagas(data) { + try { + const { token } = data.loginData; + yield call(login, token) + yield put(loginActions.loginSuccess({ name: token })) + + } catch (error) { + yield put(loginActions.loginError) + } +} \ No newline at end of file diff --git a/App/containers/login/types.js b/App/containers/login/types.js new file mode 100644 index 0000000..9aeba3f --- /dev/null +++ b/App/containers/login/types.js @@ -0,0 +1,5 @@ +export const LOGIN = 'LOGIN'; +export const LOGOUT = 'LOGOUT'; +export const LOGIN_SUCCESS = 'LOGOUT_SUCCESS'; +export const LOGIN_ERROR = 'LOGOUT_ERROR'; + diff --git a/App/navigation.js b/App/navigation.js index 03de99e..8b44419 100644 --- a/App/navigation.js +++ b/App/navigation.js @@ -1,16 +1,16 @@ -import React, {PureComponent} from 'react'; +import React, { PureComponent } from 'react'; import createAnimatedSwitchNavigator from 'react-navigation-animated-switch'; -import {Transition} from 'react-native-reanimated'; -import {createAppContainer} from 'react-navigation'; -import {createStackNavigator} from 'react-navigation-stack'; -import {createDrawerNavigator} from 'react-navigation-drawer'; -import {createBottomTabNavigator} from 'react-navigation-tabs'; +import { Transition } from 'react-native-reanimated'; +import { createAppContainer } from 'react-navigation'; +import { createStackNavigator } from 'react-navigation-stack'; +import { createDrawerNavigator } from 'react-navigation-drawer'; +import { createBottomTabNavigator } from 'react-navigation-tabs'; import LoginScreen from './containers/login/index'; import AboutScreen from './containers/about/index'; import ProfileScreen from './containers/profile/index'; import Icon from 'react-native-vector-icons/Ionicons'; -import {SidemenuScreen} from './containers/sideMenu/index.js'; -import {View, Text} from 'react-native'; +import { SidemenuScreen } from './containers/sideMenu/index.js'; +import { View, Text, Image } from 'react-native'; import NavigationAction from './utils/navigationService'; import storageService from './utils/storageService'; import { FluidNavigator } from 'react-navigation-fluid-transitions'; @@ -24,9 +24,9 @@ const AboutStackNavigator = FluidNavigator( }, { headerMode: 'none', - navigationOptions: ({navigation}) => { + navigationOptions: ({ navigation }) => { return { - tabBarVisible: navigation.state.routes.length > 1 ? false: true, + tabBarVisible: navigation.state.routes.length > 1 ? false : true, }; } }, @@ -38,7 +38,7 @@ const ProfileStackNavigator = FluidNavigator( }, { headerMode: 'none', - navigationOptions: ({navigation}) => { + navigationOptions: ({ navigation }) => { return { tabBarVisible: navigation.state.routes.length > 1 ? false : true, }; @@ -53,9 +53,9 @@ const TabBarNavigator = createBottomTabNavigator( }, { initialRouteName: '', - defaultNavigationOptions: ({navigation}) => ({ - tabBarIcon: ({focused, tintColor}) => { - const {routeName} = navigation.state; + defaultNavigationOptions: ({ navigation }) => ({ + tabBarIcon: ({ focused, tintColor }) => { + const { routeName } = navigation.state; let iconName; if (routeName === 'about') { iconName = `ios-notifications`; @@ -99,11 +99,18 @@ class LoadingScreen extends PureComponent { return ( + loading... ); @@ -112,7 +119,7 @@ class LoadingScreen extends PureComponent { export const appDrawerNavigator = createDrawerNavigator( { - Home: {screen: TabBarNavigator}, + Home: { screen: TabBarNavigator }, }, { drawerPosition: 'left', diff --git a/App/store/configureStore.js b/App/store/configureStore.js new file mode 100644 index 0000000..45a62a3 --- /dev/null +++ b/App/store/configureStore.js @@ -0,0 +1,21 @@ +import createSagaMiddleware from 'redux-saga'; +import { createStore, applyMiddleware, compose } from 'redux'; +import {finalReducer} from './finalReducer'; +import { watcherSaga } from '../containers/login/sagas'; +import {createInjectSagasStore, sagaMiddleware, reloadSaga} from 'redux-sagas-injector'; + +const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; +const store = createInjectSagasStore( + { rootSaga: watcherSaga }, + finalReducer(), + composeEnhancers(applyMiddleware(sagaMiddleware)) +); +// sagaMiddleware.run(watcherSaga); +store.injectedReducers = {}; // Reducer registry + +export default store; + +export function injectAsyncReducer(name, asyncReducer) { + store.injectedReducers[name] = asyncReducer; + store.replaceReducer(finalReducer(store.injectedReducers)); +} diff --git a/App/store/finalReducer.js b/App/store/finalReducer.js new file mode 100644 index 0000000..efdf75a --- /dev/null +++ b/App/store/finalReducer.js @@ -0,0 +1,15 @@ +import { combineReducers } from 'redux'; +import { loginReducer } from '../containers/login/reducer'; + +export const finalReducer = (asyncReducers)=> { + const appReducer = combineReducers({ + Auth: loginReducer, + ...asyncReducers, + }); + return (state, action) => { + if (action.type === 'RESET_APP') + { state = undefined; } + return appReducer(state, action); + } +} + diff --git a/App/theme/global.js b/App/theme/global.js index a157aaf..a99a7fb 100644 --- a/App/theme/global.js +++ b/App/theme/global.js @@ -5,7 +5,8 @@ import React from 'react'; export const GlobalStyle = StyleSheet.create({ mainContainer: { flex: 1, - justifyContent: 'center', - alignItems: 'center' + justifyContent: 'flex-start', + alignItems: 'center', + height: 500 } }) \ No newline at end of file diff --git a/App/utils/config.js b/App/utils/config.js new file mode 100644 index 0000000..4107a06 --- /dev/null +++ b/App/utils/config.js @@ -0,0 +1,5 @@ +export const apiEndPoints = { + baseUrl: '', + login: '', + home: '' +} \ No newline at end of file diff --git a/App/utils/fetchService.js b/App/utils/fetchService.js new file mode 100644 index 0000000..9faa3b5 --- /dev/null +++ b/App/utils/fetchService.js @@ -0,0 +1,73 @@ +import store from '../store/configureStore'; +import NavigationService from './navigationService'; +// import {removeDefaultAccount,removeApiKey} from './storageService'; + + +const myHeaders = new Headers({ + 'Content-Type': 'application/x-www-form-urlencoded' +}); + +export function appendHeader(name, value) { + myHeaders.set(name, value); +} +export function setContentType(value) { + myHeaders.set('Content-Type', value); +} +export function setAuthorization(auth) { + myHeaders.set('Authorization', `Bearer ${auth}`) +} +export function removeHeader(name) { + myHeaders.delete(name); +} +export default function request(url, method, payload = {}) { + const params = { + method: method, + headers: myHeaders, + }; + if (method === 'post' && Object.entries(payload).length !== 0) { + params.body = JSON.stringify(payload); + } + return fetch(url, params) + .then(response => { + return new Promise((resolve, reject) => { + if ((response.status >= 200 && response.status < 300)) { + response.json().then(json => { + resolve(json); + }); + } + else { + response.json().then(json => { + // showToast(json.message,1000,'danger') + }); + + reject(response); + } + }); + }) + .catch((error)=> { + if(error.status === 403){ + // removeDefaultAccount(); + store.dispatch({ + type: 'RESET_DASHBOARD' + }); + // store.dispatch(chageAccountSelection(true)) + // NavigationService.navigate('Home'); + } + else if(error.status === 401){ + store.dispatch({ + type: 'RESET_APP' + }); + resetFetch(); + // removeApiKey(); + // NavigationService.navigate('Authentication'); + } + throw error; + }); +} + +export function resetFetch() { + // appendHeader('Authorization', `Basic ${Basic_Token}`); + // setContentType('application/x-www-form-urlencoded'); + // appendHeader('x-visionlink-CustomerUID', ''); + // appendHeader('x-api-key', ''); +} \ No newline at end of file diff --git a/App/utils/storageService.js b/App/utils/storageService.js index 3aa40cb..c7f284b 100644 --- a/App/utils/storageService.js +++ b/App/utils/storageService.js @@ -14,7 +14,12 @@ const getApiKey = async () => { } }; +const clearApiKey = async () => { + await AsyncStorage.removeItem('api_key'); +} + export default { setApiKey, getApiKey, + clearApiKey }; diff --git a/package-lock.json b/package-lock.json index b28d12a..44c13d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1117,6 +1117,53 @@ "react-native-screens": "^1.0.0 || ^1.0.0-alpha" } }, + "@redux-saga/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.1.1.tgz", + "integrity": "sha512-WKXfj2cYkP0eh74dE1ueMjVDoGJIkppXiMFgx0buVRkXENeZmRxIjM4lh9LEWWFqay7I/Qkw7+cMossa7xXoAQ==", + "requires": { + "@babel/runtime": "^7.6.0", + "@redux-saga/deferred": "^1.1.0", + "@redux-saga/delay-p": "^1.1.0", + "@redux-saga/is": "^1.1.0", + "@redux-saga/symbols": "^1.1.0", + "@redux-saga/types": "^1.1.0", + "redux": "^4.0.4", + "typescript-tuple": "^2.2.1" + } + }, + "@redux-saga/deferred": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.1.0.tgz", + "integrity": "sha512-wOCJCby3hx14bvrEeFLJ1JJTjJdXDJyC+B3JQ6eiqgzNghylbf969lIYmS2Arf2QuALfUtRBNPXBIMDKG9km4g==" + }, + "@redux-saga/delay-p": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.1.0.tgz", + "integrity": "sha512-BcRwXs20kKjgiYEwZARkpVoRIe/hHftW3iwPhdeW4/jPyR9gLv/vG8VsJMF5NDEch+/w/mJtdgSubq+wtOS47g==", + "requires": { + "@redux-saga/symbols": "^1.1.0" + } + }, + "@redux-saga/is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.0.tgz", + "integrity": "sha512-0uFXWGSvDCfNBdROHwEVixNhFbI3S+UGBQfcPXQiYL+CjIjyR3DTg2Z+NFH9xzP+H4Oh/yGtTHDhC0GxYp7HQQ==", + "requires": { + "@redux-saga/symbols": "^1.1.0", + "@redux-saga/types": "^1.1.0" + } + }, + "@redux-saga/symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.0.tgz", + "integrity": "sha512-Fzw1wV3j4hbac3MYmgNE18Z53URmQZeilTHZLF7Lm4SQ1jG4fcU47v2kElsEbQXUSaFqj+uJqdRzmDGNb6pRwQ==" + }, + "@redux-saga/types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.1.0.tgz", + "integrity": "sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==" + }, "@types/babel__core": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", @@ -7222,6 +7269,33 @@ "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.8.tgz", "integrity": "sha512-8qlpooP2QqPtZHQZRhx3x3OP5skEV1py/zUdMY28WNAocbafxdG2tRD1MWE7sp8obGMNYuLWanhhQ7EQvT1FBg==" }, + "redux-reducers-injector": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/redux-reducers-injector/-/redux-reducers-injector-0.3.0.tgz", + "integrity": "sha512-oEiIVo650RRjFwSdouPMjCNMPVaaIt5Z/YqangAxQ0W65TmLX5h9+qBj1paU4JRq0CNqf9DGJ/orM1QcaOfIhw==", + "requires": { + "lodash": "4.17.15", + "redux": "4.0.4" + } + }, + "redux-saga": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.1.1.tgz", + "integrity": "sha512-guSnGJ/uEF8yL8Mn4aNa7HxRGCpVUALCkec9iTTD0fOhQqkF6bRQkBLeS+7/cAH3nFnr299bi/DOurTi1apcCA==", + "requires": { + "@redux-saga/core": "^1.1.1" + } + }, + "redux-sagas-injector": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/redux-sagas-injector/-/redux-sagas-injector-1.1.1.tgz", + "integrity": "sha512-+Z+G1Z0po01WPdXMJm1GAjovtZsLJ/A8SDlx6YMksrazOYQwUSOa7wZf5Zfq906c4cU7665Gn9H6jQVMFM/lkw==", + "requires": { + "redux": "4.0.4", + "redux-reducers-injector": "0.3.0", + "redux-saga": "1.1.1" + } + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -8309,6 +8383,27 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typescript-compare": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", + "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", + "requires": { + "typescript-logic": "^0.0.0" + } + }, + "typescript-logic": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" + }, + "typescript-tuple": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", + "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", + "requires": { + "typescript-compare": "^0.0.2" + } + }, "ua-parser-js": { "version": "0.7.20", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", diff --git a/package.json b/package.json index 8414847..dbc6584 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,9 @@ "react-navigation-tabs": "^2.5.5", "react-redux": "^7.1.1", "redux": "^4.0.4", - "redux-devtools-extension": "^2.13.8" + "redux-devtools-extension": "^2.13.8", + "redux-saga": "^1.1.1", + "redux-sagas-injector": "^1.1.1" }, "devDependencies": { "@babel/core": "7.6.3", From c663b1ee927a7d1ce9978634bd20435f23ac9031 Mon Sep 17 00:00:00 2001 From: Justin K Xavier Date: Fri, 11 Oct 2019 15:12:12 +0530 Subject: [PATCH 4/6] created basic laycout components with login-logoutflow --- App/assets/icons/pre-loader.gif | Bin 0 -> 69533 bytes App/components/button.js | 26 +++++++++ App/components/content.js | 12 ++-- App/components/footer.js | 23 ++++++++ App/components/header.js | 47 ++++++++++++++-- App/components/iconButton.js | 18 ++++++ App/components/index.js | 15 ++++- App/containers/about/index.js | 93 ++++++++++++++++++++++++++----- App/containers/details/index.js | 50 +++++++++++------ App/containers/login/actions.js | 12 ++-- App/containers/login/sagas.js | 15 +++++ App/containers/login/types.js | 3 +- App/containers/profile/index.js | 27 ++++++--- App/containers/sideMenu/index.js | 59 ++++++++++++++++---- App/navigation.js | 8 ++- App/theme/global.js | 22 +++++++- android/app/build.gradle | 15 ++++- package-lock.json | 14 +++++ package.json | 1 + 19 files changed, 385 insertions(+), 75 deletions(-) create mode 100644 App/assets/icons/pre-loader.gif create mode 100644 App/components/button.js create mode 100644 App/components/footer.js create mode 100644 App/components/iconButton.js diff --git a/App/assets/icons/pre-loader.gif b/App/assets/icons/pre-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..31a4cfc287a06b89c23c89799acf3835e951223e GIT binary patch literal 69533 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 { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/App/components/content.js b/App/components/content.js index 7144c6c..0bb8830 100644 --- a/App/components/content.js +++ b/App/components/content.js @@ -1,16 +1,20 @@ import React from 'react'; -import { View,ScrollView } from 'react-native'; +import { View, } from 'react-native'; +import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view' export const Content = ({style,children}) => { return ( - {children} - + ) } \ No newline at end of file diff --git a/App/components/footer.js b/App/components/footer.js new file mode 100644 index 0000000..9827982 --- /dev/null +++ b/App/components/footer.js @@ -0,0 +1,23 @@ +import React from 'react'; +import { View, Text } from 'react-native'; + +export const Footer = ({ style, children }) => { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/App/components/header.js b/App/components/header.js index bf2de41..2255d56 100644 --- a/App/components/header.js +++ b/App/components/header.js @@ -1,22 +1,59 @@ import React from 'react'; import { View,StatusBar } from 'react-native'; +import { BarStyle } from '../theme/global'; - -export const Header = ({style,statusbarColor,barStyle,children}) => { +export const Header = ({style,statusbarColor,barStyle = BarStyle ,children}) => { console.log(children) return ( {children} ) +} + +export const HeaderLeft = ({style,children}) => { + return ( + + {children} + + ) +} +export const HeaderBody = ({style,children}) => { + return ( + + {children} + + ) +} +export const HeaderRight = ({style,children}) => { + return ( + + {children} + + ) } \ No newline at end of file diff --git a/App/components/iconButton.js b/App/components/iconButton.js new file mode 100644 index 0000000..3772706 --- /dev/null +++ b/App/components/iconButton.js @@ -0,0 +1,18 @@ +import React from 'react'; +import { TouchableOpacity } from 'react-native'; + + +export const IconButton = ({style,buttonEvent,children}) => { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/App/components/index.js b/App/components/index.js index 2636fff..239a8d1 100644 --- a/App/components/index.js +++ b/App/components/index.js @@ -1,8 +1,17 @@ import { Container } from './container'; -import { Header } from './header'; -import { Content } from './content' +import { Header,HeaderBody,HeaderRight,HeaderLeft } from './header'; +import { Content } from './content'; +import { IconButton } from './iconButton'; +import { Button } from './button'; +import { Footer } from './footer'; export { Container, Header, - Content + HeaderBody, + HeaderRight, + HeaderLeft, + Content, + Button, + Footer, + IconButton } \ No newline at end of file diff --git a/App/containers/about/index.js b/App/containers/about/index.js index ea30094..f0f5e8d 100644 --- a/App/containers/about/index.js +++ b/App/containers/about/index.js @@ -1,25 +1,92 @@ -import React, {PureComponent} from 'react'; -import {View, Text, Button} from 'react-native'; -import {GlobalStyle} from '../../theme/global'; -import { Container, Header, Content } from '../../components/index'; +import React, { PureComponent } from 'react'; +import { View, Text, Image, StyleSheet } from 'react-native'; +import { GlobalStyle } from '../../theme/global'; +import { + Container, Header, Content, HeaderBody, + HeaderRight, + HeaderLeft, Button +} from '../../components/index'; export default class AboutScreen extends PureComponent { + render() { + const images = [ + 'https://cdn.dribbble.com/users/4103091/screenshots/7353178/media/6d1a3a06961c0dcfd513ffe241636472.png', + 'https://cdn.dribbble.com/users/4103091/screenshots/7154300/media/7839c89716a90284e0c52595efb61dd5.jpg', + 'https://cdn.dribbble.com/users/4103091/screenshots/7144043/media/d656c920c640137820705cb7f2c74b8d.png', + 'https://cdn.dribbble.com/users/4103091/screenshots/7161471/media/5a8d8a0ca7ef17438d3abb153f65964a.png', + 'https://cdn.dribbble.com/users/4103091/screenshots/7182137/media/e62354aab046eaa95906378326401ae3.jpg', + 'https://cdn.dribbble.com/users/4103091/screenshots/7206198/media/3abe7e52b17db092707f8571acdc1692.jpg', + 'https://cdn.dribbble.com/users/4103091/screenshots/7206610/media/ffb593de453a0ec31a07d87032d874bb.jpg' + ] return ( -
- Header +
+ + + About + +
- AboutScreen - + + About Screen + + + + + {images.map((image, index) => ( + + + + ))} - + ); } } + +const style = StyleSheet.create({ + title: { + fontSize: 18, + marginBottom: 15, + fontWeight: 'bold' + }, + imageContainer: { + height: 250, + marginBottom: 20, + borderRadius: 5, + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 4, + }, + shadowOpacity: 0.32, + shadowRadius: 5.46, + backgroundColor: 'white', + elevation: 9, + }, + image: { + width: '100%', + height: 250, + resizeMode: 'stretch', + borderRadius: 5, + } +}) \ No newline at end of file diff --git a/App/containers/details/index.js b/App/containers/details/index.js index 5c5cd12..a4fc7c6 100644 --- a/App/containers/details/index.js +++ b/App/containers/details/index.js @@ -1,28 +1,44 @@ -import React, {PureComponent} from 'react'; -import {View, Text, Button} from 'react-native'; -import { Container, Header, Content } from '../../components/index'; +import React, { PureComponent } from 'react'; +import { View, Text, Button } from 'react-native'; +import { + Container, + Header, + Content, + HeaderBody, + HeaderRight, + HeaderLeft, + IconButton +} from '../../components/index'; +import {GlobalStyle} from '../../theme/global'; +import Icon from 'react-native-vector-icons/Ionicons'; + export default class DetailsScreens extends PureComponent { constructor(props) { super(props); } + goBack() { + this.props.navigation.pop() + } render() { return ( - -
- - Details + +
+ + this.goBack()}> + + + + + Details + +
- + + This is details screen. +
); } diff --git a/App/containers/login/actions.js b/App/containers/login/actions.js index 0677cf8..62cda20 100644 --- a/App/containers/login/actions.js +++ b/App/containers/login/actions.js @@ -5,10 +5,6 @@ export const login = loginData => ({ loginData }); -export const LogOut = () => ({ - type: loginTypes.LOGOUT -}); - export const loginSuccess = user =>({ type: loginTypes.LOGIN_SUCCESS, user @@ -16,4 +12,12 @@ export const loginSuccess = user =>({ export const loginError = () =>({ type: loginTypes.LOGIN_ERROR +}); + +export const LogOut = () => ({ + type: loginTypes.LOGOUT +}); + +export const LogOutSuccess = () => ({ + type: loginTypes.LOGOUT_SUCCESS }); \ No newline at end of file diff --git a/App/containers/login/sagas.js b/App/containers/login/sagas.js index ce1d71e..bf31000 100644 --- a/App/containers/login/sagas.js +++ b/App/containers/login/sagas.js @@ -8,6 +8,7 @@ import NavigationService from '../../utils/navigationService'; export function* watcherSaga() { yield all([ takeLatest(loginTypes.LOGIN, loginSagas), + takeLatest(loginTypes.LOGOUT, logoutSagas) ]); } login = async (token) => { @@ -23,4 +24,18 @@ function* loginSagas(data) { } catch (error) { yield put(loginActions.loginError) } +} + +logout = () => { + storageService.clearApiKey(); + NavigationService.navigate('Authentication') +} + +function* logoutSagas() { + try { + yield call(logout); + yield put(loginActions.LogOutSuccess()) + } catch (error) { + + } } \ No newline at end of file diff --git a/App/containers/login/types.js b/App/containers/login/types.js index 9aeba3f..45200f2 100644 --- a/App/containers/login/types.js +++ b/App/containers/login/types.js @@ -1,5 +1,6 @@ export const LOGIN = 'LOGIN'; -export const LOGOUT = 'LOGOUT'; export const LOGIN_SUCCESS = 'LOGOUT_SUCCESS'; export const LOGIN_ERROR = 'LOGOUT_ERROR'; +export const LOGOUT = 'LOGOUT'; +export const LOGOUT_SUCCESS = 'LOGOUT_SUCCESS'; \ No newline at end of file diff --git a/App/containers/profile/index.js b/App/containers/profile/index.js index 80cf1e4..e206f35 100644 --- a/App/containers/profile/index.js +++ b/App/containers/profile/index.js @@ -1,17 +1,28 @@ import React, {PureComponent} from 'react'; import {View, Text} from 'react-native'; +import { Container, Header, Content,HeaderBody, + HeaderRight, + HeaderLeft } from '../../components/index'; + import {GlobalStyle} from '../../theme/global'; export default class ProfileScreen extends PureComponent { render() { return ( - - Profile - + +
+ + + Profile + + +
+ + Profile Screen + + +
); } } diff --git a/App/containers/sideMenu/index.js b/App/containers/sideMenu/index.js index c922240..419f1eb 100644 --- a/App/containers/sideMenu/index.js +++ b/App/containers/sideMenu/index.js @@ -1,18 +1,53 @@ -import React from 'react'; +import React, {PureComponent} from 'react'; import SafeAreaView from 'react-native-safe-area-view'; -import {DrawerNavigatorItems} from 'react-navigation-drawer'; -import { StyleSheet, ScrollView } from 'react-native'; +import { DrawerNavigatorItems } from 'react-navigation-drawer'; +import { StyleSheet, Text } from 'react-native'; +import { + Container, Header, Content, HeaderBody, + HeaderRight,Footer, + HeaderLeft, Button +} from '../../components/index'; +import { GlobalStyle } from '../../theme/global'; +import store from '../../store/configureStore'; +import * as loginTypes from '../login/types'; +export class SidemenuScreen extends PureComponent { + constructor(props) { + super(props) + console.log(props) -export const SidemenuScreen = props => ( - - - - - -); + } + + onLogOut() { + store.dispatch({ + type: loginTypes.LOGOUT + }); + } + render() { + return ( + +
+ + + Boilerplate + + +
+ + +
+ +
+
+ ) + } +} const styles = StyleSheet.create({ container: { diff --git a/App/navigation.js b/App/navigation.js index 8b44419..5b57b8e 100644 --- a/App/navigation.js +++ b/App/navigation.js @@ -17,7 +17,7 @@ import { FluidNavigator } from 'react-navigation-fluid-transitions'; import DetailsScreens from './containers/details/index' -const AboutStackNavigator = FluidNavigator( +const AboutStackNavigator = createStackNavigator( { about: AboutScreen, details: DetailsScreens, @@ -32,7 +32,7 @@ const AboutStackNavigator = FluidNavigator( }, ); -const ProfileStackNavigator = FluidNavigator( +const ProfileStackNavigator = createStackNavigator( { profile: ProfileScreen, }, @@ -80,7 +80,9 @@ const TabBarNavigator = createBottomTabNavigator( title: navigation.state.routeName, }), tabBarOptions: { - activeTintColor: 'red' + activeTintColor: 'white', + activeBackgroundColor: '#3c414f', + inactiveBackgroundColor: '#3c414f' } }, ); diff --git a/App/theme/global.js b/App/theme/global.js index a99a7fb..0c263f1 100644 --- a/App/theme/global.js +++ b/App/theme/global.js @@ -1,12 +1,28 @@ import { StyleSheet } from 'react-native'; import React from 'react'; +import { Platform, Dimensions, PixelRatio } from 'react-native'; + + +export const deviceHeight = Dimensions.get('window').height; +export const deviceWidth = Dimensions.get('window').width; +export const platform = Platform.OS; +export const isAndroid = Platform.OS === 'android' ? true : false; +export const isIphoneX = +platform === Platform.OS === 'ios' && +(deviceHeight === 812 || + deviceWidth === 812 || + deviceHeight === 896 || + deviceWidth === 896); +export const BarStyle = Platform.OS === 'ios' ? 'dark-content' : 'light-content'; export const GlobalStyle = StyleSheet.create({ mainContainer: { flex: 1, - justifyContent: 'flex-start', - alignItems: 'center', - height: 500 + justifyContent: 'flex-start' + }, + headerTitle: { + fontSize: isAndroid ? 18 : 16, + color: 'white' } }) \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index 7e1be46..998032f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -81,7 +81,10 @@ project.ext.react = [ ] apply from: "../../node_modules/react-native/react.gradle" - +project.ext.vectoricons = [ + iconFontNames: [ 'MaterialIcons.ttf', 'EvilIcons.ttf', 'Ionicons.ttf' ] // Name of the font files you want to copy +] +apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" /** * Set this to true to create two separate APKs instead of one: * - An APK that only works on ARM devices @@ -190,7 +193,15 @@ dependencies { implementation jscFlavor } implementation 'androidx.appcompat:appcompat:1.1.0-rc01' -implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02' + implementation 'com.facebook.fresco:animated-gif:1.12.0' + + // For WebP support, including animated WebP + implementation 'com.facebook.fresco:animated-webp:1.10.0' + implementation 'com.facebook.fresco:webpsupport:1.10.0' + + // For WebP support, without animations + implementation 'com.facebook.fresco:webpsupport:1.10.0' } // Run this once to be able to run the application with BUCK diff --git a/package-lock.json b/package-lock.json index 44c13d7..e799823 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6956,6 +6956,20 @@ } } }, + "react-native-iphone-x-helper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz", + "integrity": "sha512-/VbpIEp8tSNNHIvstuA3Swx610whci1Zpc9mqNkqn14DkMbw+ORviln2u0XyHG1kPvvwTNGZY6QpeFwxYaSdbQ==" + }, + "react-native-keyboard-aware-scroll-view": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.9.1.tgz", + "integrity": "sha512-tBZ8rmjELN0F6t5UBp5CW3NYmZXgVnJSzVCssv/OqG2t6kiB+OUTqxNvUP24K+HARX4H+XaW0aEJSFQkQCv6KA==", + "requires": { + "prop-types": "^15.6.2", + "react-native-iphone-x-helper": "^1.0.3" + } + }, "react-native-reanimated": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-1.3.0.tgz", diff --git a/package.json b/package.json index dbc6584..ec8c0cf 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "react": "16.9.0", "react-native": "0.61.2", "react-native-gesture-handler": "^1.4.1", + "react-native-keyboard-aware-scroll-view": "^0.9.1", "react-native-reanimated": "^1.3.0", "react-native-screens": "^1.0.0-alpha.23", "react-native-vector-icons": "^6.6.0", From 9082463ccb015630726141e58fafc535bb6c144e Mon Sep 17 00:00:00 2001 From: Justin K Xavier Date: Fri, 11 Oct 2019 15:55:28 +0530 Subject: [PATCH 5/6] updated license and readme files --- LICENSE.md | 9 ++++ README.md | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 LICENSE.md create mode 100644 README.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..2095fbb --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2019 Fidisys Technologies Pvt Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b150fe8 --- /dev/null +++ b/README.md @@ -0,0 +1,126 @@ +react boilerplate banner + +
+ +
Start Your Next React Native Project In Seconds
+
A highly scalable, redux state management, sagas middleware integrated setup focus on performance and best practices
+ +
+ +
+ + + Dependency Status + + + + devDependency Status + + + + Build Status + + + +
+ + +
+ +
+ Created by Justin K Xavier and maintained with ❤️ by Fidisys +
+ +# React Native Boilerplate + +React Native boilerplate using react-native-cli with react-navigation, redux state management, redux-saga middleware and auth flow mechanism with drawer-tab navigation layout. + + +## Prerequisites + +What things you need to install the software and how to install them + +1. Node (v10.9 and above) +2. Android studio with sdk tools installed +3. Java (jdk 9 and above) +4. Xcode (for ios build) +5. React native cli +``` +npm install -g react-native-cli +``` +___ +## Installing + + +1. Clone the boilerplate. +``` +git clone https://github.com/fidisys/react-native-boilerplate.git +``` +2. Install all the dependencies +And repeat + +``` +npm install +``` +3. Go to project folder and start server. + +``` +react-native start +``` +4. Run the project on android/ios + +``` +react-native run +``` + +## Packages used for scaffolding + +- react +- react-native +- react-navigation +- react-native-gesture-handler +- react-native-vector-icons +- redux +- react-redux +- redux-saga + + +### React-Native Debugger +![React Native Debugger](https://user-images.githubusercontent.com/3001525/29451479-6621bf1a-83c8-11e7-8ebb-b4e98b1af91c.png) + +* This is a standalone app for debugging React Native apps +- Based on official [Remote Debugger](https://facebook.github.io/react-native/docs/debugging.html#chrome-developer-tools) and provide more functionally. +- Includes [React Inspector](docs/react-devtools-integration.md) from [`react-devtools-core`](https://github.com/facebook/react-devtools/tree/master/packages/react-devtools-core). +- Includes Redux DevTools, made [the same API](docs/redux-devtools-integration.md) with [`redux-devtools-extension`](https://github.com/zalmoxisus/redux-devtools-extension). + +#### Installation + +To install the app, you can download a prebuilt binary from the [release page](https://github.com/jhen0409/react-native-debugger/releases). + +For **macOS**, you can use [Homebrew Cask](https://caskroom.github.io) to install: + +```bash +$ brew update && brew cask install react-native-debugger +``` + +This puts `React Native Debugger.app` in your `/applications/` folder. + +#### [Official Page](https://github.com/jhen0409/react-native-debugger) + +___ + +## Authors + +* **Justin K Xavier** - *Initial work* - [LinkedIn](https://www.linkedin.com/in/justin-k-xavier-59b82710a/) +* **prasanth kumar lalapeta** - [Github](https://github.com/prasanthLalapeta) + +See also the list of [contributors](https://github.com/your/project/contributors) who participated in this project. + +## License + +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details +___ + + +

😊Pull requests accepted with ❤️

+ From b859438a7e6f4e569c0180ea96afca813d8029eb Mon Sep 17 00:00:00 2001 From: Justin K Xavier Date: Fri, 11 Oct 2019 15:59:54 +0530 Subject: [PATCH 6/6] modified readme file --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b150fe8..762cb58 100644 --- a/README.md +++ b/README.md @@ -112,9 +112,9 @@ ___ ## Authors * **Justin K Xavier** - *Initial work* - [LinkedIn](https://www.linkedin.com/in/justin-k-xavier-59b82710a/) -* **prasanth kumar lalapeta** - [Github](https://github.com/prasanthLalapeta) +* **Prasanth Kumar Lalapeta** - [Github](https://github.com/prasanthLalapeta) -See also the list of [contributors](https://github.com/your/project/contributors) who participated in this project. +See also the list of [contributors](https://github.com/fidisys/react-native-boilerplate/graphs/contributors) who participated in this project. ## License