From b48420943b6867f4b5d1df2bf6c4e2b1ceac9f98 Mon Sep 17 00:00:00 2001 From: Manu Nair Date: Sun, 1 Nov 2020 18:46:26 -0800 Subject: [PATCH] Using firestore as local db --- .vscode/settings.json | 1 - AppInit.tsx | 24 +- android/app/build.gradle | 1 + android/app/google-services.json | 40 ++ android/build.gradle | 1 + commonlib/database/IDatabase.ts | 15 +- commonlib/services/resistance.ts | 12 +- components/CreateResistance.tsx | 3 +- domainlogic/controllers/resistance.ts | 24 +- domainlogic/database/FirebaseDB.ts | 100 +++++ firebase.json | 5 + ios/GoogleService-Info.plist | 36 ++ ios/Podfile.lock | 355 ++++++++++++++++++ ios/fitbook.xcodeproj/project.pbxproj | 19 + .../UserInterfaceState.xcuserstate | Bin 16425 -> 21934 bytes ios/fitbook/AppDelegate.m | 4 + package.json | 5 +- screens/resistance/ResistancelogScreen.tsx | 4 +- yarn.lock | 23 +- 19 files changed, 635 insertions(+), 37 deletions(-) create mode 100644 android/app/google-services.json create mode 100644 domainlogic/database/FirebaseDB.ts create mode 100644 firebase.json create mode 100644 ios/GoogleService-Info.plist diff --git a/.vscode/settings.json b/.vscode/settings.json index fa4fa7d..7477f9a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,6 @@ { "editor.formatOnSave": true, "editor.codeLens": false, - "editor.tabSize": 2, "files.insertFinalNewline": true, "javascript.preferences.importModuleSpecifier": "relative", "typescript.preferences.importModuleSpecifier": "relative", diff --git a/AppInit.tsx b/AppInit.tsx index b76d621..ac664f3 100644 --- a/AppInit.tsx +++ b/AppInit.tsx @@ -4,24 +4,46 @@ import React from 'react'; import { useDispatch } from 'react-redux'; import { Style } from './styles/style'; import { setTheme } from './store/actions/actions'; +import auth from '@react-native-firebase/auth'; interface AppInitProps { children: React.ReactElement; } +const AuthenticateUser = async () => { + try { + const response = await auth().signInAnonymously(); + return response; + } catch (error) { + if (error.code === 'auth/operation-not-allowed') { + console.log('Enable anonymous in your firebase console.'); + } + + console.error(error); + } +}; + const AppInit: React.FC = props => { const [isInitialized, setIsInitialized] = React.useState(false); + const [currentUser, setCurrentUser] = React.useState(''); const dispatch = useDispatch(); React.useEffect(() => { const fetchConfigFromStorage = async () => { await Style.computeCurrentTheme(); dispatch(setTheme(Style.getCurrentTheme())); + + const user = await AuthenticateUser(); + if (user) { + setCurrentUser(user.user.displayName); + console.log(user.user.uid); + } + setIsInitialized(true); }; fetchConfigFromStorage(); - }, [dispatch, setIsInitialized]); + }, [currentUser, dispatch, setIsInitialized]); if (isInitialized) { return props.children; diff --git a/android/app/build.gradle b/android/app/build.gradle index 5e3616c..afba4c5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: "com.android.application" +apply plugin: "com.google.gms.google-services" import com.android.build.OutputFile diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..ee246c8 --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,40 @@ +{ + "project_info": { + "project_number": "301938801516", + "firebase_url": "https://rn-fitbook.firebaseio.com", + "project_id": "rn-fitbook", + "storage_bucket": "rn-fitbook.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:301938801516:android:e6786ea7423cd9d93fd149", + "android_client_info": { + "package_name": "com.fitbook" + } + }, + "oauth_client": [ + { + "client_id": "301938801516-klgq32le15hukm6q20mb94lu8k3j6vjt.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD7_AwC14DOmUicmaqyYPmoJhLZXJ-f4f0" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "301938801516-klgq32le15hukm6q20mb94lu8k3j6vjt.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index e314b9f..3141afc 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -13,6 +13,7 @@ buildscript { } dependencies { classpath("com.android.tools.build:gradle:3.5.3") + classpath("com.google.gms:google-services:4.3.3") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/commonlib/database/IDatabase.ts b/commonlib/database/IDatabase.ts index fb2f744..f75b4bf 100644 --- a/commonlib/database/IDatabase.ts +++ b/commonlib/database/IDatabase.ts @@ -9,6 +9,19 @@ export default interface IDatabase { params?: Record, query?: Record ) => Promise; - GetListAsync: () => Promise; + GetListAsync: (params?: IQueryParams[]) => Promise; PostAsync: (data: Record) => Promise; } + +export enum Operators { + EQUALS, + GREATERTHANOREQUALTO, + LESSTHANOREQUALTO, + NOTEQUALTO, +} + +export interface IQueryParams { + key: string; + operator: Operators; + value: string | number; +} diff --git a/commonlib/services/resistance.ts b/commonlib/services/resistance.ts index 80f2ba3..9d74012 100644 --- a/commonlib/services/resistance.ts +++ b/commonlib/services/resistance.ts @@ -1,6 +1,6 @@ // Copyright FitBook -import IDatabase from '../database/IDatabase'; +import IDatabase, { IQueryParams, Operators } from '../database/IDatabase'; import { CreateResistanceModel, ResistanceModel } from '../models/ResistanceModel'; import ServiceResponse, { isServiceResponse } from '../models/ServiceResponse'; @@ -22,10 +22,14 @@ export default class ResistanceService { return r; } - public async getResistanceListByUserId(type: string, userId: string): Promise { - const params = { type: type.toLocaleUpperCase() }; + public async getResistanceListByUserId(type: string): Promise { + const param: IQueryParams = { + key: 'type', + value: type.toLocaleUpperCase(), + operator: Operators.EQUALS, + }; - const r: ResistanceModel[] | ServiceResponse = await this.db.GetListByUserId(userId, params); + const r: ResistanceModel[] | ServiceResponse = await this.db.GetListAsync([param]); if (isServiceResponse(r)) { return r; diff --git a/components/CreateResistance.tsx b/components/CreateResistance.tsx index 7e4bef8..6c13483 100644 --- a/components/CreateResistance.tsx +++ b/components/CreateResistance.tsx @@ -69,9 +69,8 @@ const ResistanceInput: React.FC = props => { const addLog = () => { let timestamp = getTimestamp(); - let id = '5dfecbdd39d8760019968d04'; const newResistance: CreateResistanceModel = { - userId: id, + userId: '', type: props.name, createdDate: new Date(timestamp), weight, diff --git a/domainlogic/controllers/resistance.ts b/domainlogic/controllers/resistance.ts index 7c30be0..024f434 100644 --- a/domainlogic/controllers/resistance.ts +++ b/domainlogic/controllers/resistance.ts @@ -1,34 +1,16 @@ // Copyright FitBook import { CreateResistanceModel, ResistanceModel, ResistanceTypes } from '../../commonlib/models/ResistanceModel'; -import AsyncStorage from '@react-native-community/async-storage'; -import Storage from '../../constants/storage'; import ResistanceService from '../../commonlib/services/resistance'; import ServiceResponse from '../../commonlib/models/ServiceResponse'; -import LocalStorageDB from '../database/localStorageDB'; -import MongoDb from '../database/mongoDb'; +import FirebaseDB from '../database/FirebaseDB'; export default class ResistanceController { private resistanceSvc: ResistanceService; - private static readonly TABLE_NAME: string = 'resistance'; - private static readonly ENDPOINT = '/api/resistance'; + private static readonly TABLE_NAME: string = 'Resistances'; constructor() { - this.resistanceSvc = new ResistanceService(new LocalStorageDB(ResistanceController.TABLE_NAME)); - this.initialize(); - } - - public async initialize() { - let allowRemoteStorage = true; - AsyncStorage.getItem(Storage.ALLOW_REMOTE_STORAGE).then(value => { - if (value) { - allowRemoteStorage = !!value; - } - - this.resistanceSvc = allowRemoteStorage - ? new ResistanceService(new MongoDb(ResistanceController.ENDPOINT)) - : new ResistanceService(new LocalStorageDB(ResistanceController.TABLE_NAME)); - }); + this.resistanceSvc = new ResistanceService(new FirebaseDB(ResistanceController.TABLE_NAME)); } public async createResistance(data: CreateResistanceModel): Promise { diff --git a/domainlogic/database/FirebaseDB.ts b/domainlogic/database/FirebaseDB.ts new file mode 100644 index 0000000..28ada2b --- /dev/null +++ b/domainlogic/database/FirebaseDB.ts @@ -0,0 +1,100 @@ +// Copyright FitBook +import firestore from '@react-native-firebase/firestore'; +import auth from '@react-native-firebase/auth'; +import IDatabase, { IQueryParams, Operators } from '../../commonlib/database/IDatabase'; +import ServiceResponse from '../../commonlib/models/ServiceResponse'; + +export default class FirebaseDB implements IDatabase { + private tableName: string; + private currentUserId: string | undefined; + private isOffline: boolean; + + constructor(tableName: string) { + this.tableName = tableName; + this.currentUserId = auth().currentUser?.uid; + this.isOffline = false; + } + public async PostAsync(data: Record) { + if (!this.isOffline) this.setOffline(); + + try { + data.userId = this.currentUserId; + const result = await firestore().collection(this.tableName).add(data); + const value = await result.get(); + return value; + } catch (error) { + return new ServiceResponse(); + } + } + + public async GetAsync(id: string): Promise> { + if (!this.isOffline) this.setOffline(); + + try { + const querySnapshot = await firestore().collection(this.tableName).where('id', '==', id).get(); + return querySnapshot.docs; + } catch (error) { + console.error('Something went wrong', error); + return new ServiceResponse(); + } + } + + public async GetListAsync(params?: IQueryParams[]): Promise { + if (!this.isOffline) this.setOffline(); + + try { + let query = firestore().collection(this.tableName).where('userId', '==', this.currentUserId); + + if (params) { + params.forEach(param => { + query.where(param.key, this.GetOperator(param.operator), param.value); + }); + } + const snapshot = await query.get(); + + let data: any[] = []; + snapshot.forEach(doc => { + data.push(doc.data()); + }); + + return data; + } catch (error) { + console.error('Something went wrong', error); + return new ServiceResponse(); + } + } + + public async GetListByUserId(_userId: string, _params?: Record): Promise { + try { + const snapshot = await firestore().collection(this.tableName).get(); + return snapshot.docs; + } catch (error) { + console.error('Something went wrong', error); + return new ServiceResponse(); + } + } + + private GetOperator(operator: Operators): any { + switch (operator) { + case Operators.EQUALS: + return '=='; + case Operators.GREATERTHANOREQUALTO: + return '>='; + case Operators.LESSTHANOREQUALTO: + return '<='; + case Operators.NOTEQUALTO: + return '!='; + default: + return '=='; + } + } + + private async setOffline() { + try { + await firestore().enableNetwork(); + this.isOffline = true; + } catch (error) { + console.error('Unable to set device offline.', error); + } + } +} diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..a8fb587 --- /dev/null +++ b/firebase.json @@ -0,0 +1,5 @@ +{ + "react-native": { + "database_persistence_enabled": true + } +} diff --git a/ios/GoogleService-Info.plist b/ios/GoogleService-Info.plist new file mode 100644 index 0000000..4a654f6 --- /dev/null +++ b/ios/GoogleService-Info.plist @@ -0,0 +1,36 @@ + + + + + CLIENT_ID + 301938801516-m0h0in8b7jdngt9j0ucupvsfa5h48vqb.apps.googleusercontent.com + REVERSED_CLIENT_ID + com.googleusercontent.apps.301938801516-m0h0in8b7jdngt9j0ucupvsfa5h48vqb + API_KEY + AIzaSyAuhEOM76Zd5fz50w037TQXulReJu9p22Y + GCM_SENDER_ID + 301938801516 + PLIST_VERSION + 1 + BUNDLE_ID + org.fitbook.fitbook + PROJECT_ID + rn-fitbook + STORAGE_BUCKET + rn-fitbook.appspot.com + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:301938801516:ios:55c56b3359ba92563fd149 + DATABASE_URL + https://rn-fitbook.firebaseio.com + + \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 71ab25b..b438349 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,5 +1,224 @@ PODS: + - abseil/algorithm (0.20200225.0): + - abseil/algorithm/algorithm (= 0.20200225.0) + - abseil/algorithm/container (= 0.20200225.0) + - abseil/algorithm/algorithm (0.20200225.0): + - abseil/base/config + - abseil/algorithm/container (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/base (0.20200225.0): + - abseil/base/atomic_hook (= 0.20200225.0) + - abseil/base/base (= 0.20200225.0) + - abseil/base/base_internal (= 0.20200225.0) + - abseil/base/bits (= 0.20200225.0) + - abseil/base/config (= 0.20200225.0) + - abseil/base/core_headers (= 0.20200225.0) + - abseil/base/dynamic_annotations (= 0.20200225.0) + - abseil/base/endian (= 0.20200225.0) + - abseil/base/errno_saver (= 0.20200225.0) + - abseil/base/exponential_biased (= 0.20200225.0) + - abseil/base/log_severity (= 0.20200225.0) + - abseil/base/malloc_internal (= 0.20200225.0) + - abseil/base/periodic_sampler (= 0.20200225.0) + - abseil/base/pretty_function (= 0.20200225.0) + - abseil/base/raw_logging_internal (= 0.20200225.0) + - abseil/base/spinlock_wait (= 0.20200225.0) + - abseil/base/throw_delegate (= 0.20200225.0) + - abseil/base/atomic_hook (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/base (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/log_severity + - abseil/base/raw_logging_internal + - abseil/base/spinlock_wait + - abseil/meta/type_traits + - abseil/base/base_internal (0.20200225.0): + - abseil/base/config + - abseil/meta/type_traits + - abseil/base/bits (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/config (0.20200225.0) + - abseil/base/core_headers (0.20200225.0): + - abseil/base/config + - abseil/base/dynamic_annotations (0.20200225.0) + - abseil/base/endian (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/errno_saver (0.20200225.0): + - abseil/base/config + - abseil/base/exponential_biased (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/malloc_internal (0.20200225.0): + - abseil/base/base + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/base/dynamic_annotations + - abseil/base/raw_logging_internal + - abseil/base/periodic_sampler (0.20200225.0): + - abseil/base/core_headers + - abseil/base/exponential_biased + - abseil/base/pretty_function (0.20200225.0) + - abseil/base/raw_logging_internal (0.20200225.0): + - abseil/base/atomic_hook + - abseil/base/config + - abseil/base/core_headers + - abseil/base/log_severity + - abseil/base/spinlock_wait (0.20200225.0): + - abseil/base/base_internal + - abseil/base/core_headers + - abseil/base/errno_saver + - abseil/base/throw_delegate (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/container/compressed_tuple (0.20200225.0): + - abseil/utility/utility + - abseil/container/inlined_vector (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/container/inlined_vector_internal + - abseil/memory/memory + - abseil/container/inlined_vector_internal (0.20200225.0): + - abseil/base/core_headers + - abseil/container/compressed_tuple + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/span + - abseil/memory (0.20200225.0): + - abseil/memory/memory (= 0.20200225.0) + - abseil/memory/memory (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/meta (0.20200225.0): + - abseil/meta/type_traits (= 0.20200225.0) + - abseil/meta/type_traits (0.20200225.0): + - abseil/base/config + - abseil/numeric/int128 (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/strings/internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/meta/type_traits + - abseil/strings/str_format (0.20200225.0): + - abseil/strings/str_format_internal + - abseil/strings/str_format_internal (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/types/span + - abseil/strings/strings (0.20200225.0): + - abseil/base/base + - abseil/base/bits + - abseil/base/config + - abseil/base/core_headers + - abseil/base/endian + - abseil/base/raw_logging_internal + - abseil/base/throw_delegate + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/numeric/int128 + - abseil/strings/internal + - abseil/time (0.20200225.0): + - abseil/time/internal (= 0.20200225.0) + - abseil/time/time (= 0.20200225.0) + - abseil/time/internal (0.20200225.0): + - abseil/time/internal/cctz (= 0.20200225.0) + - abseil/time/internal/cctz (0.20200225.0): + - abseil/time/internal/cctz/civil_time (= 0.20200225.0) + - abseil/time/internal/cctz/time_zone (= 0.20200225.0) + - abseil/time/internal/cctz/civil_time (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/time_zone (0.20200225.0): + - abseil/base/config + - abseil/time/internal/cctz/civil_time + - abseil/time/time (0.20200225.0): + - abseil/base/base + - abseil/base/core_headers + - abseil/base/raw_logging_internal + - abseil/numeric/int128 + - abseil/strings/strings + - abseil/time/internal/cctz/civil_time + - abseil/time/internal/cctz/time_zone + - abseil/types (0.20200225.0): + - abseil/types/any (= 0.20200225.0) + - abseil/types/bad_any_cast (= 0.20200225.0) + - abseil/types/bad_any_cast_impl (= 0.20200225.0) + - abseil/types/bad_optional_access (= 0.20200225.0) + - abseil/types/bad_variant_access (= 0.20200225.0) + - abseil/types/compare (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - abseil/types/span (= 0.20200225.0) + - abseil/types/variant (= 0.20200225.0) + - abseil/types/any (0.20200225.0): + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_any_cast + - abseil/utility/utility + - abseil/types/bad_any_cast (0.20200225.0): + - abseil/base/config + - abseil/types/bad_any_cast_impl + - abseil/types/bad_any_cast_impl (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_optional_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/bad_variant_access (0.20200225.0): + - abseil/base/config + - abseil/base/raw_logging_internal + - abseil/types/compare (0.20200225.0): + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/optional (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/memory/memory + - abseil/meta/type_traits + - abseil/types/bad_optional_access + - abseil/utility/utility + - abseil/types/span (0.20200225.0): + - abseil/algorithm/algorithm + - abseil/base/core_headers + - abseil/base/throw_delegate + - abseil/meta/type_traits + - abseil/types/variant (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/base/core_headers + - abseil/meta/type_traits + - abseil/types/bad_variant_access + - abseil/utility/utility + - abseil/utility/utility (0.20200225.0): + - abseil/base/base_internal + - abseil/base/config + - abseil/meta/type_traits - boost-for-react-native (1.63.0) + - BoringSSL-GRPC (0.0.7): + - BoringSSL-GRPC/Implementation (= 0.0.7) + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Implementation (0.0.7): + - BoringSSL-GRPC/Interface (= 0.0.7) + - BoringSSL-GRPC/Interface (0.0.7) - CocoaAsyncSocket (7.6.4) - CocoaLibEvent (1.0.0) - DoubleConversion (1.1.6) @@ -11,6 +230,40 @@ PODS: - React-Core (= 0.63.2) - React-jsi (= 0.63.2) - ReactCommon/turbomodule/core (= 0.63.2) + - Firebase/Auth (6.34.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 6.9.2) + - Firebase/CoreOnly (6.34.0): + - FirebaseCore (= 6.10.4) + - Firebase/Firestore (6.34.0): + - Firebase/CoreOnly + - FirebaseFirestore (~> 1.19.0) + - FirebaseAuth (6.9.2): + - FirebaseCore (~> 6.10) + - GoogleUtilities/AppDelegateSwizzler (~> 6.7) + - GoogleUtilities/Environment (~> 6.7) + - GTMSessionFetcher/Core (~> 1.1) + - FirebaseCore (6.10.4): + - FirebaseCoreDiagnostics (~> 1.6) + - GoogleUtilities/Environment (~> 6.7) + - GoogleUtilities/Logger (~> 6.7) + - FirebaseCoreDiagnostics (1.7.0): + - GoogleDataTransport (~> 7.4) + - GoogleUtilities/Environment (~> 6.7) + - GoogleUtilities/Logger (~> 6.7) + - nanopb (~> 1.30906.0) + - FirebaseFirestore (1.19.0): + - abseil/algorithm (= 0.20200225.0) + - abseil/base (= 0.20200225.0) + - abseil/memory (= 0.20200225.0) + - abseil/meta (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/time (= 0.20200225.0) + - abseil/types (= 0.20200225.0) + - FirebaseCore (~> 6.10) + - "gRPC-C++ (~> 1.28.0)" + - leveldb-library (~> 1.22) + - nanopb (~> 1.30906.0) - Flipper (0.41.5): - Flipper-Folly (~> 2.2) - Flipper-RSocket (~> 1.1) @@ -67,9 +320,58 @@ PODS: - DoubleConversion - glog - glog (0.3.5) + - GoogleDataTransport (7.5.0): + - nanopb (~> 1.30906.0) + - GoogleUtilities/AppDelegateSwizzler (6.7.2): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (6.7.2): + - PromisesObjC (~> 1.2) + - GoogleUtilities/Logger (6.7.2): + - GoogleUtilities/Environment + - GoogleUtilities/Network (6.7.2): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (6.7.2)" + - GoogleUtilities/Reachability (6.7.2): + - GoogleUtilities/Logger + - "gRPC-C++ (1.28.2)": + - "gRPC-C++/Implementation (= 1.28.2)" + - "gRPC-C++/Interface (= 1.28.2)" + - "gRPC-C++/Implementation (1.28.2)": + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - "gRPC-C++/Interface (= 1.28.2)" + - gRPC-Core (= 1.28.2) + - "gRPC-C++/Interface (1.28.2)" + - gRPC-Core (1.28.2): + - gRPC-Core/Implementation (= 1.28.2) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Implementation (1.28.2): + - abseil/container/inlined_vector (= 0.20200225.0) + - abseil/memory/memory (= 0.20200225.0) + - abseil/strings/str_format (= 0.20200225.0) + - abseil/strings/strings (= 0.20200225.0) + - abseil/types/optional (= 0.20200225.0) + - BoringSSL-GRPC (= 0.0.7) + - gRPC-Core/Interface (= 1.28.2) + - gRPC-Core/Interface (1.28.2) + - GTMSessionFetcher/Core (1.5.0) + - leveldb-library (1.22) + - nanopb (1.30906.0): + - nanopb/decode (= 1.30906.0) + - nanopb/encode (= 1.30906.0) + - nanopb/decode (1.30906.0) + - nanopb/encode (1.30906.0) - OpenSSL-Universal (1.0.2.19): - OpenSSL-Universal/Static (= 1.0.2.19) - OpenSSL-Universal/Static (1.0.2.19) + - PromisesObjC (1.2.11) - RCTRequired (0.63.2) - RCTTypeSafety (0.63.2): - FBLazyVector (= 0.63.2) @@ -306,6 +608,17 @@ PODS: - React - RNDeviceInfo (6.0.2): - React + - RNFBApp (8.4.7): + - Firebase/CoreOnly (~> 6.34.0) + - React-Core + - RNFBAuth (9.3.2): + - Firebase/Auth (~> 6.34.0) + - React-Core + - RNFBApp + - RNFBFirestore (7.9.1): + - Firebase/Firestore (~> 6.34.0) + - React-Core + - RNFBApp - RNGestureHandler (1.8.0): - React - RNReanimated (1.13.0): @@ -372,6 +685,9 @@ DEPENDENCIES: - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" - "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) + - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" + - "RNFBAuth (from `../node_modules/@react-native-firebase/auth`)" + - "RNFBFirestore (from `../node_modules/@react-native-firebase/firestore`)" - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) @@ -381,9 +697,16 @@ DEPENDENCIES: SPEC REPOS: trunk: + - abseil - boost-for-react-native + - BoringSSL-GRPC - CocoaAsyncSocket - CocoaLibEvent + - Firebase + - FirebaseAuth + - FirebaseCore + - FirebaseCoreDiagnostics + - FirebaseFirestore - Flipper - Flipper-DoubleConversion - Flipper-Folly @@ -391,7 +714,15 @@ SPEC REPOS: - Flipper-PeerTalk - Flipper-RSocket - FlipperKit + - GoogleDataTransport + - GoogleUtilities + - "gRPC-C++" + - gRPC-Core + - GTMSessionFetcher + - leveldb-library + - nanopb - OpenSSL-Universal + - PromisesObjC - YogaKit EXTERNAL SOURCES: @@ -455,6 +786,12 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-community/masked-view" RNDeviceInfo: :path: "../node_modules/react-native-device-info" + RNFBApp: + :path: "../node_modules/@react-native-firebase/app" + RNFBAuth: + :path: "../node_modules/@react-native-firebase/auth" + RNFBFirestore: + :path: "../node_modules/@react-native-firebase/firestore" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNReanimated: @@ -469,12 +806,19 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: + abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c + BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845 CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f DoubleConversion: cde416483dac037923206447da6e1454df403714 FBLazyVector: 3ef4a7f62e7db01092f9d517d2ebc0d0677c4a37 FBReactNativeSpec: dc7fa9088f0f2a998503a352b0554d69a4391c5a + Firebase: c23a36d9e4cdf7877dfcba8dd0c58add66358999 + FirebaseAuth: c92d49ada7948d1a23466e3db17bc4c2039dddc3 + FirebaseCore: d3a978a3cfa3240bf7e4ba7d137fdf5b22b628ec + FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1 + FirebaseFirestore: 9b2f1b9b9a6f2f0b6fb7484b9e32ab7e39243554 Flipper: 33585e2d9810fe5528346be33bcf71b37bb7ae13 Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41 Flipper-Folly: c12092ea368353b58e992843a990a3225d4533c3 @@ -484,7 +828,15 @@ SPEC CHECKSUMS: FlipperKit: bc68102cd4952a258a23c9c1b316c7bec1fecf83 Folly: b73c3869541e86821df3c387eb0af5f65addfab4 glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3 + GoogleDataTransport: 445302b7da4216da63071a4c29e7023f47192e5a + GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 + "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 + gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 + GTMSessionFetcher: b3503b20a988c4e20cc189aa798fd18220133f52 + leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 + nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355 + PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f RCTRequired: f13f25e7b12f925f1f6a6a8c69d929a03c0129fe RCTTypeSafety: 44982c5c8e43ff4141eb519a8ddc88059acd1f3a React: e1c65dd41cb9db13b99f24608e47dd595f28ca9a @@ -510,6 +862,9 @@ SPEC CHECKSUMS: RNCAsyncStorage: 2a692bcb9b69b76a2f1a95f33db057129700af64 RNCMaskedView: 5a8ec07677aa885546a0d98da336457e2bea557f RNDeviceInfo: bdd61e8b070d13a1dd9d022091981075ed4cde16 + RNFBApp: 804b98033f45c3a3e35b56de8c894f85ef5e4388 + RNFBAuth: 4cfe4dabd91775346ee41f0bde60262e827033c5 + RNFBFirestore: 3fe90c352fdbbff5a822c43f571cf8d9fdf38029 RNGestureHandler: 7a5833d0f788dbd107fbb913e09aa0c1ff333c39 RNReanimated: 89f5e0a04d1dd52fbf27e7e7030d8f80a646a3fc RNScreens: b748efec66e095134c7166ca333b628cd7e6f3e2 diff --git a/ios/fitbook.xcodeproj/project.pbxproj b/ios/fitbook.xcodeproj/project.pbxproj index 89758be..cbade48 100644 --- a/ios/fitbook.xcodeproj/project.pbxproj +++ b/ios/fitbook.xcodeproj/project.pbxproj @@ -18,6 +18,7 @@ 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 2DCD954D1E0B4F2C00145EB5 /* fitbookTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* fitbookTests.m */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + 9C8AD7092549282F004D80B9 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9C8AD7082549282F004D80B9 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -54,6 +55,7 @@ 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = fitbook/LaunchScreen.storyboard; sourceTree = ""; }; 9700C360FE21A70E314ADDE8 /* Pods-fitbook-fitbookTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-fitbook-fitbookTests.release.xcconfig"; path = "Target Support Files/Pods-fitbook-fitbookTests/Pods-fitbook-fitbookTests.release.xcconfig"; sourceTree = ""; }; 99A126B4B8AD0779872D0144 /* libPods-fitbook-fitbookTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-fitbook-fitbookTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9C8AD7082549282F004D80B9 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; A363723B2C8704B28C741121 /* Pods-fitbook.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-fitbook.debug.xcconfig"; path = "Target Support Files/Pods-fitbook/Pods-fitbook.debug.xcconfig"; sourceTree = ""; }; AB5161BBA50363A8EDA26343 /* Pods-fitbook.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-fitbook.release.xcconfig"; path = "Target Support Files/Pods-fitbook/Pods-fitbook.release.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; @@ -147,6 +149,7 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 9C8AD7082549282F004D80B9 /* GoogleService-Info.plist */, 13B07FAE1A68108700A75B9A /* fitbook */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* fitbookTests */, @@ -215,6 +218,7 @@ 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 293B10BE3390E81A380A2440 /* [CP] Copy Pods Resources */, + 4C0B3E3C7CBD01E30755528E /* [CP-User] [RNFB] Core Configuration */, ); buildRules = ( ); @@ -323,6 +327,7 @@ files = ( 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 9C8AD7092549282F004D80B9 /* GoogleService-Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -382,6 +387,7 @@ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/gRPC-C++/gRPCCertificates-Cpp.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -402,6 +408,7 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates-Cpp.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -444,6 +451,16 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 4C0B3E3C7CBD01E30755528E /* [CP-User] [RNFB] Core Configuration */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + name = "[CP-User] [RNFB] Core Configuration"; + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n _JSON_OUTPUT_BASE64=$(python -c 'import json,sys,base64;print(base64.b64encode(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"').read())['${_JSON_ROOT}'])))' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\n\n # config.admob_delay_app_measurement_init\n _ADMOB_DELAY_APP_MEASUREMENT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_delay_app_measurement_init\")\n if [[ $_ADMOB_DELAY_APP_MEASUREMENT == \"true\" ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADDelayAppMeasurementInit\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"YES\")\n fi\n\n # config.admob_ios_app_id\n _ADMOB_IOS_APP_ID=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"admob_ios_app_id\")\n if [[ $_ADMOB_IOS_APP_ID ]]; then\n _PLIST_ENTRY_KEYS+=(\"GADApplicationIdentifier\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_ADMOB_IOS_APP_ID\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; + }; 500F906A19FD7DA71D74A804 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -468,6 +485,7 @@ "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf", "${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf", "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/gRPC-C++/gRPCCertificates-Cpp.bundle", ); name = "[CP] Copy Pods Resources"; outputPaths = ( @@ -488,6 +506,7 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/gRPCCertificates-Cpp.bundle", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; diff --git a/ios/fitbook.xcworkspace/xcuserdata/v-manair.xcuserdatad/UserInterfaceState.xcuserstate b/ios/fitbook.xcworkspace/xcuserdata/v-manair.xcuserdatad/UserInterfaceState.xcuserstate index 84d973c13300095f64e1f4c36140f834e53ccb5b..aa9667de8ff43f3900013d075fd96ecb719240ce 100644 GIT binary patch delta 12023 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 #import #import +#import static void InitializeFlipper(UIApplication *application) { FlipperClient *client = [FlipperClient sharedClient]; @@ -34,6 +35,9 @@ - (BOOL)application:(UIApplication *)application #ifdef FB_SONARKIT_ENABLED InitializeFlipper(application); #endif + if ([FIRApp defaultApp] == nil) { + [FIRApp configure]; + } RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; diff --git a/package.json b/package.json index 84de9c2..38f2ffe 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "dependencies": { "@react-native-community/async-storage": "^1.12.0", "@react-native-community/masked-view": "^0.1.10", - "@react-native-firebase/app": "^8.4.6", + "@react-native-firebase/app": "^8.4.7", + "@react-native-firebase/auth": "^9.3.2", + "@react-native-firebase/firestore": "^7.9.1", "@react-navigation/bottom-tabs": "^5.8.0", "@react-navigation/material-top-tabs": "^5.2.16", "@react-navigation/native": "^5.7.3", @@ -52,6 +54,7 @@ "devDependencies": { "@babel/core": "^7.8.4", "@babel/runtime": "^7.8.4", + "@firebase/firestore-types": "^2.0.0", "@react-native-community/eslint-config": "^1.1.0", "@types/jest": "^25.2.3", "@types/react-native": "^0.63.2", diff --git a/screens/resistance/ResistancelogScreen.tsx b/screens/resistance/ResistancelogScreen.tsx index 7ed2778..80dbbbe 100644 --- a/screens/resistance/ResistancelogScreen.tsx +++ b/screens/resistance/ResistancelogScreen.tsx @@ -56,8 +56,8 @@ const ResistancelogScreen = () => { ? { backgroundColor: 'rgba(0, 0, 0, 0.2)' } : styles.lightContainer : notesModalVisible || logInputModalVisible - ? { backgroundColor: 'rgba(0, 0, 0, 0.2)' } - : styles.darkContainer; + ? { backgroundColor: 'rgba(0, 0, 0, 0.2)' } + : styles.darkContainer; const themeButtonStyle = mode === 'light' ? '#343a40' : 'bisque'; const resistanceReduxState = useSelector(state => { diff --git a/yarn.lock b/yarn.lock index fa32951..57df0f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -740,6 +740,11 @@ dependencies: "@types/hammerjs" "^2.0.36" +"@firebase/firestore-types@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@firebase/firestore-types/-/firestore-types-2.0.0.tgz#1f6212553b240f1a8905bb8dcf1f87769138c5c0" + integrity sha512-ZGb7p1SSQJP0Z+kc9GAUi+Fx5rJatFddBrS1ikkayW+QHfSIz0omU23OgSHcBGTxe8dJCeKiKA2Yf+tkDKO/LA== + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1144,14 +1149,24 @@ resolved "https://registry.yarnpkg.com/@react-native-community/masked-view/-/masked-view-0.1.10.tgz#5dda643e19e587793bc2034dd9bf7398ad43d401" integrity sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ== -"@react-native-firebase/app@^8.4.6": - version "8.4.6" - resolved "https://registry.yarnpkg.com/@react-native-firebase/app/-/app-8.4.6.tgz#05b4a48f2cd452acc88dd7b816a4ca934140927f" - integrity sha512-4eZR133QuScvGs4IQQd6qMvQ5E1mtydVTy3DtuBCeiIqtvN8ZxBYoSMgcUmYGS4VafbS2nPh85g4e3BlaIJ2XA== +"@react-native-firebase/app@^8.4.7": + version "8.4.7" + resolved "https://registry.yarnpkg.com/@react-native-firebase/app/-/app-8.4.7.tgz#7393ba7af36bd815bd5af7c64a20b0dd8a7e3341" + integrity sha512-jN788Q17aMOHc49wKc74RC3iZNhFoS+yTZhMBHFVyytf64uK3ofYAk3hjvukkylUTKF0Ni/L+04M0IDv8kStKg== dependencies: opencollective-postinstall "^2.0.1" superstruct "^0.6.2" +"@react-native-firebase/auth@^9.3.2": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@react-native-firebase/auth/-/auth-9.3.2.tgz#96cb120a0628b18599e640977bdecfdf9fdfff0f" + integrity sha512-FowUGTCDpzcGUaXEDzwH1GcPtxTFXZLdo5DXu3wft+ojJCxkNJ8M1CHUv6Q9PQHAsLTpf19qTHb20Tad4daGuA== + +"@react-native-firebase/firestore@^7.9.1": + version "7.9.1" + resolved "https://registry.yarnpkg.com/@react-native-firebase/firestore/-/firestore-7.9.1.tgz#8b2013d77b4272b2bd9542f72ce7376d5e7f55c8" + integrity sha512-uibVaDa8v7fX5Jw59+FPt9auXrB96LGu3csfS5ybMtq52gkRWDvHbK8OMNLDwoyh8klACzioe+3O+WXY5z7m3Q== + "@react-navigation/bottom-tabs@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@react-navigation/bottom-tabs/-/bottom-tabs-5.8.0.tgz#d7386809bceeead0adcaacf61b6563be9cefd5cb"