├── .buckconfig
├── .flowconfig
├── .gitignore
├── .watchmanconfig
├── LICENSE
├── README.md
├── app
├── actions.js
├── components
│ ├── food.js
│ ├── index.js
│ ├── layout.js
│ ├── list-item.js
│ ├── nav-button.js
│ ├── new-notification-popup.js
│ ├── notifications.js
│ ├── sidebar-body.js
│ ├── sidebar.js
│ └── workouts.js
├── configureStore.js
├── containers
│ └── main.js
├── images
│ ├── layout.png
│ ├── layout2.png
│ ├── layout3.png
│ ├── layout4.png
│ └── program.png
├── locales.js
├── reducers.js
└── utils.js
├── index.ios.js
├── ios
├── ProFit.xcodeproj
│ ├── project.pbxproj
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── ProFit.xcscheme
├── ProFit
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Base.lproj
│ │ └── Launch Screen.storyboard
│ ├── Images.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-1.png
│ │ │ ├── Icon-167.png
│ │ │ ├── Icon-60@2x.png
│ │ │ ├── Icon-60@3x.png
│ │ │ ├── Icon-72.png
│ │ │ ├── Icon-72@2x.png
│ │ │ ├── Icon-76.png
│ │ │ ├── Icon-76@2x.png
│ │ │ ├── Icon-Small-1.png
│ │ │ ├── Icon-Small-40.png
│ │ │ ├── Icon-Small-40@2x-1.png
│ │ │ ├── Icon-Small-40@2x.png
│ │ │ ├── Icon-Small-40@3x.png
│ │ │ ├── Icon-Small-50.png
│ │ │ ├── Icon-Small-50@2x.png
│ │ │ ├── Icon-Small.png
│ │ │ ├── Icon-Small@2x-1.png
│ │ │ ├── Icon-Small@2x.png
│ │ │ ├── Icon-Small@3x.png
│ │ │ └── Icon@2x-1.png
│ │ ├── Contents.json
│ │ └── screen.imageset
│ │ │ ├── Contents.json
│ │ │ └── screen.png
│ ├── Info.plist
│ ├── main.m
│ └── ru.lproj
│ │ └── Launch Screen.strings
└── ProFitTests
│ ├── Info.plist
│ └── ProFitTests.m
├── package.json
└── screen.png
/.buckconfig:
--------------------------------------------------------------------------------
1 |
2 | [android]
3 | target = Google Inc.:Google APIs:23
4 |
5 | [maven_repositories]
6 | central = https://repo1.maven.org/maven2
7 |
--------------------------------------------------------------------------------
/.flowconfig:
--------------------------------------------------------------------------------
1 | [ignore]
2 |
3 | # We fork some components by platform.
4 | .*/*.web.js
5 | .*/*.android.js
6 |
7 | # Some modules have their own node_modules with overlap
8 | .*/node_modules/node-haste/.*
9 |
10 | # Ugh
11 | .*/node_modules/babel.*
12 | .*/node_modules/babylon.*
13 | .*/node_modules/invariant.*
14 |
15 | # Ignore react and fbjs where there are overlaps, but don't ignore
16 | # anything that react-native relies on
17 | .*/node_modules/fbjs/lib/Map.js
18 | .*/node_modules/fbjs/lib/fetch.js
19 | .*/node_modules/fbjs/lib/ExecutionEnvironment.js
20 | .*/node_modules/fbjs/lib/ErrorUtils.js
21 |
22 | # Flow has a built-in definition for the 'react' module which we prefer to use
23 | # over the currently-untyped source
24 | .*/node_modules/react/react.js
25 | .*/node_modules/react/lib/React.js
26 | .*/node_modules/react/lib/ReactDOM.js
27 |
28 | .*/__mocks__/.*
29 | .*/__tests__/.*
30 |
31 | .*/commoner/test/source/widget/share.js
32 |
33 | # Ignore commoner tests
34 | .*/node_modules/commoner/test/.*
35 |
36 | # See https://github.com/facebook/flow/issues/442
37 | .*/react-tools/node_modules/commoner/lib/reader.js
38 |
39 | # Ignore jest
40 | .*/node_modules/jest-cli/.*
41 |
42 | # Ignore Website
43 | .*/website/.*
44 |
45 | # Ignore generators
46 | .*/local-cli/generator.*
47 |
48 | # Ignore BUCK generated folders
49 | .*\.buckd/
50 |
51 | .*/node_modules/is-my-json-valid/test/.*\.json
52 | .*/node_modules/iconv-lite/encodings/tables/.*\.json
53 | .*/node_modules/y18n/test/.*\.json
54 | .*/node_modules/spdx-license-ids/spdx-license-ids.json
55 | .*/node_modules/spdx-exceptions/index.json
56 | .*/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json
57 | .*/node_modules/resolve/lib/core.json
58 | .*/node_modules/jsonparse/samplejson/.*\.json
59 | .*/node_modules/json5/test/.*\.json
60 | .*/node_modules/ua-parser-js/test/.*\.json
61 | .*/node_modules/builtin-modules/builtin-modules.json
62 | .*/node_modules/binary-extensions/binary-extensions.json
63 | .*/node_modules/url-regex/tlds.json
64 | .*/node_modules/joi/.*\.json
65 | .*/node_modules/isemail/.*\.json
66 | .*/node_modules/tr46/.*\.json
67 |
68 |
69 | [include]
70 |
71 | [libs]
72 | node_modules/react-native/Libraries/react-native/react-native-interface.js
73 | node_modules/react-native/flow
74 | flow/
75 |
76 | [options]
77 | module.system=haste
78 |
79 | esproposal.class_static_fields=enable
80 | esproposal.class_instance_fields=enable
81 |
82 | munge_underscores=true
83 |
84 | module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
85 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\)$' -> 'RelativeImageStub'
86 |
87 | suppress_type=$FlowIssue
88 | suppress_type=$FlowFixMe
89 | suppress_type=$FixMe
90 |
91 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-3]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
92 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-3]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
93 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
94 |
95 | [version]
96 | 0.23.0
97 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OSX
2 | #
3 | .DS_Store
4 |
5 | # Xcode
6 | #
7 | build/
8 | *.pbxuser
9 | !default.pbxuser
10 | *.mode1v3
11 | !default.mode1v3
12 | *.mode2v3
13 | !default.mode2v3
14 | *.perspectivev3
15 | !default.perspectivev3
16 | xcuserdata
17 | *.xccheckout
18 | *.moved-aside
19 | DerivedData
20 | *.hmap
21 | *.ipa
22 | *.xcuserstate
23 | project.xcworkspace
24 |
25 | # Android/IJ
26 | #
27 | .idea
28 | .gradle
29 | local.properties
30 |
31 | # node.js
32 | #
33 | node_modules/
34 | npm-debug.log
35 |
36 | # BUCK
37 | buck-out/
38 | \.buckd/
39 | android/app/libs
40 | android/keystores/debug.keystore
41 |
--------------------------------------------------------------------------------
/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Ivan Zotov
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # React Native / Redux Example
2 |
3 | Extracted from ProFit App.
4 |
5 | ## Start the project
6 |
7 | `npm start`
8 |
9 | From XCode project make sure you have commented line in AppDelegate.m file for debugging mode (don't forget to uncomment this line before archive project for production):
10 |
11 | `// jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];`
12 |
13 | also in Product -> Scheme -> Edit Scheme 'Build Configuration' option set to 'Debug' then just start the project from the XCode.
14 |
15 | 
16 |
17 | ## Building app icons
18 |
19 | Use app icon template – https://appicontemplate.com/ios9/
20 |
21 | ## Tools
22 |
23 | [React Native](https://facebook.github.io/react-native/)
24 | [Redux](http://redux.js.org/docs/introduction/)
25 | [Redux Thunk Middleware](https://github.com/gaearon/redux-thunk)
26 | [Redux Logger Middleware](https://github.com/evgenyrodionov/redux-logger)
27 | [React Native I18n](https://github.com/AlexanderZaytsev/react-native-i18n)
28 | [Moment](http://momentjs.com/)
29 |
30 |
--------------------------------------------------------------------------------
/app/actions.js:
--------------------------------------------------------------------------------
1 | import I18n, { moment } from './locales';
2 | import { generateUUID } from './utils';
3 |
4 | import {
5 | PushNotificationIOS,
6 | AsyncStorage
7 | } from 'react-native';
8 |
9 | const openNewNotificationPopup = () => {
10 | return (dispatch, getState) => {
11 | dispatch({
12 | type: 'OPEN_NEW_NOTIFICATION_POPUP'
13 | });
14 | };
15 | };
16 |
17 | const closeNewNotificationPopup = () => {
18 | return (dispatch, getState) => {
19 | dispatch({
20 | type: 'CLOSE_NEW_NOTIFICATION_POPUP'
21 | });
22 | };
23 | };
24 |
25 | const addNotification = date => {
26 | return (dispatch, getState) => {
27 | let notification = {
28 | uuid: generateUUID(),
29 | date: date
30 | };
31 |
32 | AsyncStorage.getItem('notifications', (err, notifications) => {
33 | if (notifications && JSON.parse(notifications).length > 0) {
34 | notifications = [...JSON.parse(notifications), notification].sort((a, b) =>
35 | new Date(a.date) - new Date(b.date)
36 | )
37 | } else {
38 | notifications = [notification];
39 | }
40 |
41 | AsyncStorage.setItem('notifications', JSON.stringify(notifications), () => {
42 | if (notifications.length > 0) {
43 | dispatch(enableEditNotifications());
44 | }
45 |
46 | dispatch({
47 | type: 'GET_NOTIFICATIONS',
48 | notifications: notifications
49 | });
50 |
51 | let fireDate = moment(notification.date)
52 | .subtract(1, 'hour')
53 | .set('second', 0)
54 | .toDate();
55 |
56 | if (notification.date > new Date()) {
57 | PushNotificationIOS.scheduleLocalNotification({
58 | fireDate: fireDate.getTime(),
59 | alertBody: `${I18n.t('notification')}: ${moment(notification.date).calendar()}`,
60 | userInfo: { uuid: notification.uuid }
61 | });
62 | }
63 | });
64 | });
65 | };
66 | };
67 |
68 | const getNotifications = () => {
69 | return (dispatch, getState) => {
70 | AsyncStorage.getItem('notifications', (err, notifications) => {
71 | if (!err && notifications) {
72 | dispatch({
73 | type: 'GET_NOTIFICATIONS',
74 | notifications: JSON.parse(notifications).sort((a, b) =>
75 | new Date(a.date) - new Date(b.date)
76 | )
77 | });
78 |
79 | if (getState().notifications.items.length > 0) {
80 | dispatch(enableEditNotifications());
81 | } else {
82 | dispatch(disableEditNotifications());
83 | }
84 | }
85 | });
86 | };
87 | };
88 |
89 | const enableEditModeNotifications = () => {
90 | return (dispatch, getState) => {
91 | dispatch({
92 | type: 'ENABLE_EDIT_MODE_NOTIFICATIONS'
93 | });
94 | };
95 | };
96 |
97 | const disableEditModeNotifications = () => {
98 | return (dispatch, getState) => {
99 | dispatch({
100 | type: 'DISABLE_EDIT_MODE_NOTIFICATIONS'
101 | });
102 | };
103 | };
104 |
105 | const enableEditNotifications = () => {
106 | return (dispatch, getState) => {
107 | dispatch({
108 | type: 'ENABLE_EDIT_NOTIFICATIONS'
109 | });
110 | };
111 | };
112 |
113 | const disableEditNotifications = () => {
114 | return (dispatch, getState) => {
115 | dispatch({
116 | type: 'DISABLE_EDIT_NOTIFICATIONS'
117 | });
118 | };
119 | };
120 |
121 | const removeNotification = (notification) => {
122 | return (dispatch, getState) => {
123 | AsyncStorage.getItem('notifications', (err, notifications) => {
124 | if (notifications && JSON.parse(notifications).length > 0) {
125 | let filtered_notifications = JSON.parse(notifications).filter((i) => i.uuid != notification.uuid);
126 |
127 | notifications = filtered_notifications.sort((a, b) =>
128 | new Date(a.date) - new Date(b.date)
129 | )
130 | } else {
131 | notifications = [];
132 | }
133 |
134 | AsyncStorage.setItem('notifications', JSON.stringify(notifications), () => {
135 | PushNotificationIOS.cancelLocalNotifications({uuid: notification.uuid});
136 |
137 | dispatch({
138 | type: 'GET_NOTIFICATIONS',
139 | notifications: notifications
140 | });
141 |
142 | if (notifications.length === 0) {
143 | dispatch(disableEditModeNotifications());
144 | dispatch(disableEditNotifications());
145 | }
146 | });
147 | });
148 | };
149 | };
150 |
151 | const openSidebar = () => {
152 | return (dispatch, getState) => {
153 | dispatch({
154 | type: 'OPEN_SIDEBAR'
155 | });
156 | };
157 | };
158 |
159 | const closeSidebar = () => {
160 | return (dispatch, getState) => {
161 | dispatch({
162 | type: 'CLOSE_SIDEBAR'
163 | });
164 | };
165 | };
166 |
167 | const goTo = (location) => {
168 | return (dispatch, getState) => {
169 | dispatch(closeSidebar());
170 | dispatch({
171 | type: 'GOTO',
172 | location
173 | });
174 | };
175 | };
176 |
177 | export {
178 | openNewNotificationPopup,
179 | closeNewNotificationPopup,
180 | addNotification,
181 | getNotifications,
182 | enableEditNotifications,
183 | disableEditNotifications,
184 | enableEditModeNotifications,
185 | disableEditModeNotifications,
186 | removeNotification,
187 | openSidebar,
188 | closeSidebar,
189 | goTo
190 | };
191 |
192 |
--------------------------------------------------------------------------------
/app/components/food.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import I18n from './../locales';
3 | import { connect } from 'react-redux';
4 | import { loadNotifications } from './../actions';
5 | import Ionicons from 'react-native-vector-icons/Ionicons';
6 | import {
7 | Notifications,
8 | Layout
9 | } from './';
10 |
11 | import {
12 | PushNotificationIOS,
13 | ActivityIndicatorIOS,
14 | StyleSheet,
15 | TabBarIOS,
16 | Text,
17 | View,
18 | ListView,
19 | Modal,
20 | TouchableHighlight
21 | } from 'react-native';
22 |
23 | class Food extends Component {
24 | constructor(props) {
25 | super(props);
26 | this.state = {selected: 'programs'};
27 | }
28 |
29 | componentDidMount() {
30 | PushNotificationIOS.requestPermissions();
31 | }
32 |
33 | render() {
34 | return (
35 |
39 | {
45 | this.setState({selected: 'programs'});
46 | }}>
47 |
50 |
51 |
52 | {
58 | this.setState({selected: 'journal'});
59 | }}>
60 |
63 |
64 |
65 | {
71 | this.setState({selected: 'list'});
72 | }}>
73 |
76 |
77 |
78 | {
84 | this.setState({selected: 'water'});
85 | }}>
86 |
89 |
90 |
91 | {
97 | this.setState({selected: 'notifications'});
98 | }}>
99 |
100 |
101 |
102 | );
103 | }
104 | }
105 |
106 | const mapStateToProps = (state) => {
107 | return {}
108 | }
109 |
110 | export default connect(mapStateToProps)(Food)
111 |
--------------------------------------------------------------------------------
/app/components/index.js:
--------------------------------------------------------------------------------
1 | import Workouts from './workouts';
2 | import Food from './food';
3 | import Notifications from './notifications';
4 | import NewNotificationPopup from './new-notification-popup';
5 | import NavButton from './nav-button';
6 | import Layout from './layout';
7 | import ListItem from './list-item';
8 | import Sidebar from './sidebar';
9 | import SidebarBody from './sidebar-body';
10 |
11 | export {
12 | Workouts,
13 | Food,
14 | Notifications,
15 | NewNotificationPopup,
16 | NavButton,
17 | Layout,
18 | ListItem,
19 | Sidebar,
20 | SidebarBody
21 | }
22 |
--------------------------------------------------------------------------------
/app/components/layout.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import Ionicons from 'react-native-vector-icons/Ionicons';
3 | import {
4 | openSidebar
5 | } from './../actions';
6 | import {
7 | StatusBar,
8 | StyleSheet,
9 | TouchableOpacity,
10 | View,
11 | Text,
12 | Image,
13 | TouchableHighlight
14 | } from 'react-native';
15 | import { connect } from 'react-redux';
16 |
17 | class Layout extends Component {
18 | render() {
19 | const { dispatch, modal, sidebar } = this.props;
20 |
21 | return (
22 |
23 |
24 |
25 |
26 | { modal ||
27 |
28 | dispatch(openSidebar())}
30 | >
31 |
32 |
33 | { this.props.menu &&
34 | {this.props.menu}
35 | }
36 |
37 | }
38 |
39 |
40 | { this.props.left && this.props.left() }
41 |
42 | {this.props.title}
43 |
44 | { this.props.right && this.props.right() }
45 |
46 |
47 |
48 |
49 |
50 | {this.props.children}
51 |
52 |
53 | )
54 | }
55 | }
56 |
57 | const styles = StyleSheet.create({
58 | layout: {
59 | flex: 1,
60 | backgroundColor: 'transparent'
61 | },
62 |
63 | layoutInner: {
64 | flex: 1,
65 | backgroundColor: '#f5f5f5'
66 | },
67 |
68 | bars: {
69 | padding: 10,
70 | marginTop: -10,
71 | marginLeft: -5,
72 | },
73 |
74 | headerTop: {
75 | marginTop: 10,
76 | padding: 15,
77 | flexDirection: 'row'
78 | },
79 |
80 | menuTitle: {
81 | marginLeft: 10,
82 | marginTop: 7,
83 | fontSize: 18,
84 | color: '#fff'
85 | },
86 |
87 | headerImage: {
88 | width: null,
89 | height: null,
90 | resizeMode: 'cover',
91 | },
92 |
93 | header: {
94 | padding: 5,
95 | paddingTop: 80,
96 | height: 120,
97 | alignItems: 'center',
98 | flexDirection: 'row',
99 | justifyContent: 'space-between',
100 | },
101 |
102 | headerModal: {
103 | paddingTop: 30,
104 | height: 70
105 | },
106 |
107 | left: {
108 | flex: 1
109 | },
110 |
111 | right: {
112 | flex: 1
113 | },
114 |
115 | title: {
116 | flex: 2,
117 | color: '#fff',
118 | fontSize: 18,
119 | fontWeight: '500',
120 | lineHeight: 18,
121 | textAlign: 'center',
122 | }
123 | });
124 |
125 | const mapStateToProps = (state) => {
126 | const { sidebar } = state;
127 | return { sidebar }
128 | }
129 |
130 | export default connect(mapStateToProps)(Layout);
131 |
--------------------------------------------------------------------------------
/app/components/list-item.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import I18n, { moment } from './../locales';
3 | import Ionicons from 'react-native-vector-icons/Ionicons';
4 |
5 | import { removeNotification } from './../actions';
6 |
7 | import {
8 | StyleSheet,
9 | View,
10 | Text,
11 | TouchableOpacity
12 | } from 'react-native';
13 | import { connect } from 'react-redux';
14 |
15 | class ListItem extends Component {
16 | render() {
17 | const {
18 | dispatch,
19 | editModeNotifications,
20 | item
21 | } = this.props;
22 |
23 | return (
24 |
25 | { editModeNotifications &&
26 | dispatch(removeNotification(item))}
28 | >
29 |
30 |
31 |
32 |
33 | }
34 |
35 |
36 | {moment(item.date).calendar()}
37 |
38 |
39 |
40 | );
41 | }
42 | }
43 |
44 | const styles = StyleSheet.create({
45 | listItemText: {
46 | fontSize: 18,
47 | },
48 |
49 | listItem: {
50 | flex: 1,
51 | padding: 10,
52 | backgroundColor: '#fff',
53 | borderBottomWidth: .5,
54 | borderBottomColor: '#aaa'
55 | },
56 |
57 | removeIcon: {
58 | padding: 8
59 | }
60 | });
61 |
62 | const mapStateToProps = (state) => {
63 | const {
64 | editModeNotifications
65 | } = state
66 |
67 | return {
68 | editModeNotifications
69 | }
70 | }
71 |
72 | export default connect(mapStateToProps)(ListItem);
73 |
--------------------------------------------------------------------------------
/app/components/nav-button.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import {
3 | StyleSheet,
4 | Text,
5 | TouchableOpacity
6 | } from 'react-native';
7 |
8 | export default class NavButton extends Component {
9 | render() {
10 | return (
11 |
13 | {this.props.name}
14 |
15 | )
16 | }
17 | }
18 |
19 | const styles = StyleSheet.create({
20 | button: {
21 | paddingTop: 10,
22 | paddingBottom: 10,
23 | paddingLeft: 5,
24 | paddingRight: 5,
25 | color: '#fff',
26 | fontSize: 14,
27 | textAlign: 'left'
28 | },
29 |
30 | button_r: {
31 | textAlign: 'right'
32 | }
33 | });
34 |
--------------------------------------------------------------------------------
/app/components/new-notification-popup.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import I18n from './../locales';
3 | import { connect } from 'react-redux';
4 | import {
5 | closeNewNotificationPopup,
6 | addNotification
7 | } from './../actions';
8 | import {
9 | Layout,
10 | NavButton
11 | } from './';
12 | import {
13 | DatePickerIOS,
14 | Modal,
15 | StyleSheet,
16 | View,
17 | Text,
18 | TouchableOpacity
19 | } from 'react-native';
20 |
21 | class NewNotificationPopup extends Component {
22 | constructor(props) {
23 | super(props);
24 | this.state = {date: new Date()};
25 | console.ignoredYellowBox = [
26 | 'Warning: Failed propType',
27 | ];
28 | }
29 |
30 | onDateChange(date) {
31 | this.setState({date});
32 | }
33 |
34 | render() {
35 | const { dispatch, newNotificationPopup } = this.props;
36 |
37 | return (
38 |
41 |
44 | dispatch(closeNewNotificationPopup())}
47 | />
48 | }
49 | right={() =>
50 | {
54 | dispatch(addNotification(this.state.date));
55 | dispatch(closeNewNotificationPopup());
56 | }}
57 | />
58 | }
59 | title={I18n.t('newNotification')}>
60 |
61 |
66 | {I18n.t('will_remind_hour_before')}
67 |
68 |
69 |
70 | )
71 | }
72 | }
73 |
74 | const styles = StyleSheet.create({
75 | modal: {
76 | flex: 1,
77 | backgroundColor: '#fff'
78 | },
79 |
80 | close: {
81 | fontSize: 14,
82 | textAlign: 'left'
83 | },
84 |
85 | done: {
86 | fontSize: 14,
87 | textAlign: 'right'
88 | },
89 |
90 | remind: {
91 | padding: 15,
92 | textAlign: 'center'
93 | }
94 | });
95 |
96 | const mapStateToProps = (state) => {
97 | const { newNotificationPopup } = state
98 | return { newNotificationPopup }
99 | }
100 |
101 | export default connect(mapStateToProps)(NewNotificationPopup);
102 |
--------------------------------------------------------------------------------
/app/components/notifications.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import I18n, { moment } from './../locales';
3 | import Icon from 'react-native-vector-icons/MaterialIcons';
4 | import {
5 | openNewNotificationPopup,
6 | getNotifications,
7 | enableEditModeNotifications,
8 | disableEditModeNotifications
9 | } from './../actions';
10 | import {
11 | AsyncStorage,
12 | StyleSheet,
13 | ListView,
14 | TouchableHighlight,
15 | TouchableOpacity,
16 | View,
17 | Text
18 | } from 'react-native';
19 | import {
20 | Layout,
21 | NavButton,
22 | ListItem,
23 | NewNotificationPopup
24 | } from './';
25 | import { connect } from 'react-redux';
26 |
27 | class Notifications extends Component {
28 | componentDidMount() {
29 | const { dispatch } = this.props;
30 | dispatch(getNotifications());
31 | }
32 |
33 | render() {
34 | const {
35 | dispatch,
36 | notifications,
37 | editNotifications,
38 | editModeNotifications,
39 | newNotificationPopup
40 | } = this.props;
41 |
42 | let ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
43 | const notifications_items = ds.cloneWithRows(notifications.items);
44 |
45 | return (
46 |
51 |
52 | { editNotifications &&
53 |
54 | { editModeNotifications ?
55 | dispatch(disableEditModeNotifications())}
58 | />
59 | :
60 | dispatch(enableEditModeNotifications())}
63 | />
64 | }
65 |
66 | }
67 |
68 | }
69 | right={() =>
70 | {
74 | dispatch(disableEditModeNotifications());
75 | dispatch(openNewNotificationPopup())
76 | }}
77 | />
78 | }>
79 |
83 |
84 | }/>
85 | {newNotificationPopup.open && }
86 |
87 | )
88 | }
89 | }
90 |
91 | const styles = StyleSheet.create({
92 | list: {
93 | flex: 1
94 | },
95 | });
96 |
97 | const mapStateToProps = (state) => {
98 | const {
99 | notifications,
100 | newNotificationPopup,
101 | editNotifications,
102 | editModeNotifications
103 | } = state
104 |
105 | return {
106 | notifications,
107 | newNotificationPopup,
108 | editNotifications,
109 | editModeNotifications
110 | }
111 | }
112 |
113 | export default connect(mapStateToProps)(Notifications);
114 |
--------------------------------------------------------------------------------
/app/components/sidebar-body.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import MaterialIcons from 'react-native-vector-icons/MaterialIcons';
3 | import I18n from './../locales';
4 | import { connect } from 'react-redux';
5 |
6 | import { goTo } from './../actions';
7 |
8 | import {
9 | StyleSheet,
10 | StatusBar,
11 | TouchableHighlight,
12 | Text,
13 | View
14 | } from 'react-native';
15 |
16 | class SidebarBody extends Component {
17 | render() {
18 | const { dispatch } = this.props;
19 |
20 | return (
21 |
22 | dispatch(goTo('workouts'))}>
23 |
24 |
25 | {I18n.t('workouts')}
26 |
27 |
28 | dispatch(goTo('food'))}>
29 |
30 |
31 | {I18n.t('food')}
32 |
33 |
34 | dispatch(goTo('profile'))}>
35 |
36 |
37 | {I18n.t('profile')}
38 |
39 |
40 |
41 | );
42 | }
43 | }
44 |
45 | const styles = StyleSheet.create({
46 | menuItem: {
47 | padding: 15,
48 | flexDirection: 'row',
49 | borderBottomWidth: 1,
50 | borderBottomColor: '#ccc'
51 | },
52 |
53 | menuItemFirst: {
54 | borderTopWidth: 1,
55 | borderTopColor: '#ccc'
56 | },
57 |
58 | menuItemText: {
59 | marginTop: 4,
60 | marginLeft: 15,
61 | }
62 | });
63 |
64 | const mapStateToProps = (state) => {
65 | return { }
66 | }
67 |
68 | export default connect(mapStateToProps)(SidebarBody);
69 |
--------------------------------------------------------------------------------
/app/components/sidebar.js:
--------------------------------------------------------------------------------
1 | import {
2 | StyleSheet,
3 | Animated,
4 | View,
5 | Text,
6 | TouchableWithoutFeedback
7 | } from 'react-native';
8 |
9 | import {
10 | closeSidebar
11 | } from './../actions';
12 |
13 | import {
14 | SidebarBody
15 | } from './';
16 |
17 | import { connect } from 'react-redux';
18 | import React, { Component } from 'react';
19 |
20 | const WIDTH = 250;
21 |
22 | class Sidebar extends Component {
23 | constructor(props) {
24 | super(props);
25 | const { dispatch } = props;
26 |
27 | let left = new Animated.Value(-WIDTH);
28 | left.addListener(({ value }) => {
29 | if (value == -WIDTH) {
30 | dispatch(closeSidebar());
31 | }
32 | });
33 |
34 | this.state = {left};
35 | }
36 |
37 | componentDidMount() {
38 | Animated.timing(
39 | this.state.left,
40 | {toValue: 0}
41 | ).start();
42 | }
43 |
44 | render() {
45 | const { dispatch, sidebar } = this.props;
46 |
47 | return (
48 | {
50 | Animated.timing(
51 | this.state.left,
52 | {toValue: -WIDTH}
53 | ).start();
54 | }}
55 | >
56 |
59 |
60 |
62 |
63 |
64 |
65 |
66 |
67 | );
68 | }
69 | }
70 |
71 | const mapStateToProps = (state) => {
72 | const { sidebar } = state;
73 | return { sidebar };
74 | };
75 |
76 | const styles = StyleSheet.create({
77 | sidebar: {
78 | position: 'absolute',
79 | top: 0,
80 | left: 0,
81 | bottom: 0,
82 | width: 250,
83 | overflow: 'hidden',
84 | backgroundColor: '#eee'
85 | },
86 |
87 | sidebar__overlay: {
88 | position: 'absolute',
89 | top: 0,
90 | right: 0,
91 | bottom: 0,
92 | left: 0,
93 | backgroundColor: 'rgba(0,0,0,.3)'
94 | },
95 | });
96 |
97 | export default connect(mapStateToProps)(Sidebar);
98 |
--------------------------------------------------------------------------------
/app/components/workouts.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import I18n from './../locales';
3 | import { connect } from 'react-redux';
4 | import { loadNotifications } from './../actions';
5 | import Ionicons from 'react-native-vector-icons/Ionicons';
6 | import {
7 | Notifications,
8 | Layout
9 | } from './';
10 |
11 | import {
12 | PushNotificationIOS,
13 | ActivityIndicatorIOS,
14 | StyleSheet,
15 | TabBarIOS,
16 | Text,
17 | Image,
18 | View,
19 | ScrollView,
20 | ListView,
21 | Modal,
22 | TouchableHighlight
23 | } from 'react-native';
24 |
25 | class Workouts extends Component {
26 | constructor(props) {
27 | super(props);
28 | this.state = {selected: 'programs'};
29 | }
30 |
31 | componentDidMount() {
32 | PushNotificationIOS.requestPermissions();
33 | }
34 |
35 | render() {
36 | return (
37 |
41 | {
47 | this.setState({selected: 'programs'});
48 | }}>
49 |
52 |
53 |
54 |
55 | Программа "Рельеф"
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | {
70 | this.setState({selected: 'journal'});
71 | }}>
72 |
76 |
77 |
78 | {
84 | this.setState({selected: 'list'});
85 | }}>
86 |
90 |
91 |
92 | {
98 | this.setState({selected: 'notifications'});
99 | }}>
100 |
101 |
102 |
103 | );
104 | }
105 | }
106 |
107 | const mapStateToProps = (state) => {
108 | return {}
109 | }
110 |
111 | export default connect(mapStateToProps)(Workouts)
112 |
--------------------------------------------------------------------------------
/app/configureStore.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware } from 'redux';
2 | import {
3 | AsyncStorage
4 | } from 'react-native';
5 | import thunkMiddleware from 'redux-thunk';
6 | import createLogger from 'redux-logger';
7 | import rootReducer from './reducers';
8 |
9 | const loggerMiddleware = createLogger();
10 |
11 | export default (initialState) => {
12 | return createStore(
13 | rootReducer,
14 | initialState,
15 | applyMiddleware(
16 | thunkMiddleware,
17 | loggerMiddleware
18 | )
19 | );
20 | }
21 |
--------------------------------------------------------------------------------
/app/containers/main.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import {
3 | Workouts,
4 | Food,
5 | Profile,
6 | Sidebar
7 | } from './../components';
8 | import { connect } from 'react-redux';
9 |
10 | import {
11 | View
12 | } from 'react-native';
13 |
14 | class Main extends Component {
15 | renderLocation(location) {
16 | switch (location) {
17 | case 'workouts':
18 | return ;
19 | case 'food':
20 | return ;
21 | case 'profile':
22 | return ;
23 | default:
24 | return ;
25 | }
26 | }
27 |
28 | render() {
29 | const { dispatch, sidebar, location } = this.props;
30 |
31 | return (
32 |
33 | { this.renderLocation(location) }
34 |
35 | { sidebar &&
36 |
37 | }
38 |
39 | );
40 | }
41 | }
42 |
43 | const mapStateToProps = (state) => {
44 | const { sidebar, location } = state;
45 | return { sidebar, location }
46 | }
47 |
48 | export default connect(mapStateToProps)(Main);
49 |
--------------------------------------------------------------------------------
/app/images/layout.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/app/images/layout.png
--------------------------------------------------------------------------------
/app/images/layout2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/app/images/layout2.png
--------------------------------------------------------------------------------
/app/images/layout3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/app/images/layout3.png
--------------------------------------------------------------------------------
/app/images/layout4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/app/images/layout4.png
--------------------------------------------------------------------------------
/app/images/program.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/app/images/program.png
--------------------------------------------------------------------------------
/app/locales.js:
--------------------------------------------------------------------------------
1 | import I18n from 'react-native-i18n';
2 | import moment from 'moment';
3 |
4 | I18n.fallbacks = true;
5 |
6 | I18n.translations = {
7 | 'en-US': {
8 | workout: 'Workout',
9 | workouts: 'Workouts',
10 | notification: 'Notification',
11 | notifications: 'Notifications',
12 | programs: 'Programs',
13 | journal: 'Journal',
14 | notifications: 'Notifications',
15 | newNotification: 'New',
16 | exercises: 'Exercises',
17 | products: 'Products',
18 | water: 'Water',
19 | food: 'Food',
20 | newFood: 'New',
21 | profile: 'Profile',
22 | add: 'Add',
23 | edit: 'Edit',
24 | close: 'Close',
25 | done: 'Done',
26 | will_remind_hour_before: `We'll remind you about the workout for 1 hour before the start.`
27 | },
28 |
29 | 'ru': {
30 | workout: 'Тренировка',
31 | workouts: 'Тренировки',
32 | notification: 'Напоминание',
33 | notifications: 'Напоминания',
34 | programs: 'Программы',
35 | journal: 'Дневник',
36 | notifications: 'Напоминания',
37 | newNotification: 'Новая',
38 | exercises: 'Упражнения',
39 | products: 'Продукты',
40 | water: 'Вода',
41 | food: 'Питание',
42 | newFood: 'Новая',
43 | profile: 'Профиль',
44 | add: 'Добавить',
45 | edit: 'Изменить',
46 | close: 'Закрыть',
47 | done: 'Готово',
48 | will_remind_hour_before: 'Мы напомним вам о тренировке за один час до начала.'
49 | }
50 | }
51 |
52 | if (!I18n.locale.match(/en/)) {
53 | let ruLocale = require('moment/locale/ru');
54 | moment.updateLocale('ru', ruLocale);
55 | }
56 |
57 | export default I18n;
58 | export { I18n, moment };
59 |
--------------------------------------------------------------------------------
/app/reducers.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux';
2 |
3 | const notifications = (state = {
4 | items: []
5 | }, action) => {
6 | switch (action.type) {
7 | case 'GET_NOTIFICATIONS':
8 | return {
9 | items: action.notifications
10 | }
11 | default:
12 | return state
13 | }
14 | };
15 |
16 | const newNotificationPopup = (state = {
17 | open: false
18 | }, action) => {
19 | switch (action.type) {
20 | case 'OPEN_NEW_NOTIFICATION_POPUP':
21 | return Object.assign({}, state, {
22 | open: true
23 | });
24 | case 'CLOSE_NEW_NOTIFICATION_POPUP':
25 | return Object.assign({}, state, {
26 | open: false
27 | });
28 | default:
29 | return state;
30 | }
31 | };
32 |
33 | const editNotifications = (state = false, action) => {
34 | switch (action.type) {
35 | case 'ENABLE_EDIT_NOTIFICATIONS':
36 | return true;
37 | case 'DISABLE_EDIT_NOTIFICATIONS':
38 | return false;
39 | default:
40 | return state;
41 | }
42 | };
43 |
44 | const editModeNotifications = (state = false, action) => {
45 | switch (action.type) {
46 | case 'ENABLE_EDIT_MODE_NOTIFICATIONS':
47 | return true;
48 | case 'DISABLE_EDIT_MODE_NOTIFICATIONS':
49 | return false;
50 | default:
51 | return state;
52 | }
53 | };
54 |
55 | const sidebar = (state = false, action) => {
56 | switch (action.type) {
57 | case 'OPEN_SIDEBAR':
58 | return true;
59 | case 'CLOSE_SIDEBAR':
60 | return false;
61 | default:
62 | return state;
63 | }
64 | };
65 |
66 | const location = (state = 'workouts', action) => {
67 | switch (action.type) {
68 | case 'GOTO':
69 | return action.location;
70 | default:
71 | return state;
72 | }
73 | };
74 |
75 | const rootReducer = combineReducers({
76 | notifications,
77 | newNotificationPopup,
78 | editModeNotifications,
79 | editNotifications,
80 | sidebar,
81 | location
82 | });
83 |
84 | export default rootReducer;
85 |
--------------------------------------------------------------------------------
/app/utils.js:
--------------------------------------------------------------------------------
1 | const generateUUID = () => {
2 | var d = new Date().getTime();
3 |
4 | var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
5 | var r = (d + Math.random()*16)%16 | 0;
6 | d = Math.floor(d/16);
7 | return (c=='x' ? r : (r&0x3|0x8)).toString(16);
8 | });
9 |
10 | return uuid;
11 | };
12 |
13 | export {
14 | generateUUID
15 | };
16 |
--------------------------------------------------------------------------------
/index.ios.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { AppRegistry } from 'react-native';
3 | import { Provider } from 'react-redux';
4 | import configureStore from './app/configureStore';
5 | import Main from './app/containers/main';
6 |
7 | const store = configureStore();
8 |
9 | class Root extends Component {
10 | render() {
11 | return (
12 |
13 |
14 |
15 | );
16 | }
17 | }
18 |
19 | AppRegistry.registerComponent('ProFit', () => Root);
20 |
--------------------------------------------------------------------------------
/ios/ProFit.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 0009C6A11CE51AA800F397EA /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0009C69F1CE51AA800F397EA /* Launch Screen.storyboard */; };
11 | 006ECCEA1CE769A9002AA97F /* libRCTPushNotification.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 006ECCE91CE76983002AA97F /* libRCTPushNotification.a */; };
12 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
13 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
14 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
15 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
16 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
17 | 00E356F31AD99517003FC87E /* ProFitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ProFitTests.m */; };
18 | 0D1D7F0C3E174A95B9146906 /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E686E15CC6244991A9715B6C /* FontAwesome.ttf */; };
19 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
20 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
21 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
22 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
23 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
24 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
25 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
26 | 23A79E4B8AB24799BD64FA0B /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6D624351F34645A59203052C /* Foundation.ttf */; };
27 | 2A94A8A0EA1747CCA6CDAC76 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C6E82CACEF064EDAAFFCF84F /* MaterialIcons.ttf */; };
28 | 69BEC1FA6FC341D0836DBB53 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 265F82B41D3649B281695ED3 /* Octicons.ttf */; };
29 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
30 | A1791576349C45698CE8825C /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8005CA7927BF44E1AD587B5D /* Ionicons.ttf */; };
31 | BF9FA749EC0D4231805C14B2 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0499736F14584559971DF841 /* Entypo.ttf */; };
32 | C2322765ABCA45A29362C7EB /* libRNI18n.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 36492CB6294648C091D73719 /* libRNI18n.a */; };
33 | C94FDD273CC449C588F96D0F /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F1B86588298B493087C2F8B0 /* EvilIcons.ttf */; };
34 | DA5EB0EABE90476FB7331757 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D3B5CD6269B04B4C922CA176 /* libRNVectorIcons.a */; };
35 | F5E2D2CA077840A18B2D1247 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A2B7BA84E9034E068C81EC65 /* Zocial.ttf */; };
36 | /* End PBXBuildFile section */
37 |
38 | /* Begin PBXContainerItemProxy section */
39 | 0009C6961CE51A6A00F397EA /* PBXContainerItemProxy */ = {
40 | isa = PBXContainerItemProxy;
41 | containerPortal = B2D15295D6CC4051B805E3B1 /* RNI18n.xcodeproj */;
42 | proxyType = 2;
43 | remoteGlobalIDString = CDD7BF781B2D5125006FDA75;
44 | remoteInfo = RNI18n;
45 | };
46 | 0009C6981CE51A6A00F397EA /* PBXContainerItemProxy */ = {
47 | isa = PBXContainerItemProxy;
48 | containerPortal = B2D15295D6CC4051B805E3B1 /* RNI18n.xcodeproj */;
49 | proxyType = 2;
50 | remoteGlobalIDString = CDD7BF831B2D5126006FDA75;
51 | remoteInfo = RNI18nTests;
52 | };
53 | 0009C69D1CE51A6A00F397EA /* PBXContainerItemProxy */ = {
54 | isa = PBXContainerItemProxy;
55 | containerPortal = 2AB70AE02B7F455EA7CC7D3B /* RNVectorIcons.xcodeproj */;
56 | proxyType = 2;
57 | remoteGlobalIDString = 5DBEB1501B18CEA900B34395;
58 | remoteInfo = RNVectorIcons;
59 | };
60 | 006ECCE81CE76983002AA97F /* PBXContainerItemProxy */ = {
61 | isa = PBXContainerItemProxy;
62 | containerPortal = 006ECCE41CE76983002AA97F /* RCTPushNotification.xcodeproj */;
63 | proxyType = 2;
64 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
65 | remoteInfo = RCTPushNotification;
66 | };
67 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
68 | isa = PBXContainerItemProxy;
69 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
70 | proxyType = 2;
71 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
72 | remoteInfo = RCTActionSheet;
73 | };
74 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
75 | isa = PBXContainerItemProxy;
76 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
77 | proxyType = 2;
78 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
79 | remoteInfo = RCTGeolocation;
80 | };
81 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
82 | isa = PBXContainerItemProxy;
83 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
84 | proxyType = 2;
85 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
86 | remoteInfo = RCTImage;
87 | };
88 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
89 | isa = PBXContainerItemProxy;
90 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
91 | proxyType = 2;
92 | remoteGlobalIDString = 58B511DB1A9E6C8500147676;
93 | remoteInfo = RCTNetwork;
94 | };
95 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
96 | isa = PBXContainerItemProxy;
97 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
98 | proxyType = 2;
99 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
100 | remoteInfo = RCTVibration;
101 | };
102 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
103 | isa = PBXContainerItemProxy;
104 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
105 | proxyType = 1;
106 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
107 | remoteInfo = ProFit;
108 | };
109 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
110 | isa = PBXContainerItemProxy;
111 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
112 | proxyType = 2;
113 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
114 | remoteInfo = RCTSettings;
115 | };
116 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
117 | isa = PBXContainerItemProxy;
118 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
119 | proxyType = 2;
120 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
121 | remoteInfo = RCTWebSocket;
122 | };
123 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
124 | isa = PBXContainerItemProxy;
125 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
126 | proxyType = 2;
127 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
128 | remoteInfo = React;
129 | };
130 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
131 | isa = PBXContainerItemProxy;
132 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
133 | proxyType = 2;
134 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
135 | remoteInfo = RCTLinking;
136 | };
137 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
138 | isa = PBXContainerItemProxy;
139 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
140 | proxyType = 2;
141 | remoteGlobalIDString = 58B5119B1A9E6C1200147676;
142 | remoteInfo = RCTText;
143 | };
144 | /* End PBXContainerItemProxy section */
145 |
146 | /* Begin PBXFileReference section */
147 | 0009C6A01CE51AA800F397EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "ProFit/Base.lproj/Launch Screen.storyboard"; sourceTree = ""; };
148 | 006ECCE41CE76983002AA97F /* RCTPushNotification.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTPushNotification.xcodeproj; path = "../node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj"; sourceTree = ""; };
149 | 006ECD061CE7A351002AA97F /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = "ProFit/ru.lproj/Launch Screen.strings"; sourceTree = ""; };
150 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
151 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; };
152 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; };
153 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; };
154 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; };
155 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; };
156 | 00E356EE1AD99517003FC87E /* ProFit.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ProFit.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
157 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
158 | 00E356F21AD99517003FC87E /* ProFitTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ProFitTests.m; sourceTree = ""; };
159 | 0499736F14584559971DF841 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; };
160 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; };
161 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; };
162 | 13B07F961A680F5B00A75B9A /* ProFit.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ProFit.app; sourceTree = BUILT_PRODUCTS_DIR; };
163 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ProFit/AppDelegate.h; sourceTree = ""; };
164 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ProFit/AppDelegate.m; sourceTree = ""; };
165 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ProFit/Images.xcassets; sourceTree = ""; };
166 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ProFit/Info.plist; sourceTree = ""; };
167 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ProFit/main.m; sourceTree = ""; };
168 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; };
169 | 265F82B41D3649B281695ED3 /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; };
170 | 2AB70AE02B7F455EA7CC7D3B /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; };
171 | 36492CB6294648C091D73719 /* libRNI18n.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNI18n.a; sourceTree = ""; };
172 | 6D624351F34645A59203052C /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; };
173 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; };
174 | 8005CA7927BF44E1AD587B5D /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; };
175 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; };
176 | A2B7BA84E9034E068C81EC65 /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; };
177 | B2D15295D6CC4051B805E3B1 /* RNI18n.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNI18n.xcodeproj; path = "../node_modules/react-native-i18n/RNI18n.xcodeproj"; sourceTree = ""; };
178 | C6E82CACEF064EDAAFFCF84F /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; };
179 | D3B5CD6269B04B4C922CA176 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; };
180 | E686E15CC6244991A9715B6C /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; };
181 | F1B86588298B493087C2F8B0 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; };
182 | /* End PBXFileReference section */
183 |
184 | /* Begin PBXFrameworksBuildPhase section */
185 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
186 | isa = PBXFrameworksBuildPhase;
187 | buildActionMask = 2147483647;
188 | files = (
189 | );
190 | runOnlyForDeploymentPostprocessing = 0;
191 | };
192 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
193 | isa = PBXFrameworksBuildPhase;
194 | buildActionMask = 2147483647;
195 | files = (
196 | 006ECCEA1CE769A9002AA97F /* libRCTPushNotification.a in Frameworks */,
197 | 146834051AC3E58100842450 /* libReact.a in Frameworks */,
198 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
199 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
200 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
201 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
202 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
203 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
204 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
205 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
206 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
207 | C2322765ABCA45A29362C7EB /* libRNI18n.a in Frameworks */,
208 | DA5EB0EABE90476FB7331757 /* libRNVectorIcons.a in Frameworks */,
209 | );
210 | runOnlyForDeploymentPostprocessing = 0;
211 | };
212 | /* End PBXFrameworksBuildPhase section */
213 |
214 | /* Begin PBXGroup section */
215 | 0009C6881CE51A6A00F397EA /* Products */ = {
216 | isa = PBXGroup;
217 | children = (
218 | 0009C6971CE51A6A00F397EA /* libRNI18n.a */,
219 | 0009C6991CE51A6A00F397EA /* RNI18nTests.xctest */,
220 | );
221 | name = Products;
222 | sourceTree = "";
223 | };
224 | 0009C69A1CE51A6A00F397EA /* Products */ = {
225 | isa = PBXGroup;
226 | children = (
227 | 0009C69E1CE51A6A00F397EA /* libRNVectorIcons.a */,
228 | );
229 | name = Products;
230 | sourceTree = "";
231 | };
232 | 006ECCE51CE76983002AA97F /* Products */ = {
233 | isa = PBXGroup;
234 | children = (
235 | 006ECCE91CE76983002AA97F /* libRCTPushNotification.a */,
236 | );
237 | name = Products;
238 | sourceTree = "";
239 | };
240 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = {
241 | isa = PBXGroup;
242 | children = (
243 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
244 | );
245 | name = Products;
246 | sourceTree = "";
247 | };
248 | 00C302B61ABCB90400DB3ED1 /* Products */ = {
249 | isa = PBXGroup;
250 | children = (
251 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
252 | );
253 | name = Products;
254 | sourceTree = "";
255 | };
256 | 00C302BC1ABCB91800DB3ED1 /* Products */ = {
257 | isa = PBXGroup;
258 | children = (
259 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
260 | );
261 | name = Products;
262 | sourceTree = "";
263 | };
264 | 00C302D41ABCB9D200DB3ED1 /* Products */ = {
265 | isa = PBXGroup;
266 | children = (
267 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
268 | );
269 | name = Products;
270 | sourceTree = "";
271 | };
272 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = {
273 | isa = PBXGroup;
274 | children = (
275 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
276 | );
277 | name = Products;
278 | sourceTree = "";
279 | };
280 | 00E356EF1AD99517003FC87E /* ProFitTests */ = {
281 | isa = PBXGroup;
282 | children = (
283 | 00E356F21AD99517003FC87E /* ProFitTests.m */,
284 | 00E356F01AD99517003FC87E /* Supporting Files */,
285 | );
286 | path = ProFitTests;
287 | sourceTree = "";
288 | };
289 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
290 | isa = PBXGroup;
291 | children = (
292 | 00E356F11AD99517003FC87E /* Info.plist */,
293 | );
294 | name = "Supporting Files";
295 | sourceTree = "";
296 | };
297 | 139105B71AF99BAD00B5F7CC /* Products */ = {
298 | isa = PBXGroup;
299 | children = (
300 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
301 | );
302 | name = Products;
303 | sourceTree = "";
304 | };
305 | 139FDEE71B06529A00C62182 /* Products */ = {
306 | isa = PBXGroup;
307 | children = (
308 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
309 | );
310 | name = Products;
311 | sourceTree = "";
312 | };
313 | 13B07FAE1A68108700A75B9A /* ProFit */ = {
314 | isa = PBXGroup;
315 | children = (
316 | 0009C69F1CE51AA800F397EA /* Launch Screen.storyboard */,
317 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
318 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
319 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
320 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
321 | 13B07FB61A68108700A75B9A /* Info.plist */,
322 | 13B07FB71A68108700A75B9A /* main.m */,
323 | );
324 | name = ProFit;
325 | sourceTree = "";
326 | };
327 | 146834001AC3E56700842450 /* Products */ = {
328 | isa = PBXGroup;
329 | children = (
330 | 146834041AC3E56700842450 /* libReact.a */,
331 | );
332 | name = Products;
333 | sourceTree = "";
334 | };
335 | 62E4836D54684F869BF99172 /* Resources */ = {
336 | isa = PBXGroup;
337 | children = (
338 | 0499736F14584559971DF841 /* Entypo.ttf */,
339 | F1B86588298B493087C2F8B0 /* EvilIcons.ttf */,
340 | E686E15CC6244991A9715B6C /* FontAwesome.ttf */,
341 | 6D624351F34645A59203052C /* Foundation.ttf */,
342 | 8005CA7927BF44E1AD587B5D /* Ionicons.ttf */,
343 | C6E82CACEF064EDAAFFCF84F /* MaterialIcons.ttf */,
344 | 265F82B41D3649B281695ED3 /* Octicons.ttf */,
345 | A2B7BA84E9034E068C81EC65 /* Zocial.ttf */,
346 | );
347 | name = Resources;
348 | sourceTree = "";
349 | };
350 | 78C398B11ACF4ADC00677621 /* Products */ = {
351 | isa = PBXGroup;
352 | children = (
353 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
354 | );
355 | name = Products;
356 | sourceTree = "";
357 | };
358 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
359 | isa = PBXGroup;
360 | children = (
361 | 006ECCE41CE76983002AA97F /* RCTPushNotification.xcodeproj */,
362 | 146833FF1AC3E56700842450 /* React.xcodeproj */,
363 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
364 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
365 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
366 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
367 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
368 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
369 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
370 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
371 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
372 | B2D15295D6CC4051B805E3B1 /* RNI18n.xcodeproj */,
373 | 2AB70AE02B7F455EA7CC7D3B /* RNVectorIcons.xcodeproj */,
374 | );
375 | name = Libraries;
376 | sourceTree = "";
377 | };
378 | 832341B11AAA6A8300B99B32 /* Products */ = {
379 | isa = PBXGroup;
380 | children = (
381 | 832341B51AAA6A8300B99B32 /* libRCTText.a */,
382 | );
383 | name = Products;
384 | sourceTree = "";
385 | };
386 | 83CBB9F61A601CBA00E9B192 = {
387 | isa = PBXGroup;
388 | children = (
389 | 13B07FAE1A68108700A75B9A /* ProFit */,
390 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
391 | 00E356EF1AD99517003FC87E /* ProFitTests */,
392 | 83CBBA001A601CBA00E9B192 /* Products */,
393 | 62E4836D54684F869BF99172 /* Resources */,
394 | );
395 | indentWidth = 2;
396 | sourceTree = "";
397 | tabWidth = 2;
398 | };
399 | 83CBBA001A601CBA00E9B192 /* Products */ = {
400 | isa = PBXGroup;
401 | children = (
402 | 13B07F961A680F5B00A75B9A /* ProFit.app */,
403 | 00E356EE1AD99517003FC87E /* ProFit.xctest */,
404 | );
405 | name = Products;
406 | sourceTree = "";
407 | };
408 | /* End PBXGroup section */
409 |
410 | /* Begin PBXNativeTarget section */
411 | 00E356ED1AD99517003FC87E /* ProFitTests */ = {
412 | isa = PBXNativeTarget;
413 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ProFitTests" */;
414 | buildPhases = (
415 | 00E356EA1AD99517003FC87E /* Sources */,
416 | 00E356EB1AD99517003FC87E /* Frameworks */,
417 | 00E356EC1AD99517003FC87E /* Resources */,
418 | );
419 | buildRules = (
420 | );
421 | dependencies = (
422 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
423 | );
424 | name = ProFitTests;
425 | productName = ProFitTests;
426 | productReference = 00E356EE1AD99517003FC87E /* ProFit.xctest */;
427 | productType = "com.apple.product-type.bundle.unit-test";
428 | };
429 | 13B07F861A680F5B00A75B9A /* ProFit */ = {
430 | isa = PBXNativeTarget;
431 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ProFit" */;
432 | buildPhases = (
433 | 13B07F871A680F5B00A75B9A /* Sources */,
434 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
435 | 13B07F8E1A680F5B00A75B9A /* Resources */,
436 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
437 | );
438 | buildRules = (
439 | );
440 | dependencies = (
441 | );
442 | name = ProFit;
443 | productName = "Hello World";
444 | productReference = 13B07F961A680F5B00A75B9A /* ProFit.app */;
445 | productType = "com.apple.product-type.application";
446 | };
447 | /* End PBXNativeTarget section */
448 |
449 | /* Begin PBXProject section */
450 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
451 | isa = PBXProject;
452 | attributes = {
453 | LastUpgradeCheck = 610;
454 | ORGANIZATIONNAME = Facebook;
455 | TargetAttributes = {
456 | 00E356ED1AD99517003FC87E = {
457 | CreatedOnToolsVersion = 6.2;
458 | TestTargetID = 13B07F861A680F5B00A75B9A;
459 | };
460 | 13B07F861A680F5B00A75B9A = {
461 | DevelopmentTeam = YRYY3MUZEK;
462 | SystemCapabilities = {
463 | com.apple.Push = {
464 | enabled = 1;
465 | };
466 | };
467 | };
468 | };
469 | };
470 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ProFit" */;
471 | compatibilityVersion = "Xcode 3.2";
472 | developmentRegion = English;
473 | hasScannedForEncodings = 0;
474 | knownRegions = (
475 | en,
476 | Base,
477 | );
478 | mainGroup = 83CBB9F61A601CBA00E9B192;
479 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
480 | projectDirPath = "";
481 | projectReferences = (
482 | {
483 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
484 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
485 | },
486 | {
487 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
488 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
489 | },
490 | {
491 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
492 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
493 | },
494 | {
495 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
496 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
497 | },
498 | {
499 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
500 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
501 | },
502 | {
503 | ProductGroup = 006ECCE51CE76983002AA97F /* Products */;
504 | ProjectRef = 006ECCE41CE76983002AA97F /* RCTPushNotification.xcodeproj */;
505 | },
506 | {
507 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
508 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
509 | },
510 | {
511 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
512 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
513 | },
514 | {
515 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
516 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
517 | },
518 | {
519 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
520 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
521 | },
522 | {
523 | ProductGroup = 146834001AC3E56700842450 /* Products */;
524 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
525 | },
526 | {
527 | ProductGroup = 0009C6881CE51A6A00F397EA /* Products */;
528 | ProjectRef = B2D15295D6CC4051B805E3B1 /* RNI18n.xcodeproj */;
529 | },
530 | {
531 | ProductGroup = 0009C69A1CE51A6A00F397EA /* Products */;
532 | ProjectRef = 2AB70AE02B7F455EA7CC7D3B /* RNVectorIcons.xcodeproj */;
533 | },
534 | );
535 | projectRoot = "";
536 | targets = (
537 | 13B07F861A680F5B00A75B9A /* ProFit */,
538 | 00E356ED1AD99517003FC87E /* ProFitTests */,
539 | );
540 | };
541 | /* End PBXProject section */
542 |
543 | /* Begin PBXReferenceProxy section */
544 | 0009C6971CE51A6A00F397EA /* libRNI18n.a */ = {
545 | isa = PBXReferenceProxy;
546 | fileType = archive.ar;
547 | path = libRNI18n.a;
548 | remoteRef = 0009C6961CE51A6A00F397EA /* PBXContainerItemProxy */;
549 | sourceTree = BUILT_PRODUCTS_DIR;
550 | };
551 | 0009C6991CE51A6A00F397EA /* RNI18nTests.xctest */ = {
552 | isa = PBXReferenceProxy;
553 | fileType = wrapper.cfbundle;
554 | path = RNI18nTests.xctest;
555 | remoteRef = 0009C6981CE51A6A00F397EA /* PBXContainerItemProxy */;
556 | sourceTree = BUILT_PRODUCTS_DIR;
557 | };
558 | 0009C69E1CE51A6A00F397EA /* libRNVectorIcons.a */ = {
559 | isa = PBXReferenceProxy;
560 | fileType = archive.ar;
561 | path = libRNVectorIcons.a;
562 | remoteRef = 0009C69D1CE51A6A00F397EA /* PBXContainerItemProxy */;
563 | sourceTree = BUILT_PRODUCTS_DIR;
564 | };
565 | 006ECCE91CE76983002AA97F /* libRCTPushNotification.a */ = {
566 | isa = PBXReferenceProxy;
567 | fileType = archive.ar;
568 | path = libRCTPushNotification.a;
569 | remoteRef = 006ECCE81CE76983002AA97F /* PBXContainerItemProxy */;
570 | sourceTree = BUILT_PRODUCTS_DIR;
571 | };
572 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
573 | isa = PBXReferenceProxy;
574 | fileType = archive.ar;
575 | path = libRCTActionSheet.a;
576 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
577 | sourceTree = BUILT_PRODUCTS_DIR;
578 | };
579 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
580 | isa = PBXReferenceProxy;
581 | fileType = archive.ar;
582 | path = libRCTGeolocation.a;
583 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
584 | sourceTree = BUILT_PRODUCTS_DIR;
585 | };
586 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
587 | isa = PBXReferenceProxy;
588 | fileType = archive.ar;
589 | path = libRCTImage.a;
590 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
591 | sourceTree = BUILT_PRODUCTS_DIR;
592 | };
593 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
594 | isa = PBXReferenceProxy;
595 | fileType = archive.ar;
596 | path = libRCTNetwork.a;
597 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
598 | sourceTree = BUILT_PRODUCTS_DIR;
599 | };
600 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
601 | isa = PBXReferenceProxy;
602 | fileType = archive.ar;
603 | path = libRCTVibration.a;
604 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
605 | sourceTree = BUILT_PRODUCTS_DIR;
606 | };
607 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
608 | isa = PBXReferenceProxy;
609 | fileType = archive.ar;
610 | path = libRCTSettings.a;
611 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
612 | sourceTree = BUILT_PRODUCTS_DIR;
613 | };
614 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
615 | isa = PBXReferenceProxy;
616 | fileType = archive.ar;
617 | path = libRCTWebSocket.a;
618 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
619 | sourceTree = BUILT_PRODUCTS_DIR;
620 | };
621 | 146834041AC3E56700842450 /* libReact.a */ = {
622 | isa = PBXReferenceProxy;
623 | fileType = archive.ar;
624 | path = libReact.a;
625 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
626 | sourceTree = BUILT_PRODUCTS_DIR;
627 | };
628 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
629 | isa = PBXReferenceProxy;
630 | fileType = archive.ar;
631 | path = libRCTLinking.a;
632 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
633 | sourceTree = BUILT_PRODUCTS_DIR;
634 | };
635 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
636 | isa = PBXReferenceProxy;
637 | fileType = archive.ar;
638 | path = libRCTText.a;
639 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
640 | sourceTree = BUILT_PRODUCTS_DIR;
641 | };
642 | /* End PBXReferenceProxy section */
643 |
644 | /* Begin PBXResourcesBuildPhase section */
645 | 00E356EC1AD99517003FC87E /* Resources */ = {
646 | isa = PBXResourcesBuildPhase;
647 | buildActionMask = 2147483647;
648 | files = (
649 | );
650 | runOnlyForDeploymentPostprocessing = 0;
651 | };
652 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
653 | isa = PBXResourcesBuildPhase;
654 | buildActionMask = 2147483647;
655 | files = (
656 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
657 | BF9FA749EC0D4231805C14B2 /* Entypo.ttf in Resources */,
658 | C94FDD273CC449C588F96D0F /* EvilIcons.ttf in Resources */,
659 | 0D1D7F0C3E174A95B9146906 /* FontAwesome.ttf in Resources */,
660 | 23A79E4B8AB24799BD64FA0B /* Foundation.ttf in Resources */,
661 | A1791576349C45698CE8825C /* Ionicons.ttf in Resources */,
662 | 2A94A8A0EA1747CCA6CDAC76 /* MaterialIcons.ttf in Resources */,
663 | 69BEC1FA6FC341D0836DBB53 /* Octicons.ttf in Resources */,
664 | 0009C6A11CE51AA800F397EA /* Launch Screen.storyboard in Resources */,
665 | F5E2D2CA077840A18B2D1247 /* Zocial.ttf in Resources */,
666 | );
667 | runOnlyForDeploymentPostprocessing = 0;
668 | };
669 | /* End PBXResourcesBuildPhase section */
670 |
671 | /* Begin PBXShellScriptBuildPhase section */
672 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
673 | isa = PBXShellScriptBuildPhase;
674 | buildActionMask = 2147483647;
675 | files = (
676 | );
677 | inputPaths = (
678 | );
679 | name = "Bundle React Native code and images";
680 | outputPaths = (
681 | );
682 | runOnlyForDeploymentPostprocessing = 0;
683 | shellPath = /bin/sh;
684 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh";
685 | };
686 | /* End PBXShellScriptBuildPhase section */
687 |
688 | /* Begin PBXSourcesBuildPhase section */
689 | 00E356EA1AD99517003FC87E /* Sources */ = {
690 | isa = PBXSourcesBuildPhase;
691 | buildActionMask = 2147483647;
692 | files = (
693 | 00E356F31AD99517003FC87E /* ProFitTests.m in Sources */,
694 | );
695 | runOnlyForDeploymentPostprocessing = 0;
696 | };
697 | 13B07F871A680F5B00A75B9A /* Sources */ = {
698 | isa = PBXSourcesBuildPhase;
699 | buildActionMask = 2147483647;
700 | files = (
701 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
702 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
703 | );
704 | runOnlyForDeploymentPostprocessing = 0;
705 | };
706 | /* End PBXSourcesBuildPhase section */
707 |
708 | /* Begin PBXTargetDependency section */
709 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
710 | isa = PBXTargetDependency;
711 | target = 13B07F861A680F5B00A75B9A /* ProFit */;
712 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
713 | };
714 | /* End PBXTargetDependency section */
715 |
716 | /* Begin PBXVariantGroup section */
717 | 0009C69F1CE51AA800F397EA /* Launch Screen.storyboard */ = {
718 | isa = PBXVariantGroup;
719 | children = (
720 | 0009C6A01CE51AA800F397EA /* Base */,
721 | 006ECD061CE7A351002AA97F /* ru */,
722 | );
723 | name = "Launch Screen.storyboard";
724 | sourceTree = "";
725 | };
726 | /* End PBXVariantGroup section */
727 |
728 | /* Begin XCBuildConfiguration section */
729 | 00E356F61AD99517003FC87E /* Debug */ = {
730 | isa = XCBuildConfiguration;
731 | buildSettings = {
732 | BUNDLE_LOADER = "$(TEST_HOST)";
733 | FRAMEWORK_SEARCH_PATHS = (
734 | "$(SDKROOT)/Developer/Library/Frameworks",
735 | "$(inherited)",
736 | );
737 | GCC_PREPROCESSOR_DEFINITIONS = (
738 | "DEBUG=1",
739 | "$(inherited)",
740 | );
741 | INFOPLIST_FILE = ProFitTests/Info.plist;
742 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
743 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
744 | LIBRARY_SEARCH_PATHS = (
745 | "$(inherited)",
746 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
747 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
748 | );
749 | PRODUCT_NAME = ProFit;
750 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ProFit.app/ProFit";
751 | };
752 | name = Debug;
753 | };
754 | 00E356F71AD99517003FC87E /* Release */ = {
755 | isa = XCBuildConfiguration;
756 | buildSettings = {
757 | BUNDLE_LOADER = "$(TEST_HOST)";
758 | COPY_PHASE_STRIP = NO;
759 | FRAMEWORK_SEARCH_PATHS = (
760 | "$(SDKROOT)/Developer/Library/Frameworks",
761 | "$(inherited)",
762 | );
763 | INFOPLIST_FILE = ProFitTests/Info.plist;
764 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
765 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
766 | LIBRARY_SEARCH_PATHS = (
767 | "$(inherited)",
768 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
769 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
770 | );
771 | PRODUCT_NAME = ProFit;
772 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ProFit.app/ProFit";
773 | };
774 | name = Release;
775 | };
776 | 13B07F941A680F5B00A75B9A /* Debug */ = {
777 | isa = XCBuildConfiguration;
778 | buildSettings = {
779 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
780 | CODE_SIGN_IDENTITY = "iPhone Developer";
781 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
782 | DEAD_CODE_STRIPPING = NO;
783 | HEADER_SEARCH_PATHS = (
784 | "$(inherited)",
785 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
786 | "$(SRCROOT)/../node_modules/react-native/React/**",
787 | "$(SRCROOT)/../node_modules/react-native-i18n/RNI18n",
788 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
789 | "$(SRCROOT)/../node_modules/react-native/Libraries/PushNotificationIOS/**",
790 | );
791 | INFOPLIST_FILE = ProFit/Info.plist;
792 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
793 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
794 | OTHER_LDFLAGS = "-ObjC";
795 | PRODUCT_BUNDLE_IDENTIFIER = com.ProFit.ProFit;
796 | PRODUCT_NAME = ProFit;
797 | PROVISIONING_PROFILE = "";
798 | TARGETED_DEVICE_FAMILY = "1,2";
799 | };
800 | name = Debug;
801 | };
802 | 13B07F951A680F5B00A75B9A /* Release */ = {
803 | isa = XCBuildConfiguration;
804 | buildSettings = {
805 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
806 | CODE_SIGN_IDENTITY = "iPhone Distribution: Railsmob OOO (YRYY3MUZEK)";
807 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Railsmob OOO (YRYY3MUZEK)";
808 | HEADER_SEARCH_PATHS = (
809 | "$(inherited)",
810 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
811 | "$(SRCROOT)/../node_modules/react-native/React/**",
812 | "$(SRCROOT)/../node_modules/react-native-i18n/RNI18n",
813 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
814 | "$(SRCROOT)/../node_modules/react-native/Libraries/PushNotificationIOS/**",
815 | );
816 | INFOPLIST_FILE = ProFit/Info.plist;
817 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
818 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
819 | OTHER_LDFLAGS = "-ObjC";
820 | PRODUCT_BUNDLE_IDENTIFIER = com.ProFit.ProFit;
821 | PRODUCT_NAME = ProFit;
822 | PROVISIONING_PROFILE = "";
823 | TARGETED_DEVICE_FAMILY = "1,2";
824 | };
825 | name = Release;
826 | };
827 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
828 | isa = XCBuildConfiguration;
829 | buildSettings = {
830 | ALWAYS_SEARCH_USER_PATHS = NO;
831 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
832 | CLANG_CXX_LIBRARY = "libc++";
833 | CLANG_ENABLE_MODULES = YES;
834 | CLANG_ENABLE_OBJC_ARC = YES;
835 | CLANG_WARN_BOOL_CONVERSION = YES;
836 | CLANG_WARN_CONSTANT_CONVERSION = YES;
837 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
838 | CLANG_WARN_EMPTY_BODY = YES;
839 | CLANG_WARN_ENUM_CONVERSION = YES;
840 | CLANG_WARN_INT_CONVERSION = YES;
841 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
842 | CLANG_WARN_UNREACHABLE_CODE = YES;
843 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
844 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
845 | COPY_PHASE_STRIP = NO;
846 | ENABLE_STRICT_OBJC_MSGSEND = YES;
847 | GCC_C_LANGUAGE_STANDARD = gnu99;
848 | GCC_DYNAMIC_NO_PIC = NO;
849 | GCC_OPTIMIZATION_LEVEL = 0;
850 | GCC_PREPROCESSOR_DEFINITIONS = (
851 | "DEBUG=1",
852 | "$(inherited)",
853 | );
854 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
855 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
856 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
857 | GCC_WARN_UNDECLARED_SELECTOR = YES;
858 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
859 | GCC_WARN_UNUSED_FUNCTION = YES;
860 | GCC_WARN_UNUSED_VARIABLE = YES;
861 | HEADER_SEARCH_PATHS = (
862 | "$(inherited)",
863 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
864 | "$(SRCROOT)/../node_modules/react-native/React/**",
865 | "$(SRCROOT)/../node_modules/react-native-i18n/RNI18n",
866 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
867 | );
868 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
869 | MTL_ENABLE_DEBUG_INFO = YES;
870 | ONLY_ACTIVE_ARCH = YES;
871 | SDKROOT = iphoneos;
872 | };
873 | name = Debug;
874 | };
875 | 83CBBA211A601CBA00E9B192 /* Release */ = {
876 | isa = XCBuildConfiguration;
877 | buildSettings = {
878 | ALWAYS_SEARCH_USER_PATHS = NO;
879 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
880 | CLANG_CXX_LIBRARY = "libc++";
881 | CLANG_ENABLE_MODULES = YES;
882 | CLANG_ENABLE_OBJC_ARC = YES;
883 | CLANG_WARN_BOOL_CONVERSION = YES;
884 | CLANG_WARN_CONSTANT_CONVERSION = YES;
885 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
886 | CLANG_WARN_EMPTY_BODY = YES;
887 | CLANG_WARN_ENUM_CONVERSION = YES;
888 | CLANG_WARN_INT_CONVERSION = YES;
889 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
890 | CLANG_WARN_UNREACHABLE_CODE = YES;
891 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
892 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
893 | COPY_PHASE_STRIP = YES;
894 | ENABLE_NS_ASSERTIONS = NO;
895 | ENABLE_STRICT_OBJC_MSGSEND = YES;
896 | GCC_C_LANGUAGE_STANDARD = gnu99;
897 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
898 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
899 | GCC_WARN_UNDECLARED_SELECTOR = YES;
900 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
901 | GCC_WARN_UNUSED_FUNCTION = YES;
902 | GCC_WARN_UNUSED_VARIABLE = YES;
903 | HEADER_SEARCH_PATHS = (
904 | "$(inherited)",
905 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
906 | "$(SRCROOT)/../node_modules/react-native/React/**",
907 | "$(SRCROOT)/../node_modules/react-native-i18n/RNI18n",
908 | "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager",
909 | );
910 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
911 | MTL_ENABLE_DEBUG_INFO = NO;
912 | SDKROOT = iphoneos;
913 | VALIDATE_PRODUCT = YES;
914 | };
915 | name = Release;
916 | };
917 | /* End XCBuildConfiguration section */
918 |
919 | /* Begin XCConfigurationList section */
920 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ProFitTests" */ = {
921 | isa = XCConfigurationList;
922 | buildConfigurations = (
923 | 00E356F61AD99517003FC87E /* Debug */,
924 | 00E356F71AD99517003FC87E /* Release */,
925 | );
926 | defaultConfigurationIsVisible = 0;
927 | defaultConfigurationName = Release;
928 | };
929 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ProFit" */ = {
930 | isa = XCConfigurationList;
931 | buildConfigurations = (
932 | 13B07F941A680F5B00A75B9A /* Debug */,
933 | 13B07F951A680F5B00A75B9A /* Release */,
934 | );
935 | defaultConfigurationIsVisible = 0;
936 | defaultConfigurationName = Release;
937 | };
938 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ProFit" */ = {
939 | isa = XCConfigurationList;
940 | buildConfigurations = (
941 | 83CBBA201A601CBA00E9B192 /* Debug */,
942 | 83CBBA211A601CBA00E9B192 /* Release */,
943 | );
944 | defaultConfigurationIsVisible = 0;
945 | defaultConfigurationName = Release;
946 | };
947 | /* End XCConfigurationList section */
948 | };
949 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
950 | }
951 |
--------------------------------------------------------------------------------
/ios/ProFit.xcodeproj/xcshareddata/xcschemes/ProFit.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
47 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 |
66 |
67 |
68 |
79 |
81 |
87 |
88 |
89 |
90 |
91 |
92 |
98 |
100 |
106 |
107 |
108 |
109 |
111 |
112 |
115 |
116 |
117 |
--------------------------------------------------------------------------------
/ios/ProFit/AppDelegate.h:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2015-present, Facebook, Inc.
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the BSD-style license found in the
6 | * LICENSE file in the root directory of this source tree. An additional grant
7 | * of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | @interface AppDelegate : UIResponder
13 |
14 | @property (nonatomic, strong) UIWindow *window;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/ios/ProFit/AppDelegate.m:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2015-present, Facebook, Inc.
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the BSD-style license found in the
6 | * LICENSE file in the root directory of this source tree. An additional grant
7 | * of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import "AppDelegate.h"
11 | #import "RCTPushNotificationManager.h"
12 | #import "RCTRootView.h"
13 |
14 | @implementation AppDelegate
15 |
16 | // Required to register for notifications
17 | - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
18 | {
19 | [RCTPushNotificationManager didRegisterUserNotificationSettings:notificationSettings];
20 | }
21 | // Required for the register event.
22 | - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
23 | {
24 | [RCTPushNotificationManager didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
25 | }
26 | // Required for the notification event.
27 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification
28 | {
29 | [RCTPushNotificationManager didReceiveRemoteNotification:notification];
30 | }
31 | // Required for the localNotification event.
32 | - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
33 | {
34 | [RCTPushNotificationManager didReceiveLocalNotification:notification];
35 | }
36 |
37 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
38 | {
39 | NSURL *jsCodeLocation;
40 |
41 | /**
42 | * Loading JavaScript code - uncomment the one you want.
43 | *
44 | * OPTION 1
45 | * Load from development server. Start the server from the repository root:
46 | *
47 | * $ npm start
48 | *
49 | * To run on device, change `localhost` to the IP address of your computer
50 | * (you can get this by typing `ifconfig` into the terminal and selecting the
51 | * `inet` value under `en0:`) and make sure your computer and iOS device are
52 | * on the same Wi-Fi network.
53 | */
54 |
55 | jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
56 |
57 | /**
58 | * OPTION 2
59 | * Load from pre-bundled file on disk. The static bundle is automatically
60 | * generated by the "Bundle React Native code and images" build step when
61 | * running the project on an actual device or running the project on the
62 | * simulator in the "Release" build configuration.
63 | */
64 |
65 | // jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
66 |
67 |
68 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
69 | moduleName:@"ProFit"
70 | initialProperties:nil
71 | launchOptions:launchOptions];
72 |
73 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
74 | UIViewController *rootViewController = [UIViewController new];
75 | rootViewController.view = rootView;
76 | self.window.rootViewController = rootViewController;
77 | [self.window makeKeyAndVisible];
78 | return YES;
79 | }
80 |
81 | @end
82 |
--------------------------------------------------------------------------------
/ios/ProFit/Base.lproj/Launch Screen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "29x29",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-Small.png",
7 | "scale" : "1x"
8 | },
9 | {
10 | "size" : "29x29",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-Small@2x.png",
13 | "scale" : "2x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-Small@3x.png",
19 | "scale" : "3x"
20 | },
21 | {
22 | "size" : "40x40",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-Small-40@2x-1.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "40x40",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-Small-40@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "57x57",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-1.png",
37 | "scale" : "1x"
38 | },
39 | {
40 | "size" : "57x57",
41 | "idiom" : "iphone",
42 | "filename" : "Icon@2x-1.png",
43 | "scale" : "2x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "29x29",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-Small-1.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "29x29",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-Small@2x-1.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "40x40",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-Small-40.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "40x40",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-Small-40@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "50x50",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-Small-50.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "50x50",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-Small-50@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "72x72",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-72.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "72x72",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-72@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "76x76",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-76.png",
109 | "scale" : "1x"
110 | },
111 | {
112 | "size" : "76x76",
113 | "idiom" : "ipad",
114 | "filename" : "Icon-76@2x.png",
115 | "scale" : "2x"
116 | },
117 | {
118 | "size" : "83.5x83.5",
119 | "idiom" : "ipad",
120 | "filename" : "Icon-167.png",
121 | "scale" : "2x"
122 | }
123 | ],
124 | "info" : {
125 | "version" : 1,
126 | "author" : "xcode"
127 | }
128 | }
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-1.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-167.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-167.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-72.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-76.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-1.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/screen.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x"
6 | },
7 | {
8 | "idiom" : "universal",
9 | "filename" : "screen.png",
10 | "scale" : "2x"
11 | },
12 | {
13 | "idiom" : "universal",
14 | "scale" : "3x"
15 | }
16 | ],
17 | "info" : {
18 | "version" : 1,
19 | "author" : "xcode"
20 | }
21 | }
--------------------------------------------------------------------------------
/ios/ProFit/Images.xcassets/screen.imageset/screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/ios/ProFit/Images.xcassets/screen.imageset/screen.png
--------------------------------------------------------------------------------
/ios/ProFit/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 8
23 | LSRequiresIPhoneOS
24 |
25 | NSAppTransportSecurity
26 |
27 | NSAllowsArbitraryLoads
28 |
29 |
30 | NSLocationWhenInUseUsageDescription
31 |
32 | UIAppFonts
33 |
34 | Entypo.ttf
35 | EvilIcons.ttf
36 | FontAwesome.ttf
37 | Foundation.ttf
38 | Ionicons.ttf
39 | MaterialIcons.ttf
40 | Octicons.ttf
41 | Zocial.ttf
42 |
43 | UILaunchStoryboardName
44 | Launch Screen
45 | UIRequiredDeviceCapabilities
46 |
47 | armv7
48 |
49 | UIStatusBarHidden~ipad
50 |
51 | UISupportedInterfaceOrientations
52 |
53 | UIInterfaceOrientationPortrait
54 |
55 | UISupportedInterfaceOrientations~ipad
56 |
57 | UIInterfaceOrientationPortrait
58 | UIInterfaceOrientationLandscapeLeft
59 | UIInterfaceOrientationLandscapeRight
60 | UIInterfaceOrientationPortraitUpsideDown
61 |
62 | UIViewControllerBasedStatusBarAppearance
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/ios/ProFit/main.m:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2015-present, Facebook, Inc.
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the BSD-style license found in the
6 | * LICENSE file in the root directory of this source tree. An additional grant
7 | * of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | #import "AppDelegate.h"
13 |
14 | int main(int argc, char * argv[]) {
15 | @autoreleasepool {
16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/ios/ProFit/ru.lproj/Launch Screen.strings:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/ios/ProFitTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/ios/ProFitTests/ProFitTests.m:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2015-present, Facebook, Inc.
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the BSD-style license found in the
6 | * LICENSE file in the root directory of this source tree. An additional grant
7 | * of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 | #import
12 |
13 | #import "RCTLog.h"
14 | #import "RCTRootView.h"
15 |
16 | #define TIMEOUT_SECONDS 600
17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
18 |
19 | @interface FitnessBotTests : XCTestCase
20 |
21 | @end
22 |
23 | @implementation FitnessBotTests
24 |
25 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
26 | {
27 | if (test(view)) {
28 | return YES;
29 | }
30 | for (UIView *subview in [view subviews]) {
31 | if ([self findSubviewInView:subview matching:test]) {
32 | return YES;
33 | }
34 | }
35 | return NO;
36 | }
37 |
38 | - (void)testRendersWelcomeScreen
39 | {
40 | UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
41 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
42 | BOOL foundElement = NO;
43 |
44 | __block NSString *redboxError = nil;
45 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
46 | if (level >= RCTLogLevelError) {
47 | redboxError = message;
48 | }
49 | });
50 |
51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
54 |
55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
57 | return YES;
58 | }
59 | return NO;
60 | }];
61 | }
62 |
63 | RCTSetLogFunction(RCTDefaultLogFunction);
64 |
65 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
66 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
67 | }
68 |
69 |
70 | @end
71 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ProFit",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "start": "node node_modules/react-native/local-cli/cli.js start"
7 | },
8 | "dependencies": {
9 | "moment": "^2.13.0",
10 | "react": "^0.14.8",
11 | "react-native": "^0.25.1",
12 | "react-native-i18n": "0.0.8",
13 | "react-native-vector-icons": "^2.0.1",
14 | "react-redux": "^4.4.5",
15 | "redux": "^3.5.2",
16 | "redux-logger": "^2.6.1",
17 | "redux-thunk": "^2.0.1"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ivanzotov/react-native-example/c252f1e09c5558dbd2458057f6eeb632ddf84307/screen.png
--------------------------------------------------------------------------------