Commit c15d95df authored by Wietse Kuipers's avatar Wietse Kuipers
Browse files

Merge branch 'feature/push-notifications' into 'master'

Push Notifications

See merge request !26
parents c22cc3d8 c86a3d63
...@@ -22,6 +22,10 @@ DerivedData ...@@ -22,6 +22,10 @@ DerivedData
*.xcuserstate *.xcuserstate
project.xcworkspace project.xcworkspace
# Pods
#
ios/Pods
# Android/IntelliJ # Android/IntelliJ
# #
build/ build/
......
...@@ -141,11 +141,13 @@ android { ...@@ -141,11 +141,13 @@ android {
} }
dependencies { dependencies {
compile project(':react-native-fcm')
compile project(':react-native-linear-gradient') compile project(':react-native-linear-gradient')
compile project(':react-native-vector-icons') compile project(':react-native-vector-icons')
compile fileTree(dir: "libs", include: ["*.jar"]) compile fileTree(dir: "libs", include: ["*.jar"])
compile "com.android.support:appcompat-v7:23.0.1" compile "com.android.support:appcompat-v7:23.0.1"
compile "com.facebook.react:react-native:+" // From node_modules compile "com.facebook.react:react-native:+" // From node_modules
compile 'com.google.firebase:firebase-core:11.4.0'
} }
// Run this once to be able to run the application with BUCK // Run this once to be able to run the application with BUCK
...@@ -162,3 +164,5 @@ gradle.projectsEvaluated { ...@@ -162,3 +164,5 @@ gradle.projectsEvaluated {
processBuilder.start() processBuilder.start()
} }
} }
apply plugin: 'com.google.gms.google-services'
\ No newline at end of file
{
"project_info": {
"project_number": "488731759938",
"firebase_url": "https://thalia-493a0.firebaseio.com",
"project_id": "thalia-493a0",
"storage_bucket": "thalia-493a0.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:488731759938:android:ce90d9e7effcbbfb",
"android_client_info": {
"package_name": "com.thaliapp"
}
},
"oauth_client": [
{
"client_id": "488731759938-k103fp2m146qhfsf7s3to9bm43qhcous.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyApn30VsmPqjs4N5_kR68tpXzBWSyOxuoM"
}
],
"services": {
"analytics_service": {
"status": 1
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:488731759938:android:e73d72886d6d4f94",
"android_client_info": {
"package_name": "com.thaliapp.dev"
}
},
"oauth_client": [
{
"client_id": "488731759938-k103fp2m146qhfsf7s3to9bm43qhcous.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyApn30VsmPqjs4N5_kR68tpXzBWSyOxuoM"
}
],
"services": {
"analytics_service": {
"status": 1
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
}
],
"configuration_version": "1"
}
\ No newline at end of file
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.thaliapp" package="com.thaliapp"
android:versionCode="1" android:versionCode="1"
android:versionName="1.0"> android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-sdk <uses-sdk
android:minSdkVersion="16" android:minSdkVersion="16"
android:targetSdkVersion="22" /> android:targetSdkVersion="22"/>
<application <application
android:name=".MainApplication" android:name=".MainApplication"
android:allowBackup="true" android:allowBackup="true"
android:label="@string/app_name" android:label="@string/app_name"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> <activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>
<meta-data android:name="android.max_aspect" android:value="2.1" /> <service android:name="com.evollu.react.fcm.MessagingService" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service android:name="com.evollu.react.fcm.InstanceIdService" android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_notification" />
<meta-data
android:name="android.max_aspect"
android:value="2.1" />
</application> </application>
</manifest> </manifest>
...@@ -3,6 +3,7 @@ package com.thaliapp; ...@@ -3,6 +3,7 @@ package com.thaliapp;
import android.app.Application; import android.app.Application;
import com.facebook.react.ReactApplication; import com.facebook.react.ReactApplication;
import com.evollu.react.fcm.FIRMessagingPackage;
import com.BV.LinearGradient.LinearGradientPackage; import com.BV.LinearGradient.LinearGradientPackage;
import com.oblador.vectoricons.VectorIconsPackage; import com.oblador.vectoricons.VectorIconsPackage;
import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactNativeHost;
...@@ -25,6 +26,7 @@ public class MainApplication extends Application implements ReactApplication { ...@@ -25,6 +26,7 @@ public class MainApplication extends Application implements ReactApplication {
protected List<ReactPackage> getPackages() { protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList( return Arrays.<ReactPackage>asList(
new MainReactPackage(), new MainReactPackage(),
new FIRMessagingPackage(),
new LinearGradientPackage(), new LinearGradientPackage(),
new VectorIconsPackage() new VectorIconsPackage()
); );
......
...@@ -6,6 +6,7 @@ buildscript { ...@@ -6,6 +6,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.google.gms:google-services:3.1.0'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
...@@ -20,5 +21,8 @@ allprojects { ...@@ -20,5 +21,8 @@ allprojects {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android" url "$rootDir/../node_modules/react-native/android"
} }
maven {
url "https://maven.google.com" // Google's Maven repository
}
} }
} }
rootProject.name = 'ThaliApp' rootProject.name = 'ThaliApp'
include ':react-native-fcm'
project(':react-native-fcm').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fcm/android')
include ':react-native-linear-gradient' include ':react-native-linear-gradient'
project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android') project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android')
include ':react-native-vector-icons' include ':react-native-vector-icons'
project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android')
include ':app' include ':app'
\ No newline at end of file
export const REGISTER = 'PUSH_NOTIFICATIONS_REGISTER';
export const INVALIDATE = 'PUSH_NOTIFICATIONS_INVALIDATE';
export function register(token) {
return { type: REGISTER, payload: { token } };
}
export function invalidate() {
return { type: INVALIDATE };
}
...@@ -4,6 +4,7 @@ import { applyMiddleware, combineReducers, createStore } from 'redux'; ...@@ -4,6 +4,7 @@ import { applyMiddleware, combineReducers, createStore } from 'redux';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import thunk from 'redux-thunk'; import thunk from 'redux-thunk';
import createSagaMiddleware from 'redux-saga'; import createSagaMiddleware from 'redux-saga';
import FCM, { FCMEvent } from 'react-native-fcm';
import Moment from 'moment'; import Moment from 'moment';
import 'moment/locale/nl'; import 'moment/locale/nl';
...@@ -11,6 +12,7 @@ import * as reducers from './reducers'; ...@@ -11,6 +12,7 @@ import * as reducers from './reducers';
import sagas from './sagas'; import sagas from './sagas';
import ReduxNavigator from './components/navigator'; import ReduxNavigator from './components/navigator';
import * as loginActions from './actions/login'; import * as loginActions from './actions/login';
import { register } from './actions/pushNotifications';
const createStoreWithMiddleware = applyMiddleware(thunk)(createStore); const createStoreWithMiddleware = applyMiddleware(thunk)(createStore);
const sagaMiddleware = createSagaMiddleware(); const sagaMiddleware = createSagaMiddleware();
...@@ -29,6 +31,20 @@ const pairsToObject = (obj, pair) => { ...@@ -29,6 +31,20 @@ const pairsToObject = (obj, pair) => {
return obj2; return obj2;
}; };
FCM.on(FCMEvent.Notification, async (notif) => {
if (notif.fcm) {
FCM.presentLocalNotification({
title: notif.fcm.title,
body: notif.fcm.body,
color: notif.fcm.color,
icon: notif.fcm.icon === null ? 'ic_notification' : notif.fcm.icon,
action: notif.fcm.action,
tag: notif.fcm.tag,
show_in_foreground: true,
});
}
});
class Main extends Component { class Main extends Component {
componentDidMount() { componentDidMount() {
Moment.locale('nl'); Moment.locale('nl');
...@@ -43,6 +59,7 @@ class Main extends Component { ...@@ -43,6 +59,7 @@ class Main extends Component {
if (username !== null && token !== null) { if (username !== null && token !== null) {
store.dispatch(loginActions.success(username, token, displayName, photo, '')); store.dispatch(loginActions.success(username, token, displayName, photo, ''));
store.dispatch(register(token));
} }
}); });
} }
......
...@@ -5,6 +5,7 @@ import eventSaga from './event'; ...@@ -5,6 +5,7 @@ import eventSaga from './event';
import profileSaga from './profile'; import profileSaga from './profile';
import welcomeSaga from './welcome'; import welcomeSaga from './welcome';
import calendarSaga from './calendar'; import calendarSaga from './calendar';
import pushNotificationsSaga from './pushNotifications';
const sagas = function* sagas() { const sagas = function* sagas() {
yield all([ yield all([
...@@ -13,6 +14,7 @@ const sagas = function* sagas() { ...@@ -13,6 +14,7 @@ const sagas = function* sagas() {
fork(profileSaga), fork(profileSaga),
fork(welcomeSaga), fork(welcomeSaga),
fork(calendarSaga), fork(calendarSaga),
fork(pushNotificationsSaga),
]); ]);
}; };
......
...@@ -4,6 +4,7 @@ import { AsyncStorage } from 'react-native'; ...@@ -4,6 +4,7 @@ import { AsyncStorage } from 'react-native';
import { apiRequest, url } from '../url'; import { apiRequest, url } from '../url';
import * as loginActions from '../actions/login'; import * as loginActions from '../actions/login';
import * as pushNotificationsActions from '../actions/pushNotifications';
const USERNAMEKEY = '@MyStore:username'; const USERNAMEKEY = '@MyStore:username';
const TOKENKEY = '@MyStore:token'; const TOKENKEY = '@MyStore:token';
...@@ -52,6 +53,7 @@ const login = function* login(action) { ...@@ -52,6 +53,7 @@ const login = function* login(action) {
yield put(loginActions.success( yield put(loginActions.success(
user, token, displayName, avatar, user, token, displayName, avatar,
)); ));
yield put(pushNotificationsActions.register(token));
yield delay(2000); yield delay(2000);
yield put(loginActions.reset()); yield put(loginActions.reset());
} catch (error) { } catch (error) {
...@@ -64,6 +66,7 @@ const login = function* login(action) { ...@@ -64,6 +66,7 @@ const login = function* login(action) {
const logout = function* logout() { const logout = function* logout() {
yield call(AsyncStorage.multiRemove, [USERNAMEKEY, TOKENKEY]); yield call(AsyncStorage.multiRemove, [USERNAMEKEY, TOKENKEY]);
yield delay(2000); yield delay(2000);
yield put(pushNotificationsActions.invalidate());
yield put(loginActions.reset()); yield put(loginActions.reset());
}; };
......
import { call, takeEvery } from 'redux-saga/effects';
import { Platform } from 'react-native';
import FCM from 'react-native-fcm';
import { apiRequest } from '../url';
import * as pushNotificationsActions from '../actions/pushNotifications';
const register = function* register(action) {
const { token } = action.payload;
let pushToken;
if (Platform.OS === 'ios') {
pushToken = yield call(FCM.getFCMToken);
} else {
yield call(FCM.requestPermissions);
pushToken = yield call(FCM.getFCMToken);
}
const data = {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
Authorization: `Token ${token}`,
},
body: JSON.stringify({
registration_id: pushToken,
type: Platform.OS,
}),
};
yield call(apiRequest, 'devices', data);
};
const invalidate = function* invalidate() {
yield call(FCM.deleteInstanceId);
};
const pushNotificationsSaga = function* pushNotificationsSaga() {
yield takeEvery(pushNotificationsActions.REGISTER, register);
yield takeEvery(pushNotificationsActions.INVALIDATE, invalidate);
};
export default pushNotificationsSaga;
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
target 'ThaliApp' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for ThaliApp
pod 'FirebaseMessaging'
target 'ThaliAppTests' do
inherit! :search_paths
# Pods for testing
end
end
PODS:
- FirebaseAnalytics (3.6.0):
- FirebaseCore (~> 3.4)
- FirebaseInstanceID (~> 1.0)
- GoogleInterchangeUtilities (~> 1.2)
- GoogleSymbolUtilities (~> 1.1)
- GoogleToolboxForMac/NSData+zlib (~> 2.1)
- FirebaseCore (3.4.6):
- GoogleInterchangeUtilities (~> 1.2)
- GoogleToolboxForMac/NSData+zlib (~> 2.1)
- FirebaseInstanceID (1.0.8)
- FirebaseMessaging (1.2.1):
- FirebaseAnalytics (~> 3.4)
- FirebaseInstanceID (~> 1.0)
- GoogleInterchangeUtilities (~> 1.2)
- GoogleSymbolUtilities (~> 1.1)
- GoogleToolboxForMac/Logger (~> 2.1)
- GoogleInterchangeUtilities (1.2.2):
- GoogleSymbolUtilities (~> 1.1)
- GoogleSymbolUtilities (1.1.2)
- GoogleToolboxForMac/Defines (2.1.0)
- GoogleToolboxForMac/Logger (2.1.0):
- GoogleToolboxForMac/Defines (= 2.1.0)
- GoogleToolboxForMac/NSData+zlib (2.1.0):
- GoogleToolboxForMac/Defines (= 2.1.0)
DEPENDENCIES:
- FirebaseMessaging
SPEC CHECKSUMS:
FirebaseAnalytics: 9c67af0ebeb8d2146c9b4ea2616439affa947b58
FirebaseCore: 03da1cb32615569bbc2830a22f9ad753d9a02ef5
FirebaseInstanceID: ba1e640935235e5fac39dfa816fe7660e72e1a8a
FirebaseMessaging: acf66347e43c5637c697060c3001d25c809a4131
GoogleInterchangeUtilities: d5bc4d88d5b661ab72f9d70c58d02ca8c27ad1f7
GoogleSymbolUtilities: 631ee17048aa5e9ab133470d768ea997a5ef9b96
GoogleToolboxForMac: 2b2596cbb7186865e98cadf2b1e262d851c2b168
PODFILE CHECKSUM: e96d08e64ae034c5cc5d47d35f4df47f936e7fc3
COCOAPODS: 1.2.1
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
}; };
objectVersion = 46; objectVersion = 46;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
...@@ -21,6 +22,8 @@ ...@@ -21,6 +22,8 @@
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
150EE563EF1D49189E5DE953 /* libRNFIRMessaging.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 162DE951FF45441397E81D10 /* libRNFIRMessaging.a */; };
219D8BF2E10693BA3C26E1FA /* libPods-ThaliAppTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 910BDD5E550B32CBCAA9EB32 /* libPods-ThaliAppTests.a */; };
2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
...@@ -31,7 +34,8 @@ ...@@ -31,7 +34,8 @@
2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; };
2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; };
2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; };
2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; 2D02E4C91E0B4AEC006451C7 /* libReact-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact-tvOS.a */; };
2D1FCA53D8DB5ADD28A3D2F3 /* libPods-ThaliApp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 419A54DF78ED5BAF6B5C40B7 /* libPods-ThaliApp.a */; };
2DCD954D1E0B4F2C00145EB5 /* ThaliAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ThaliAppTests.m */; }; 2DCD954D1E0B4F2C00145EB5 /* ThaliAppTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ThaliAppTests.m */; };
307D8943B1734FD58BC954BD /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F808FC5B0C6A43748E179BF6 /* Entypo.ttf */; }; 307D8943B1734FD58BC954BD /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F808FC5B0C6A43748E179BF6 /* Entypo.ttf */; };
32D3E4CE1ED98F33004F54F8 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 32D3E4871ED98796004F54F8 /* libBVLinearGradient.a */; }; 32D3E4CE1ED98F33004F54F8 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 32D3E4871ED98796004F54F8 /* libBVLinearGradient.a */; };
...@@ -41,13 +45,13 @@ ...@@ -41,13 +45,13 @@
5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
8FE220E4161B43D0AF59C4AB /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3AF00CDF61D94356B607ED10 /* EvilIcons.ttf */; }; 8FE220E4161B43D0AF59C4AB /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3AF00CDF61D94356B607ED10 /* EvilIcons.ttf */; };
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
B2F2F142E10040768729608C /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B1083F2DA4E240B69789FA61 /* FontAwesome.ttf */; }; B2F2F142E10040768729608C /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B1083F2DA4E240B69789FA61 /* FontAwesome.ttf */; };
B4E7CD24D4FD4998A35D2106 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2A30344F7F0A4E50A76BDA3F /* Zocial.ttf */; }; B4E7CD24D4FD4998A35D2106 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2A30344F7F0A4E50A76BDA3F /* Zocial.ttf */; };
DD0BDA6EC5B84A00B22A1D59 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0EBF699C4D43413C9CCE8127 /* Octicons.ttf */; }; DD0BDA6EC5B84A00B22A1D59 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0EBF699C4D43413C9CCE8127 /* Octicons.ttf */; };
E5F26864D8034A489C708F9E /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CF9FEDFD7450466781B02A2D /* Ionicons.ttf */; }; E5F26864D8034A489C708F9E /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CF9FEDFD7450466781B02A2D /* Ionicons.ttf */; };
F4DAEE2B4E1B4763873408DA /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 93DB7BC111BA461BA87006BA /* MaterialCommunityIcons.ttf */; }; F4DAEE2B4E1B4763873408DA /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 93DB7BC111BA461BA87006BA /* MaterialCommunityIcons.ttf */; };
FC2516869BC4468581E4A667 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9D762E1DAD73438C812C1461 /* Foundation.ttf */; }; FC2516869BC4468581E4A667 /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9D762E1DAD73438C812C1461 /* Foundation.ttf */; };
ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
...@@ -135,6 +139,27 @@ ...@@ -135,6 +139,27 @@
remoteGlobalIDString = 5DBEB1501B18CEA900B34395; remoteGlobalIDString = 5DBEB1501B18CEA900B34395;
remoteInfo = RNVectorIcons; remoteInfo = RNVectorIcons;
}; };
32D5610C1F7592880012EC89 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5A90BA3FF7F8422A9150FDAA /* BVLinearGradient.xcodeproj */;
proxyType = 2;