├── .gitignore
├── .npmignore
├── .vscode
└── settings.json
├── License.md
├── README.md
├── connectMeteorRedux.js
├── example
├── LICENSE
├── MeteorApp
│ ├── .gitignore
│ ├── .meteor
│ │ ├── .finished-upgraders
│ │ ├── .gitignore
│ │ ├── .id
│ │ ├── packages
│ │ ├── platforms
│ │ ├── release
│ │ └── versions
│ ├── client
│ │ ├── main.css
│ │ ├── main.html
│ │ └── main.js
│ ├── lib
│ │ └── collections
│ │ │ ├── details.js
│ │ │ └── index.js
│ ├── package.json
│ └── server
│ │ ├── main.js
│ │ ├── publications
│ │ ├── details.js
│ │ └── index.js
│ │ └── seeds.js
├── README.md
├── RNApp
│ ├── .buckconfig
│ ├── .eslintrc.js
│ ├── .flowconfig
│ ├── .gitignore
│ ├── .watchmanconfig
│ ├── android
│ │ ├── app
│ │ │ ├── BUCK
│ │ │ ├── build.gradle
│ │ │ ├── proguard-rules.pro
│ │ │ └── src
│ │ │ │ └── main
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java
│ │ │ │ └── com
│ │ │ │ │ └── rnapp
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ └── MainApplication.java
│ │ │ │ └── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ └── values
│ │ │ │ ├── strings.xml
│ │ │ │ └── styles.xml
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── gradle
│ │ │ └── wrapper
│ │ │ │ ├── gradle-wrapper.jar
│ │ │ │ └── gradle-wrapper.properties
│ │ ├── gradlew
│ │ ├── gradlew.bat
│ │ ├── keystores
│ │ │ ├── BUCK
│ │ │ └── debug.keystore.properties
│ │ └── settings.gradle
│ ├── app
│ │ ├── components
│ │ │ ├── Avatar
│ │ │ │ ├── Avatar.js
│ │ │ │ ├── index.js
│ │ │ │ └── styles.js
│ │ │ ├── Button
│ │ │ │ ├── Button.js
│ │ │ │ ├── index.js
│ │ │ │ └── styles.js
│ │ │ ├── GenericTextInput
│ │ │ │ ├── GenericTextInput.js
│ │ │ │ ├── InputWrapper.js
│ │ │ │ ├── index.js
│ │ │ │ └── styles.js
│ │ │ └── Loading
│ │ │ │ ├── Loading.js
│ │ │ │ ├── index.js
│ │ │ │ └── styles.js
│ │ ├── config
│ │ │ ├── images.js
│ │ │ ├── routes.js
│ │ │ ├── settings.js
│ │ │ └── styles.js
│ │ ├── images
│ │ │ ├── avatar-placeholder.png
│ │ │ ├── header-image.png
│ │ │ ├── home-icon.png
│ │ │ ├── rn-logo.png
│ │ │ ├── rn-logo@2x.png
│ │ │ ├── rn-logo@3x.png
│ │ │ └── user-icon.png
│ │ ├── index.js
│ │ ├── layouts
│ │ │ ├── LoggedIn
│ │ │ │ ├── LoggedIn.js
│ │ │ │ ├── index.js
│ │ │ │ └── styles.js
│ │ │ └── LoggedOut
│ │ │ │ ├── LoggedOut.js
│ │ │ │ └── index.js
│ │ ├── lib
│ │ │ └── string.js
│ │ └── routes
│ │ │ ├── Details
│ │ │ ├── Details.js
│ │ │ ├── DetailsContainer.js
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ │ ├── Home
│ │ │ ├── Home.js
│ │ │ ├── HomeContainer.js
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ │ ├── Profile
│ │ │ ├── Profile.js
│ │ │ ├── ProfileContainer.js
│ │ │ ├── index.js
│ │ │ └── styles.js
│ │ │ └── SignIn
│ │ │ ├── SignIn.js
│ │ │ ├── SignInContainer.js
│ │ │ ├── index.js
│ │ │ └── styles.js
│ ├── index.android.js
│ ├── index.ios.js
│ ├── ios
│ │ ├── RNApp.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata
│ │ │ │ └── xcschemes
│ │ │ │ └── RNApp.xcscheme
│ │ ├── RNApp
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Base.lproj
│ │ │ │ └── LaunchScreen.xib
│ │ │ ├── Images.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ └── main.m
│ │ └── RNAppTests
│ │ │ ├── Info.plist
│ │ │ └── RNAppTests.m
│ ├── jsconfig.json
│ └── package.json
└── npm-debug.log
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .idea/
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | example
2 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 | "search.exclude": {
4 | "**/node_modules": true,
5 | "**/bower_components": true,
6 | "**/.meteor"
7 | }
8 | }
--------------------------------------------------------------------------------
/License.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017
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 all
13 | 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 THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # react-native-meteor-offline
2 |
3 | This package uses redux and redux-persist behind the scenes to maintain offline versions of your meteor data (compatible with react-native-meteor).
4 |
5 | Important: V 2.0 implements a new class-based API. The V 1 api will be deprecated at some point. I've also renamed this react-native-meteor-offline, since that's more reflective of what it is.
6 | Access the 1.X API here: https://github.com/DesignmanIO/react-native-meteor-redux/tree/1.1.1
7 |
8 | ## Install
9 | `npm install react-native-meteor-redux`
10 |
11 | ## Use
12 | ### Initialize
13 | ````javascript
14 | import MeteorOffline from 'react-native-meteor-redux';
15 |
16 | // initialize a MeteorOffline instance with options, currently just takes debounce
17 | // Do this at/near the top level of your app
18 | const GroundedMeteor = new MeteorOffline({debounce: 1000});
19 |
20 | // Now you can access MeteorStore as a redux store throughout your app.
21 | export {GroundedMeteor};
22 | ````
23 |
24 | ### Using cached collection
25 |
26 | ````javascript
27 | import {GroundedMeteor} from '../index';
28 | import Meteor, {createContainer} from 'react-native-meteor';
29 |
30 | const component = (props) => {
31 | const {docs} = props;
32 | return (
33 |
34 | {
35 | docs.map((doc) => {
36 | {doc.title},
37 | });
38 | }
39 |
40 | )
41 | }
42 |
43 | export createContainer((props) => {
44 | // MeteorOffline.subscribe takes an extra first parameter, uniqueSubscriptionName
45 | // The unique name allows you to have multiple subscriptions to the same publication
46 | // Collections are synchronized based on the uniqueSubscriptionName
47 | const sub = GroundedMeteor.subscribe('getUsersById', 'users/id', {userIds: [...]}, () => {
48 | console.log('callback');
49 | });
50 | // MeteorOffline.collection works as normal, but we pass the unique subscription name so that behind the scenes it will synchronize your collection
51 | return {
52 | docs: GroundedMeteor.collection('docs', 'getUsersById').find({}),
53 | };
54 | }, component)
55 | ````
56 |
57 | ### Running the example
58 | Execute the following commands:
59 | ````bash
60 | cd example/RNApp && npm i
61 | cd ../MeteorApp && meteor
62 | cd ../RNApp && react-native run-ios
63 | # or
64 | cd ../RNApp && react-native run-android
65 | ````
66 | If you get .babelrc errors, try running this in the RNApp directory
67 | ````bash
68 | ./node_modules/react-native/packager/packager.sh start --reset-cache
69 | ````
--------------------------------------------------------------------------------
/connectMeteorRedux.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Created by Julian on 12/30/16.
3 | */
4 | import Meteor, { getData } from 'react-native-meteor';
5 | import { createStore, combineReducers } from 'redux';
6 | import { AsyncStorage } from 'react-native';
7 | import _ from 'lodash';
8 | import EventEmitter from 'events';
9 | import { persistStore, autoRehydrate, createTransform } from 'redux-persist';
10 |
11 | const meteorReduxReducers = (
12 | state = { reactNativeMeteorOfflineRecentlyAdded: [] },
13 | action
14 | ) => {
15 | const { type, collection, id, fields, cleared } = action;
16 | // console.log(type);
17 | switch (type) {
18 | case 'SET_USERID': {
19 | return { ...state, userId: id };
20 | }
21 | case 'RECENTLY_ADDED': {
22 | return {
23 | ...state,
24 | reactNativeMeteorOfflineRecentlyAdded: [
25 | ...(state.reactNativeMeteorOfflineRecentlyAdded || []),
26 | id,
27 | ],
28 | };
29 | }
30 | case 'ADDED': {
31 | // doc and/or collection don't exist yet, add them
32 | if (_.isEqual(_.get(state, `${collection}.${id}`, {}), fields)) return state;
33 | return {
34 | ...state,
35 | [collection]: { ...state[collection], [id]: fields },
36 | };
37 | }
38 | case 'CHANGED': {
39 | // something's changed, add/update
40 | if (cleared.length) {
41 | const nextDoc = _.omit(state[collection][id], cleared);
42 | return { ...state, [collection]: { ...state[collection], [id]: nextDoc } };
43 | } else if (_.isEqual(_.get(state, `${collection}.${id}`), fields)) return state;
44 | return { ...state, [collection]: { ...state[collection], [id]: fields } };
45 | }
46 | case 'REMOVED':
47 | if (state[collection] && state[collection][id]) {
48 | const newState = _.clone(state);
49 | delete newState[collection][id];
50 | return newState;
51 | }
52 | // console.error(`Couldn't remove ${id}, not found in ${collection} collection`);
53 | return state;
54 | case 'SET_READY':
55 | // todo: check for removed docs
56 | return {
57 | ...state,
58 | ready: action.ready,
59 | };
60 | case 'REMOVE_AFTER_RECONNECT':
61 | // todo: check for removed docs
62 | const { removed } = action;
63 | const withoutRemoved = _.omit(
64 | state.reactNativeMeteorOfflineRecentlyAdded,
65 | removed
66 | );
67 | if (getData().db[collection]) getData().db[collection].remove({ _id: { $in: removed } });
68 | return {
69 | ...state,
70 | reactNativeMeteorOfflineRecentlyAdded: withoutRemoved,
71 | };
72 | case 'persist/REHYDRATE':
73 | if (
74 | typeof Meteor.ddp === 'undefined' ||
75 | Meteor.ddp.status === 'disconnected'
76 | ) {
77 | return action.payload;
78 | }
79 | return state;
80 | case 'HARDRESET':
81 | console.log('hard reset');
82 | return {};
83 | default:
84 | return state;
85 | }
86 | };
87 |
88 | const meteorReduxEmitter = new EventEmitter();
89 |
90 | const initMeteorRedux = (
91 | customDebugger = undefined,
92 | preloadedState = undefined,
93 | enhancer = undefined,
94 | customReducers = undefined
95 | ) => {
96 | // console.log(preloadedState, enhancer)
97 | const newReducers = customReducers !== undefined
98 | ? combineReducers({ ...customReducers, meteorReduxReducers })
99 | : meteorReduxReducers;
100 | const MeteorStore = createStore(
101 | newReducers,
102 | customDebugger,
103 | preloadedState,
104 | enhancer
105 | );
106 |
107 | MeteorStore.loaded = () => {
108 | meteorReduxEmitter.emit('rehydrated');
109 | };
110 |
111 | meteorReduxEmitter.once('rehydrated', () => {
112 | // restore collections to minimongo
113 | _.each(MeteorStore.getState(), (collection, key) => {
114 | const correctedCollection = _.chain(collection)
115 | .map((doc) => doc)
116 | .filter('_id')
117 | .value();
118 | // add the collection if it doesn't exist
119 | if (!getData().db[key]) {
120 | // add collection to minimongo
121 | getData().db.addCollection(key);
122 | }
123 | // only upsert if the data doesn't match
124 | if (!_.isEqual(getData().db[key], collection)) {
125 | // add documents to collection
126 | getData().db[key].upsert(correctedCollection);
127 | }
128 | });
129 | MeteorStore.dispatch({ type: 'SET_READY', ready: true });
130 | });
131 |
132 | Meteor.waitDdpConnected(() => {
133 | // return false;
134 | // question: do I need to check for disconnection?
135 | let connected = true;
136 | Meteor.ddp.on('disconnected', () => {
137 | connected = false;
138 | });
139 | if (connected) {
140 | Meteor.ddp.on('removed', ({ collection, id, fields = {} }) => {
141 | MeteorStore.dispatch({ type: 'REMOVED', collection, id, fields });
142 | });
143 | Meteor.ddp.on('changed', ({ collection, id, fields = {}, cleared = [] }) => {
144 | MeteorStore.dispatch({ type: 'CHANGED', collection, id, fields, cleared });
145 | });
146 | Meteor.ddp.on('added', (obj, ...args) => {
147 | const { collection, id } = obj;
148 | // console.log('added', obj, args);
149 | const fields = obj.fields || {};
150 | fields._id = id;
151 | const getCollection = MeteorStore.getState()[collection];
152 | if (
153 | !getCollection ||
154 | !getCollection[id] ||
155 | !_.isEqual(getCollection[id], fields)
156 | ) {
157 | // don't insert if it exists
158 | MeteorStore.dispatch({ type: 'ADDED', collection, id, fields });
159 | }
160 | MeteorStore.dispatch({ type: 'RECENTLY_ADDED', id });
161 | });
162 | }
163 | });
164 |
165 | return MeteorStore;
166 | };
167 |
168 | const subscribeCached = (store, name, ...args) => {
169 | let offline = true;
170 | const subHandle = Meteor.subscribe(name, ...args);
171 | Meteor.waitDdpConnected(() => {
172 | if (Meteor.ddp.status === 'connected') {
173 | offline = false;
174 | }
175 | });
176 | if (!store || !offline) return subHandle;
177 | if (typeof args[args.length - 1] === 'function' && store.getState().ready) {
178 | const callback = _.once(args[args.length - 1]);
179 | callback();
180 | }
181 | return {
182 | ready: () => {
183 | return store.getState().ready || false;
184 | },
185 | offline: true,
186 | };
187 | };
188 |
189 | const returnCached = (cursor, store, collection, doDisable) => {
190 | console.warn('returnCached is deprecated and will be removed soon');
191 | if (Meteor.ddp && Meteor.ddp.status === 'disconnected') {
192 | return store.getState()[collection] || [];
193 | }
194 | return cursor;
195 | };
196 |
197 | class MeteorOffline {
198 | constructor(options = {}) {
199 | this.offline = true;
200 | // first time connecting since app open or connection restored
201 | this.firstConnection = true;
202 | this.subscriptions = [];
203 | this.collections = [];
204 | this.store = options.store || initMeteorRedux(options.debugger || undefined, undefined, autoRehydrate());
205 | this.persistor = persistStore(
206 | this.store,
207 | {
208 | storage: AsyncStorage,
209 | debounce: options.debounce || 1000,
210 | blacklist: ['reactNativeMeteorOfflineRecentlyAdded'],
211 | },
212 | () => {
213 | this.store.loaded();
214 | }
215 | );
216 | console.log('initializing');
217 | Meteor.waitDdpConnected(() => {
218 | if (Meteor.ddp.status === 'connected') {
219 | this.offline = false;
220 | } else {
221 | this.offline = true;
222 | this.firstConnection = false;
223 | }
224 | });
225 | }
226 |
227 | subReady (uniqueName) {
228 | return this.subscriptions[uniqueName].ready && !this.offline;
229 | }
230 |
231 | user() {
232 | if (Meteor.user()) {
233 | this.store.dispatch({ type: 'SET_USERID', id: Meteor.userId() });
234 | return Meteor.user();
235 | }
236 | const { userId } = this.store.getState();
237 | return Meteor.collection('users').findOne(userId);
238 | }
239 |
240 | reset() {
241 | this.store.dispatch({ type: 'HARDRESET' });
242 | this.persistor.purge();
243 | //console.log('performed meteor offline hard reset');
244 | }
245 |
246 | subscribe(uniqueName, name, ...params) {
247 | const hasCallback = typeof params[params.length - 1] === 'function';
248 | const justParams = params.slice(0, params.length - 1);
249 | _.set(this.subscriptions, `${uniqueName}.${name}`, name);
250 | _.set(
251 | this.subscriptions,
252 | `${uniqueName}.${params}`,
253 | JSON.stringify(justParams)
254 | );
255 | let subHandle = Meteor.subscribe(name, ...params);
256 | if (this.offline) {
257 | subHandle = {
258 | ready: () => {
259 | // ready === rehydrated
260 | return this.store.getState().ready || false;
261 | },
262 | offline: this.offline,
263 | };
264 | }
265 | // run callback if it's offline and ready for the first time
266 | if (
267 | this.offline &&
268 | hasCallback &&
269 | this.store.getState().ready &&
270 | !this.subscriptions[uniqueName].ready
271 | ) {
272 | // handled by meteor.subscribe if online
273 | const callback = _.once(params[params.length - 1]);
274 | callback();
275 | }
276 | this.subscriptions[uniqueName].ready = subHandle.ready();
277 | return subHandle;
278 | }
279 |
280 | collection(collection, subscriptionName) {
281 | if (
282 | Meteor.status().connected &&
283 | this.firstConnection &&
284 | _.get(this.subscriptions, `${subscriptionName}.ready`)
285 | ) {
286 | this.firstConnection = false;
287 | const t = new Date();
288 | const recentlyAddedIds = this.store.getState()
289 | .reactNativeMeteorOfflineRecentlyAdded;
290 | const cachedIds = _.sortBy(_.keys(this.store.getState()[collection]));
291 | // console.log(`got cached in ${new Date() - t}ms`);
292 | const removed = _.sortBy(_.difference(cachedIds, recentlyAddedIds)) || [];
293 | // console.log(
294 | // `got difference in ${new Date() - t}ms`,
295 | // recentlyAddedIds,
296 | // cachedIds,
297 | // removed,
298 | // this.store.getState().reactNativeMeteorOfflineRecentlyAdded
299 | // );
300 | this.store.dispatch({
301 | type: 'REMOVE_AFTER_RECONNECT',
302 | collection,
303 | removed,
304 | });
305 | }
306 | this.collections = _.uniq([...this.collections, collection]);
307 | return Meteor.collection(collection);
308 | }
309 | }
310 |
311 | export { meteorReduxReducers, subscribeCached, returnCached, MeteorOffline };
312 | export default initMeteorRedux;
313 |
--------------------------------------------------------------------------------
/example/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2016 Spencer Carli
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 all
13 | 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 THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/example/MeteorApp/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/example/MeteorApp/.meteor/.finished-upgraders:
--------------------------------------------------------------------------------
1 | # This file contains information which helps Meteor properly upgrade your
2 | # app when you run 'meteor update'. You should check it into version control
3 | # with your project.
4 |
5 | notices-for-0.9.0
6 | notices-for-0.9.1
7 | 0.9.4-platform-file
8 | notices-for-facebook-graph-api-2
9 | 1.2.0-standard-minifiers-package
10 | 1.2.0-meteor-platform-split
11 | 1.2.0-cordova-changes
12 | 1.2.0-breaking-changes
13 | 1.3.0-split-minifiers-package
14 | 1.3.5-remove-old-dev-bundle-link
15 | 1.4.0-remove-old-dev-bundle-link
16 | 1.4.1-add-shell-server-package
17 |
--------------------------------------------------------------------------------
/example/MeteorApp/.meteor/.gitignore:
--------------------------------------------------------------------------------
1 | dev_bundle
2 | local
3 |
--------------------------------------------------------------------------------
/example/MeteorApp/.meteor/.id:
--------------------------------------------------------------------------------
1 | # This file contains a token that is unique to your project.
2 | # Check it into your repository along with the rest of this directory.
3 | # It can be used for purposes such as:
4 | # - ensuring you don't accidentally deploy one app on top of another
5 | # - providing package authors with aggregated statistics
6 |
7 | 12ok2yo148omi442145y
8 |
--------------------------------------------------------------------------------
/example/MeteorApp/.meteor/packages:
--------------------------------------------------------------------------------
1 | # Meteor packages used by this project, one per line.
2 | # Check this file (and the other files in this directory) into your repository.
3 | #
4 | # 'meteor add' and 'meteor remove' will edit this file for you,
5 | # but you can also edit it by hand.
6 |
7 | meteor-base@1.0.4 # Packages every Meteor app needs to have
8 | mobile-experience@1.0.4 # Packages for a great mobile UX
9 | mongo@1.1.12_1 # The database Meteor supports right now
10 | blaze-html-templates@1.0.4 # Compile .html files into Meteor Blaze views
11 | reactive-var@1.0.10 # Reactive variable for tracker
12 | jquery@1.11.9 # Helpful client-side library
13 | tracker@1.1.0 # Meteor's client-side reactive programming library
14 |
15 | standard-minifier-css@1.2.0_1 # CSS minifier run for production mode
16 | standard-minifier-js@1.2.0_1 # JS minifier run for production mode
17 | es5-shim@4.6.14_1 # ECMAScript 5 compatibility for older browsers.
18 | ecmascript@0.5.8_1 # Enable ECMAScript2015+ syntax in app code
19 |
20 | accounts-password@1.3.0
21 | shell-server
22 |
--------------------------------------------------------------------------------
/example/MeteorApp/.meteor/platforms:
--------------------------------------------------------------------------------
1 | server
2 | browser
3 |
--------------------------------------------------------------------------------
/example/MeteorApp/.meteor/release:
--------------------------------------------------------------------------------
1 | METEOR@1.4.1.2
2 |
--------------------------------------------------------------------------------
/example/MeteorApp/.meteor/versions:
--------------------------------------------------------------------------------
1 | accounts-base@1.2.12_1
2 | accounts-password@1.3.0
3 | allow-deny@1.0.5
4 | autoupdate@1.3.11
5 | babel-compiler@6.9.1_1
6 | babel-runtime@0.1.11_1
7 | base64@1.0.9
8 | binary-heap@1.0.9
9 | blaze@2.1.9
10 | blaze-html-templates@1.0.5
11 | blaze-tools@1.0.10
12 | boilerplate-generator@1.0.10
13 | caching-compiler@1.1.7_1
14 | caching-html-compiler@1.0.7
15 | callback-hook@1.0.9
16 | check@1.2.3
17 | ddp@1.2.5
18 | ddp-client@1.3.1_1
19 | ddp-common@1.2.6
20 | ddp-rate-limiter@1.0.5
21 | ddp-server@1.3.10_1
22 | deps@1.0.12
23 | diff-sequence@1.0.6
24 | ecmascript@0.5.8_1
25 | ecmascript-runtime@0.3.14_1
26 | ejson@1.0.12
27 | email@1.1.17_1
28 | es5-shim@4.6.14_1
29 | fastclick@1.0.12
30 | geojson-utils@1.0.9
31 | hot-code-push@1.0.4
32 | html-tools@1.0.11
33 | htmljs@1.0.11
34 | http@1.2.9_1
35 | id-map@1.0.8
36 | jquery@1.11.9
37 | launch-screen@1.0.12
38 | livedata@1.0.18
39 | localstorage@1.0.11
40 | logging@1.1.15_1
41 | meteor@1.2.17_1
42 | meteor-base@1.0.4
43 | minifier-css@1.2.14_1
44 | minifier-js@1.2.14_1
45 | minimongo@1.0.17
46 | mobile-experience@1.0.4
47 | mobile-status-bar@1.0.12
48 | modules@0.7.6_1
49 | modules-runtime@0.7.6_1
50 | mongo@1.1.12_5
51 | mongo-id@1.0.5
52 | npm-bcrypt@0.9.1_1
53 | npm-mongo@2.2.10_1
54 | observe-sequence@1.0.13
55 | ordered-dict@1.0.8
56 | promise@0.8.7
57 | random@1.0.10
58 | rate-limit@1.0.5
59 | reactive-var@1.0.10
60 | reload@1.1.10
61 | retry@1.0.8
62 | routepolicy@1.0.11
63 | service-configuration@1.0.10
64 | sha@1.0.8
65 | shell-server@0.2.1
66 | spacebars@1.0.13
67 | spacebars-compiler@1.0.13
68 | srp@1.0.9
69 | standard-minifier-css@1.2.1
70 | standard-minifier-js@1.2.0_1
71 | templating@1.2.15
72 | templating-compiler@1.2.15
73 | templating-runtime@1.2.15
74 | templating-tools@1.0.5
75 | tracker@1.1.0
76 | ui@1.0.12
77 | underscore@1.0.9
78 | url@1.0.10
79 | webapp@1.3.11_1
80 | webapp-hashing@1.0.9
81 |
--------------------------------------------------------------------------------
/example/MeteorApp/client/main.css:
--------------------------------------------------------------------------------
1 | /* CSS declarations go here */
2 |
--------------------------------------------------------------------------------
/example/MeteorApp/client/main.html:
--------------------------------------------------------------------------------
1 |
2 | simple
3 |
4 |
5 |
6 | Welcome to Meteor!
7 |
8 | {{> hello}}
9 | {{> info}}
10 |
11 |
12 |
13 |
14 | You've pressed the button {{counter}} times.
15 |
16 |
17 |
18 | Learn Meteor!
19 |
25 |
--------------------------------------------------------------------------------
/example/MeteorApp/client/main.js:
--------------------------------------------------------------------------------
1 | import { Template } from 'meteor/templating';
2 | import { ReactiveVar } from 'meteor/reactive-var';
3 |
4 | import './main.html';
5 |
6 | Template.hello.onCreated(function helloOnCreated() {
7 | // counter starts at 0
8 | this.counter = new ReactiveVar(0);
9 | });
10 |
11 | Template.hello.helpers({
12 | counter() {
13 | return Template.instance().counter.get();
14 | },
15 | });
16 |
17 | Template.hello.events({
18 | 'click button'(event, instance) {
19 | // increment the counter when button is clicked
20 | instance.counter.set(instance.counter.get() + 1);
21 | },
22 | });
23 |
--------------------------------------------------------------------------------
/example/MeteorApp/lib/collections/details.js:
--------------------------------------------------------------------------------
1 | import {Mongo} from 'meteor/mongo';
2 |
3 | const Details = new Mongo.Collection('details');
4 |
5 | export default Details;
6 |
--------------------------------------------------------------------------------
/example/MeteorApp/lib/collections/index.js:
--------------------------------------------------------------------------------
1 | import Details from './details';
2 |
3 | export {
4 | Details
5 | };
6 |
--------------------------------------------------------------------------------
/example/MeteorApp/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "MeteorApp",
3 | "private": true,
4 | "scripts": {
5 | "start": "meteor run"
6 | },
7 | "dependencies": {
8 | "bcrypt": "^0.8.7",
9 | "meteor-node-stubs": "~0.2.0"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/example/MeteorApp/server/main.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import publications from './publications';
3 | import seeds from './seeds';
4 |
5 | Meteor.startup(() => {
6 | publications();
7 | seeds();
8 | });
9 |
--------------------------------------------------------------------------------
/example/MeteorApp/server/publications/details.js:
--------------------------------------------------------------------------------
1 | import { Meteor } from 'meteor/meteor';
2 | import { Details } from '/lib/collections/';
3 |
4 | export default () => {
5 | Meteor.publish('details-list', () => {
6 | return Details.find();
7 | });
8 | }
9 |
--------------------------------------------------------------------------------
/example/MeteorApp/server/publications/index.js:
--------------------------------------------------------------------------------
1 | import details from './details';
2 |
3 | export default function (){
4 | details();
5 | }
6 |
--------------------------------------------------------------------------------
/example/MeteorApp/server/seeds.js:
--------------------------------------------------------------------------------
1 | import Details from '/lib/collections/details';
2 |
3 | const seed = () => {
4 | if (Details.find().count() === 0) {
5 | let count = 10;
6 | let doc = {name: {first: 'Some', last: 'detail'}};
7 | if (Meteor.settings.powerHungry) {
8 | count = 10000;
9 | doc = {
10 | "name": 'Detail',
11 | "index": 0,
12 | "guid": "dd3401b0-d802-40ba-8ad2-98cc1b393846",
13 | "isActive": true,
14 | "balance": "$3,616.93",
15 | "picture": "http://placehold.it/32x32",
16 | "age": 35,
17 | "eyeColor": "brown",
18 | "name": {
19 | "first": "Johnnie",
20 | "last": "Merritt"
21 | },
22 | "company": "LIQUICOM",
23 | "email": "johnnie.merritt@liquicom.biz",
24 | "phone": "+1 (826) 589-3689",
25 | "address": "420 Railroad Avenue, Denio, Missouri, 2330",
26 | "about": "Cupidatat enim velit esse incididunt. Laborum ex exercitation cillum officia irure eiusmod occaecat veniam aliqua enim cupidatat. Qui enim tempor mollit ut consectetur aliquip elit.",
27 | "registered": "Saturday, December 17, 2016 2:58 AM",
28 | "latitude": "6.621428",
29 | "longitude": "81.120502",
30 | "tags": [
31 | "aliqua",
32 | "elit",
33 | "sint",
34 | "occaecat",
35 | "duis"
36 | ],
37 | "range": [
38 | 0,
39 | 1,
40 | 2,
41 | 3,
42 | 4,
43 | 5,
44 | 6,
45 | 7,
46 | 8,
47 | 9
48 | ],
49 | "friends": [
50 | {
51 | "id": 0,
52 | "name": "Branch Morse"
53 | },
54 | {
55 | "id": 1,
56 | "name": "Knapp Kent"
57 | },
58 | {
59 | "id": 2,
60 | "name": "Valenzuela Hammond"
61 | }
62 | ],
63 | "greeting": "Hello, Johnnie! You have 9 unread messages.",
64 | "favoriteFruit": "strawberry"
65 | };
66 | }
67 | for (let i = 0; i < 10; i++) {
68 | Details.insert(doc);
69 | }
70 | }
71 | }
72 |
73 | export default seed;
74 |
--------------------------------------------------------------------------------
/example/README.md:
--------------------------------------------------------------------------------
1 | # React Native Meteor Boilerplate
2 |
3 | This is a simple way to get started building an app with React Native and Meteor. It is opinionated to make it easy for people to start but if you have your own way of doing things it's very easy to swap things out and move them around however you see fit.
4 |
5 | As it currently stands this project is only focused on configuring the React Native project. The Meteor side is up to you. For thoughts on how to structure your Meteor App I would suggest you read the [Meteor Guide](http://guide.meteor.com/) and the [Mantra spec](http://mantrajs.com/).
6 |
7 | You can checkout a _very_ quick walkthrough of the project [here](https://www.youtube.com/watch?v=vM4axvopnJc).
8 |
9 | ## Getting Started
10 |
11 | - [Install Meteor](https://www.meteor.com/install)
12 | - [Install React Native](https://facebook.github.io/react-native/docs/getting-started.html#content)
13 | - Clone Repo: `git clone https://github.com/spencercarli/react-native-meteor-boilerplate.git`
14 | - From the `RNApp` directory run `npm install`
15 |
16 | ## Running on iOS Simulator
17 |
18 | _Note_: You must be on a Mac for this.
19 |
20 | - Be sure your Meteor app is running: In the ```MeteorApp``` directory, type ```meteor```
21 |
22 | You've got a few ways you can run the app for iOS:
23 |
24 | - From the `RNApp` directory run `react-native run-ios`
25 | - From the `RNApp` directory run `npm run ios` then start the project in Xcode
26 |
27 | ## Running on iOS Device
28 |
29 | _Note_: You must be on a Mac for this.
30 |
31 | - Be sure your Meteor app is running: In the ```MeteorApp``` directory, type ```meteor```
32 | - Get the IP address of your machine (you can run `ipconfig getifaddr en1` to do so)
33 | - In `RNApp/app/config/settings.js` change `localhost` to your machine's IP address
34 | - Plug your device into your computer (make sure it's on the same network)
35 | - Open the project in Xcode
36 | - Select your device in Xcode and press "Build and run"
37 |
38 | For further information please reference the [official docs](https://facebook.github.io/react-native/docs/running-on-device-ios.html#content).
39 |
40 | ## Running on Android Simulator
41 |
42 | - Be sure your Meteor app is running: In the ```MeteorApp``` directory, type ```meteor```
43 | - Get the IP address of your machine
44 | - In `RNApp/app/config/settings.js` change `localhost` to your machine's IP address
45 | - Make sure you have an emulator configured and running.
46 | - From the `RNApp` directory run `react-native run-android`
47 |
48 | On OSX you can get your IP address by running `ipconfig getifaddr en1` in a terminal window.
49 |
50 | On linux running `ifconfig` will get you a list of your network interfaces along with their IP addresses. For the stock Google simulator you will want to use the IP of your active network connection (probably `eth0` or `wlan0`). If you are using the Genymotion simulator, it runs in a Virtual Box VM with a Host-only network interface. You will want to use the IP address of this network which may look like vboxnet0 under ifconfig.
51 |
52 | ## Running on Android Device
53 |
54 | - Be sure your Meteor app is running: In the ```MeteorApp``` directory, type ```meteor```
55 | - Make sure [USB Debugging is enabled](https://facebook.github.io/react-native/docs/running-on-device-android.html#prerequisite-usb-debugging)
56 | - Plug your device into your computer
57 | - Run `adb devices` to make sure your device shows up
58 | - Run `adb reverse tcp:8081 tcp:8081`
59 | - In `RNApp/app/config/settings.js` change `localhost` in `METEOR_URL` to your computer's IP address (see note in "Running on Android" section on how to get your IP Address)
60 | - Run `react-native run-android`
61 |
62 | For further information please reference the [official docs](https://facebook.github.io/react-native/docs/running-on-device-android.html#content).
63 |
64 | ## Linux Setup for Android Dev
65 |
66 | Configure how the device will connect to the meteor server. See [running android on a device](https://facebook.github.io/react-native/docs/running-on-device-android.html) to pick from the options.
67 |
68 | Plug in your device and use _lusb_ to find the first 4 digits of your device ID.
69 | > lsusb
70 | Bus 001 Device 003: ID 04e8:2e76 Motorola PCS
71 |
72 | Enter this in udev rules. In the example we are copying over `04e8`
73 | > echo SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev" | sudo tee /etc/udev/rules.d/51-android-usb.rules
74 |
75 | Check that your device is properly connecting to ADB, the Android Debug Bridge, by using:
76 | > adb devices
77 |
78 | _Note:_ You should have only one active ADB connection. If you have a simulator running you should close it before proceeding.
79 |
80 | These steps are abstracted from the pages [running on device](https://facebook.github.io/react-native/docs/running-on-device-android.html) and [getting started](https://facebook.github.io/react-native/docs/getting-started-linux.html#setting-up-an-android-device) on linux.
81 |
82 | ## Project Structure
83 |
84 | Check out [this article](https://medium.com/@spencer_carli/organizing-a-react-native-project-9514dfadaa0#.361gf1awu) for an overview of the `RNApp` directory.
85 |
86 | ## Questions?
87 |
88 | If you have any questions please open an issue. Thanks!
89 |
--------------------------------------------------------------------------------
/example/RNApp/.buckconfig:
--------------------------------------------------------------------------------
1 |
2 | [android]
3 | target = Google Inc.:Google APIs:23
4 |
5 | [maven_repositories]
6 | central = https://repo1.maven.org/maven2
7 |
--------------------------------------------------------------------------------
/example/RNApp/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "extends": "airbnb",
3 | "plugins": [
4 | "react"
5 | ],
6 | "parser": "babel-eslint",
7 | "rules": {
8 | "arrow-body-style": 0,
9 | "react/jsx-no-bind": 0,
10 | "no-underscore-dangle": 0,
11 | "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
12 | "import/prefer-default-export": 0,
13 | "react/forbid-prop-types": 0,
14 | "arrow-parens": [1, "always"],
15 | "class-methods-use-this": 0,
16 | "no-case-declarations": 0,
17 | "import/no-named-as-default": 0,
18 | },
19 | "parserOptions": {
20 | "ecmaVersion": 6,
21 | "sourceType": "module",
22 | "ecmaFeatures": {
23 | "experimentalObjectRestSpread": true
24 | }
25 | },
26 | };
27 |
--------------------------------------------------------------------------------
/example/RNApp/.flowconfig:
--------------------------------------------------------------------------------
1 | [ignore]
2 |
3 | # We fork some components by platform.
4 | .*/*[.]android.js
5 |
6 | # Ignore templates with `@flow` in header
7 | .*/local-cli/generator.*
8 |
9 | # Ignore malformed json
10 | .*/node_modules/y18n/test/.*\.json
11 |
12 | # Ignore the website subdir
13 | /website/.*
14 |
15 | # Ignore BUCK generated dirs
16 | /\.buckd/
17 |
18 | # Ignore unexpected extra @providesModule
19 | .*/node_modules/commoner/test/source/widget/share.js
20 |
21 | # Ignore duplicate module providers
22 | # For RN Apps installed via npm, "Libraries" folder is inside node_modules/react-native but in the source repo it is in the root
23 | .*/Libraries/react-native/React.js
24 | .*/Libraries/react-native/ReactNative.js
25 | .*/node_modules/jest-runtime/build/__tests__/.*
26 |
27 | [include]
28 |
29 | [libs]
30 | node_modules/react-native/Libraries/react-native/react-native-interface.js
31 | node_modules/react-native/flow
32 | flow/
33 |
34 | [options]
35 | module.system=haste
36 |
37 | esproposal.class_static_fields=enable
38 | esproposal.class_instance_fields=enable
39 |
40 | experimental.strict_type_args=true
41 |
42 | munge_underscores=true
43 |
44 | module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
45 | 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\|pdf\)$' -> 'RelativeImageStub'
46 |
47 | suppress_type=$FlowIssue
48 | suppress_type=$FlowFixMe
49 | suppress_type=$FixMe
50 |
51 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-2]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
52 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-2]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
53 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
54 |
55 | unsafe.enable_getters_and_setters=true
56 |
57 | [version]
58 | ^0.32.0
59 |
--------------------------------------------------------------------------------
/example/RNApp/.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 | *.iml
28 | .idea
29 | .gradle
30 | local.properties
31 |
32 | # node.js
33 | #
34 | node_modules/
35 | npm-debug.log
36 |
37 | # BUCK
38 | buck-out/
39 | \.buckd/
40 | android/app/libs
41 | android/keystores/debug.keystore
42 |
--------------------------------------------------------------------------------
/example/RNApp/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/example/RNApp/android/app/BUCK:
--------------------------------------------------------------------------------
1 | import re
2 |
3 | # To learn about Buck see [Docs](https://buckbuild.com/).
4 | # To run your application with Buck:
5 | # - install Buck
6 | # - `npm start` - to start the packager
7 | # - `cd android`
8 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
9 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
10 | # - `buck install -r android/app` - compile, install and run application
11 | #
12 |
13 | lib_deps = []
14 | for jarfile in glob(['libs/*.jar']):
15 | name = 'jars__' + re.sub(r'^.*/([^/]+)\.jar$', r'\1', jarfile)
16 | lib_deps.append(':' + name)
17 | prebuilt_jar(
18 | name = name,
19 | binary_jar = jarfile,
20 | )
21 |
22 | for aarfile in glob(['libs/*.aar']):
23 | name = 'aars__' + re.sub(r'^.*/([^/]+)\.aar$', r'\1', aarfile)
24 | lib_deps.append(':' + name)
25 | android_prebuilt_aar(
26 | name = name,
27 | aar = aarfile,
28 | )
29 |
30 | android_library(
31 | name = 'all-libs',
32 | exported_deps = lib_deps
33 | )
34 |
35 | android_library(
36 | name = 'app-code',
37 | srcs = glob([
38 | 'src/main/java/**/*.java',
39 | ]),
40 | deps = [
41 | ':all-libs',
42 | ':build_config',
43 | ':res',
44 | ],
45 | )
46 |
47 | android_build_config(
48 | name = 'build_config',
49 | package = 'com.rnapp',
50 | )
51 |
52 | android_resource(
53 | name = 'res',
54 | res = 'src/main/res',
55 | package = 'com.rnapp',
56 | )
57 |
58 | android_binary(
59 | name = 'app',
60 | package_type = 'debug',
61 | manifest = 'src/main/AndroidManifest.xml',
62 | keystore = '//android/keystores:debug',
63 | deps = [
64 | ':app-code',
65 | ],
66 | )
67 |
--------------------------------------------------------------------------------
/example/RNApp/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: "com.android.application"
2 |
3 | import com.android.build.OutputFile
4 |
5 | /**
6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7 | * and bundleReleaseJsAndAssets).
8 | * These basically call `react-native bundle` with the correct arguments during the Android build
9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10 | * bundle directly from the development server. Below you can see all the possible configurations
11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the
12 | * `apply from: "../../node_modules/react-native/react.gradle"` line.
13 | *
14 | * project.ext.react = [
15 | * // the name of the generated asset file containing your JS bundle
16 | * bundleAssetName: "index.android.bundle",
17 | *
18 | * // the entry file for bundle generation
19 | * entryFile: "index.android.js",
20 | *
21 | * // whether to bundle JS and assets in debug mode
22 | * bundleInDebug: false,
23 | *
24 | * // whether to bundle JS and assets in release mode
25 | * bundleInRelease: true,
26 | *
27 | * // whether to bundle JS and assets in another build variant (if configured).
28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
29 | * // The configuration property can be in the following formats
30 | * // 'bundleIn${productFlavor}${buildType}'
31 | * // 'bundleIn${buildType}'
32 | * // bundleInFreeDebug: true,
33 | * // bundleInPaidRelease: true,
34 | * // bundleInBeta: true,
35 | *
36 | * // the root of your project, i.e. where "package.json" lives
37 | * root: "../../",
38 | *
39 | * // where to put the JS bundle asset in debug mode
40 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
41 | *
42 | * // where to put the JS bundle asset in release mode
43 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release",
44 | *
45 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
46 | * // require('./image.png')), in debug mode
47 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
48 | *
49 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
50 | * // require('./image.png')), in release mode
51 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
52 | *
53 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means
54 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
55 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle
56 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
57 | * // for example, you might want to remove it from here.
58 | * inputExcludes: ["android/**", "ios/**"],
59 | *
60 | * // override which node gets called and with what additional arguments
61 | * nodeExecutableAndArgs: ["node"]
62 | *
63 | * // supply additional arguments to the packager
64 | * extraPackagerArgs: []
65 | * ]
66 | */
67 |
68 | apply from: "../../node_modules/react-native/react.gradle"
69 |
70 | /**
71 | * Set this to true to create two separate APKs instead of one:
72 | * - An APK that only works on ARM devices
73 | * - An APK that only works on x86 devices
74 | * The advantage is the size of the APK is reduced by about 4MB.
75 | * Upload all the APKs to the Play Store and people will download
76 | * the correct one based on the CPU architecture of their device.
77 | */
78 | def enableSeparateBuildPerCPUArchitecture = false
79 |
80 | /**
81 | * Run Proguard to shrink the Java bytecode in release builds.
82 | */
83 | def enableProguardInReleaseBuilds = false
84 |
85 | android {
86 | compileSdkVersion 23
87 | buildToolsVersion "23.0.1"
88 |
89 | defaultConfig {
90 | applicationId "com.rnapp"
91 | minSdkVersion 16
92 | targetSdkVersion 22
93 | versionCode 1
94 | versionName "1.0"
95 | ndk {
96 | abiFilters "armeabi-v7a", "x86"
97 | }
98 | }
99 | splits {
100 | abi {
101 | reset()
102 | enable enableSeparateBuildPerCPUArchitecture
103 | universalApk false // If true, also generate a universal APK
104 | include "armeabi-v7a", "x86"
105 | }
106 | }
107 | buildTypes {
108 | release {
109 | minifyEnabled enableProguardInReleaseBuilds
110 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
111 | }
112 | }
113 | // applicationVariants are e.g. debug, release
114 | applicationVariants.all { variant ->
115 | variant.outputs.each { output ->
116 | // For each separate APK per architecture, set a unique version code as described here:
117 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
118 | def versionCodes = ["armeabi-v7a":1, "x86":2]
119 | def abi = output.getFilter(OutputFile.ABI)
120 | if (abi != null) { // null for the universal-debug, universal-release variants
121 | output.versionCodeOverride =
122 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
123 | }
124 | }
125 | }
126 | }
127 |
128 | dependencies {
129 | compile fileTree(dir: "libs", include: ["*.jar"])
130 | compile "com.android.support:appcompat-v7:23.0.1"
131 | compile "com.facebook.react:react-native:+" // From node_modules
132 | }
133 |
134 | // Run this once to be able to run the application with BUCK
135 | // puts all compile dependencies into folder libs for BUCK to use
136 | task copyDownloadableDepsToLibs(type: Copy) {
137 | from configurations.compile
138 | into 'libs'
139 | }
140 |
--------------------------------------------------------------------------------
/example/RNApp/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
19 | # Disabling obfuscation is useful if you collect stack traces from production crashes
20 | # (unless you are using a system that supports de-obfuscate the stack traces).
21 | -dontobfuscate
22 |
23 | # React Native
24 |
25 | # Keep our interfaces so they can be used by other ProGuard rules.
26 | # See http://sourceforge.net/p/proguard/bugs/466/
27 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
28 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
29 | -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
30 |
31 | # Do not strip any method/class that is annotated with @DoNotStrip
32 | -keep @com.facebook.proguard.annotations.DoNotStrip class *
33 | -keep @com.facebook.common.internal.DoNotStrip class *
34 | -keepclassmembers class * {
35 | @com.facebook.proguard.annotations.DoNotStrip *;
36 | @com.facebook.common.internal.DoNotStrip *;
37 | }
38 |
39 | -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
40 | void set*(***);
41 | *** get*();
42 | }
43 |
44 | -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
45 | -keep class * extends com.facebook.react.bridge.NativeModule { *; }
46 | -keepclassmembers,includedescriptorclasses class * { native ; }
47 | -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; }
48 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; }
49 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; }
50 |
51 | -dontwarn com.facebook.react.**
52 |
53 | # okhttp
54 |
55 | -keepattributes Signature
56 | -keepattributes *Annotation*
57 | -keep class okhttp3.** { *; }
58 | -keep interface okhttp3.** { *; }
59 | -dontwarn okhttp3.**
60 |
61 | # okio
62 |
63 | -keep class sun.misc.Unsafe { *; }
64 | -dontwarn java.nio.file.*
65 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
66 | -dontwarn okio.**
67 |
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
7 |
8 |
9 |
10 |
13 |
14 |
20 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/java/com/rnapp/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.rnapp;
2 |
3 | import com.facebook.react.ReactActivity;
4 |
5 | public class MainActivity extends ReactActivity {
6 |
7 | /**
8 | * Returns the name of the main component registered from JavaScript.
9 | * This is used to schedule rendering of the component.
10 | */
11 | @Override
12 | protected String getMainComponentName() {
13 | return "RNApp";
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/java/com/rnapp/MainApplication.java:
--------------------------------------------------------------------------------
1 | package com.rnapp;
2 |
3 | import android.app.Application;
4 | import android.util.Log;
5 |
6 | import com.facebook.react.ReactApplication;
7 | import com.facebook.react.ReactInstanceManager;
8 | import com.facebook.react.ReactNativeHost;
9 | import com.facebook.react.ReactPackage;
10 | import com.facebook.react.shell.MainReactPackage;
11 |
12 | import java.util.Arrays;
13 | import java.util.List;
14 |
15 | public class MainApplication extends Application implements ReactApplication {
16 |
17 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
18 | @Override
19 | protected boolean getUseDeveloperSupport() {
20 | return BuildConfig.DEBUG;
21 | }
22 |
23 | @Override
24 | protected List getPackages() {
25 | return Arrays.asList(
26 | new MainReactPackage()
27 | );
28 | }
29 | };
30 |
31 | @Override
32 | public ReactNativeHost getReactNativeHost() {
33 | return mReactNativeHost;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | RNApp
3 |
4 |
--------------------------------------------------------------------------------
/example/RNApp/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/example/RNApp/android/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:1.3.1'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | mavenLocal()
18 | jcenter()
19 | maven {
20 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
21 | url "$rootDir/../node_modules/react-native/android"
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/example/RNApp/android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 |
20 | android.useDeprecatedNdk=true
21 |
--------------------------------------------------------------------------------
/example/RNApp/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/example/RNApp/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
6 |
--------------------------------------------------------------------------------
/example/RNApp/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # For Cygwin, ensure paths are in UNIX format before anything is touched.
46 | if $cygwin ; then
47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
48 | fi
49 |
50 | # Attempt to set APP_HOME
51 | # Resolve links: $0 may be a link
52 | PRG="$0"
53 | # Need this for relative symlinks.
54 | while [ -h "$PRG" ] ; do
55 | ls=`ls -ld "$PRG"`
56 | link=`expr "$ls" : '.*-> \(.*\)$'`
57 | if expr "$link" : '/.*' > /dev/null; then
58 | PRG="$link"
59 | else
60 | PRG=`dirname "$PRG"`"/$link"
61 | fi
62 | done
63 | SAVED="`pwd`"
64 | cd "`dirname \"$PRG\"`/" >&-
65 | APP_HOME="`pwd -P`"
66 | cd "$SAVED" >&-
67 |
68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
69 |
70 | # Determine the Java command to use to start the JVM.
71 | if [ -n "$JAVA_HOME" ] ; then
72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
73 | # IBM's JDK on AIX uses strange locations for the executables
74 | JAVACMD="$JAVA_HOME/jre/sh/java"
75 | else
76 | JAVACMD="$JAVA_HOME/bin/java"
77 | fi
78 | if [ ! -x "$JAVACMD" ] ; then
79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
80 |
81 | Please set the JAVA_HOME variable in your environment to match the
82 | location of your Java installation."
83 | fi
84 | else
85 | JAVACMD="java"
86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
87 |
88 | Please set the JAVA_HOME variable in your environment to match the
89 | location of your Java installation."
90 | fi
91 |
92 | # Increase the maximum file descriptors if we can.
93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
94 | MAX_FD_LIMIT=`ulimit -H -n`
95 | if [ $? -eq 0 ] ; then
96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
97 | MAX_FD="$MAX_FD_LIMIT"
98 | fi
99 | ulimit -n $MAX_FD
100 | if [ $? -ne 0 ] ; then
101 | warn "Could not set maximum file descriptor limit: $MAX_FD"
102 | fi
103 | else
104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
105 | fi
106 | fi
107 |
108 | # For Darwin, add options to specify how the application appears in the dock
109 | if $darwin; then
110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
111 | fi
112 |
113 | # For Cygwin, switch paths to Windows format before running java
114 | if $cygwin ; then
115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/example/RNApp/android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/example/RNApp/android/keystores/BUCK:
--------------------------------------------------------------------------------
1 | keystore(
2 | name = 'debug',
3 | store = 'debug.keystore',
4 | properties = 'debug.keystore.properties',
5 | visibility = [
6 | 'PUBLIC',
7 | ],
8 | )
9 |
--------------------------------------------------------------------------------
/example/RNApp/android/keystores/debug.keystore.properties:
--------------------------------------------------------------------------------
1 | key.store=debug.keystore
2 | key.alias=androiddebugkey
3 | key.store.password=android
4 | key.alias.password=android
5 |
--------------------------------------------------------------------------------
/example/RNApp/android/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'RNApp'
2 |
3 | include ':app'
4 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Avatar/Avatar.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Image } from 'react-native';
3 | import gravatar from 'gravatar-api';
4 | import images from '../../config/images';
5 | import styles from './styles';
6 |
7 | const Avatar = (props) => {
8 | const gravatarOptions = {
9 | email: props.email,
10 | parameters: { size: 200 },
11 | };
12 |
13 | const uri = gravatar.imageUrl(gravatarOptions);
14 | return (
15 |
20 | );
21 | };
22 |
23 | Avatar.propTypes = {
24 | email: React.PropTypes.string,
25 | };
26 |
27 | export default Avatar;
28 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Avatar/index.js:
--------------------------------------------------------------------------------
1 | import Avatar from './Avatar';
2 |
3 | export default Avatar;
4 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Avatar/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet } from 'react-native';
2 |
3 | const size = 100;
4 | export default StyleSheet.create({
5 | avatar: {
6 | width: size,
7 | height: size,
8 | borderRadius: size / 2,
9 | borderWidth: 3,
10 | borderColor: '#FFFFFF',
11 | },
12 | });
13 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Button/Button.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Text, TouchableOpacity } from 'react-native';
3 | import styles from './styles';
4 |
5 | const Button = (props) => {
6 | const { text, onPress } = props;
7 | return (
8 |
9 |
10 | {text}
11 |
12 |
13 | );
14 | };
15 |
16 | Button.propTypes = {
17 | text: React.PropTypes.string,
18 | onPress: React.PropTypes.func,
19 | };
20 |
21 | Button.defaultProps = {
22 | text: 'Button Text',
23 | // eslint-disable-next-line no-console
24 | onPress: () => console.log('Button Pressed'),
25 | };
26 |
27 | export default Button;
28 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Button/index.js:
--------------------------------------------------------------------------------
1 | import Button from './Button';
2 |
3 | export default Button;
4 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Button/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet } from 'react-native';
2 | import { colors } from '../../config/styles';
3 |
4 | export default StyleSheet.create({
5 | button: {
6 | paddingVertical: 10,
7 | paddingHorizontal: 20,
8 | backgroundColor: colors.buttonBackground,
9 | margin: 5,
10 | },
11 | buttonText: {
12 | color: colors.buttonText,
13 | fontSize: 16,
14 | fontWeight: '500',
15 | },
16 | });
17 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/GenericTextInput/GenericTextInput.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { View, TextInput } from 'react-native';
3 | import styles from './styles';
4 |
5 | const GenericTextInput = (props) => {
6 | return (
7 |
8 | {props.borderTop ? : null}
9 |
15 |
16 | );
17 | };
18 |
19 | GenericTextInput.propTypes = {
20 | borderTop: React.PropTypes.bool,
21 | };
22 |
23 | export default GenericTextInput;
24 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/GenericTextInput/InputWrapper.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { View } from 'react-native';
3 | import styles from './styles';
4 |
5 | const InputWrapper = (props) => {
6 | return (
7 |
8 | {props.children}
9 |
10 | );
11 | };
12 |
13 | InputWrapper.propTypes = {
14 | children: React.PropTypes.array,
15 | };
16 |
17 | export default InputWrapper;
18 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/GenericTextInput/index.js:
--------------------------------------------------------------------------------
1 | import GenericTextInput from './GenericTextInput';
2 | import InputWrapper from './InputWrapper';
3 |
4 | export { InputWrapper };
5 | export default GenericTextInput;
6 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/GenericTextInput/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet, Dimensions } from 'react-native';
2 | import { colors } from '../../config/styles';
3 |
4 | const window = Dimensions.get('window');
5 | export default StyleSheet.create({
6 | input: {
7 | height: 40,
8 | borderRadius: 5,
9 | backgroundColor: colors.inputBackground,
10 | marginLeft: 10,
11 | marginVertical: 5,
12 | paddingVertical: 5,
13 | paddingHorizontal: 15,
14 | },
15 | divider: {
16 | height: 1,
17 | backgroundColor: colors.inputDivider,
18 | flex: 1,
19 | marginLeft: 10,
20 | },
21 | inputWrapper: {
22 | backgroundColor: colors.inputBackground,
23 | width: window.width,
24 | },
25 | });
26 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Loading/Loading.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { View, ActivityIndicator } from 'react-native';
3 | import styles from './styles';
4 |
5 | const Loading = (props) => {
6 | return (
7 |
8 |
13 |
14 | );
15 | };
16 |
17 | Loading.propTypes = {
18 | size: React.PropTypes.string,
19 | };
20 |
21 | Loading.defaultProps = {
22 | size: 'large',
23 | };
24 |
25 | export default Loading;
26 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Loading/index.js:
--------------------------------------------------------------------------------
1 | import Loading from './Loading';
2 |
3 | export default Loading;
4 |
--------------------------------------------------------------------------------
/example/RNApp/app/components/Loading/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet } from 'react-native';
2 | import { colors } from '../../config/styles';
3 |
4 | export default StyleSheet.create({
5 | container: {
6 | flex: 1,
7 | justifyContent: 'center',
8 | alignItems: 'center',
9 | backgroundColor: colors.background,
10 | },
11 | });
12 |
--------------------------------------------------------------------------------
/example/RNApp/app/config/images.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable global-require */
2 |
3 | const images = {
4 | logo: require('../images/rn-logo.png'),
5 | icons: {
6 | home: require('../images/home-icon.png'),
7 | profile: require('../images/user-icon.png'),
8 | },
9 | profileHeader: require('../images/header-image.png'),
10 | avatarPlaceholder: require('../images/avatar-placeholder.png'),
11 | };
12 |
13 | export default images;
14 |
--------------------------------------------------------------------------------
/example/RNApp/app/config/routes.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Home from '../routes/Home';
3 | import Details from '../routes/Details';
4 | import Profile from '../routes/Profile';
5 | import SignIn from '../routes/SignIn';
6 | import { TouchableOpacity, Text, View } from 'react-native';
7 | import { MO } from '../index';
8 |
9 | export const routes = {
10 | getHomeRoute() {
11 | return {
12 | renderScene(navigator) {
13 | return ;
14 | },
15 |
16 | getTitle() {
17 | return 'Home';
18 | },
19 | };
20 | },
21 | getDetailsRoute() {
22 | return {
23 | renderScene(navigator) {
24 | return ;
25 | },
26 |
27 | renderRightButton() {
28 | return (
29 | MO.persister.purge()}>
30 |
31 | {MO.subReady('detailsByParam') ? 'Sub ready' : 'Sub not ready'}
32 | Purge Cache
33 |
34 |
35 | );
36 | },
37 |
38 | getTitle() {
39 | return 'Details';
40 | },
41 | };
42 | },
43 | getProfileRoute() {
44 | return {
45 | renderScene(navigator) {
46 | return ;
47 | },
48 |
49 | showNavigationBar: false,
50 | };
51 | },
52 | getSignInRoute() {
53 | return {
54 | renderScene(navigator) {
55 | return ;
56 | },
57 |
58 | showNavigationBar: false,
59 | };
60 | },
61 | };
62 |
63 | export default routes;
64 |
--------------------------------------------------------------------------------
/example/RNApp/app/config/settings.js:
--------------------------------------------------------------------------------
1 | // If you're running on a device or in the Android simulator be sure to change
2 | let METEOR_URL = 'ws://localhost:3000/websocket';
3 | if (process.env.NODE_ENV === 'production') {
4 | METEOR_URL = ''; // your production server url
5 | }
6 |
7 | export const settings = {
8 | env: process.env.NODE_ENV,
9 | METEOR_URL,
10 | };
11 |
12 | export default settings;
13 |
--------------------------------------------------------------------------------
/example/RNApp/app/config/styles.js:
--------------------------------------------------------------------------------
1 | export const colors = {
2 | background: '#F5F2F9',
3 | errorText: '#FA3256',
4 | headerText: '#444444',
5 | buttonBackground: '#39BD98',
6 | buttonText: '#FFFFFF',
7 | inputBackground: '#FFFFFF',
8 | inputDivider: '#E4E2E5',
9 | };
10 |
--------------------------------------------------------------------------------
/example/RNApp/app/images/avatar-placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/app/images/avatar-placeholder.png
--------------------------------------------------------------------------------
/example/RNApp/app/images/header-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/app/images/header-image.png
--------------------------------------------------------------------------------
/example/RNApp/app/images/home-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/app/images/home-icon.png
--------------------------------------------------------------------------------
/example/RNApp/app/images/rn-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/app/images/rn-logo.png
--------------------------------------------------------------------------------
/example/RNApp/app/images/rn-logo@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/app/images/rn-logo@2x.png
--------------------------------------------------------------------------------
/example/RNApp/app/images/rn-logo@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/app/images/rn-logo@3x.png
--------------------------------------------------------------------------------
/example/RNApp/app/images/user-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DesignmanIO/react-native-meteor-offline/b0c95b49898846529fbca3fa64bc9006abf02d93/example/RNApp/app/images/user-icon.png
--------------------------------------------------------------------------------
/example/RNApp/app/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Meteor, { createContainer } from 'react-native-meteor';
3 |
4 | // react-native-meteor-redux
5 | import initMeteorRedux, {MeteorOffline} from 'react-native-meteor-redux';
6 | import { AsyncStorage } from 'react-native';
7 | import { persistStore, autoRehydrate } from 'redux-persist';
8 | // end react-native-meteor-redux
9 |
10 | import LoggedOut from './layouts/LoggedOut';
11 | import LoggedIn from './layouts/LoggedIn';
12 | import Loading from './components/Loading';
13 | import settings from './config/settings';
14 |
15 | Meteor.connect(settings.METEOR_URL);
16 |
17 | export const MO = new MeteorOffline();
18 | // react-native-meteor-redux
19 | // const MeteorStore = initMeteorRedux(undefined, autoRehydrate());
20 | // persistStore(MeteorStore, { storage: AsyncStorage, debounce: 1000 }, () => {
21 | // MeteorStore.loaded();
22 | // });
23 | // setInterval(() => console.log(MeteorStore.getState(), Object.keys(MeteorStore.getState().details || {}).length), 10000);
24 | // export { MeteorStore }
25 | // end react-native-meteor-redux
26 |
27 | const RNApp = (props) => {
28 | const { status, user, loggingIn } = props;
29 |
30 | console.log(loggingIn, status);
31 | // return ;
32 | if (loggingIn && status.connected) {
33 | return ;
34 | } else if (user !== null) {
35 | return ;
36 | }
37 | return ;
38 | };
39 |
40 | RNApp.propTypes = {
41 | status: React.PropTypes.object,
42 | user: React.PropTypes.object,
43 | loggingIn: React.PropTypes.bool,
44 | };
45 |
46 | export default createContainer(() => {
47 | return {
48 | status: Meteor.status(),
49 | user: MO.user(),
50 | loggingIn: Meteor.loggingIn(),
51 | };
52 | }, RNApp);
53 |
--------------------------------------------------------------------------------
/example/RNApp/app/layouts/LoggedIn/LoggedIn.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Image } from 'react-native';
3 | import TabNavigator from 'react-native-tab-navigator';
4 | import ExNavigator from '@exponent/react-native-navigator';
5 | import Routes from '../../config/routes';
6 | import images from '../../config/images';
7 | import styles from './styles';
8 |
9 | class LoggedIn extends React.Component {
10 | constructor(props) {
11 | super(props);
12 | this.state = {
13 | selectedTab: 'Home',
14 | };
15 | }
16 |
17 | renderTabItem(title, initialRoute, Icon) {
18 | const { selectedTab } = this.state;
19 | const sceneStyle = [];
20 | if (initialRoute.showNavigationBar !== false) {
21 | sceneStyle.push({ paddingTop: 64 });
22 | }
23 |
24 | return (
25 | }
29 | renderSelectedIcon={() => (
30 |
34 | )}
35 | onPress={() => this.setState({ selectedTab: title })}
36 | >
37 |
43 |
44 | );
45 | }
46 |
47 | render() {
48 | return (
49 |
50 | {this.renderTabItem('Home', Routes.getHomeRoute(), images.icons.home)}
51 | {this.renderTabItem('Profile', Routes.getProfileRoute(), images.icons.profile)}
52 |
53 | );
54 | }
55 | }
56 |
57 | export default LoggedIn;
58 |
--------------------------------------------------------------------------------
/example/RNApp/app/layouts/LoggedIn/index.js:
--------------------------------------------------------------------------------
1 | import LoggedIn from './LoggedIn';
2 |
3 | export default LoggedIn;
4 |
--------------------------------------------------------------------------------
/example/RNApp/app/layouts/LoggedIn/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet } from 'react-native';
2 |
3 | export default StyleSheet.create({
4 | icon: {
5 | height: 30,
6 | width: 30,
7 | tintColor: '#929292',
8 | },
9 | iconSelected: {
10 | tintColor: 'rgb(0, 122, 255)',
11 | },
12 | });
13 |
--------------------------------------------------------------------------------
/example/RNApp/app/layouts/LoggedOut/LoggedOut.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ExNavigator from '@exponent/react-native-navigator';
3 | import Routes from '../../config/routes';
4 |
5 | const LoggedOut = () => {
6 | const route = Routes.getSignInRoute();
7 | return (
8 |
13 | );
14 | };
15 |
16 | export default LoggedOut;
17 |
--------------------------------------------------------------------------------
/example/RNApp/app/layouts/LoggedOut/index.js:
--------------------------------------------------------------------------------
1 | import LoggedOut from './LoggedOut';
2 |
3 | export default LoggedOut;
4 |
--------------------------------------------------------------------------------
/example/RNApp/app/lib/string.js:
--------------------------------------------------------------------------------
1 | export const capitalize = (string = '') => {
2 | return string.charAt(0).toUpperCase() + string.slice(1);
3 | };
4 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Details/Details.js:
--------------------------------------------------------------------------------
1 | import React, { PropTypes } from 'react';
2 | import { Text, View } from 'react-native';
3 | import { MeteorListView } from 'react-native-meteor';
4 | import Loading from '../../components/Loading';
5 | import styles from './styles';
6 |
7 | const Details = ({ detailsReady }) => {
8 | if (!detailsReady) {
9 | return ;
10 | }
11 |
12 | return (
13 |
14 | {`${detail.name.first} ${detail.name.first}`}}
18 | />
19 |
20 | );
21 | };
22 |
23 | Details.propTypes = {
24 | detailsReady: PropTypes.bool,
25 | };
26 |
27 | export default Details;
28 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Details/DetailsContainer.js:
--------------------------------------------------------------------------------
1 | import React, { PropTypes } from 'react';
2 | import Meteor, { createContainer } from 'react-native-meteor';
3 | import Details from './Details';
4 | // react-native-meteor-redux
5 | import {subscribeCached, MeteorOffline} from 'react-native-meteor-redux';
6 | import {MeteorStore, MO} from '../../index';
7 | // end react-native-meteor-redux
8 |
9 | const DetailsContainer = ({ detailsReady }) => {
10 | // console.log(detailsReady);
11 | return (
12 |
15 | );
16 | };
17 |
18 | DetailsContainer.propTypes = {
19 | detailsReady: PropTypes.bool,
20 | };
21 |
22 | export default createContainer(() => {
23 | // react-native-meteor-redux
24 | // const handle = subscribeCached(MeteorStore, 'details-list');
25 | const handle = MO.subscribe('detailsByParam', 'details-list', 'param', {test: 'test'}, () => console.log('callback'));
26 | const details = MO.collection('details', 'detailsByParam').find();
27 | console.log(details.length, Meteor.user(), MO.user());
28 | // console.log(MO.store.getState());
29 | // end react-native-meteor-redux
30 | return {
31 | detailsReady: handle.ready(),
32 | };
33 | }, DetailsContainer);
34 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Details/index.js:
--------------------------------------------------------------------------------
1 | import DetailsContainer from './DetailsContainer';
2 | import Details from './Details';
3 |
4 | export { Details };
5 | export default DetailsContainer;
6 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Details/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet, Dimensions } from 'react-native';
2 | import { colors } from '../../config/styles';
3 |
4 | const window = Dimensions.get('window');
5 | const MARGIN_HORIZONTAL = 10;
6 | const cardSize = (window.width - (MARGIN_HORIZONTAL * 4)) / 2;
7 |
8 | export default StyleSheet.create({
9 | container: {
10 | flex: 1,
11 | backgroundColor: colors.background,
12 | },
13 | list: {
14 | flexDirection: 'row',
15 | flexWrap: 'wrap',
16 | justifyContent: 'flex-start',
17 | },
18 | item: {
19 | backgroundColor: colors.buttonBackground,
20 | color: colors.buttonText,
21 | width: cardSize,
22 | height: cardSize,
23 | marginHorizontal: MARGIN_HORIZONTAL,
24 | marginVertical: 5,
25 | paddingTop: cardSize / 2.3,
26 | fontSize: 16,
27 | fontWeight: '500',
28 | textAlign: 'center',
29 | alignItems: 'center',
30 | },
31 | });
32 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Home/Home.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Text, View } from 'react-native';
3 | import Button from '../../components/Button';
4 | import styles from './styles';
5 |
6 | const Home = (props) => {
7 | return (
8 |
9 |
10 | Home
11 |
12 |
16 |
17 | );
18 | };
19 |
20 | Home.propTypes = {
21 | onDetailsPress: React.PropTypes.func,
22 | };
23 |
24 | export default Home;
25 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Home/HomeContainer.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Home from './Home';
3 | import Routes from '../../config/routes';
4 |
5 | const HomeContainer = (props) => {
6 | return (
7 | props.navigator.push(Routes.getDetailsRoute())}
9 | />
10 | );
11 | };
12 |
13 | HomeContainer.propTypes = {
14 | navigator: React.PropTypes.object,
15 | };
16 |
17 | export default HomeContainer;
18 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Home/index.js:
--------------------------------------------------------------------------------
1 | import HomeContainer from './HomeContainer';
2 | import Home from './Home';
3 |
4 | export { Home };
5 | export default HomeContainer;
6 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Home/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet } from 'react-native';
2 | import { colors } from '../../config/styles';
3 |
4 | export default StyleSheet.create({
5 | container: {
6 | flex: 1,
7 | justifyContent: 'center',
8 | alignItems: 'center',
9 | backgroundColor: colors.background,
10 | },
11 | main: {
12 | fontSize: 20,
13 | textAlign: 'center',
14 | color: colors.headerText,
15 | fontWeight: '400',
16 | fontStyle: 'italic',
17 | },
18 | });
19 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Profile/Profile.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Text, View, Image } from 'react-native';
3 | import Button from '../../components/Button';
4 | import Avatar from '../../components/Avatar';
5 | import images from '../../config/images';
6 | import { capitalize } from '../../lib/string';
7 | import styles from './styles';
8 |
9 | const Profile = (props) => {
10 | const { user, signOut } = props;
11 | let email;
12 |
13 | if (user) {
14 | email = user.emails[0].address;
15 | }
16 |
17 | return (
18 |
19 |
20 |
21 |
22 | {capitalize(email)}
23 |
24 |
25 |
26 | );
27 | };
28 |
29 | Profile.propTypes = {
30 | user: React.PropTypes.object,
31 | signOut: React.PropTypes.func,
32 | };
33 |
34 | export default Profile;
35 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Profile/ProfileContainer.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import Meteor, { createContainer } from 'react-native-meteor';
3 | import Profile from './Profile';
4 |
5 | class ProfileContainer extends Component {
6 | handleSignOut() {
7 | Meteor.logout();
8 | }
9 |
10 | render() {
11 | const { user } = this.props;
12 |
13 | return (
14 |
18 | );
19 | }
20 | }
21 |
22 | ProfileContainer.propTypes = {
23 | user: React.PropTypes.object,
24 | };
25 |
26 | export default createContainer(() => {
27 | return {
28 | user: Meteor.user(),
29 | };
30 | }, ProfileContainer);
31 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Profile/index.js:
--------------------------------------------------------------------------------
1 | import ProfileContainer from './ProfileContainer';
2 | import Profile from './Profile';
3 |
4 | export { Profile };
5 | export default ProfileContainer;
6 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/Profile/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet, Dimensions } from 'react-native';
2 | import { colors } from '../../config/styles';
3 |
4 | const window = Dimensions.get('window');
5 | export default StyleSheet.create({
6 | container: {
7 | flex: 1,
8 | backgroundColor: colors.background,
9 | },
10 | header: {
11 | width: window.width,
12 | height: window.height * 0.4,
13 | },
14 | body: {
15 | marginTop: -50,
16 | alignItems: 'center',
17 | },
18 | });
19 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/SignIn/SignIn.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Text, View, Image } from 'react-native';
3 | import KeyboardSpacer from 'react-native-keyboard-spacer';
4 | import Button from '../../components/Button';
5 | import GenericTextInput, { InputWrapper } from '../../components/GenericTextInput';
6 | import images from '../../config/images';
7 | import styles from './styles';
8 |
9 | const SignIn = (props) => {
10 | const { updateState, signIn, createAccount, error, confirmPasswordVisible } = props;
11 |
12 | return (
13 |
14 |
15 |
19 |
20 | React Native Meteor
21 | Boilerplate
22 |
23 |
24 |
25 | updateState({ email })}
28 | />
29 | updateState({ password })}
32 | secureTextEntry
33 | borderTop
34 | />
35 | {confirmPasswordVisible ?
36 | updateState({ confirmPassword })}
39 | secureTextEntry
40 | borderTop
41 | />
42 | : null}
43 |
44 |
45 |
46 | {error}
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | );
57 | };
58 |
59 | SignIn.propTypes = {
60 | updateState: React.PropTypes.func,
61 | signIn: React.PropTypes.func,
62 | createAccount: React.PropTypes.func,
63 | error: React.PropTypes.string,
64 | confirmPasswordVisible: React.PropTypes.bool,
65 | };
66 |
67 | export default SignIn;
68 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/SignIn/SignInContainer.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { LayoutAnimation } from 'react-native';
3 | import Meteor, { Accounts } from 'react-native-meteor';
4 | import SignIn from './SignIn';
5 |
6 | class SignInContainer extends Component {
7 | constructor(props) {
8 | super(props);
9 |
10 | this.mounted = false;
11 | this.state = {
12 | email: '',
13 | password: '',
14 | confirmPassword: '',
15 | confirmPasswordVisible: false,
16 | error: null,
17 | };
18 | }
19 |
20 | componentWillMount() {
21 | this.mounted = true;
22 | }
23 |
24 | componentWillUnmount() {
25 | this.mounted = false;
26 | }
27 |
28 | handleError(error) {
29 | if (this.mounted) {
30 | this.setState({ error });
31 | }
32 | }
33 |
34 | validInput(overrideConfirm) {
35 | const { email, password, confirmPassword, confirmPasswordVisible } = this.state;
36 | let valid = true;
37 |
38 | if (email.length === 0 || password.length === 0) {
39 | this.handleError('Email and password cannot be empty.');
40 | valid = false;
41 | }
42 |
43 | if (!overrideConfirm && confirmPasswordVisible && password !== confirmPassword) {
44 | this.handleError('Passwords do not match.');
45 | valid = false;
46 | }
47 |
48 | if (valid) {
49 | this.handleError(null);
50 | }
51 |
52 | return valid;
53 | }
54 |
55 | handleSignIn() {
56 | if (this.validInput(true)) {
57 | const { email, password } = this.state;
58 | Meteor.loginWithPassword(email, password, (err) => {
59 | if (err) {
60 | this.handleError(err.reason);
61 | }
62 | });
63 | }
64 | }
65 |
66 | handleCreateAccount() {
67 | const { email, password, confirmPasswordVisible } = this.state;
68 |
69 | if (confirmPasswordVisible && this.validInput()) {
70 | Accounts.createUser({ email, password }, (err) => {
71 | if (err) {
72 | this.handleError(err.reason);
73 | } else {
74 | // hack because react-native-meteor doesn't login right away after sign in
75 | this.handleSignIn();
76 | }
77 | });
78 | } else {
79 | LayoutAnimation.configureNext(LayoutAnimation.Presets.spring);
80 | this.setState({ confirmPasswordVisible: true });
81 | }
82 | }
83 |
84 | render() {
85 | return (
86 |
92 | );
93 | }
94 | }
95 |
96 | export default SignInContainer;
97 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/SignIn/index.js:
--------------------------------------------------------------------------------
1 | import SignInContainer from './SignInContainer';
2 | import SignIn from './SignIn';
3 |
4 | export { SignIn };
5 | export default SignInContainer;
6 |
--------------------------------------------------------------------------------
/example/RNApp/app/routes/SignIn/styles.js:
--------------------------------------------------------------------------------
1 | import { StyleSheet, Dimensions } from 'react-native';
2 | import { colors } from '../../config/styles';
3 |
4 | const window = Dimensions.get('window');
5 | export default StyleSheet.create({
6 | container: {
7 | flex: 1,
8 | justifyContent: 'center',
9 | alignItems: 'center',
10 | backgroundColor: colors.background,
11 | },
12 | buttons: {
13 | flexDirection: 'row',
14 | },
15 | error: {
16 | height: 28,
17 | justifyContent: 'center',
18 | width: window.width,
19 | alignItems: 'center',
20 | },
21 | errorText: {
22 | color: colors.errorText,
23 | fontSize: 14,
24 | },
25 | header: {
26 | marginBottom: 25,
27 | alignItems: 'center',
28 | },
29 | logo: {
30 | width: 125,
31 | height: 125,
32 | },
33 | headerText: {
34 | fontSize: 30,
35 | color: colors.headerText,
36 | fontWeight: '600',
37 | fontStyle: 'italic',
38 | },
39 | subHeaderText: {
40 | fontSize: 20,
41 | color: colors.headerText,
42 | fontWeight: '400',
43 | fontStyle: 'italic',
44 | },
45 | });
46 |
--------------------------------------------------------------------------------
/example/RNApp/index.android.js:
--------------------------------------------------------------------------------
1 | import { AppRegistry } from 'react-native';
2 | import App from './app';
3 |
4 | AppRegistry.registerComponent('RNApp', () => App);
5 |
--------------------------------------------------------------------------------
/example/RNApp/index.ios.js:
--------------------------------------------------------------------------------
1 | import { AppRegistry } from 'react-native';
2 | import App from './app';
3 |
4 | AppRegistry.registerComponent('RNApp', () => App);
5 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
11 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
12 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
13 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
14 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
15 | 00E356F31AD99517003FC87E /* RNAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RNAppTests.m */; };
16 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
17 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
18 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
19 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
20 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
21 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
22 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
23 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
24 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
25 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
26 | /* End PBXBuildFile section */
27 |
28 | /* Begin PBXContainerItemProxy section */
29 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
30 | isa = PBXContainerItemProxy;
31 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
32 | proxyType = 2;
33 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
34 | remoteInfo = RCTActionSheet;
35 | };
36 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
37 | isa = PBXContainerItemProxy;
38 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
39 | proxyType = 2;
40 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
41 | remoteInfo = RCTGeolocation;
42 | };
43 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
44 | isa = PBXContainerItemProxy;
45 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
46 | proxyType = 2;
47 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
48 | remoteInfo = RCTImage;
49 | };
50 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
51 | isa = PBXContainerItemProxy;
52 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
53 | proxyType = 2;
54 | remoteGlobalIDString = 58B511DB1A9E6C8500147676;
55 | remoteInfo = RCTNetwork;
56 | };
57 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
58 | isa = PBXContainerItemProxy;
59 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
60 | proxyType = 2;
61 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
62 | remoteInfo = RCTVibration;
63 | };
64 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
65 | isa = PBXContainerItemProxy;
66 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
67 | proxyType = 1;
68 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
69 | remoteInfo = RNApp;
70 | };
71 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
72 | isa = PBXContainerItemProxy;
73 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
74 | proxyType = 2;
75 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
76 | remoteInfo = RCTSettings;
77 | };
78 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
79 | isa = PBXContainerItemProxy;
80 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
81 | proxyType = 2;
82 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
83 | remoteInfo = RCTWebSocket;
84 | };
85 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
86 | isa = PBXContainerItemProxy;
87 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
88 | proxyType = 2;
89 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
90 | remoteInfo = React;
91 | };
92 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
93 | isa = PBXContainerItemProxy;
94 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
95 | proxyType = 2;
96 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
97 | remoteInfo = RCTLinking;
98 | };
99 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
100 | isa = PBXContainerItemProxy;
101 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
102 | proxyType = 2;
103 | remoteGlobalIDString = 58B5119B1A9E6C1200147676;
104 | remoteInfo = RCTText;
105 | };
106 | /* End PBXContainerItemProxy section */
107 |
108 | /* Begin PBXFileReference section */
109 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = main.jsbundle; path = main.jsbundle; sourceTree = ""; };
110 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = ../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj; sourceTree = ""; };
111 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = ../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj; sourceTree = ""; };
112 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = ../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj; sourceTree = ""; };
113 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = ../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj; sourceTree = ""; };
114 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = ../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj; sourceTree = ""; };
115 | 00E356EE1AD99517003FC87E /* RNAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RNAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
116 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
117 | 00E356F21AD99517003FC87E /* RNAppTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNAppTests.m; sourceTree = ""; };
118 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = ../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj; sourceTree = ""; };
119 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = ../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj; sourceTree = ""; };
120 | 13B07F961A680F5B00A75B9A /* RNApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RNApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
121 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RNApp/AppDelegate.h; sourceTree = ""; };
122 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = RNApp/AppDelegate.m; sourceTree = ""; };
123 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
124 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RNApp/Images.xcassets; sourceTree = ""; };
125 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RNApp/Info.plist; sourceTree = ""; };
126 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RNApp/main.m; sourceTree = ""; };
127 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = ../node_modules/react-native/React/React.xcodeproj; sourceTree = ""; };
128 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = ../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj; sourceTree = ""; };
129 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = ../node_modules/react-native/Libraries/Text/RCTText.xcodeproj; sourceTree = ""; };
130 | /* End PBXFileReference section */
131 |
132 | /* Begin PBXFrameworksBuildPhase section */
133 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
134 | isa = PBXFrameworksBuildPhase;
135 | buildActionMask = 2147483647;
136 | files = (
137 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */,
138 | );
139 | runOnlyForDeploymentPostprocessing = 0;
140 | };
141 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
142 | isa = PBXFrameworksBuildPhase;
143 | buildActionMask = 2147483647;
144 | files = (
145 | 146834051AC3E58100842450 /* libReact.a in Frameworks */,
146 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
147 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
148 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
149 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
150 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
151 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
152 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
153 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
154 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
155 | );
156 | runOnlyForDeploymentPostprocessing = 0;
157 | };
158 | /* End PBXFrameworksBuildPhase section */
159 |
160 | /* Begin PBXGroup section */
161 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = {
162 | isa = PBXGroup;
163 | children = (
164 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
165 | );
166 | name = Products;
167 | sourceTree = "";
168 | };
169 | 00C302B61ABCB90400DB3ED1 /* Products */ = {
170 | isa = PBXGroup;
171 | children = (
172 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
173 | );
174 | name = Products;
175 | sourceTree = "";
176 | };
177 | 00C302BC1ABCB91800DB3ED1 /* Products */ = {
178 | isa = PBXGroup;
179 | children = (
180 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
181 | );
182 | name = Products;
183 | sourceTree = "";
184 | };
185 | 00C302D41ABCB9D200DB3ED1 /* Products */ = {
186 | isa = PBXGroup;
187 | children = (
188 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
189 | );
190 | name = Products;
191 | sourceTree = "";
192 | };
193 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = {
194 | isa = PBXGroup;
195 | children = (
196 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
197 | );
198 | name = Products;
199 | sourceTree = "";
200 | };
201 | 00E356EF1AD99517003FC87E /* RNAppTests */ = {
202 | isa = PBXGroup;
203 | children = (
204 | 00E356F21AD99517003FC87E /* RNAppTests.m */,
205 | 00E356F01AD99517003FC87E /* Supporting Files */,
206 | );
207 | path = RNAppTests;
208 | sourceTree = "";
209 | };
210 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
211 | isa = PBXGroup;
212 | children = (
213 | 00E356F11AD99517003FC87E /* Info.plist */,
214 | );
215 | name = "Supporting Files";
216 | sourceTree = "";
217 | };
218 | 139105B71AF99BAD00B5F7CC /* Products */ = {
219 | isa = PBXGroup;
220 | children = (
221 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
222 | );
223 | name = Products;
224 | sourceTree = "";
225 | };
226 | 139FDEE71B06529A00C62182 /* Products */ = {
227 | isa = PBXGroup;
228 | children = (
229 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
230 | );
231 | name = Products;
232 | sourceTree = "";
233 | };
234 | 13B07FAE1A68108700A75B9A /* RNApp */ = {
235 | isa = PBXGroup;
236 | children = (
237 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
238 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
239 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
240 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
241 | 13B07FB61A68108700A75B9A /* Info.plist */,
242 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
243 | 13B07FB71A68108700A75B9A /* main.m */,
244 | );
245 | name = RNApp;
246 | sourceTree = "";
247 | };
248 | 146834001AC3E56700842450 /* Products */ = {
249 | isa = PBXGroup;
250 | children = (
251 | 146834041AC3E56700842450 /* libReact.a */,
252 | );
253 | name = Products;
254 | sourceTree = "";
255 | };
256 | 78C398B11ACF4ADC00677621 /* Products */ = {
257 | isa = PBXGroup;
258 | children = (
259 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
260 | );
261 | name = Products;
262 | sourceTree = "";
263 | };
264 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
265 | isa = PBXGroup;
266 | children = (
267 | 146833FF1AC3E56700842450 /* React.xcodeproj */,
268 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
269 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
270 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
271 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
272 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
273 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
274 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
275 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
276 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
277 | );
278 | name = Libraries;
279 | sourceTree = "";
280 | };
281 | 832341B11AAA6A8300B99B32 /* Products */ = {
282 | isa = PBXGroup;
283 | children = (
284 | 832341B51AAA6A8300B99B32 /* libRCTText.a */,
285 | );
286 | name = Products;
287 | sourceTree = "";
288 | };
289 | 83CBB9F61A601CBA00E9B192 = {
290 | isa = PBXGroup;
291 | children = (
292 | 13B07FAE1A68108700A75B9A /* RNApp */,
293 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
294 | 00E356EF1AD99517003FC87E /* RNAppTests */,
295 | 83CBBA001A601CBA00E9B192 /* Products */,
296 | );
297 | indentWidth = 2;
298 | sourceTree = "";
299 | tabWidth = 2;
300 | };
301 | 83CBBA001A601CBA00E9B192 /* Products */ = {
302 | isa = PBXGroup;
303 | children = (
304 | 13B07F961A680F5B00A75B9A /* RNApp.app */,
305 | 00E356EE1AD99517003FC87E /* RNAppTests.xctest */,
306 | );
307 | name = Products;
308 | sourceTree = "";
309 | };
310 | /* End PBXGroup section */
311 |
312 | /* Begin PBXNativeTarget section */
313 | 00E356ED1AD99517003FC87E /* RNAppTests */ = {
314 | isa = PBXNativeTarget;
315 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "RNAppTests" */;
316 | buildPhases = (
317 | 00E356EA1AD99517003FC87E /* Sources */,
318 | 00E356EB1AD99517003FC87E /* Frameworks */,
319 | 00E356EC1AD99517003FC87E /* Resources */,
320 | );
321 | buildRules = (
322 | );
323 | dependencies = (
324 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
325 | );
326 | name = RNAppTests;
327 | productName = RNAppTests;
328 | productReference = 00E356EE1AD99517003FC87E /* RNAppTests.xctest */;
329 | productType = "com.apple.product-type.bundle.unit-test";
330 | };
331 | 13B07F861A680F5B00A75B9A /* RNApp */ = {
332 | isa = PBXNativeTarget;
333 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RNApp" */;
334 | buildPhases = (
335 | 13B07F871A680F5B00A75B9A /* Sources */,
336 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
337 | 13B07F8E1A680F5B00A75B9A /* Resources */,
338 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
339 | );
340 | buildRules = (
341 | );
342 | dependencies = (
343 | );
344 | name = RNApp;
345 | productName = "Hello World";
346 | productReference = 13B07F961A680F5B00A75B9A /* RNApp.app */;
347 | productType = "com.apple.product-type.application";
348 | };
349 | /* End PBXNativeTarget section */
350 |
351 | /* Begin PBXProject section */
352 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
353 | isa = PBXProject;
354 | attributes = {
355 | LastUpgradeCheck = 0610;
356 | ORGANIZATIONNAME = Facebook;
357 | TargetAttributes = {
358 | 00E356ED1AD99517003FC87E = {
359 | CreatedOnToolsVersion = 6.2;
360 | TestTargetID = 13B07F861A680F5B00A75B9A;
361 | };
362 | };
363 | };
364 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RNApp" */;
365 | compatibilityVersion = "Xcode 3.2";
366 | developmentRegion = English;
367 | hasScannedForEncodings = 0;
368 | knownRegions = (
369 | en,
370 | Base,
371 | );
372 | mainGroup = 83CBB9F61A601CBA00E9B192;
373 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
374 | projectDirPath = "";
375 | projectReferences = (
376 | {
377 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
378 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
379 | },
380 | {
381 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
382 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
383 | },
384 | {
385 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
386 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
387 | },
388 | {
389 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
390 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
391 | },
392 | {
393 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
394 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
395 | },
396 | {
397 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
398 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
399 | },
400 | {
401 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
402 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
403 | },
404 | {
405 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
406 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
407 | },
408 | {
409 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
410 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
411 | },
412 | {
413 | ProductGroup = 146834001AC3E56700842450 /* Products */;
414 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
415 | },
416 | );
417 | projectRoot = "";
418 | targets = (
419 | 13B07F861A680F5B00A75B9A /* RNApp */,
420 | 00E356ED1AD99517003FC87E /* RNAppTests */,
421 | );
422 | };
423 | /* End PBXProject section */
424 |
425 | /* Begin PBXReferenceProxy section */
426 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
427 | isa = PBXReferenceProxy;
428 | fileType = archive.ar;
429 | path = libRCTActionSheet.a;
430 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
431 | sourceTree = BUILT_PRODUCTS_DIR;
432 | };
433 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
434 | isa = PBXReferenceProxy;
435 | fileType = archive.ar;
436 | path = libRCTGeolocation.a;
437 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
438 | sourceTree = BUILT_PRODUCTS_DIR;
439 | };
440 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
441 | isa = PBXReferenceProxy;
442 | fileType = archive.ar;
443 | path = libRCTImage.a;
444 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
445 | sourceTree = BUILT_PRODUCTS_DIR;
446 | };
447 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
448 | isa = PBXReferenceProxy;
449 | fileType = archive.ar;
450 | path = libRCTNetwork.a;
451 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
452 | sourceTree = BUILT_PRODUCTS_DIR;
453 | };
454 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
455 | isa = PBXReferenceProxy;
456 | fileType = archive.ar;
457 | path = libRCTVibration.a;
458 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
459 | sourceTree = BUILT_PRODUCTS_DIR;
460 | };
461 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
462 | isa = PBXReferenceProxy;
463 | fileType = archive.ar;
464 | path = libRCTSettings.a;
465 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
466 | sourceTree = BUILT_PRODUCTS_DIR;
467 | };
468 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
469 | isa = PBXReferenceProxy;
470 | fileType = archive.ar;
471 | path = libRCTWebSocket.a;
472 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
473 | sourceTree = BUILT_PRODUCTS_DIR;
474 | };
475 | 146834041AC3E56700842450 /* libReact.a */ = {
476 | isa = PBXReferenceProxy;
477 | fileType = archive.ar;
478 | path = libReact.a;
479 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
480 | sourceTree = BUILT_PRODUCTS_DIR;
481 | };
482 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
483 | isa = PBXReferenceProxy;
484 | fileType = archive.ar;
485 | path = libRCTLinking.a;
486 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
487 | sourceTree = BUILT_PRODUCTS_DIR;
488 | };
489 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
490 | isa = PBXReferenceProxy;
491 | fileType = archive.ar;
492 | path = libRCTText.a;
493 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
494 | sourceTree = BUILT_PRODUCTS_DIR;
495 | };
496 | /* End PBXReferenceProxy section */
497 |
498 | /* Begin PBXResourcesBuildPhase section */
499 | 00E356EC1AD99517003FC87E /* Resources */ = {
500 | isa = PBXResourcesBuildPhase;
501 | buildActionMask = 2147483647;
502 | files = (
503 | );
504 | runOnlyForDeploymentPostprocessing = 0;
505 | };
506 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
507 | isa = PBXResourcesBuildPhase;
508 | buildActionMask = 2147483647;
509 | files = (
510 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
511 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
512 | );
513 | runOnlyForDeploymentPostprocessing = 0;
514 | };
515 | /* End PBXResourcesBuildPhase section */
516 |
517 | /* Begin PBXShellScriptBuildPhase section */
518 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
519 | isa = PBXShellScriptBuildPhase;
520 | buildActionMask = 2147483647;
521 | files = (
522 | );
523 | inputPaths = (
524 | );
525 | name = "Bundle React Native code and images";
526 | outputPaths = (
527 | );
528 | runOnlyForDeploymentPostprocessing = 0;
529 | shellPath = /bin/sh;
530 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh";
531 | showEnvVarsInLog = 1;
532 | };
533 | /* End PBXShellScriptBuildPhase section */
534 |
535 | /* Begin PBXSourcesBuildPhase section */
536 | 00E356EA1AD99517003FC87E /* Sources */ = {
537 | isa = PBXSourcesBuildPhase;
538 | buildActionMask = 2147483647;
539 | files = (
540 | 00E356F31AD99517003FC87E /* RNAppTests.m in Sources */,
541 | );
542 | runOnlyForDeploymentPostprocessing = 0;
543 | };
544 | 13B07F871A680F5B00A75B9A /* Sources */ = {
545 | isa = PBXSourcesBuildPhase;
546 | buildActionMask = 2147483647;
547 | files = (
548 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
549 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
550 | );
551 | runOnlyForDeploymentPostprocessing = 0;
552 | };
553 | /* End PBXSourcesBuildPhase section */
554 |
555 | /* Begin PBXTargetDependency section */
556 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
557 | isa = PBXTargetDependency;
558 | target = 13B07F861A680F5B00A75B9A /* RNApp */;
559 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
560 | };
561 | /* End PBXTargetDependency section */
562 |
563 | /* Begin PBXVariantGroup section */
564 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
565 | isa = PBXVariantGroup;
566 | children = (
567 | 13B07FB21A68108700A75B9A /* Base */,
568 | );
569 | name = LaunchScreen.xib;
570 | path = RNApp;
571 | sourceTree = "";
572 | };
573 | /* End PBXVariantGroup section */
574 |
575 | /* Begin XCBuildConfiguration section */
576 | 00E356F61AD99517003FC87E /* Debug */ = {
577 | isa = XCBuildConfiguration;
578 | buildSettings = {
579 | BUNDLE_LOADER = "$(TEST_HOST)";
580 | GCC_PREPROCESSOR_DEFINITIONS = (
581 | "DEBUG=1",
582 | "$(inherited)",
583 | );
584 | INFOPLIST_FILE = RNAppTests/Info.plist;
585 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
586 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
587 | PRODUCT_NAME = "$(TARGET_NAME)";
588 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNApp.app/RNApp";
589 | };
590 | name = Debug;
591 | };
592 | 00E356F71AD99517003FC87E /* Release */ = {
593 | isa = XCBuildConfiguration;
594 | buildSettings = {
595 | BUNDLE_LOADER = "$(TEST_HOST)";
596 | COPY_PHASE_STRIP = NO;
597 | INFOPLIST_FILE = RNAppTests/Info.plist;
598 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
599 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
600 | PRODUCT_NAME = "$(TARGET_NAME)";
601 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RNApp.app/RNApp";
602 | };
603 | name = Release;
604 | };
605 | 13B07F941A680F5B00A75B9A /* Debug */ = {
606 | isa = XCBuildConfiguration;
607 | buildSettings = {
608 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
609 | CURRENT_PROJECT_VERSION = 1;
610 | DEAD_CODE_STRIPPING = NO;
611 | HEADER_SEARCH_PATHS = (
612 | "$(inherited)",
613 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
614 | "$(SRCROOT)/../node_modules/react-native/React/**",
615 | );
616 | INFOPLIST_FILE = "RNApp/Info.plist";
617 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
618 | OTHER_LDFLAGS = (
619 | "$(inherited)",
620 | "-ObjC",
621 | "-lc++",
622 | );
623 | PRODUCT_NAME = RNApp;
624 | VERSIONING_SYSTEM = "apple-generic";
625 | };
626 | name = Debug;
627 | };
628 | 13B07F951A680F5B00A75B9A /* Release */ = {
629 | isa = XCBuildConfiguration;
630 | buildSettings = {
631 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
632 | CURRENT_PROJECT_VERSION = 1;
633 | HEADER_SEARCH_PATHS = (
634 | "$(inherited)",
635 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
636 | "$(SRCROOT)/../node_modules/react-native/React/**",
637 | );
638 | INFOPLIST_FILE = "RNApp/Info.plist";
639 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
640 | OTHER_LDFLAGS = (
641 | "$(inherited)",
642 | "-ObjC",
643 | "-lc++",
644 | );
645 | PRODUCT_NAME = RNApp;
646 | VERSIONING_SYSTEM = "apple-generic";
647 | };
648 | name = Release;
649 | };
650 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
651 | isa = XCBuildConfiguration;
652 | buildSettings = {
653 | ALWAYS_SEARCH_USER_PATHS = NO;
654 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
655 | CLANG_CXX_LIBRARY = "libc++";
656 | CLANG_ENABLE_MODULES = YES;
657 | CLANG_ENABLE_OBJC_ARC = YES;
658 | CLANG_WARN_BOOL_CONVERSION = YES;
659 | CLANG_WARN_CONSTANT_CONVERSION = YES;
660 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
661 | CLANG_WARN_EMPTY_BODY = YES;
662 | CLANG_WARN_ENUM_CONVERSION = YES;
663 | CLANG_WARN_INT_CONVERSION = YES;
664 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
665 | CLANG_WARN_UNREACHABLE_CODE = YES;
666 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
667 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
668 | COPY_PHASE_STRIP = NO;
669 | ENABLE_STRICT_OBJC_MSGSEND = YES;
670 | GCC_C_LANGUAGE_STANDARD = gnu99;
671 | GCC_DYNAMIC_NO_PIC = NO;
672 | GCC_OPTIMIZATION_LEVEL = 0;
673 | GCC_PREPROCESSOR_DEFINITIONS = (
674 | "DEBUG=1",
675 | "$(inherited)",
676 | );
677 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
678 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
679 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
680 | GCC_WARN_UNDECLARED_SELECTOR = YES;
681 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
682 | GCC_WARN_UNUSED_FUNCTION = YES;
683 | GCC_WARN_UNUSED_VARIABLE = YES;
684 | HEADER_SEARCH_PATHS = (
685 | "$(inherited)",
686 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
687 | "$(SRCROOT)/../node_modules/react-native/React/**",
688 | );
689 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
690 | MTL_ENABLE_DEBUG_INFO = YES;
691 | ONLY_ACTIVE_ARCH = YES;
692 | SDKROOT = iphoneos;
693 | };
694 | name = Debug;
695 | };
696 | 83CBBA211A601CBA00E9B192 /* Release */ = {
697 | isa = XCBuildConfiguration;
698 | buildSettings = {
699 | ALWAYS_SEARCH_USER_PATHS = NO;
700 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
701 | CLANG_CXX_LIBRARY = "libc++";
702 | CLANG_ENABLE_MODULES = YES;
703 | CLANG_ENABLE_OBJC_ARC = YES;
704 | CLANG_WARN_BOOL_CONVERSION = YES;
705 | CLANG_WARN_CONSTANT_CONVERSION = YES;
706 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
707 | CLANG_WARN_EMPTY_BODY = YES;
708 | CLANG_WARN_ENUM_CONVERSION = YES;
709 | CLANG_WARN_INT_CONVERSION = YES;
710 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
711 | CLANG_WARN_UNREACHABLE_CODE = YES;
712 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
713 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
714 | COPY_PHASE_STRIP = YES;
715 | ENABLE_NS_ASSERTIONS = NO;
716 | ENABLE_STRICT_OBJC_MSGSEND = YES;
717 | GCC_C_LANGUAGE_STANDARD = gnu99;
718 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
719 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
720 | GCC_WARN_UNDECLARED_SELECTOR = YES;
721 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
722 | GCC_WARN_UNUSED_FUNCTION = YES;
723 | GCC_WARN_UNUSED_VARIABLE = YES;
724 | HEADER_SEARCH_PATHS = (
725 | "$(inherited)",
726 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
727 | "$(SRCROOT)/../node_modules/react-native/React/**",
728 | );
729 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
730 | MTL_ENABLE_DEBUG_INFO = NO;
731 | SDKROOT = iphoneos;
732 | VALIDATE_PRODUCT = YES;
733 | };
734 | name = Release;
735 | };
736 | /* End XCBuildConfiguration section */
737 |
738 | /* Begin XCConfigurationList section */
739 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "RNAppTests" */ = {
740 | isa = XCConfigurationList;
741 | buildConfigurations = (
742 | 00E356F61AD99517003FC87E /* Debug */,
743 | 00E356F71AD99517003FC87E /* Release */,
744 | );
745 | defaultConfigurationIsVisible = 0;
746 | defaultConfigurationName = Release;
747 | };
748 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RNApp" */ = {
749 | isa = XCConfigurationList;
750 | buildConfigurations = (
751 | 13B07F941A680F5B00A75B9A /* Debug */,
752 | 13B07F951A680F5B00A75B9A /* Release */,
753 | );
754 | defaultConfigurationIsVisible = 0;
755 | defaultConfigurationName = Release;
756 | };
757 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RNApp" */ = {
758 | isa = XCConfigurationList;
759 | buildConfigurations = (
760 | 83CBBA201A601CBA00E9B192 /* Debug */,
761 | 83CBBA211A601CBA00E9B192 /* Release */,
762 | );
763 | defaultConfigurationIsVisible = 0;
764 | defaultConfigurationName = Release;
765 | };
766 | /* End XCConfigurationList section */
767 | };
768 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
769 | }
770 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp.xcodeproj/xcshareddata/xcschemes/RNApp.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 |
75 |
77 |
83 |
84 |
85 |
86 |
87 |
88 |
94 |
96 |
102 |
103 |
104 |
105 |
107 |
108 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp/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 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp/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 |
12 | #import "RCTBundleURLProvider.h"
13 | #import "RCTRootView.h"
14 |
15 | @implementation AppDelegate
16 |
17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
18 | {
19 | NSURL *jsCodeLocation;
20 |
21 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
22 |
23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
24 | moduleName:@"RNApp"
25 | initialProperties:nil
26 | launchOptions:launchOptions];
27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
28 |
29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
30 | UIViewController *rootViewController = [UIViewController new];
31 | rootViewController.view = rootView;
32 | self.window.rootViewController = rootViewController;
33 | [self.window makeKeyAndVisible];
34 | return YES;
35 | }
36 |
37 | @end
38 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
21 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | }
33 | ],
34 | "info" : {
35 | "version" : 1,
36 | "author" : "xcode"
37 | }
38 | }
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp/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 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UIViewControllerBasedStatusBarAppearance
38 |
39 | NSLocationWhenInUseUsageDescription
40 |
41 | NSAppTransportSecurity
42 |
43 |
44 | NSExceptionDomains
45 |
46 | localhost
47 |
48 | NSTemporaryExceptionAllowsInsecureHTTPLoads
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNApp/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 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNAppTests/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 |
--------------------------------------------------------------------------------
/example/RNApp/ios/RNAppTests/RNAppTests.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 RNAppTests : XCTestCase
20 |
21 | @end
22 |
23 | @implementation RNAppTests
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 |
--------------------------------------------------------------------------------
/example/RNApp/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "allowJs": true,
4 | "allowSyntheticDefaultImports": true
5 | },
6 | "exclude": [
7 | "node_modules"
8 | ]
9 | }
--------------------------------------------------------------------------------
/example/RNApp/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "RNApp",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "start": "node_modules/react-native/packager/packager.sh",
7 | "lint": "eslint app/",
8 | "meteor": "cd ../MeteorApp && Meteor && cd ../RNApp && react-native run-ios"
9 | },
10 | "dependencies": {
11 | "@exponent/react-native-navigator": "^0.4.7",
12 | "gravatar-api": "^1.4.0",
13 | "react": "~15.3.1",
14 | "react-native": "^0.35.0",
15 | "react-native-keyboard-spacer": "^0.3.0",
16 | "react-native-meteor": "^1.0.0-rc14",
17 | "react-native-tab-navigator": "^0.3.3",
18 | "react-native-meteor-redux": "DesignmanIO/react-native-meteor-redux.git"
19 | },
20 | "devDependencies": {
21 | "babel-eslint": "^7.0.0",
22 | "eslint": "^3.3.1",
23 | "eslint-config-airbnb": "^12.0.0",
24 | "eslint-plugin-import": "^1.16.0",
25 | "eslint-plugin-jsx-a11y": "^2.1.0",
26 | "eslint-plugin-react": "^6.1.1"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/example/npm-debug.log:
--------------------------------------------------------------------------------
1 | 0 info it worked if it ends with ok
2 | 1 verbose cli [ '/usr/local/Cellar/node/7.0.0/bin/node',
3 | 1 verbose cli '/usr/local/bin/npm',
4 | 1 verbose cli 'install',
5 | 1 verbose cli 'react-native-meteor-redux',
6 | 1 verbose cli '-S' ]
7 | 2 info using npm@4.0.3
8 | 3 info using node@v7.0.0
9 | 4 silly loadCurrentTree Starting
10 | 5 silly install loadCurrentTree
11 | 6 silly install readLocalPackageData
12 | 7 silly fetchPackageMetaData react-native-meteor-redux
13 | 8 silly fetchNamedPackageData react-native-meteor-redux
14 | 9 silly mapToRegistry name react-native-meteor-redux
15 | 10 silly mapToRegistry using default registry
16 | 11 silly mapToRegistry registry https://registry.npmjs.org/
17 | 12 silly mapToRegistry data Result {
18 | 12 silly mapToRegistry raw: 'react-native-meteor-redux',
19 | 12 silly mapToRegistry scope: null,
20 | 12 silly mapToRegistry escapedName: 'react-native-meteor-redux',
21 | 12 silly mapToRegistry name: 'react-native-meteor-redux',
22 | 12 silly mapToRegistry rawSpec: '',
23 | 12 silly mapToRegistry spec: 'latest',
24 | 12 silly mapToRegistry type: 'tag' }
25 | 13 silly mapToRegistry uri https://registry.npmjs.org/react-native-meteor-redux
26 | 14 verbose request uri https://registry.npmjs.org/react-native-meteor-redux
27 | 15 verbose request no auth needed
28 | 16 info attempt registry request try #1 at 7:13:32 AM
29 | 17 verbose request using bearer token for auth
30 | 18 verbose request id d4dbd4b645c57963
31 | 19 http request GET https://registry.npmjs.org/react-native-meteor-redux
32 | 20 http 200 https://registry.npmjs.org/react-native-meteor-redux
33 | 21 verbose headers { server: 'nginx/1.10.1',
34 | 21 verbose headers 'content-type': 'application/json',
35 | 21 verbose headers 'last-modified': 'Mon, 30 Jan 2017 20:43:19 GMT',
36 | 21 verbose headers etag: 'W/"588fa567-80b3"',
37 | 21 verbose headers 'content-encoding': 'gzip',
38 | 21 verbose headers 'cache-control': 'max-age=300',
39 | 21 verbose headers 'transfer-encoding': 'chunked',
40 | 21 verbose headers 'accept-ranges': 'bytes',
41 | 21 verbose headers date: 'Tue, 14 Feb 2017 12:13:33 GMT',
42 | 21 verbose headers via: '1.1 varnish',
43 | 21 verbose headers connection: 'keep-alive',
44 | 21 verbose headers 'x-served-by': 'cache-bos8222-BOS',
45 | 21 verbose headers 'x-cache': 'MISS',
46 | 21 verbose headers 'x-cache-hits': '0',
47 | 21 verbose headers 'x-timer': 'S1487074413.130709,VS0,VE47',
48 | 21 verbose headers vary: 'Accept-Encoding' }
49 | 22 silly get cb [ 200,
50 | 22 silly get { server: 'nginx/1.10.1',
51 | 22 silly get 'content-type': 'application/json',
52 | 22 silly get 'last-modified': 'Mon, 30 Jan 2017 20:43:19 GMT',
53 | 22 silly get etag: 'W/"588fa567-80b3"',
54 | 22 silly get 'content-encoding': 'gzip',
55 | 22 silly get 'cache-control': 'max-age=300',
56 | 22 silly get 'transfer-encoding': 'chunked',
57 | 22 silly get 'accept-ranges': 'bytes',
58 | 22 silly get date: 'Tue, 14 Feb 2017 12:13:33 GMT',
59 | 22 silly get via: '1.1 varnish',
60 | 22 silly get connection: 'keep-alive',
61 | 22 silly get 'x-served-by': 'cache-bos8222-BOS',
62 | 22 silly get 'x-cache': 'MISS',
63 | 22 silly get 'x-cache-hits': '0',
64 | 22 silly get 'x-timer': 'S1487074413.130709,VS0,VE47',
65 | 22 silly get vary: 'Accept-Encoding' } ]
66 | 23 verbose get saving react-native-meteor-redux to /Users/Julian/.npm/registry.npmjs.org/react-native-meteor-redux/.cache.json
67 | 24 verbose correctMkdir /Users/Julian/.npm correctMkdir not in flight; initializing
68 | 25 silly install normalizeTree
69 | 26 silly loadCurrentTree Finishing
70 | 27 silly loadIdealTree Starting
71 | 28 silly install loadIdealTree
72 | 29 silly cloneCurrentTree Starting
73 | 30 silly install cloneCurrentTreeToIdealTree
74 | 31 silly cloneCurrentTree Finishing
75 | 32 silly loadShrinkwrap Starting
76 | 33 silly install loadShrinkwrap
77 | 34 silly loadShrinkwrap Finishing
78 | 35 silly loadAllDepsIntoIdealTree Starting
79 | 36 silly install loadAllDepsIntoIdealTree
80 | 37 silly rollbackFailedOptional Starting
81 | 38 silly rollbackFailedOptional Finishing
82 | 39 silly runTopLevelLifecycles Finishing
83 | 40 silly install printInstalled
84 | 41 verbose stack Error: Refusing to install package with name "react-native-meteor-redux" under a package
85 | 41 verbose stack also called "react-native-meteor-redux". Did you name your project the same
86 | 41 verbose stack as the dependency you're installing?
87 | 41 verbose stack
88 | 41 verbose stack For more information, see:
89 | 41 verbose stack
90 | 41 verbose stack at checkSelf (/usr/local/lib/node_modules/npm/lib/install/validate-args.js:53:14)
91 | 41 verbose stack at Array. (/usr/local/lib/node_modules/npm/node_modules/slide/lib/bind-actor.js:15:8)
92 | 41 verbose stack at LOOP (/usr/local/lib/node_modules/npm/node_modules/slide/lib/chain.js:15:14)
93 | 41 verbose stack at chain (/usr/local/lib/node_modules/npm/node_modules/slide/lib/chain.js:20:5)
94 | 41 verbose stack at /usr/local/lib/node_modules/npm/lib/install/validate-args.js:16:5
95 | 41 verbose stack at /usr/local/lib/node_modules/npm/node_modules/slide/lib/async-map.js:52:35
96 | 41 verbose stack at Array.forEach (native)
97 | 41 verbose stack at /usr/local/lib/node_modules/npm/node_modules/slide/lib/async-map.js:52:11
98 | 41 verbose stack at Array.forEach (native)
99 | 41 verbose stack at asyncMap (/usr/local/lib/node_modules/npm/node_modules/slide/lib/async-map.js:51:8)
100 | 42 verbose cwd /Users/Julian/OneDrive/Meteor/react-native-meteor-redux/example
101 | 43 error Darwin 16.4.0
102 | 44 error argv "/usr/local/Cellar/node/7.0.0/bin/node" "/usr/local/bin/npm" "install" "react-native-meteor-redux" "-S"
103 | 45 error node v7.0.0
104 | 46 error npm v4.0.3
105 | 47 error code ENOSELF
106 | 48 error Refusing to install package with name "react-native-meteor-redux" under a package
107 | 48 error also called "react-native-meteor-redux". Did you name your project the same
108 | 48 error as the dependency you're installing?
109 | 48 error
110 | 48 error For more information, see:
111 | 48 error
112 | 49 error If you need help, you may report this error at:
113 | 49 error
114 | 50 verbose exit [ 1, true ]
115 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-native-meteor-redux",
3 | "version": "2.2.6",
4 | "description": "Link react-native-meteor to redux",
5 | "main": "connectMeteorRedux.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/DesignmanIO/react-native-meteor-redux.git"
12 | },
13 | "keywords": [
14 | "react",
15 | "native",
16 | "react",
17 | "native",
18 | "meteor",
19 | "redux",
20 | "react",
21 | "native",
22 | "meteor",
23 | "redux"
24 | ],
25 | "author": "Designman",
26 | "license": "MIT",
27 | "bugs": {
28 | "url": "https://github.com/DesignmanIO/react-native-meteor-redux/issues"
29 | },
30 | "homepage": "https://github.com/DesignmanIO/react-native-meteor-redux#readme",
31 | "dependencies": {
32 | "lodash": "^4.17.4",
33 | "next-frame": "^0.2.3",
34 | "react-native-meteor": "^1.0.3",
35 | "redux": "^3.6.0",
36 | "redux-persist": "^4.0.1",
37 | "events": "^1.1.1"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------