├── .watchmanconfig
├── screenshot.png
├── .jshintrc
├── app
├── actions
│ ├── index.js
│ ├── chat.js
│ └── login.js
├── components
│ ├── message
│ │ ├── assets
│ │ │ └── anon.jpg
│ │ └── message.js
│ ├── login
│ │ ├── assets
│ │ │ ├── fb-login-button.png
│ │ │ └── fb-login-button@2x.png
│ │ └── login.js
│ ├── inputfield
│ │ └── inputfield.js
│ └── chatter
│ │ └── chatter.js
├── configuration.js
├── containers
│ ├── app.js
│ └── chat.js
├── utils
│ └── facebookAPI.js
└── reducers
│ └── index.js
├── index.ios.js
├── server
├── package.json
├── bots.js
└── index.js
├── .gitignore
├── .eslintrc
├── ios
├── chatter
│ ├── AppDelegate.h
│ ├── main.m
│ ├── Images.xcassets
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Info.plist
│ ├── AppDelegate.m
│ └── Base.lproj
│ │ └── LaunchScreen.xib
├── chatterTests
│ ├── Info.plist
│ └── chatterTests.m
└── chatter.xcodeproj
│ ├── xcshareddata
│ └── xcschemes
│ │ └── chatter.xcscheme
│ └── project.pbxproj
├── README.md
├── package.json
└── .flowconfig
/.watchmanconfig:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/farzd/ReactNativeChatApp/HEAD/screenshot.png
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | node: true,
3 | browser: true,
4 | esnext: true,
5 | newcap: false
6 | }
7 |
--------------------------------------------------------------------------------
/app/actions/index.js:
--------------------------------------------------------------------------------
1 | export const loginActions = require('./login');
2 | export const chatActions = require('./chat');
3 |
--------------------------------------------------------------------------------
/app/components/message/assets/anon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/farzd/ReactNativeChatApp/HEAD/app/components/message/assets/anon.jpg
--------------------------------------------------------------------------------
/app/components/login/assets/fb-login-button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/farzd/ReactNativeChatApp/HEAD/app/components/login/assets/fb-login-button.png
--------------------------------------------------------------------------------
/app/components/login/assets/fb-login-button@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/farzd/ReactNativeChatApp/HEAD/app/components/login/assets/fb-login-button@2x.png
--------------------------------------------------------------------------------
/index.ios.js:
--------------------------------------------------------------------------------
1 | import React from 'react-native';
2 | import App from './app/containers/app';
3 | const { AppRegistry } = React;
4 | AppRegistry.registerComponent('chatter', () => App);
5 |
--------------------------------------------------------------------------------
/app/configuration.js:
--------------------------------------------------------------------------------
1 | export const config = {
2 | facebookReadPermissions: ['public_profile', 'email', 'user_friends', 'user_photos'],
3 | facebookUserRequest: '/me/?fields=name,picture.width(300)'
4 | };
5 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chatserver",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "socket.io": "^1.4.5",
13 | "ws": "^1.0.1"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OSX
2 | #
3 | .DS_Store
4 |
5 | # Xcode
6 | #
7 | build/
8 | *.pbxuser
9 | !default.pbxuser
10 | *.mode1v3
11 | !default.mode1v3
12 | *.mode2v3
13 | !default.mode2v3
14 | *.perspectivev3
15 | !default.perspectivev3
16 | xcuserdata
17 | *.xccheckout
18 | *.moved-aside
19 | DerivedData
20 | *.hmap
21 | *.ipa
22 | *.xcuserstate
23 | project.xcworkspace
24 |
25 | # Android/IJ
26 | #
27 | .idea
28 | .gradle
29 | local.properties
30 |
31 | # node.js
32 | #
33 | node_modules/
34 | npm-debug.log
35 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "es6": true
4 | },
5 | "plugins": [
6 | "react"
7 | ],
8 | "ecmaFeatures": {
9 | "jsx": true,
10 | "experimentalObjectRestSpread": true
11 | },
12 | "extends": "airbnb",
13 | "rules": {
14 | "indent": [2, 4],
15 | "comma-dangle": 0,
16 | "new-cap": 0,
17 | "id-length": 0,
18 | "react/sort-comp": 0,
19 | "react/no-multi-comp": 0,
20 | "react/jsx-boolean-value": 0
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/components/login/login.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react-native';
2 |
3 | const { Image, TouchableOpacity } = React;
4 |
5 | export default class Login extends Component {
6 | render() {
7 | return (
8 |
9 |
10 |
11 | );
12 | }
13 | }
14 |
15 | Login.propTypes = {
16 | onPress: PropTypes.func.isRequired
17 | };
18 |
--------------------------------------------------------------------------------
/ios/chatter/AppDelegate.h:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) 2015-present, Facebook, Inc.
3 | * All rights reserved.
4 | *
5 | * This source code is licensed under the BSD-style license found in the
6 | * LICENSE file in the root directory of this source tree. An additional grant
7 | * of patent rights can be found in the PATENTS file in the same directory.
8 | */
9 |
10 | #import
11 |
12 | @interface AppDelegate : UIResponder
13 |
14 | @property (nonatomic, strong) UIWindow *window;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/ios/chatter/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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ReactNativeChatApp
2 | A Simple Chat application that utilises WebSocket Polyfill in React-native.
3 |
4 | - Client and Server both have separate dependencies.
5 | - Run 'npm i' on the server folder, then execute the server by node index.js
6 | - Run 'npm i' on the root folder, then run the porject the same way you run any react-native app [ios/chatter.xcodeproj]
7 | - Requires facebook SDK for the facebook login to work, it needs to be located in Documents/FacebookSDK [see here](https://github.com/antigirl/ios-starterpack)
8 |
9 | 
10 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "chatter",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "start": "node node_modules/react-native/local-cli/cli.js start"
7 | },
8 | "dependencies": {
9 | "react-native": "^0.19.0",
10 | "react-redux": "^3.1.0",
11 | "redux": "^3.0.4",
12 | "redux-logger": "^2.0.4",
13 | "redux-thunk": "^1.0.0",
14 | "react-native-fbsdkcore": "0.0.8",
15 | "react-native-fbsdklogin": "0.0.8"
16 | },
17 | "devDependencies": {
18 | "babel-eslint": "^4.1.4",
19 | "eslint": "^1.9.0",
20 | "eslint-config-airbnb": "^1.0.0",
21 | "eslint-plugin-react": "^3.8.0"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/containers/app.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react-native';
2 | import { createStore, applyMiddleware } from 'redux';
3 | import thunkMiddleware from 'redux-thunk';
4 | import createLogger from 'redux-logger';
5 | import { Provider } from 'react-redux/native';
6 |
7 | import reducer from '../reducers';
8 | import Chat from './chat';
9 |
10 | const loggerMiddleware = createLogger();
11 |
12 | const createStoreWithMiddleware = applyMiddleware(
13 | thunkMiddleware
14 | )(createStore);
15 |
16 | const store = createStoreWithMiddleware(reducer);
17 |
18 | export default class App extends Component {
19 | render() {
20 | return (
21 |
22 | {() => }
23 |
24 | );
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/ios/chatter/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 | }
--------------------------------------------------------------------------------
/ios/chatterTests/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 |
--------------------------------------------------------------------------------
/app/actions/chat.js:
--------------------------------------------------------------------------------
1 | let ws;
2 |
3 | export function receiveMessage(msg) {
4 | return {
5 | type: 'MSG_IN',
6 | msg
7 | };
8 | }
9 |
10 | export function connectChat() {
11 | return dispatch => {
12 | ws = new WebSocket('ws://localhost:3000');
13 | ws.onopen = () => {
14 | console.log('WebSocket connection opened');
15 | };
16 | ws.onclose = (e) => {
17 | console.log('WebSocket connection closed', e.code, e.reason);
18 | };
19 | ws.onerror = (e) => {
20 | alert('WebSocket error: ' + e.message);
21 | console.log('WebSocket error: ', e);
22 | };
23 | ws.onmessage = (e) => {
24 | dispatch(receiveMessage(e.data));
25 | console.log('WebSocket received: ' + e.data);
26 | };
27 | };
28 | }
29 |
30 | export function sendMessage(userid, username, msg, profileURL) {
31 | return dispatch => {
32 | ws.send(userid + '{<>}' + username + '{<>}' + msg + '{<>}' + profileURL);
33 | };
34 | }
35 |
--------------------------------------------------------------------------------
/app/components/inputfield/inputfield.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react-native';
2 | const { StyleSheet, View, TextInput } = React;
3 |
4 | const styles = StyleSheet.create({
5 | textWrapper: {
6 | position: 'absolute',
7 | left: 0,
8 | right: 0,
9 | bottom: 2
10 | },
11 | textInput: {
12 | height: 40,
13 | backgroundColor: '#000',
14 | opacity: 0.3,
15 | borderRadius: 20,
16 | paddingLeft: 10,
17 | paddingRight: 10,
18 | color: '#fff'
19 | }
20 | });
21 |
22 | export default class InputField extends Component {
23 | constructor(props) {
24 | super(props);
25 | this.state = {
26 | text: ''
27 | };
28 | }
29 |
30 | render() {
31 | return (
32 |
33 | this.setState({text})}
35 | onSubmitEditing={() => {
36 | this.props.actions.sendMessage(this.props.profile.id, this.props.profile.name, this.state.text, this.props.profile.profileURL);
37 | this.setState({text: ''});
38 | }
39 | }
40 | value={this.state.text} />
41 |
42 | );
43 | }
44 | }
45 |
46 | InputField.propTypes = {
47 | actions: PropTypes.object.isRequired,
48 | profile: PropTypes.object
49 | };
50 |
--------------------------------------------------------------------------------
/server/bots.js:
--------------------------------------------------------------------------------
1 | var WebSocket = require('ws');
2 | var ws = new WebSocket('ws://localhost:3000');
3 |
4 | ws.on('open', function open() {
5 | person1();
6 | person2();
7 | person3();
8 | });
9 |
10 | function person1() {
11 | var userid = '123';
12 | var username = 'jane';
13 | var msg = 'im a test bot';
14 | var profileURL = 'https://randomuser.me/api/portraits/med/women/0.jpg';
15 |
16 | ws.send(userid + '{<>}' + username + '{<>}' + 'serverJOIN' + '{<>}' + profileURL);
17 |
18 | setTimeout(function () {
19 | ws.send(userid + '{<>}' + username + '{<>}' + msg + '{<>}' + profileURL);
20 | }, 1000);
21 | }
22 |
23 | function person2() {
24 | var userid = '345';
25 | var username = 'tom';
26 | var msg = 'im a test bot aswell';
27 | var profileURL = 'https://randomuser.me/api/portraits/med/men/80.jpg';
28 |
29 | ws.send(userid + '{<>}' + username + '{<>}' + 'serverJOIN' + '{<>}' + profileURL);
30 |
31 | setTimeout(function () {
32 | ws.send(userid + '{<>}' + username + '{<>}' + msg + '{<>}' + profileURL);
33 | }, 1000);
34 | }
35 |
36 | function person3() {
37 | var userid = '678';
38 | var username = 'alison';
39 | var msg = 'im also a test bot';
40 | var profileURL = 'https://randomuser.me/api/portraits/med/women/70.jpg';
41 |
42 | ws.send(userid + '{<>}' + username + '{<>}' + 'serverJOIN' + '{<>}' + profileURL);
43 |
44 | setTimeout(function () {
45 | ws.send(userid + '{<>}' + username + '{<>}' + msg + '{<>}' + profileURL);
46 | }, 1000);
47 | }
48 |
--------------------------------------------------------------------------------
/server/index.js:
--------------------------------------------------------------------------------
1 | var WebSocketServer = require('ws').Server;
2 | var wss = new WebSocketServer({
3 | host: 'localhost',
4 | port: 3000
5 | });
6 |
7 | var onlineUsers = [];
8 | var colors = ['#2196F3', '#009688', '#EF6C00', '#01579B', '#CCC907', ];
9 | var dilem = '{<>}';
10 |
11 | wss.broadcast = function broadcast(data) {
12 | wss.clients.forEach(function each(client) {
13 | client.send(data);
14 | });
15 | };
16 |
17 | wss.on('connection', function connection(ws) {
18 | ws.on('message', function incoming(data) {
19 | var dataSplit = data.split(dilem);
20 | var user = {
21 | id: dataSplit[0],
22 | name: dataSplit[1],
23 | msg: dataSplit[2],
24 | url: dataSplit[3]
25 | };
26 |
27 | if (user.msg === 'serverJOIN') {
28 | console.log(user.name + ' joined');
29 |
30 | if (onlineUsers.indexOf(user.id) === -1) {
31 | onlineUsers.push(user.id);
32 | }
33 |
34 | return wss.broadcast('server{<>}' + user.name + ' just joined{<>}{<>}#5D70C2');
35 | }
36 |
37 | if (user.msg === 'serverLEAVE') {
38 | console.log(user.name + ' left');
39 |
40 | var userIndex = onlineUsers.indexOf(user.id);
41 | if (userIndex > -1) {
42 | onlineUsers.splice(userIndex, 1);
43 | }
44 |
45 | return wss.broadcast('server{<>}' + user.name + ' left{<>}{<>}#5D70C2');
46 | }
47 |
48 |
49 | var currentUser = onlineUsers.indexOf(user.id);
50 | wss.broadcast(user.id + dilem + user.msg + dilem + user.url + dilem + colors[currentUser]);
51 | console.log(user.name + ' ' + colors[currentUser] + ' ' + user.msg);
52 | });
53 |
54 | });
55 |
--------------------------------------------------------------------------------
/app/utils/facebookAPI.js:
--------------------------------------------------------------------------------
1 | import FBSDKLogin from 'react-native-fbsdklogin';
2 | import FBSDKCore from 'react-native-fbsdkcore';
3 | import { config } from '../configuration';
4 |
5 | const { FBSDKLoginManager} = FBSDKLogin;
6 | const { FBSDKGraphRequest, FBSDKAccessToken } = FBSDKCore;
7 |
8 | export function getInfo() {
9 | return new Promise((resolve, reject) => {
10 | const fetchFriendsRequest = new FBSDKGraphRequest((error, result) => {
11 | if (error) {
12 | console.log(error);
13 | reject('error making request ' + error);
14 | } else {
15 | resolve(result);
16 | }
17 | }, config.facebookUserRequest);
18 | fetchFriendsRequest.start();
19 | });
20 | }
21 |
22 | export function checkAccessToken() {
23 | return new Promise((resolve, reject) => {
24 | FBSDKAccessToken.getCurrentAccessToken((result) => {
25 | if (result === null) {
26 | reject();
27 | } else {
28 | resolve(result);
29 | }
30 | });
31 | });
32 | }
33 |
34 | export function facebookLogin() {
35 | return new Promise((resolve, reject) => {
36 | FBSDKLoginManager.logInWithReadPermissions(config.facebookReadPermissions, (error, result) => {
37 | console.log('error, result ', error, result);
38 | if (error) {
39 | reject('error: ' + error);
40 | } else {
41 | if (result.isCancelled) {
42 | reject('error: login cancelled');
43 | } else {
44 | resolve();
45 | }
46 | }
47 | });
48 | });
49 | }
50 |
51 | export function facebookLogout() {
52 | return new Promise((resolve) => {
53 | FBSDKLoginManager.logOut();
54 | return resolve();
55 | });
56 | }
57 |
--------------------------------------------------------------------------------
/app/reducers/index.js:
--------------------------------------------------------------------------------
1 | function loginReducer(state = {loading: false, loggedIn: false, error: null}, action) {
2 | switch (action.type) {
3 | case 'LOADING':
4 | return Object.assign({}, state, {
5 | loading: true
6 | });
7 |
8 | case 'LOGIN':
9 | return Object.assign({}, state, {
10 | loading: false,
11 | loggedIn: true,
12 | error: null,
13 | });
14 |
15 | case 'LOGOUT':
16 | return Object.assign({}, state, {
17 | loading: false,
18 | loggedIn: false,
19 | error: null
20 | });
21 |
22 | case 'ERROR': {
23 | return Object.assign({}, state, {
24 | loading: false,
25 | loggedIn: false,
26 | error: action.err
27 | });
28 | }
29 |
30 | default:
31 | return state;
32 | }
33 | }
34 |
35 | function profileReducer(state = { id: null, name: null, profileURL: null, profileWidth: null, profileHeight: null}, action) {
36 | switch (action.type) {
37 | case 'ADD_USER':
38 | return Object.assign({}, state, {
39 | id: action.id,
40 | name: action.name,
41 | profileURL: action.profileURL,
42 | profileWidth: action.profileWidth,
43 | profileHeight: action.profileHeight
44 | });
45 |
46 | default:
47 | return state;
48 | }
49 | }
50 |
51 |
52 | function chatReducer(state = [], action) {
53 | switch (action.type) {
54 | case 'MSG_IN':
55 | return state.concat([action.msg]);
56 |
57 | default:
58 | return state;
59 | }
60 | }
61 |
62 | export default function reducers(state = {}, action) {
63 | return {
64 | login: loginReducer(state.login, action),
65 | profile: profileReducer(state.profile, action),
66 | chat: chatReducer(state.chat, action)
67 | };
68 | }
69 |
--------------------------------------------------------------------------------
/.flowconfig:
--------------------------------------------------------------------------------
1 | [ignore]
2 |
3 | # We fork some components by platform.
4 | .*/*.web.js
5 | .*/*.android.js
6 |
7 | # Some modules have their own node_modules with overlap
8 | .*/node_modules/node-haste/.*
9 |
10 | # Ugh
11 | .*/node_modules/babel.*
12 | .*/node_modules/babylon.*
13 | .*/node_modules/invariant.*
14 |
15 | # Ignore react and fbjs where there are overlaps, but don't ignore
16 | # anything that react-native relies on
17 | .*/node_modules/fbjs/lib/Map.js
18 | .*/node_modules/fbjs/lib/Promise.js
19 | .*/node_modules/fbjs/lib/fetch.js
20 | .*/node_modules/fbjs/lib/ExecutionEnvironment.js
21 | .*/node_modules/fbjs/lib/isEmpty.js
22 | .*/node_modules/fbjs/lib/crc32.js
23 | .*/node_modules/fbjs/lib/ErrorUtils.js
24 |
25 | # Flow has a built-in definition for the 'react' module which we prefer to use
26 | # over the currently-untyped source
27 | .*/node_modules/react/react.js
28 | .*/node_modules/react/lib/React.js
29 | .*/node_modules/react/lib/ReactDOM.js
30 |
31 | # Ignore commoner tests
32 | .*/node_modules/commoner/test/.*
33 |
34 | # See https://github.com/facebook/flow/issues/442
35 | .*/react-tools/node_modules/commoner/lib/reader.js
36 |
37 | # Ignore jest
38 | .*/node_modules/jest-cli/.*
39 |
40 | # Ignore Website
41 | .*/website/.*
42 |
43 | [include]
44 |
45 | [libs]
46 | node_modules/react-native/Libraries/react-native/react-native-interface.js
47 |
48 | [options]
49 | module.system=haste
50 |
51 | munge_underscores=true
52 |
53 | module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
54 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.png$' -> 'RelativeImageStub'
55 |
56 | suppress_type=$FlowIssue
57 | suppress_type=$FlowFixMe
58 | suppress_type=$FixMe
59 |
60 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-0]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
61 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-0]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
62 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
63 |
64 | [version]
65 | 0.20.1
66 |
--------------------------------------------------------------------------------
/app/actions/login.js:
--------------------------------------------------------------------------------
1 | import { facebookLogin, facebookLogout, checkAccessToken, getInfo } from '../utils/facebookAPI.js';
2 |
3 | export function attempt() {
4 | return {
5 | type: 'LOADING'
6 | };
7 | }
8 |
9 | export function errors(err) {
10 | return {
11 | type: 'ERROR',
12 | err
13 | };
14 | }
15 |
16 | export function loggedin() {
17 | return {
18 | type: 'LOGIN',
19 | };
20 | }
21 |
22 | export function loggedout() {
23 | return {
24 | type: 'LOGOUT'
25 | };
26 | }
27 |
28 | export function addUser(id, name, profileURL, profileWidth, profileHeight) {
29 | return {
30 | type: 'ADD_USER',
31 | id,
32 | name,
33 | profileURL,
34 | profileWidth,
35 | profileHeight
36 | };
37 | }
38 |
39 | function getUserInfo(dispatch) {
40 | console.log('getting user info');
41 | getInfo().then((result) => {
42 | dispatch(addUser(result.id, result.name, result.picture.data.url, result.picture.data.width, result.picture.data.height));
43 | dispatch(loggedin());
44 | }).catch((err) => {
45 | dispatch(errors(err));
46 | });
47 | }
48 |
49 | export function login() {
50 | return dispatch => {
51 | dispatch(attempt());
52 | facebookLogin().then(() => {
53 | getUserInfo(dispatch);
54 | }).catch((err) => {
55 | dispatch(errors(err));
56 | });
57 | };
58 | }
59 |
60 | export function checkIfLoggedIn() {
61 | return dispatch => {
62 | dispatch(attempt());
63 | checkAccessToken().then((result) => {
64 | console.log('found access token ', result);
65 | getUserInfo(dispatch);
66 | }).catch((err) => {
67 | console.log('no access token found', err);
68 | dispatch(loggedout());
69 | });
70 | };
71 | }
72 |
73 | export function logout() {
74 | return dispatch => {
75 | dispatch(attempt());
76 | facebookLogout().then(() => {
77 | dispatch(loggedout());
78 | });
79 | };
80 | }
81 |
--------------------------------------------------------------------------------
/ios/chatterTests/chatterTests.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 240
17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
18 |
19 | @interface chatterTests : XCTestCase
20 |
21 | @end
22 |
23 | @implementation chatterTests
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 |
--------------------------------------------------------------------------------
/ios/chatter/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 | CFBundleURLTypes
22 |
23 |
24 | CFBundleURLSchemes
25 |
26 | fb216767178671073
27 |
28 |
29 |
30 | CFBundleVersion
31 | 1
32 | FacebookAppID
33 | 216767178671073
34 | FacebookDisplayName
35 | chatter
36 | LSApplicationQueriesSchemes
37 |
38 | fbapi
39 | fb-messenger-api
40 | fbauth2
41 | fbshareextension
42 |
43 | LSRequiresIPhoneOS
44 |
45 | NSAppTransportSecurity
46 |
47 | NSExceptionDomains
48 |
49 | akamaihd.net
50 |
51 | NSIncludesSubdomains
52 |
53 | NSThirdPartyExceptionRequiresForwardSecrecy
54 |
55 |
56 | facebook.com
57 |
58 | NSIncludesSubdomains
59 |
60 | NSThirdPartyExceptionRequiresForwardSecrecy
61 |
62 |
63 | fbcdn.net
64 |
65 | NSIncludesSubdomains
66 |
67 | NSThirdPartyExceptionRequiresForwardSecrecy
68 |
69 |
70 | localhost
71 |
72 | NSTemporaryExceptionAllowsInsecureHTTPLoads
73 |
74 |
75 |
76 |
77 | NSLocationWhenInUseUsageDescription
78 |
79 | UILaunchStoryboardName
80 | LaunchScreen
81 | UIRequiredDeviceCapabilities
82 |
83 | armv7
84 |
85 | UISupportedInterfaceOrientations
86 |
87 | UIInterfaceOrientationPortrait
88 |
89 | UIViewControllerBasedStatusBarAppearance
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/ios/chatter/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
13 |
14 | #import "RCTRootView.h"
15 |
16 | @implementation AppDelegate
17 |
18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
19 | {
20 | NSURL *jsCodeLocation;
21 |
22 | /**
23 | * Loading JavaScript code - uncomment the one you want.
24 | *
25 | * OPTION 1
26 | * Load from development server. Start the server from the repository root:
27 | *
28 | * $ npm start
29 | *
30 | * To run on device, change `localhost` to the IP address of your computer
31 | * (you can get this by typing `ifconfig` into the terminal and selecting the
32 | * `inet` value under `en0:`) and make sure your computer and iOS device are
33 | * on the same Wi-Fi network.
34 | */
35 |
36 | jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];
37 |
38 | /**
39 | * OPTION 2
40 | * Load from pre-bundled file on disk. The static bundle is automatically
41 | * generated by "Bundle React Native code and images" build step.
42 | */
43 |
44 | // jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
45 |
46 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
47 | moduleName:@"chatter"
48 | initialProperties:nil
49 | launchOptions:launchOptions];
50 |
51 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
52 | UIViewController *rootViewController = [UIViewController new];
53 | rootViewController.view = rootView;
54 | self.window.rootViewController = rootViewController;
55 | [self.window makeKeyAndVisible];
56 |
57 | return [[FBSDKApplicationDelegate sharedInstance] application:application
58 | didFinishLaunchingWithOptions:launchOptions];
59 | }
60 |
61 |
62 | - (BOOL)application:(UIApplication *)application
63 | openURL:(NSURL *)url
64 | sourceApplication:(NSString *)sourceApplication
65 | annotation:(id)annotation
66 | {
67 | return [[FBSDKApplicationDelegate sharedInstance] application:application
68 | openURL:url
69 | sourceApplication:sourceApplication
70 | annotation:annotation];
71 | }
72 |
73 | @end
74 |
--------------------------------------------------------------------------------
/app/components/message/message.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react-native';
2 |
3 | const { StyleSheet, Text, View, Image, Animated, Easing } = React;
4 | const styles = StyleSheet.create({
5 | bubbleWrapper: {
6 | marginTop: 10,
7 | marginBottom: 10,
8 | marginLeft: 50,
9 | marginRight: 50
10 | },
11 | bubbleWrapperLeft: {
12 | alignItems: 'flex-start'
13 | },
14 | bubbleWrapperRight: {
15 | alignItems: 'flex-end'
16 | },
17 | speechBubble: {
18 | fontSize: 14,
19 | color: '#fff',
20 | borderRadius: 5,
21 | backgroundColor: '#F974A0',
22 | padding: 10
23 | },
24 | avatar: {
25 | width: 36,
26 | height: 36,
27 | borderRadius: 18,
28 | position: 'absolute',
29 | top: 0,
30 | },
31 | avatarLeft: {
32 | left: -43
33 | },
34 | avatarRight: {
35 | right: -43
36 | }
37 | });
38 |
39 | const serverImg = require('./assets/anon.jpg');
40 |
41 | export default class Message extends Component {
42 | constructor(props) {
43 | super(props);
44 |
45 | this.state = {
46 | speechBubbleScale: new Animated.Value(0)
47 | };
48 | }
49 |
50 | shouldComponentUpdate() {
51 | return false;
52 | }
53 |
54 | render() {
55 | const { msg, profile } = this.props;
56 | const dilem = '{<>}';
57 | const messageSplit = msg.split(dilem);
58 | const message = {
59 | id: messageSplit[0],
60 | text: messageSplit[1],
61 | url: messageSplit[2],
62 | color: messageSplit[3]
63 | };
64 |
65 | Animated.sequence([
66 | Animated.timing(this.state.speechBubbleScale, {toValue: 1, duration: 200 })
67 | ]).start();
68 |
69 | if (profile.id === message.id) {
70 | return (
71 |
72 |
73 | { message.text }
74 |
75 |
76 |
77 | );
78 | }
79 |
80 | const speechBubbleColor = { backgroundColor: message.color };
81 | return (
82 |
83 |
84 |
85 | { message.text }
86 |
87 |
88 | );
89 | }
90 | }
91 |
92 | Message.propTypes = {
93 | msg: PropTypes.string,
94 | profile: PropTypes.object
95 | };
96 |
--------------------------------------------------------------------------------
/app/components/chatter/chatter.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react-native';
2 | import InputField from '../inputfield/inputfield';
3 | import Message from '../message/message';
4 | import Dimensions from 'Dimensions';
5 | const windowHeight = Dimensions.get('window').height - 66;
6 | const scrollHeight = windowHeight - 50;
7 |
8 | const { StyleSheet, View, ScrollView, DeviceEventEmitter, Animated } = React;
9 | const styles = StyleSheet.create({
10 | wrapper: {
11 | position: 'relative',
12 | marginTop: 66
13 | },
14 | scrollWrapper: {
15 | marginBottom: 42,
16 | },
17 | scrollContainer: {
18 | flexDirection: 'column',
19 | },
20 | text: {
21 | fontSize: 20,
22 | color: '#01579B'
23 | }
24 | });
25 |
26 | export default class Chatter extends Component {
27 | constructor(props) {
28 | super(props);
29 |
30 | this.state = {
31 | visibleHeight: new Animated.Value(windowHeight),
32 | };
33 | }
34 |
35 | componentDidMount() {
36 | const { actions, profile } = this.props;
37 | console.log('connecting');
38 | actions.connectChat();
39 |
40 | setTimeout(function timout() {
41 | // ping to say that you've join the chat room
42 | actions.sendMessage(profile.id, profile.name, 'serverJOIN');
43 | }, 10);
44 |
45 | DeviceEventEmitter.addListener('keyboardWillShow', this.keyboardWillShow.bind(this));
46 | DeviceEventEmitter.addListener('keyboardWillHide', this.keyboardWillHide.bind(this));
47 | }
48 |
49 | componentWillUnmount() {
50 | this.props.actions.sendMessage(this.props.profile.id, this.props.profile.name, 'serverLEAVE');
51 | }
52 |
53 | keyboardWillShow(e) {
54 | const newSize = windowHeight - e.endCoordinates.height;
55 | Animated.timing(this.state.visibleHeight, {toValue: newSize, duration: 200}).start();
56 | }
57 |
58 | keyboardWillHide() {
59 | Animated.timing(this.state.visibleHeight, {toValue: windowHeight, duration: 10}).start();
60 | }
61 |
62 | updateScrollView(x, y) {
63 | if (y > scrollHeight) {
64 | this.refs.scroller.scrollTo(y - scrollHeight);
65 | }
66 | }
67 |
68 | render() {
69 | return (
70 |
71 |
72 | {this.props.chat.map((msg, i) => {
73 | return ;
74 | })}
75 |
76 |
77 |
78 | );
79 | }
80 | }
81 |
82 |
83 | Chatter.propTypes = {
84 | actions: PropTypes.object.isRequired,
85 | chat: PropTypes.array.isRequired,
86 | profile: PropTypes.object
87 | };
88 |
--------------------------------------------------------------------------------
/ios/chatter/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 |
--------------------------------------------------------------------------------
/app/containers/chat.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react-native';
2 | import { connect } from 'react-redux/native';
3 | import { bindActionCreators } from 'redux';
4 | import { loginActions, chatActions } from '../actions';
5 | import Login from '../components/login/login';
6 | import Chatter from '../components/chatter/chatter';
7 |
8 | const { StyleSheet, View, Text, Image, StatusBarIOS, TouchableOpacity, ActivityIndicatorIOS } = React;
9 |
10 | const styles = StyleSheet.create({
11 | wrapper: {
12 | backgroundColor: '#7991E9',
13 | flex: 1,
14 | flexDirection: 'column',
15 | position: 'relative'
16 | },
17 | text: {
18 | fontSize: 20,
19 | color: '#01579B'
20 | },
21 | navBar: {
22 | height: 66,
23 | flexDirection: 'row',
24 | alignItems: 'center',
25 | position: 'absolute',
26 | paddingTop: 20,
27 | top: 0,
28 | left: 0,
29 | right: 0,
30 | backgroundColor: '#465C92'
31 | },
32 | navTitle: {
33 | color: '#6683CF',
34 | fontSize: 20
35 | },
36 | navLogout: {
37 | color: '#fff',
38 | fontSize: 15,
39 | paddingRight: 10
40 | }
41 | });
42 |
43 | class Chat extends Component {
44 | constructor(props) {
45 | super(props);
46 | StatusBarIOS.setStyle('light-content');
47 | }
48 |
49 | componentDidMount() {
50 | this.props.actions.checkIfLoggedIn();
51 | }
52 |
53 | render() {
54 | const { actions, login, profile, chat } = this.props;
55 | let loginComponent = actions.login()} />;
56 |
57 | if (login.error) {
58 | loginComponent = actions.login()} />{login.error};
59 | }
60 |
61 | if (login.loading) {
62 | loginComponent = ;
63 | }
64 |
65 | let navBarTitleAlign = { justifyContent: 'center' };
66 | let wrapperAlign = { alignItems: 'center', justifyContent: 'center' };
67 |
68 | if (login.loggedIn) {
69 | navBarTitleAlign = { justifyContent: 'space-between' };
70 | wrapperAlign = { alignItems: 'stretch' };
71 | }
72 |
73 | return (
74 |
75 |
76 | { login.loggedIn ? : null }
77 | CHAT
78 | { login.loggedIn ?
79 | actions.logout()}>
80 | logout
81 | : null}
82 |
83 | { login.loggedIn ? : loginComponent }
84 |
85 | );
86 | }
87 | }
88 |
89 | Chat.propTypes = {
90 | login: PropTypes.object.isRequired,
91 | profile: PropTypes.object.isRequired,
92 | actions: PropTypes.object.isRequired,
93 | chat: PropTypes.array.isRequired
94 | };
95 |
96 | function mapStateToProps(state) {
97 | return {
98 | login: state.login,
99 | profile: state.profile,
100 | chat: state.chat
101 | };
102 | }
103 |
104 | function mapDispatchToProps(dispatch) {
105 | return {
106 | actions: bindActionCreators({...loginActions, ...chatActions}, dispatch)
107 | };
108 | }
109 |
110 | export default connect(mapStateToProps, mapDispatchToProps)(Chat);
111 |
--------------------------------------------------------------------------------
/ios/chatter.xcodeproj/xcshareddata/xcschemes/chatter.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 |
--------------------------------------------------------------------------------
/ios/chatter.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 /* chatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* chatterTests.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 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
24 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
25 | 9634A1C11C6E47B700FCF217 /* FBSDKCoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9634A1C01C6E47B700FCF217 /* FBSDKCoreKit.framework */; };
26 | 9634A1E01C6E4B3100FCF217 /* libRCTFBSDKCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9634A1D11C6E49D100FCF217 /* libRCTFBSDKCore.a */; };
27 | 9634A1E11C6E4B3500FCF217 /* libRCTFBSDKLogin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9634A1DF1C6E49D100FCF217 /* libRCTFBSDKLogin.a */; };
28 | 9634A1E31C6E4BFE00FCF217 /* FBSDKLoginKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9634A1E21C6E4BFE00FCF217 /* FBSDKLoginKit.framework */; };
29 | /* End PBXBuildFile section */
30 |
31 | /* Begin PBXContainerItemProxy section */
32 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
33 | isa = PBXContainerItemProxy;
34 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
35 | proxyType = 2;
36 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
37 | remoteInfo = RCTActionSheet;
38 | };
39 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
40 | isa = PBXContainerItemProxy;
41 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
42 | proxyType = 2;
43 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
44 | remoteInfo = RCTGeolocation;
45 | };
46 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
47 | isa = PBXContainerItemProxy;
48 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
49 | proxyType = 2;
50 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
51 | remoteInfo = RCTImage;
52 | };
53 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
54 | isa = PBXContainerItemProxy;
55 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
56 | proxyType = 2;
57 | remoteGlobalIDString = 58B511DB1A9E6C8500147676;
58 | remoteInfo = RCTNetwork;
59 | };
60 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
61 | isa = PBXContainerItemProxy;
62 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
63 | proxyType = 2;
64 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
65 | remoteInfo = RCTVibration;
66 | };
67 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
68 | isa = PBXContainerItemProxy;
69 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
70 | proxyType = 1;
71 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
72 | remoteInfo = chatter;
73 | };
74 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
75 | isa = PBXContainerItemProxy;
76 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
77 | proxyType = 2;
78 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
79 | remoteInfo = RCTSettings;
80 | };
81 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
82 | isa = PBXContainerItemProxy;
83 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
84 | proxyType = 2;
85 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
86 | remoteInfo = RCTWebSocket;
87 | };
88 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
89 | isa = PBXContainerItemProxy;
90 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
91 | proxyType = 2;
92 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
93 | remoteInfo = React;
94 | };
95 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
96 | isa = PBXContainerItemProxy;
97 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
98 | proxyType = 2;
99 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
100 | remoteInfo = RCTLinking;
101 | };
102 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
103 | isa = PBXContainerItemProxy;
104 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
105 | proxyType = 2;
106 | remoteGlobalIDString = 58B5119B1A9E6C1200147676;
107 | remoteInfo = RCTText;
108 | };
109 | 9634A1D01C6E49D100FCF217 /* PBXContainerItemProxy */ = {
110 | isa = PBXContainerItemProxy;
111 | containerPortal = 03CA654565CC4ABA80841318 /* RCTFBSDKCore.xcodeproj */;
112 | proxyType = 2;
113 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
114 | remoteInfo = RCTFBSDKCore;
115 | };
116 | 9634A1DE1C6E49D100FCF217 /* PBXContainerItemProxy */ = {
117 | isa = PBXContainerItemProxy;
118 | containerPortal = FE1B684DFBDA4CC39DD6C831 /* RCTFBSDKLogin.xcodeproj */;
119 | proxyType = 2;
120 | remoteGlobalIDString = 134814201AA4EA6300B7C361;
121 | remoteInfo = RCTFBSDKLogin;
122 | };
123 | /* End PBXContainerItemProxy section */
124 |
125 | /* Begin PBXFileReference section */
126 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
127 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; };
128 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; };
129 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; };
130 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; };
131 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; };
132 | 00E356EE1AD99517003FC87E /* chatterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = chatterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
133 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
134 | 00E356F21AD99517003FC87E /* chatterTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = chatterTests.m; sourceTree = ""; };
135 | 03CA654565CC4ABA80841318 /* RCTFBSDKCore.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 0; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTFBSDKCore.xcodeproj; path = "../node_modules/react-native-fbsdkcore/RCTFBSDKCore.xcodeproj"; sourceTree = ""; };
136 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; };
137 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; };
138 | 13B07F961A680F5B00A75B9A /* chatter.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = chatter.app; sourceTree = BUILT_PRODUCTS_DIR; };
139 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = chatter/AppDelegate.h; sourceTree = ""; };
140 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = chatter/AppDelegate.m; sourceTree = ""; };
141 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
142 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = chatter/Images.xcassets; sourceTree = ""; };
143 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = chatter/Info.plist; sourceTree = ""; };
144 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = chatter/main.m; sourceTree = ""; };
145 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; };
146 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; };
147 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; };
148 | 9634A1C01C6E47B700FCF217 /* FBSDKCoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSDKCoreKit.framework; path = ../../../FacebookSDK/FBSDKCoreKit.framework; sourceTree = ""; };
149 | 9634A1E21C6E4BFE00FCF217 /* FBSDKLoginKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FBSDKLoginKit.framework; path = ../../../FacebookSDK/FBSDKLoginKit.framework; sourceTree = ""; };
150 | FE1B684DFBDA4CC39DD6C831 /* RCTFBSDKLogin.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 0; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTFBSDKLogin.xcodeproj; path = "../node_modules/react-native-fbsdklogin/RCTFBSDKLogin.xcodeproj"; sourceTree = ""; };
151 | /* End PBXFileReference section */
152 |
153 | /* Begin PBXFrameworksBuildPhase section */
154 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
155 | isa = PBXFrameworksBuildPhase;
156 | buildActionMask = 2147483647;
157 | files = (
158 | );
159 | runOnlyForDeploymentPostprocessing = 0;
160 | };
161 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
162 | isa = PBXFrameworksBuildPhase;
163 | buildActionMask = 2147483647;
164 | files = (
165 | 146834051AC3E58100842450 /* libReact.a in Frameworks */,
166 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
167 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
168 | 9634A1C11C6E47B700FCF217 /* FBSDKCoreKit.framework in Frameworks */,
169 | 9634A1E31C6E4BFE00FCF217 /* FBSDKLoginKit.framework in Frameworks */,
170 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
171 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
172 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
173 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
174 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
175 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
176 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
177 | 9634A1E01C6E4B3100FCF217 /* libRCTFBSDKCore.a in Frameworks */,
178 | 9634A1E11C6E4B3500FCF217 /* libRCTFBSDKLogin.a in Frameworks */,
179 | );
180 | runOnlyForDeploymentPostprocessing = 0;
181 | };
182 | /* End PBXFrameworksBuildPhase section */
183 |
184 | /* Begin PBXGroup section */
185 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = {
186 | isa = PBXGroup;
187 | children = (
188 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
189 | );
190 | name = Products;
191 | sourceTree = "";
192 | };
193 | 00C302B61ABCB90400DB3ED1 /* Products */ = {
194 | isa = PBXGroup;
195 | children = (
196 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
197 | );
198 | name = Products;
199 | sourceTree = "";
200 | };
201 | 00C302BC1ABCB91800DB3ED1 /* Products */ = {
202 | isa = PBXGroup;
203 | children = (
204 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
205 | );
206 | name = Products;
207 | sourceTree = "";
208 | };
209 | 00C302D41ABCB9D200DB3ED1 /* Products */ = {
210 | isa = PBXGroup;
211 | children = (
212 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
213 | );
214 | name = Products;
215 | sourceTree = "";
216 | };
217 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = {
218 | isa = PBXGroup;
219 | children = (
220 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
221 | );
222 | name = Products;
223 | sourceTree = "";
224 | };
225 | 00E356EF1AD99517003FC87E /* chatterTests */ = {
226 | isa = PBXGroup;
227 | children = (
228 | 00E356F21AD99517003FC87E /* chatterTests.m */,
229 | 00E356F01AD99517003FC87E /* Supporting Files */,
230 | );
231 | path = chatterTests;
232 | sourceTree = "";
233 | };
234 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
235 | isa = PBXGroup;
236 | children = (
237 | 00E356F11AD99517003FC87E /* Info.plist */,
238 | );
239 | name = "Supporting Files";
240 | sourceTree = "";
241 | };
242 | 139105B71AF99BAD00B5F7CC /* Products */ = {
243 | isa = PBXGroup;
244 | children = (
245 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
246 | );
247 | name = Products;
248 | sourceTree = "";
249 | };
250 | 139FDEE71B06529A00C62182 /* Products */ = {
251 | isa = PBXGroup;
252 | children = (
253 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
254 | );
255 | name = Products;
256 | sourceTree = "";
257 | };
258 | 13B07FAE1A68108700A75B9A /* chatter */ = {
259 | isa = PBXGroup;
260 | children = (
261 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
262 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
263 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
264 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
265 | 13B07FB61A68108700A75B9A /* Info.plist */,
266 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
267 | 13B07FB71A68108700A75B9A /* main.m */,
268 | );
269 | name = chatter;
270 | sourceTree = "";
271 | };
272 | 146834001AC3E56700842450 /* Products */ = {
273 | isa = PBXGroup;
274 | children = (
275 | 146834041AC3E56700842450 /* libReact.a */,
276 | );
277 | name = Products;
278 | sourceTree = "";
279 | };
280 | 78C398B11ACF4ADC00677621 /* Products */ = {
281 | isa = PBXGroup;
282 | children = (
283 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
284 | );
285 | name = Products;
286 | sourceTree = "";
287 | };
288 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
289 | isa = PBXGroup;
290 | children = (
291 | 146833FF1AC3E56700842450 /* React.xcodeproj */,
292 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
293 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
294 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
295 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
296 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
297 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
298 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
299 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
300 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
301 | 03CA654565CC4ABA80841318 /* RCTFBSDKCore.xcodeproj */,
302 | FE1B684DFBDA4CC39DD6C831 /* RCTFBSDKLogin.xcodeproj */,
303 | );
304 | name = Libraries;
305 | sourceTree = "";
306 | };
307 | 832341B11AAA6A8300B99B32 /* Products */ = {
308 | isa = PBXGroup;
309 | children = (
310 | 832341B51AAA6A8300B99B32 /* libRCTText.a */,
311 | );
312 | name = Products;
313 | sourceTree = "";
314 | };
315 | 83CBB9F61A601CBA00E9B192 = {
316 | isa = PBXGroup;
317 | children = (
318 | 9634A1BF1C6E478C00FCF217 /* Frameworks */,
319 | 13B07FAE1A68108700A75B9A /* chatter */,
320 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
321 | 00E356EF1AD99517003FC87E /* chatterTests */,
322 | 83CBBA001A601CBA00E9B192 /* Products */,
323 | );
324 | indentWidth = 2;
325 | sourceTree = "";
326 | tabWidth = 2;
327 | };
328 | 83CBBA001A601CBA00E9B192 /* Products */ = {
329 | isa = PBXGroup;
330 | children = (
331 | 13B07F961A680F5B00A75B9A /* chatter.app */,
332 | 00E356EE1AD99517003FC87E /* chatterTests.xctest */,
333 | );
334 | name = Products;
335 | sourceTree = "";
336 | };
337 | 9634A1BF1C6E478C00FCF217 /* Frameworks */ = {
338 | isa = PBXGroup;
339 | children = (
340 | 9634A1E21C6E4BFE00FCF217 /* FBSDKLoginKit.framework */,
341 | 9634A1C01C6E47B700FCF217 /* FBSDKCoreKit.framework */,
342 | );
343 | name = Frameworks;
344 | sourceTree = "";
345 | };
346 | 9634A1CC1C6E49D100FCF217 /* Products */ = {
347 | isa = PBXGroup;
348 | children = (
349 | 9634A1D11C6E49D100FCF217 /* libRCTFBSDKCore.a */,
350 | );
351 | name = Products;
352 | sourceTree = "";
353 | };
354 | 9634A1DB1C6E49D100FCF217 /* Products */ = {
355 | isa = PBXGroup;
356 | children = (
357 | 9634A1DF1C6E49D100FCF217 /* libRCTFBSDKLogin.a */,
358 | );
359 | name = Products;
360 | sourceTree = "";
361 | };
362 | /* End PBXGroup section */
363 |
364 | /* Begin PBXNativeTarget section */
365 | 00E356ED1AD99517003FC87E /* chatterTests */ = {
366 | isa = PBXNativeTarget;
367 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "chatterTests" */;
368 | buildPhases = (
369 | 00E356EA1AD99517003FC87E /* Sources */,
370 | 00E356EB1AD99517003FC87E /* Frameworks */,
371 | 00E356EC1AD99517003FC87E /* Resources */,
372 | );
373 | buildRules = (
374 | );
375 | dependencies = (
376 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
377 | );
378 | name = chatterTests;
379 | productName = chatterTests;
380 | productReference = 00E356EE1AD99517003FC87E /* chatterTests.xctest */;
381 | productType = "com.apple.product-type.bundle.unit-test";
382 | };
383 | 13B07F861A680F5B00A75B9A /* chatter */ = {
384 | isa = PBXNativeTarget;
385 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "chatter" */;
386 | buildPhases = (
387 | 13B07F871A680F5B00A75B9A /* Sources */,
388 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
389 | 13B07F8E1A680F5B00A75B9A /* Resources */,
390 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
391 | );
392 | buildRules = (
393 | );
394 | dependencies = (
395 | );
396 | name = chatter;
397 | productName = "Hello World";
398 | productReference = 13B07F961A680F5B00A75B9A /* chatter.app */;
399 | productType = "com.apple.product-type.application";
400 | };
401 | /* End PBXNativeTarget section */
402 |
403 | /* Begin PBXProject section */
404 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
405 | isa = PBXProject;
406 | attributes = {
407 | LastUpgradeCheck = 610;
408 | ORGANIZATIONNAME = Facebook;
409 | TargetAttributes = {
410 | 00E356ED1AD99517003FC87E = {
411 | CreatedOnToolsVersion = 6.2;
412 | TestTargetID = 13B07F861A680F5B00A75B9A;
413 | };
414 | 13B07F861A680F5B00A75B9A = {
415 | DevelopmentTeam = 2AYJGEUVM7;
416 | };
417 | };
418 | };
419 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "chatter" */;
420 | compatibilityVersion = "Xcode 3.2";
421 | developmentRegion = English;
422 | hasScannedForEncodings = 0;
423 | knownRegions = (
424 | en,
425 | Base,
426 | );
427 | mainGroup = 83CBB9F61A601CBA00E9B192;
428 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
429 | projectDirPath = "";
430 | projectReferences = (
431 | {
432 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
433 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
434 | },
435 | {
436 | ProductGroup = 9634A1CC1C6E49D100FCF217 /* Products */;
437 | ProjectRef = 03CA654565CC4ABA80841318 /* RCTFBSDKCore.xcodeproj */;
438 | },
439 | {
440 | ProductGroup = 9634A1DB1C6E49D100FCF217 /* Products */;
441 | ProjectRef = FE1B684DFBDA4CC39DD6C831 /* RCTFBSDKLogin.xcodeproj */;
442 | },
443 | {
444 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
445 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
446 | },
447 | {
448 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
449 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
450 | },
451 | {
452 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
453 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
454 | },
455 | {
456 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
457 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
458 | },
459 | {
460 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
461 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
462 | },
463 | {
464 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
465 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
466 | },
467 | {
468 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
469 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
470 | },
471 | {
472 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
473 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
474 | },
475 | {
476 | ProductGroup = 146834001AC3E56700842450 /* Products */;
477 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
478 | },
479 | );
480 | projectRoot = "";
481 | targets = (
482 | 13B07F861A680F5B00A75B9A /* chatter */,
483 | 00E356ED1AD99517003FC87E /* chatterTests */,
484 | );
485 | };
486 | /* End PBXProject section */
487 |
488 | /* Begin PBXReferenceProxy section */
489 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
490 | isa = PBXReferenceProxy;
491 | fileType = archive.ar;
492 | path = libRCTActionSheet.a;
493 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
494 | sourceTree = BUILT_PRODUCTS_DIR;
495 | };
496 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
497 | isa = PBXReferenceProxy;
498 | fileType = archive.ar;
499 | path = libRCTGeolocation.a;
500 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
501 | sourceTree = BUILT_PRODUCTS_DIR;
502 | };
503 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
504 | isa = PBXReferenceProxy;
505 | fileType = archive.ar;
506 | path = libRCTImage.a;
507 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
508 | sourceTree = BUILT_PRODUCTS_DIR;
509 | };
510 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
511 | isa = PBXReferenceProxy;
512 | fileType = archive.ar;
513 | path = libRCTNetwork.a;
514 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
515 | sourceTree = BUILT_PRODUCTS_DIR;
516 | };
517 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
518 | isa = PBXReferenceProxy;
519 | fileType = archive.ar;
520 | path = libRCTVibration.a;
521 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
522 | sourceTree = BUILT_PRODUCTS_DIR;
523 | };
524 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
525 | isa = PBXReferenceProxy;
526 | fileType = archive.ar;
527 | path = libRCTSettings.a;
528 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
529 | sourceTree = BUILT_PRODUCTS_DIR;
530 | };
531 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
532 | isa = PBXReferenceProxy;
533 | fileType = archive.ar;
534 | path = libRCTWebSocket.a;
535 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
536 | sourceTree = BUILT_PRODUCTS_DIR;
537 | };
538 | 146834041AC3E56700842450 /* libReact.a */ = {
539 | isa = PBXReferenceProxy;
540 | fileType = archive.ar;
541 | path = libReact.a;
542 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
543 | sourceTree = BUILT_PRODUCTS_DIR;
544 | };
545 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
546 | isa = PBXReferenceProxy;
547 | fileType = archive.ar;
548 | path = libRCTLinking.a;
549 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
550 | sourceTree = BUILT_PRODUCTS_DIR;
551 | };
552 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
553 | isa = PBXReferenceProxy;
554 | fileType = archive.ar;
555 | path = libRCTText.a;
556 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
557 | sourceTree = BUILT_PRODUCTS_DIR;
558 | };
559 | 9634A1D11C6E49D100FCF217 /* libRCTFBSDKCore.a */ = {
560 | isa = PBXReferenceProxy;
561 | fileType = archive.ar;
562 | path = libRCTFBSDKCore.a;
563 | remoteRef = 9634A1D01C6E49D100FCF217 /* PBXContainerItemProxy */;
564 | sourceTree = BUILT_PRODUCTS_DIR;
565 | };
566 | 9634A1DF1C6E49D100FCF217 /* libRCTFBSDKLogin.a */ = {
567 | isa = PBXReferenceProxy;
568 | fileType = archive.ar;
569 | path = libRCTFBSDKLogin.a;
570 | remoteRef = 9634A1DE1C6E49D100FCF217 /* PBXContainerItemProxy */;
571 | sourceTree = BUILT_PRODUCTS_DIR;
572 | };
573 | /* End PBXReferenceProxy section */
574 |
575 | /* Begin PBXResourcesBuildPhase section */
576 | 00E356EC1AD99517003FC87E /* Resources */ = {
577 | isa = PBXResourcesBuildPhase;
578 | buildActionMask = 2147483647;
579 | files = (
580 | );
581 | runOnlyForDeploymentPostprocessing = 0;
582 | };
583 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
584 | isa = PBXResourcesBuildPhase;
585 | buildActionMask = 2147483647;
586 | files = (
587 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
588 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
589 | );
590 | runOnlyForDeploymentPostprocessing = 0;
591 | };
592 | /* End PBXResourcesBuildPhase section */
593 |
594 | /* Begin PBXShellScriptBuildPhase section */
595 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
596 | isa = PBXShellScriptBuildPhase;
597 | buildActionMask = 2147483647;
598 | files = (
599 | );
600 | inputPaths = (
601 | );
602 | name = "Bundle React Native code and images";
603 | outputPaths = (
604 | );
605 | runOnlyForDeploymentPostprocessing = 0;
606 | shellPath = /bin/sh;
607 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh";
608 | };
609 | /* End PBXShellScriptBuildPhase section */
610 |
611 | /* Begin PBXSourcesBuildPhase section */
612 | 00E356EA1AD99517003FC87E /* Sources */ = {
613 | isa = PBXSourcesBuildPhase;
614 | buildActionMask = 2147483647;
615 | files = (
616 | 00E356F31AD99517003FC87E /* chatterTests.m in Sources */,
617 | );
618 | runOnlyForDeploymentPostprocessing = 0;
619 | };
620 | 13B07F871A680F5B00A75B9A /* Sources */ = {
621 | isa = PBXSourcesBuildPhase;
622 | buildActionMask = 2147483647;
623 | files = (
624 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
625 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
626 | );
627 | runOnlyForDeploymentPostprocessing = 0;
628 | };
629 | /* End PBXSourcesBuildPhase section */
630 |
631 | /* Begin PBXTargetDependency section */
632 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
633 | isa = PBXTargetDependency;
634 | target = 13B07F861A680F5B00A75B9A /* chatter */;
635 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
636 | };
637 | /* End PBXTargetDependency section */
638 |
639 | /* Begin PBXVariantGroup section */
640 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
641 | isa = PBXVariantGroup;
642 | children = (
643 | 13B07FB21A68108700A75B9A /* Base */,
644 | );
645 | name = LaunchScreen.xib;
646 | path = chatter;
647 | sourceTree = "";
648 | };
649 | /* End PBXVariantGroup section */
650 |
651 | /* Begin XCBuildConfiguration section */
652 | 00E356F61AD99517003FC87E /* Debug */ = {
653 | isa = XCBuildConfiguration;
654 | buildSettings = {
655 | BUNDLE_LOADER = "$(TEST_HOST)";
656 | FRAMEWORK_SEARCH_PATHS = (
657 | "$(SDKROOT)/Developer/Library/Frameworks",
658 | "$(inherited)",
659 | );
660 | GCC_PREPROCESSOR_DEFINITIONS = (
661 | "DEBUG=1",
662 | "$(inherited)",
663 | );
664 | INFOPLIST_FILE = chatterTests/Info.plist;
665 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
666 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
667 | LIBRARY_SEARCH_PATHS = (
668 | "$(inherited)",
669 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
670 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
671 | );
672 | PRODUCT_NAME = "$(TARGET_NAME)";
673 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatter.app/chatter";
674 | };
675 | name = Debug;
676 | };
677 | 00E356F71AD99517003FC87E /* Release */ = {
678 | isa = XCBuildConfiguration;
679 | buildSettings = {
680 | BUNDLE_LOADER = "$(TEST_HOST)";
681 | COPY_PHASE_STRIP = NO;
682 | FRAMEWORK_SEARCH_PATHS = (
683 | "$(SDKROOT)/Developer/Library/Frameworks",
684 | "$(inherited)",
685 | );
686 | INFOPLIST_FILE = chatterTests/Info.plist;
687 | IPHONEOS_DEPLOYMENT_TARGET = 8.2;
688 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
689 | LIBRARY_SEARCH_PATHS = (
690 | "$(inherited)",
691 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
692 | "\"$(SRCROOT)/$(TARGET_NAME)\"",
693 | );
694 | PRODUCT_NAME = "$(TARGET_NAME)";
695 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatter.app/chatter";
696 | };
697 | name = Release;
698 | };
699 | 13B07F941A680F5B00A75B9A /* Debug */ = {
700 | isa = XCBuildConfiguration;
701 | buildSettings = {
702 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
703 | CODE_SIGN_IDENTITY = "iPhone Developer";
704 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
705 | DEAD_CODE_STRIPPING = NO;
706 | FRAMEWORK_SEARCH_PATHS = "~/Documents/FacebookSDK/**";
707 | HEADER_SEARCH_PATHS = (
708 | "$(inherited)",
709 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
710 | "$(SRCROOT)/../node_modules/react-native/React/**",
711 | "$(SRCROOT)/../node_modules/react-native-fbsdkcore/iOS",
712 | "$(SRCROOT)/../node_modules/react-native-fbsdklogin/iOS",
713 | );
714 | INFOPLIST_FILE = chatter/Info.plist;
715 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
716 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
717 | OTHER_LDFLAGS = "-ObjC";
718 | PRODUCT_NAME = chatter;
719 | PROVISIONING_PROFILE = "";
720 | TARGETED_DEVICE_FAMILY = 1;
721 | };
722 | name = Debug;
723 | };
724 | 13B07F951A680F5B00A75B9A /* Release */ = {
725 | isa = XCBuildConfiguration;
726 | buildSettings = {
727 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
728 | CODE_SIGN_IDENTITY = "iPhone Developer";
729 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
730 | FRAMEWORK_SEARCH_PATHS = "~/Documents/FacebookSDK/**";
731 | HEADER_SEARCH_PATHS = (
732 | "$(inherited)",
733 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
734 | "$(SRCROOT)/../node_modules/react-native/React/**",
735 | "$(SRCROOT)/../node_modules/react-native-fbsdkcore/iOS",
736 | "$(SRCROOT)/../node_modules/react-native-fbsdklogin/iOS",
737 | );
738 | INFOPLIST_FILE = chatter/Info.plist;
739 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
740 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
741 | OTHER_LDFLAGS = "-ObjC";
742 | PRODUCT_NAME = chatter;
743 | PROVISIONING_PROFILE = "";
744 | TARGETED_DEVICE_FAMILY = 1;
745 | };
746 | name = Release;
747 | };
748 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
749 | isa = XCBuildConfiguration;
750 | buildSettings = {
751 | ALWAYS_SEARCH_USER_PATHS = NO;
752 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
753 | CLANG_CXX_LIBRARY = "libc++";
754 | CLANG_ENABLE_MODULES = YES;
755 | CLANG_ENABLE_OBJC_ARC = YES;
756 | CLANG_WARN_BOOL_CONVERSION = YES;
757 | CLANG_WARN_CONSTANT_CONVERSION = YES;
758 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
759 | CLANG_WARN_EMPTY_BODY = YES;
760 | CLANG_WARN_ENUM_CONVERSION = YES;
761 | CLANG_WARN_INT_CONVERSION = YES;
762 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
763 | CLANG_WARN_UNREACHABLE_CODE = YES;
764 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
765 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
766 | COPY_PHASE_STRIP = NO;
767 | ENABLE_STRICT_OBJC_MSGSEND = YES;
768 | GCC_C_LANGUAGE_STANDARD = gnu99;
769 | GCC_DYNAMIC_NO_PIC = NO;
770 | GCC_OPTIMIZATION_LEVEL = 0;
771 | GCC_PREPROCESSOR_DEFINITIONS = (
772 | "DEBUG=1",
773 | "$(inherited)",
774 | );
775 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
776 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
777 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
778 | GCC_WARN_UNDECLARED_SELECTOR = YES;
779 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
780 | GCC_WARN_UNUSED_FUNCTION = YES;
781 | GCC_WARN_UNUSED_VARIABLE = YES;
782 | HEADER_SEARCH_PATHS = (
783 | "$(inherited)",
784 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
785 | "$(SRCROOT)/../node_modules/react-native/React/**",
786 | "$(SRCROOT)/../node_modules/react-native-fbsdkcore/iOS",
787 | "$(SRCROOT)/../node_modules/react-native-fbsdklogin/iOS",
788 | );
789 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
790 | MTL_ENABLE_DEBUG_INFO = YES;
791 | ONLY_ACTIVE_ARCH = YES;
792 | SDKROOT = iphoneos;
793 | };
794 | name = Debug;
795 | };
796 | 83CBBA211A601CBA00E9B192 /* Release */ = {
797 | isa = XCBuildConfiguration;
798 | buildSettings = {
799 | ALWAYS_SEARCH_USER_PATHS = NO;
800 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
801 | CLANG_CXX_LIBRARY = "libc++";
802 | CLANG_ENABLE_MODULES = YES;
803 | CLANG_ENABLE_OBJC_ARC = YES;
804 | CLANG_WARN_BOOL_CONVERSION = YES;
805 | CLANG_WARN_CONSTANT_CONVERSION = YES;
806 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
807 | CLANG_WARN_EMPTY_BODY = YES;
808 | CLANG_WARN_ENUM_CONVERSION = YES;
809 | CLANG_WARN_INT_CONVERSION = YES;
810 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
811 | CLANG_WARN_UNREACHABLE_CODE = YES;
812 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
813 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
814 | COPY_PHASE_STRIP = YES;
815 | ENABLE_NS_ASSERTIONS = NO;
816 | ENABLE_STRICT_OBJC_MSGSEND = YES;
817 | GCC_C_LANGUAGE_STANDARD = gnu99;
818 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
819 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
820 | GCC_WARN_UNDECLARED_SELECTOR = YES;
821 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
822 | GCC_WARN_UNUSED_FUNCTION = YES;
823 | GCC_WARN_UNUSED_VARIABLE = YES;
824 | HEADER_SEARCH_PATHS = (
825 | "$(inherited)",
826 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
827 | "$(SRCROOT)/../node_modules/react-native/React/**",
828 | "$(SRCROOT)/../node_modules/react-native-fbsdkcore/iOS",
829 | "$(SRCROOT)/../node_modules/react-native-fbsdklogin/iOS",
830 | );
831 | IPHONEOS_DEPLOYMENT_TARGET = 7.0;
832 | MTL_ENABLE_DEBUG_INFO = NO;
833 | SDKROOT = iphoneos;
834 | VALIDATE_PRODUCT = YES;
835 | };
836 | name = Release;
837 | };
838 | /* End XCBuildConfiguration section */
839 |
840 | /* Begin XCConfigurationList section */
841 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "chatterTests" */ = {
842 | isa = XCConfigurationList;
843 | buildConfigurations = (
844 | 00E356F61AD99517003FC87E /* Debug */,
845 | 00E356F71AD99517003FC87E /* Release */,
846 | );
847 | defaultConfigurationIsVisible = 0;
848 | defaultConfigurationName = Release;
849 | };
850 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "chatter" */ = {
851 | isa = XCConfigurationList;
852 | buildConfigurations = (
853 | 13B07F941A680F5B00A75B9A /* Debug */,
854 | 13B07F951A680F5B00A75B9A /* Release */,
855 | );
856 | defaultConfigurationIsVisible = 0;
857 | defaultConfigurationName = Release;
858 | };
859 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "chatter" */ = {
860 | isa = XCConfigurationList;
861 | buildConfigurations = (
862 | 83CBBA201A601CBA00E9B192 /* Debug */,
863 | 83CBBA211A601CBA00E9B192 /* Release */,
864 | );
865 | defaultConfigurationIsVisible = 0;
866 | defaultConfigurationName = Release;
867 | };
868 | /* End XCConfigurationList section */
869 | };
870 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
871 | }
872 |
--------------------------------------------------------------------------------