├── .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 | ![](https://raw.githubusercontent.com/antigirl/ReactNativeChatApp/master/screenshot.png) 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 | --------------------------------------------------------------------------------