diff --git a/android/app/build.gradle b/android/app/build.gradle index a30542d6..b605e214 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -102,8 +102,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 3000050 - versionName "3.0.5" + versionCode 3000060 + versionName "3.0.6" multiDexEnabled true @@ -159,6 +159,8 @@ android { } dependencies { + compile project(':@react-native-community_async-storage') + compile project(':react-native-webview') compile project(':react-native-file-viewer') compile project(':react-native-fs') compile project(':react-native-gesture-handler') diff --git a/android/app/src/main/java/com/standardnotes/MainApplication.java b/android/app/src/main/java/com/standardnotes/MainApplication.java index 85cff87a..a60c875d 100644 --- a/android/app/src/main/java/com/standardnotes/MainApplication.java +++ b/android/app/src/main/java/com/standardnotes/MainApplication.java @@ -9,6 +9,8 @@ import android.support.annotation.Nullable; import android.view.WindowManager; import com.facebook.react.ReactApplication; +import com.reactnativecommunity.asyncstorage.AsyncStoragePackage; +import com.reactnativecommunity.webview.RNCWebViewPackage; import com.vinzscam.reactnativefileviewer.RNFileViewerPackage; import com.rnfs.RNFSPackage; import com.swmansion.gesturehandler.react.RNGestureHandlerPackage; @@ -45,18 +47,20 @@ public class MainApplication extends Application implements ReactApplication { @Override protected List getPackages() { return Arrays.asList( - new MainReactPackage(), - new RNFileViewerPackage(), - new RNFSPackage(), - new RNGestureHandlerPackage(), - BugsnagReactNative.getPackage(), - new KeychainPackage(), - new VectorIconsPackage(), - new RCTAesPackage(), - new RNMail(), - new ReactNativeFingerprintScannerPackage(), - new SNTextViewPackage(), - new FlagSecurePackage() + new MainReactPackage(), + new AsyncStoragePackage(), + new RNCWebViewPackage(), + new RNFileViewerPackage(), + new RNFSPackage(), + new RNGestureHandlerPackage(), + BugsnagReactNative.getPackage(), + new KeychainPackage(), + new VectorIconsPackage(), + new RCTAesPackage(), + new RNMail(), + new ReactNativeFingerprintScannerPackage(), + new SNTextViewPackage(), + new FlagSecurePackage() ); } @@ -77,10 +81,6 @@ public class MainApplication extends Application implements ReactApplication { SoLoader.init(this, /* native exopackage */ false); - // Set AsyncStorage size, default is 6mb - long size = 50L * 1024L * 1024L; // 50 MB - com.facebook.react.modules.storage.ReactDatabaseSupplier.getInstance(getApplicationContext()).setMaximumSize(size); - registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { diff --git a/android/gradle.properties b/android/gradle.properties index f92bb31f..2e8a9ba2 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -17,4 +17,6 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true android.useDeprecatedNdk=true + +AsyncStorage_db_size_in_MB=50 #android.enableAapt2=false diff --git a/android/settings.gradle b/android/settings.gradle index 7a2e98dd..dbdc1500 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,8 @@ rootProject.name = 'StandardNotes' +include ':@react-native-community_async-storage' +project(':@react-native-community_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/async-storage/android') +include ':react-native-webview' +project(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android') include ':react-native-file-viewer' project(':react-native-file-viewer').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-file-viewer/android') include ':react-native-fs' diff --git a/ios/StandardNotes.xcodeproj/project.pbxproj b/ios/StandardNotes.xcodeproj/project.pbxproj index 06ad1217..c459a7a4 100644 --- a/ios/StandardNotes.xcodeproj/project.pbxproj +++ b/ios/StandardNotes.xcodeproj/project.pbxproj @@ -5,7 +5,6 @@ }; objectVersion = 46; objects = { - /* Begin PBXBuildFile section */ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; @@ -38,6 +37,7 @@ 300BF5D7132F46BCAB353149 /* libRNGestureHandler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 04047F33889C425483EB8244 /* libRNGestureHandler.a */; }; 3B66E39D04514331AF08A4D1 /* FontAwesome5_Solid.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 074A7613CE8C41BAB3C4193E /* FontAwesome5_Solid.ttf */; }; 40F325481D4F4F04AC15D0A9 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 48127930FB1344778C168838 /* libRNVectorIcons.a */; }; + 4C4C0C80E5254E16BA086A86 /* libRNCWebView.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4449457EB3FC4387810027F1 /* libRNCWebView.a */; }; 5A8928DC2824482A99763067 /* FontAwesome5_Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EF2E9E34ADA441EDB4CE8370 /* FontAwesome5_Regular.ttf */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 6C1915C4DE9040A9BB17CFBB /* libRNStoreReview.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADB6F6B9BC7144FCB2C08D40 /* libRNStoreReview.a */; }; @@ -58,6 +58,7 @@ CDB58A211F6C51A4009EF868 /* libReactNativeFingerprintScanner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CDB58A0F1F6C5174009EF868 /* libReactNativeFingerprintScanner.a */; }; CDB58A221F6C5235009EF868 /* libRCTAes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CDB58A091F6C516B009EF868 /* libRCTAes.a */; }; F0D84FDB75374348BC0017C2 /* libBugsnagReactNative.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EFD3F9197A5F41C0904D7E60 /* libBugsnagReactNative.a */; }; + 7A0B269BD1714EA79E486BAE /* libRNCAsyncStorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1009A2994551440E819E2CE6 /* libRNCAsyncStorage.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -327,6 +328,13 @@ remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RNStoreReview; }; + CD5AEDE322825CB8002439FB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EC178A0479CE4154896293C3 /* RNCWebView.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNCWebView; + }; CD885F771F70228400B91C20 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 737AF67874434967865855D8 /* BugsnagReactNative.xcodeproj */; @@ -484,6 +492,7 @@ 2D02E4901E0B4A5D006451C7 /* StandardNotes-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "StandardNotes-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 2FAF1266E8404686B7F36870 /* RNFS.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNFS.xcodeproj; path = "../node_modules/react-native-fs/RNFS.xcodeproj"; sourceTree = ""; }; 37A42F4068AE42DD8D2DF182 /* libRNFileViewer.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFileViewer.a; sourceTree = ""; }; + 4449457EB3FC4387810027F1 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCWebView.a; sourceTree = ""; }; 48127930FB1344778C168838 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; 54ED130E749A46A3B15B27F2 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; 59DCF8530F2945FFAA0300FD /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; @@ -511,8 +520,11 @@ CDCF33ADCFE845D588CC4E66 /* libRNKeychain.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNKeychain.a; sourceTree = ""; }; CEB6B877AE784055A8E294A8 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = ""; }; D38724A93AC141D6B51D1356 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; + EC178A0479CE4154896293C3 /* RNCWebView.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCWebView.xcodeproj; path = "../node_modules/react-native-webview/ios/RNCWebView.xcodeproj"; sourceTree = ""; }; EF2E9E34ADA441EDB4CE8370 /* FontAwesome5_Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Regular.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Regular.ttf"; sourceTree = ""; }; EFD3F9197A5F41C0904D7E60 /* libBugsnagReactNative.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libBugsnagReactNative.a; sourceTree = ""; }; + FF655164AD874250A8F6E20E /* RNCAsyncStorage.xcodeproj */ = {isa = PBXFileReference; name = "RNCAsyncStorage.xcodeproj"; path = "../node_modules/@react-native-community/async-storage/ios/RNCAsyncStorage.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; + 1009A2994551440E819E2CE6 /* libRNCAsyncStorage.a */ = {isa = PBXFileReference; name = "libRNCAsyncStorage.a"; path = "libRNCAsyncStorage.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -554,6 +566,8 @@ 300BF5D7132F46BCAB353149 /* libRNGestureHandler.a in Frameworks */, 0A7C7EB08AA3465C8E686821 /* libRNFS.a in Frameworks */, 9E1F5D0FE7C441D685DAEEAA /* libRNFileViewer.a in Frameworks */, + 4C4C0C80E5254E16BA086A86 /* libRNCWebView.a in Frameworks */, + 7A0B269BD1714EA79E486BAE /* libRNCAsyncStorage.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -769,6 +783,8 @@ 19A39FBB53A3465B81022E02 /* RNGestureHandler.xcodeproj */, 2FAF1266E8404686B7F36870 /* RNFS.xcodeproj */, 645E3D9167344C3E81B7223C /* RNFileViewer.xcodeproj */, + EC178A0479CE4154896293C3 /* RNCWebView.xcodeproj */, + FF655164AD874250A8F6E20E /* RNCAsyncStorage.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -842,6 +858,14 @@ name = Products; sourceTree = ""; }; + CD5AEDE022825CB8002439FB /* Products */ = { + isa = PBXGroup; + children = ( + CD5AEDE422825CB8002439FB /* libRNCWebView.a */, + ); + name = Products; + sourceTree = ""; + }; CD885F741F70228400B91C20 /* Products */ = { isa = PBXGroup; children = ( @@ -902,6 +926,7 @@ 04047F33889C425483EB8244 /* libRNGestureHandler.a */, CEB6B877AE784055A8E294A8 /* libRNFS.a */, 37A42F4068AE42DD8D2DF182 /* libRNFileViewer.a */, + 4449457EB3FC4387810027F1 /* libRNCWebView.a */, ); name = "Recovered References"; sourceTree = ""; @@ -1127,6 +1152,10 @@ ProductGroup = CDB58A0B1F6C5174009EF868 /* Products */; ProjectRef = CDB58A0A1F6C5174009EF868 /* ReactNativeFingerprintScanner.xcodeproj */; }, + { + ProductGroup = CD5AEDE022825CB8002439FB /* Products */; + ProjectRef = EC178A0479CE4154896293C3 /* RNCWebView.xcodeproj */; + }, { ProductGroup = CDEBDDB721E044BD00333D77 /* Products */; ProjectRef = 645E3D9167344C3E81B7223C /* RNFileViewer.xcodeproj */; @@ -1423,6 +1452,13 @@ remoteRef = CD4D91841F7BE11800080678 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + CD5AEDE422825CB8002439FB /* libRNCWebView.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNCWebView.a; + remoteRef = CD5AEDE322825CB8002439FB /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; CD885F781F70228400B91C20 /* libBugsnagReactNative.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1696,6 +1732,8 @@ "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-file-viewer/ios", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", ); INFOPLIST_FILE = StandardNotesTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1704,11 +1742,6 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1734,6 +1767,8 @@ "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-file-viewer/ios", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", ); INFOPLIST_FILE = StandardNotesTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1742,11 +1777,6 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1776,6 +1806,8 @@ "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-file-viewer/ios", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", ); INFOPLIST_FILE = StandardNotes/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1811,6 +1843,8 @@ "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-file-viewer/ios", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", ); INFOPLIST_FILE = StandardNotes/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1849,6 +1883,8 @@ "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-file-viewer/ios", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", ); INFOPLIST_FILE = "StandardNotes-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1856,11 +1892,6 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1895,6 +1926,8 @@ "$(SRCROOT)/../node_modules/react-native-gesture-handler/ios/**", "$(SRCROOT)/../node_modules/react-native-fs/**", "$(SRCROOT)/../node_modules/react-native-file-viewer/ios", + "$(SRCROOT)/../node_modules/react-native-webview/ios", + "$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios", ); INFOPLIST_FILE = "StandardNotes-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1902,11 +1935,6 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1937,11 +1965,6 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.StandardNotes-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1968,11 +1991,6 @@ "$(inherited)", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.StandardNotes-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/StandardNotes/Info.plist b/ios/StandardNotes/Info.plist index 28dbb6c7..bd2f2d3c 100644 --- a/ios/StandardNotes/Info.plist +++ b/ios/StandardNotes/Info.plist @@ -67,11 +67,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.0.5 + 3.0.6 CFBundleSignature ???? CFBundleVersion - 5 + 1 LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/ios/untitled folder/sn_react-tvOS/Info.plist b/ios/untitled folder/sn_react-tvOS/Info.plist deleted file mode 100644 index 2fb6a11c..00000000 --- a/ios/untitled folder/sn_react-tvOS/Info.plist +++ /dev/null @@ -1,54 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - NSLocationWhenInUseUsageDescription - - NSAppTransportSecurity - - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - - diff --git a/ios/untitled folder/sn_react-tvOSTests/Info.plist b/ios/untitled folder/sn_react-tvOSTests/Info.plist deleted file mode 100644 index 886825cc..00000000 --- a/ios/untitled folder/sn_react-tvOSTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ios/untitled folder/sn_react.xcodeproj/project.pbxproj b/ios/untitled folder/sn_react.xcodeproj/project.pbxproj deleted file mode 100644 index 96417f1d..00000000 --- a/ios/untitled folder/sn_react.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1717 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; - 00E356F31AD99517003FC87E /* sn_reactTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* sn_reactTests.m */; }; - 1167C266CB224DBE87C13D8E /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C57DDBAD260F476993B42198 /* FontAwesome.ttf */; }; - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 27EC6831A396473FA5EE67B6 /* libRCTAes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B8AD7260B3B84F81B6A20E6E /* libRCTAes.a */; }; - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; - 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; - 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; - 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-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 */; }; - 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; - 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; - 2DCD954D1E0B4F2C00145EB5 /* sn_reactTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* sn_reactTests.m */; }; - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; - 5EFECE11794F40E181B99498 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D3AB634496942D38E5015A9 /* libRNVectorIcons.a */; }; - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - A1BEF7553D6B48CCAE53C451 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CB7FF4CB3C154463AD026A2A /* Zocial.ttf */; }; - AC93140751CD46C3A338A692 /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F1D2428F4628483D89E06821 /* Ionicons.ttf */; }; - ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; - AEB483888C374320B3F4642A /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 12F9C5943A24403E8E6F400E /* SimpleLineIcons.ttf */; }; - C444784E8C9B41A696096AA6 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 9C78F79B46E840C483C299E8 /* Entypo.ttf */; }; - CD5267431F603AD600111058 /* libRCTAes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CD5267421F603AD000111058 /* libRCTAes.a */; }; - CD5763031F6AD2C40047E10B /* libReactNativeFingerprintScanner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CD5762FD1F6AD2BA0047E10B /* libReactNativeFingerprintScanner.a */; }; - CD794F831F635AE30042156F /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CD794F811F635AB20042156F /* libReactNativeNavigation.a */; }; - CD794F841F635C900042156F /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CD794F811F635AB20042156F /* libReactNativeNavigation.a */; }; - CDC871761F6844C400BFA364 /* libRNMail.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CDC871721F6844B600BFA364 /* libRNMail.a */; }; - DC52BF6667FC468590FA0519 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 897B4DF5D95D4558927BB133 /* MaterialIcons.ttf */; }; - E3B5408139D24F7D9B661C18 /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 89CEAD0D569344EF9371C0CA /* Octicons.ttf */; }; - E46046EEE98E4E86BFD6FE6A /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 539E47A25B31483D88B9BEE3 /* EvilIcons.ttf */; }; - EC8910981E624D0AB7B0359E /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7564FD238CB44AC3B1E3B656 /* MaterialCommunityIcons.ttf */; }; - F0E50C0D190941AD9983EC41 /* libRNKeychain.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6060C0C9465B4994AF9F1C67 /* libRNKeychain.a */; }; - FFEBC0CCC84A41BEB04A2C2A /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E4C61E3040704C1AA5B5C053 /* Foundation.ttf */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTActionSheet; - }; - 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTGeolocation; - }; - 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5115D1A9E6B3D00147676; - remoteInfo = RCTImage; - }; - 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B511DB1A9E6C8500147676; - remoteInfo = RCTNetwork; - }; - 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; - remoteInfo = RCTVibration; - }; - 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 13B07F861A680F5B00A75B9A; - remoteInfo = sn_react; - }; - 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTSettings; - }; - 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3C86DF461ADF2C930047B81A; - remoteInfo = RCTWebSocket; - }; - 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; - remoteInfo = React; - }; - 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; - remoteInfo = "sn_react-tvOS"; - }; - 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; - remoteInfo = "RCTImage-tvOS"; - }; - 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28471D9B043800D4039D; - remoteInfo = "RCTLinking-tvOS"; - }; - 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28541D9B044C00D4039D; - remoteInfo = "RCTNetwork-tvOS"; - }; - 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28611D9B046600D4039D; - remoteInfo = "RCTSettings-tvOS"; - }; - 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A287B1D9B048500D4039D; - remoteInfo = "RCTText-tvOS"; - }; - 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28881D9B049200D4039D; - remoteInfo = "RCTWebSocket-tvOS"; - }; - 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28131D9B038B00D4039D; - remoteInfo = "React-tvOS"; - }; - 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C059A1DE3340900C268FA; - remoteInfo = yoga; - }; - 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C06751DE3340C00C268FA; - remoteInfo = "yoga-tvOS"; - }; - 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; - remoteInfo = cxxreact; - }; - 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; - remoteInfo = "cxxreact-tvOS"; - }; - 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; - remoteInfo = jschelpers; - }; - 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; - remoteInfo = "jschelpers-tvOS"; - }; - 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTAnimation; - }; - 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28201D9B03D100D4039D; - remoteInfo = "RCTAnimation-tvOS"; - }; - 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTLinking; - }; - 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5119B1A9E6C1200147676; - remoteInfo = RCTText; - }; - ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 358F4ED71D1E81A9004DF814; - remoteInfo = RCTBlob; - }; - CD5267201F6038AA00111058 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = A2928B635B784C7284DC86FB /* RCTAes.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 32D980DD1BE9F11C00FA27E5; - remoteInfo = RCTAes; - }; - CD5267261F6038AA00111058 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = ADD01A681E09402E00F6D226; - remoteInfo = "RCTBlob-tvOS"; - }; - CD5267411F603AD000111058 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CD52673D1F603AD000111058 /* RCTAes.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 32D980DD1BE9F11C00FA27E5; - remoteInfo = RCTAes; - }; - CD52677C1F6088F900111058 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; - remoteInfo = "third-party"; - }; - CD52677E1F6088F900111058 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; - remoteInfo = "third-party-tvOS"; - }; - CD5267801F6088F900111058 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 139D7E881E25C6D100323FB7; - remoteInfo = "double-conversion"; - }; - CD5267821F6088F900111058 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D383D621EBD27B9005632C8; - remoteInfo = "double-conversion-tvOS"; - }; - CD5762FC1F6AD2BA0047E10B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CD5762D81F6AD2BA0047E10B /* ReactNativeFingerprintScanner.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = ReactNativeFingerprintScanner; - }; - CD794F4B1F634E4A0042156F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 3050498332B2431D8433C5A2 /* RNVectorIcons.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 5DBEB1501B18CEA900B34395; - remoteInfo = RNVectorIcons; - }; - CD794F801F635AB20042156F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CD794F5C1F635AB20042156F /* ReactNativeNavigation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D8AFADBD1BEE6F3F00A4592D; - remoteInfo = ReactNativeNavigation; - }; - CD794FB91F645C4D0042156F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CF284CC268EB4D08A2C10542 /* RNKeychain.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 5D82366F1B0CE05B005A9EF3; - remoteInfo = RNKeychain; - }; - CDC871711F6844B600BFA364 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CDC8714A1F6844B600BFA364 /* RNMail.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 46FEDE7F1AFF192F00D3261C; - remoteInfo = RNMail; - }; - CDC871731F6844B600BFA364 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CDC8714A1F6844B600BFA364 /* RNMail.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 46FEDE8A1AFF192F00D3261C; - remoteInfo = RNMailTests; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; - 00E356EE1AD99517003FC87E /* StandardNotesTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StandardNotesTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 00E356F21AD99517003FC87E /* sn_reactTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = sn_reactTests.m; sourceTree = ""; }; - 12F9C5943A24403E8E6F400E /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; - 13B07F961A680F5B00A75B9A /* StandardNotes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StandardNotes.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = sn_react/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = sn_react/AppDelegate.m; sourceTree = ""; }; - 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = sn_react/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = sn_react/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = sn_react/main.m; sourceTree = ""; }; - 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 2D02E47B1E0B4A5D006451C7 /* StandardNotes-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "StandardNotes-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D02E4901E0B4A5D006451C7 /* StandardNotes-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "StandardNotes-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3050498332B2431D8433C5A2 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; - 539E47A25B31483D88B9BEE3 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; - 5D3AB634496942D38E5015A9 /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; - 6060C0C9465B4994AF9F1C67 /* libRNKeychain.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNKeychain.a; sourceTree = ""; }; - 7564FD238CB44AC3B1E3B656 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = ""; }; - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - 897B4DF5D95D4558927BB133 /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; - 89CEAD0D569344EF9371C0CA /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; - 9C78F79B46E840C483C299E8 /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; - A2928B635B784C7284DC86FB /* RCTAes.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTAes.xcodeproj; path = "../node_modules/react-native-aes-crypto/ios/RCTAes.xcodeproj"; sourceTree = ""; }; - ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; - B8AD7260B3B84F81B6A20E6E /* libRCTAes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTAes.a; sourceTree = ""; }; - C57DDBAD260F476993B42198 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; - CB7FF4CB3C154463AD026A2A /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = ""; }; - CD52673D1F603AD000111058 /* RCTAes.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAes.xcodeproj; path = "../vendor/react-native-aes/ios/RCTAes.xcodeproj"; sourceTree = ""; }; - CD5762D81F6AD2BA0047E10B /* ReactNativeFingerprintScanner.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeFingerprintScanner.xcodeproj; path = "../vendor/react-native-fingerprint-scanner/ios/ReactNativeFingerprintScanner.xcodeproj"; sourceTree = ""; }; - CD794F5C1F635AB20042156F /* ReactNativeNavigation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeNavigation.xcodeproj; path = "../vendor/react-native-navigation/ios/ReactNativeNavigation.xcodeproj"; sourceTree = ""; }; - CD794FBC1F645C950042156F /* sn_react.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = sn_react.entitlements; path = sn_react/sn_react.entitlements; sourceTree = ""; }; - CDC8714A1F6844B600BFA364 /* RNMail.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNMail.xcodeproj; path = "../vendor/react-native-mail/RNMail.xcodeproj"; sourceTree = ""; }; - CF284CC268EB4D08A2C10542 /* RNKeychain.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNKeychain.xcodeproj; path = "../node_modules/react-native-keychain/RNKeychain.xcodeproj"; sourceTree = ""; }; - E4C61E3040704C1AA5B5C053 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = ""; }; - F1D2428F4628483D89E06821 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 00E356EB1AD99517003FC87E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, - CD794F831F635AE30042156F /* libReactNativeNavigation.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CD5763031F6AD2C40047E10B /* libReactNativeFingerprintScanner.a in Frameworks */, - CDC871761F6844C400BFA364 /* libRNMail.a in Frameworks */, - CD5267431F603AD600111058 /* libRCTAes.a in Frameworks */, - ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, - 146834051AC3E58100842450 /* libReact.a in Frameworks */, - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, - CD794F841F635C900042156F /* libReactNativeNavigation.a in Frameworks */, - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - 27EC6831A396473FA5EE67B6 /* libRCTAes.a in Frameworks */, - 5EFECE11794F40E181B99498 /* libRNVectorIcons.a in Frameworks */, - F0E50C0D190941AD9983EC41 /* libRNKeychain.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4C91E0B4AEC006451C7 /* libReact.a in Frameworks */, - 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, - 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, - 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, - 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, - 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, - 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, - 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 00C302A81ABCB8CE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302B61ABCB90400DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302BC1ABCB91800DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, - 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302D41ABCB9D200DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, - 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302E01ABCB9EE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, - ); - name = Products; - sourceTree = ""; - }; - 00E356EF1AD99517003FC87E /* sn_reactTests */ = { - isa = PBXGroup; - children = ( - 00E356F21AD99517003FC87E /* sn_reactTests.m */, - 00E356F01AD99517003FC87E /* Supporting Files */, - ); - path = sn_reactTests; - sourceTree = ""; - }; - 00E356F01AD99517003FC87E /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 00E356F11AD99517003FC87E /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 139105B71AF99BAD00B5F7CC /* Products */ = { - isa = PBXGroup; - children = ( - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, - 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 139FDEE71B06529A00C62182 /* Products */ = { - isa = PBXGroup; - children = ( - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, - 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 13B07FAE1A68108700A75B9A /* sn_react */ = { - isa = PBXGroup; - children = ( - CD794FBC1F645C950042156F /* sn_react.entitlements */, - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FAF1A68108700A75B9A /* AppDelegate.h */, - 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 13B07FB51A68108700A75B9A /* Images.xcassets */, - 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, - 13B07FB71A68108700A75B9A /* main.m */, - ); - name = sn_react; - sourceTree = ""; - }; - 146834001AC3E56700842450 /* Products */ = { - isa = PBXGroup; - children = ( - 146834041AC3E56700842450 /* libReact.a */, - 3DAD3EA31DF850E9000B6D8A /* libReact.a */, - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, - CD52677D1F6088F900111058 /* libthird-party.a */, - CD52677F1F6088F900111058 /* libthird-party.a */, - CD5267811F6088F900111058 /* libdouble-conversion.a */, - CD5267831F6088F900111058 /* libdouble-conversion.a */, - ); - name = Products; - sourceTree = ""; - }; - 324EF8F405884DFD985A1BD6 /* Resources */ = { - isa = PBXGroup; - children = ( - 9C78F79B46E840C483C299E8 /* Entypo.ttf */, - 539E47A25B31483D88B9BEE3 /* EvilIcons.ttf */, - C57DDBAD260F476993B42198 /* FontAwesome.ttf */, - E4C61E3040704C1AA5B5C053 /* Foundation.ttf */, - F1D2428F4628483D89E06821 /* Ionicons.ttf */, - 7564FD238CB44AC3B1E3B656 /* MaterialCommunityIcons.ttf */, - 897B4DF5D95D4558927BB133 /* MaterialIcons.ttf */, - 89CEAD0D569344EF9371C0CA /* Octicons.ttf */, - 12F9C5943A24403E8E6F400E /* SimpleLineIcons.ttf */, - CB7FF4CB3C154463AD026A2A /* Zocial.ttf */, - ); - name = Resources; - sourceTree = ""; - }; - 5E91572E1DD0AC6500FF2AA8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, - ); - name = Products; - sourceTree = ""; - }; - 78C398B11ACF4ADC00677621 /* Products */ = { - isa = PBXGroup; - children = ( - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, - 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - CD5762D81F6AD2BA0047E10B /* ReactNativeFingerprintScanner.xcodeproj */, - CDC8714A1F6844B600BFA364 /* RNMail.xcodeproj */, - CD794F5C1F635AB20042156F /* ReactNativeNavigation.xcodeproj */, - CD52673D1F603AD000111058 /* RCTAes.xcodeproj */, - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, - 146833FF1AC3E56700842450 /* React.xcodeproj */, - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, - ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - A2928B635B784C7284DC86FB /* RCTAes.xcodeproj */, - 3050498332B2431D8433C5A2 /* RNVectorIcons.xcodeproj */, - CF284CC268EB4D08A2C10542 /* RNKeychain.xcodeproj */, - ); - name = Libraries; - sourceTree = ""; - }; - 832341B11AAA6A8300B99B32 /* Products */ = { - isa = PBXGroup; - children = ( - 832341B51AAA6A8300B99B32 /* libRCTText.a */, - 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 83CBB9F61A601CBA00E9B192 = { - isa = PBXGroup; - children = ( - 13B07FAE1A68108700A75B9A /* sn_react */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, - 00E356EF1AD99517003FC87E /* sn_reactTests */, - 83CBBA001A601CBA00E9B192 /* Products */, - 324EF8F405884DFD985A1BD6 /* Resources */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 83CBBA001A601CBA00E9B192 /* Products */ = { - isa = PBXGroup; - children = ( - 13B07F961A680F5B00A75B9A /* StandardNotes.app */, - 00E356EE1AD99517003FC87E /* StandardNotesTests.xctest */, - 2D02E47B1E0B4A5D006451C7 /* StandardNotes-tvOS.app */, - 2D02E4901E0B4A5D006451C7 /* StandardNotes-tvOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - ADBDB9201DFEBF0600ED6528 /* Products */ = { - isa = PBXGroup; - children = ( - ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, - CD5267271F6038AA00111058 /* libRCTBlob-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - CD52671C1F6038A900111058 /* Products */ = { - isa = PBXGroup; - children = ( - CD5267211F6038AA00111058 /* libRCTAes.a */, - ); - name = Products; - sourceTree = ""; - }; - CD52673E1F603AD000111058 /* Products */ = { - isa = PBXGroup; - children = ( - CD5267421F603AD000111058 /* libRCTAes.a */, - ); - name = Products; - sourceTree = ""; - }; - CD5762D91F6AD2BA0047E10B /* Products */ = { - isa = PBXGroup; - children = ( - CD5762FD1F6AD2BA0047E10B /* libReactNativeFingerprintScanner.a */, - ); - name = Products; - sourceTree = ""; - }; - CD794F271F634E4A0042156F /* Products */ = { - isa = PBXGroup; - children = ( - CD794F4C1F634E4A0042156F /* libRNVectorIcons.a */, - ); - name = Products; - sourceTree = ""; - }; - CD794F5D1F635AB20042156F /* Products */ = { - isa = PBXGroup; - children = ( - CD794F811F635AB20042156F /* libReactNativeNavigation.a */, - ); - name = Products; - sourceTree = ""; - }; - CD794F951F645C4D0042156F /* Products */ = { - isa = PBXGroup; - children = ( - CD794FBA1F645C4D0042156F /* libRNKeychain.a */, - ); - name = Products; - sourceTree = ""; - }; - CDC8714B1F6844B600BFA364 /* Products */ = { - isa = PBXGroup; - children = ( - CDC871721F6844B600BFA364 /* libRNMail.a */, - CDC871741F6844B600BFA364 /* RNMailTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 00E356ED1AD99517003FC87E /* StandardNotesTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "StandardNotesTests" */; - buildPhases = ( - 00E356EA1AD99517003FC87E /* Sources */, - 00E356EB1AD99517003FC87E /* Frameworks */, - 00E356EC1AD99517003FC87E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 00E356F51AD99517003FC87E /* PBXTargetDependency */, - ); - name = StandardNotesTests; - productName = sn_reactTests; - productReference = 00E356EE1AD99517003FC87E /* StandardNotesTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 13B07F861A680F5B00A75B9A /* StandardNotes */ = { - isa = PBXNativeTarget; - buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "StandardNotes" */; - buildPhases = ( - 13B07F871A680F5B00A75B9A /* Sources */, - 13B07F8C1A680F5B00A75B9A /* Frameworks */, - 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = StandardNotes; - productName = "Hello World"; - productReference = 13B07F961A680F5B00A75B9A /* StandardNotes.app */; - productType = "com.apple.product-type.application"; - }; - 2D02E47A1E0B4A5D006451C7 /* StandardNotes-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StandardNotes-tvOS" */; - buildPhases = ( - 2D02E4771E0B4A5D006451C7 /* Sources */, - 2D02E4781E0B4A5D006451C7 /* Frameworks */, - 2D02E4791E0B4A5D006451C7 /* Resources */, - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "StandardNotes-tvOS"; - productName = "sn_react-tvOS"; - productReference = 2D02E47B1E0B4A5D006451C7 /* StandardNotes-tvOS.app */; - productType = "com.apple.product-type.application"; - }; - 2D02E48F1E0B4A5D006451C7 /* StandardNotes-tvOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StandardNotes-tvOSTests" */; - buildPhases = ( - 2D02E48C1E0B4A5D006451C7 /* Sources */, - 2D02E48D1E0B4A5D006451C7 /* Frameworks */, - 2D02E48E1E0B4A5D006451C7 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, - ); - name = "StandardNotes-tvOSTests"; - productName = "sn_react-tvOSTests"; - productReference = 2D02E4901E0B4A5D006451C7 /* StandardNotes-tvOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 83CBB9F71A601CBA00E9B192 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 610; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 00E356ED1AD99517003FC87E = { - CreatedOnToolsVersion = 6.2; - DevelopmentTeam = HKF9BXSN95; - TestTargetID = 13B07F861A680F5B00A75B9A; - }; - 13B07F861A680F5B00A75B9A = { - DevelopmentTeam = HKF9BXSN95; - SystemCapabilities = { - com.apple.Keychain = { - enabled = 1; - }; - }; - }; - 2D02E47A1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - 2D02E48F1E0B4A5D006451C7 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - TestTargetID = 2D02E47A1E0B4A5D006451C7; - }; - }; - }; - buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "StandardNotes" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 83CBB9F61A601CBA00E9B192; - productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; - projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; - ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - }, - { - ProductGroup = CD52671C1F6038A900111058 /* Products */; - ProjectRef = A2928B635B784C7284DC86FB /* RCTAes.xcodeproj */; - }, - { - ProductGroup = CD52673E1F603AD000111058 /* Products */; - ProjectRef = CD52673D1F603AD000111058 /* RCTAes.xcodeproj */; - }, - { - ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; - ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - }, - { - ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; - ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; - }, - { - ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; - ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - }, - { - ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; - ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - }, - { - ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; - ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - }, - { - ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; - ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - }, - { - ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; - ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - }, - { - ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; - ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - }, - { - ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; - ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - }, - { - ProductGroup = 139FDEE71B06529A00C62182 /* Products */; - ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - }, - { - ProductGroup = 146834001AC3E56700842450 /* Products */; - ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; - }, - { - ProductGroup = CD5762D91F6AD2BA0047E10B /* Products */; - ProjectRef = CD5762D81F6AD2BA0047E10B /* ReactNativeFingerprintScanner.xcodeproj */; - }, - { - ProductGroup = CD794F5D1F635AB20042156F /* Products */; - ProjectRef = CD794F5C1F635AB20042156F /* ReactNativeNavigation.xcodeproj */; - }, - { - ProductGroup = CD794F951F645C4D0042156F /* Products */; - ProjectRef = CF284CC268EB4D08A2C10542 /* RNKeychain.xcodeproj */; - }, - { - ProductGroup = CDC8714B1F6844B600BFA364 /* Products */; - ProjectRef = CDC8714A1F6844B600BFA364 /* RNMail.xcodeproj */; - }, - { - ProductGroup = CD794F271F634E4A0042156F /* Products */; - ProjectRef = 3050498332B2431D8433C5A2 /* RNVectorIcons.xcodeproj */; - }, - ); - projectRoot = ""; - targets = ( - 13B07F861A680F5B00A75B9A /* StandardNotes */, - 00E356ED1AD99517003FC87E /* StandardNotesTests */, - 2D02E47A1E0B4A5D006451C7 /* StandardNotes-tvOS */, - 2D02E48F1E0B4A5D006451C7 /* StandardNotes-tvOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXReferenceProxy section */ - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTActionSheet.a; - remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTGeolocation.a; - remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTImage.a; - remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTNetwork.a; - remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTVibration.a; - remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTSettings.a; - remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTWebSocket.a; - remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 146834041AC3E56700842450 /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTImage-tvOS.a"; - remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTLinking-tvOS.a"; - remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTNetwork-tvOS.a"; - remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTSettings-tvOS.a"; - remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTText-tvOS.a"; - remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTWebSocket-tvOS.a"; - remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAnimation.a; - remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAnimation.a; - remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTLinking.a; - remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTText.a; - remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTBlob.a; - remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD5267211F6038AA00111058 /* libRCTAes.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAes.a; - remoteRef = CD5267201F6038AA00111058 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD5267271F6038AA00111058 /* libRCTBlob-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTBlob-tvOS.a"; - remoteRef = CD5267261F6038AA00111058 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD5267421F603AD000111058 /* libRCTAes.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAes.a; - remoteRef = CD5267411F603AD000111058 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD52677D1F6088F900111058 /* libthird-party.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libthird-party.a"; - remoteRef = CD52677C1F6088F900111058 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD52677F1F6088F900111058 /* libthird-party.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libthird-party.a"; - remoteRef = CD52677E1F6088F900111058 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD5267811F6088F900111058 /* libdouble-conversion.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libdouble-conversion.a"; - remoteRef = CD5267801F6088F900111058 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD5267831F6088F900111058 /* libdouble-conversion.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libdouble-conversion.a"; - remoteRef = CD5267821F6088F900111058 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD5762FD1F6AD2BA0047E10B /* libReactNativeFingerprintScanner.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReactNativeFingerprintScanner.a; - remoteRef = CD5762FC1F6AD2BA0047E10B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD794F4C1F634E4A0042156F /* libRNVectorIcons.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNVectorIcons.a; - remoteRef = CD794F4B1F634E4A0042156F /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD794F811F635AB20042156F /* libReactNativeNavigation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReactNativeNavigation.a; - remoteRef = CD794F801F635AB20042156F /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CD794FBA1F645C4D0042156F /* libRNKeychain.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNKeychain.a; - remoteRef = CD794FB91F645C4D0042156F /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CDC871721F6844B600BFA364 /* libRNMail.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNMail.a; - remoteRef = CDC871711F6844B600BFA364 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CDC871741F6844B600BFA364 /* RNMailTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = RNMailTests.xctest; - remoteRef = CDC871731F6844B600BFA364 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - -/* Begin PBXResourcesBuildPhase section */ - 00E356EC1AD99517003FC87E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F8E1A680F5B00A75B9A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, - 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - C444784E8C9B41A696096AA6 /* Entypo.ttf in Resources */, - E46046EEE98E4E86BFD6FE6A /* EvilIcons.ttf in Resources */, - 1167C266CB224DBE87C13D8E /* FontAwesome.ttf in Resources */, - FFEBC0CCC84A41BEB04A2C2A /* Foundation.ttf in Resources */, - AC93140751CD46C3A338A692 /* Ionicons.ttf in Resources */, - EC8910981E624D0AB7B0359E /* MaterialCommunityIcons.ttf in Resources */, - DC52BF6667FC468590FA0519 /* MaterialIcons.ttf in Resources */, - E3B5408139D24F7D9B661C18 /* Octicons.ttf in Resources */, - AEB483888C374320B3F4642A /* SimpleLineIcons.ttf in Resources */, - A1BEF7553D6B48CCAE53C451 /* Zocial.ttf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4791E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48E1E0B4A5D006451C7 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native code and images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; - }; - 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Bundle React Native Code And Images"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 00E356EA1AD99517003FC87E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 00E356F31AD99517003FC87E /* sn_reactTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 13B07F871A680F5B00A75B9A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, - 13B07FC11A68108700A75B9A /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E4771E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, - 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2D02E48C1E0B4A5D006451C7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2DCD954D1E0B4F2C00145EB5 /* sn_reactTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 13B07F861A680F5B00A75B9A /* StandardNotes */; - targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; - }; - 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 2D02E47A1E0B4A5D006451C7 /* StandardNotes-tvOS */; - targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 13B07FB21A68108700A75B9A /* Base */, - ); - name = LaunchScreen.xib; - path = sn_react; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 00E356F61AD99517003FC87E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - DEVELOPMENT_TEAM = HKF9BXSN95; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-aes-crypto/ios/RCTAes/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../vendor/react-native-navigation/ios/**", - "$(SRCROOT)/../node_modules/react-native-keychain/RNKeychainManager", - ); - INFOPLIST_FILE = sn_reactTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StandardNotes.app/StandardNotes"; - }; - name = Debug; - }; - 00E356F71AD99517003FC87E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - COPY_PHASE_STRIP = NO; - DEVELOPMENT_TEAM = HKF9BXSN95; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-aes-crypto/ios/RCTAes/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../vendor/react-native-navigation/ios/**", - "$(SRCROOT)/../node_modules/react-native-keychain/RNKeychainManager", - ); - INFOPLIST_FILE = sn_reactTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StandardNotes.app/StandardNotes"; - }; - name = Release; - }; - 13B07F941A680F5B00A75B9A /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = sn_react/sn_react.entitlements; - CURRENT_PROJECT_VERSION = 1; - DEAD_CODE_STRIPPING = NO; - DEVELOPMENT_TEAM = HKF9BXSN95; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-aes-crypto/ios/RCTAes/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../vendor/react-native-navigation/ios/**", - "$(SRCROOT)/../node_modules/react-native-keychain/RNKeychainManager", - ); - INFOPLIST_FILE = sn_react/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_NAME = StandardNotes; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 13B07F951A680F5B00A75B9A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = sn_react/sn_react.entitlements; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = HKF9BXSN95; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-aes-crypto/ios/RCTAes/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../vendor/react-native-navigation/ios/**", - "$(SRCROOT)/../node_modules/react-native-keychain/RNKeychainManager", - ); - INFOPLIST_FILE = sn_react/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - OTHER_LDFLAGS = ( - "$(inherited)", - "-ObjC", - "-lc++", - ); - PRODUCT_NAME = StandardNotes; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; - 2D02E4971E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-aes-crypto/ios/RCTAes/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-keychain/RNKeychainManager", - ); - INFOPLIST_FILE = "sn_react-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.sn_react-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Debug; - }; - 2D02E4981E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_NO_COMMON_BLOCKS = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-aes-crypto/ios/RCTAes/**", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", - "$(SRCROOT)/../node_modules/react-native-keychain/RNKeychainManager", - ); - INFOPLIST_FILE = "sn_react-tvOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - OTHER_LDFLAGS = ( - "-ObjC", - "-lc++", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.sn_react-tvOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 9.2; - }; - name = Release; - }; - 2D02E4991E0B4A5E006451C7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "sn_react-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.sn_react-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StandardNotes-tvOS.app/StandardNotes-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Debug; - }; - 2D02E49A1E0B4A5E006451C7 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "sn_react-tvOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/$(TARGET_NAME)\"", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.sn_react-tvOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StandardNotes-tvOS.app/StandardNotes-tvOS"; - TVOS_DEPLOYMENT_TARGET = 10.1; - }; - name = Release; - }; - 83CBBA201A601CBA00E9B192 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 83CBBA211A601CBA00E9B192 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "StandardNotesTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 00E356F61AD99517003FC87E /* Debug */, - 00E356F71AD99517003FC87E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "StandardNotes" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 13B07F941A680F5B00A75B9A /* Debug */, - 13B07F951A680F5B00A75B9A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StandardNotes-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4971E0B4A5E006451C7 /* Debug */, - 2D02E4981E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StandardNotes-tvOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D02E4991E0B4A5E006451C7 /* Debug */, - 2D02E49A1E0B4A5E006451C7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "StandardNotes" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 83CBBA201A601CBA00E9B192 /* Debug */, - 83CBBA211A601CBA00E9B192 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; -} diff --git a/ios/untitled folder/sn_react.xcodeproj/xcshareddata/xcschemes/sn_react-tvOS.xcscheme b/ios/untitled folder/sn_react.xcodeproj/xcshareddata/xcschemes/sn_react-tvOS.xcscheme deleted file mode 100644 index 7aa6e619..00000000 --- a/ios/untitled folder/sn_react.xcodeproj/xcshareddata/xcschemes/sn_react-tvOS.xcscheme +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/untitled folder/sn_react.xcodeproj/xcshareddata/xcschemes/sn_react.xcscheme b/ios/untitled folder/sn_react.xcodeproj/xcshareddata/xcschemes/sn_react.xcscheme deleted file mode 100644 index 18e02031..00000000 --- a/ios/untitled folder/sn_react.xcodeproj/xcshareddata/xcschemes/sn_react.xcscheme +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/untitled folder/sn_react/AppDelegate.h b/ios/untitled folder/sn_react/AppDelegate.h deleted file mode 100644 index a9654d5e..00000000 --- a/ios/untitled folder/sn_react/AppDelegate.h +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@interface AppDelegate : UIResponder - -@property (nonatomic, strong) UIWindow *window; - -@end diff --git a/ios/untitled folder/sn_react/AppDelegate.m b/ios/untitled folder/sn_react/AppDelegate.m deleted file mode 100644 index 5f158c37..00000000 --- a/ios/untitled folder/sn_react/AppDelegate.m +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "AppDelegate.h" - -#import -#import "RCCManager.h" -#import - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - NSURL *jsCodeLocation; - - jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; - -// RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation -// moduleName:@"sn_react" -// initialProperties:nil -// launchOptions:launchOptions]; -// rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - self.window.backgroundColor = [UIColor whiteColor]; - [[RCCManager sharedInstance] initBridgeWithBundleURL:jsCodeLocation launchOptions:launchOptions]; - -// self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; -// UIViewController *rootViewController = [UIViewController new]; -// rootViewController.view = rootView; -// self.window.rootViewController = rootViewController; -// [self.window makeKeyAndVisible]; - return YES; -} - -@end diff --git a/ios/untitled folder/sn_react/Base.lproj/LaunchScreen.xib b/ios/untitled folder/sn_react/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 1ece1fd0..00000000 --- a/ios/untitled folder/sn_react/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/untitled folder/sn_react/Images.xcassets/Contents.json b/ios/untitled folder/sn_react/Images.xcassets/Contents.json deleted file mode 100644 index da4a164c..00000000 --- a/ios/untitled folder/sn_react/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ios/untitled folder/sn_react/Info.plist b/ios/untitled folder/sn_react/Info.plist deleted file mode 100644 index 6cb95e1f..00000000 --- a/ios/untitled folder/sn_react/Info.plist +++ /dev/null @@ -1,68 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - S. Notes - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - NSAppTransportSecurity - - NSExceptionDomains - - localhost - - NSExceptionAllowsInsecureHTTPLoads - - - - - NSLocationWhenInUseUsageDescription - - UIAppFonts - - Entypo.ttf - EvilIcons.ttf - FontAwesome.ttf - Foundation.ttf - Ionicons.ttf - MaterialCommunityIcons.ttf - MaterialIcons.ttf - Octicons.ttf - SimpleLineIcons.ttf - Zocial.ttf - - UILaunchStoryboardName - LaunchScreen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/ios/untitled folder/sn_react/main.m b/ios/untitled folder/sn_react/main.m deleted file mode 100644 index 3d767fcb..00000000 --- a/ios/untitled folder/sn_react/main.m +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/ios/untitled folder/sn_react/sn_react.entitlements b/ios/untitled folder/sn_react/sn_react.entitlements deleted file mode 100644 index cc050e2d..00000000 --- a/ios/untitled folder/sn_react/sn_react.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - keychain-access-groups - - $(AppIdentifierPrefix)org.reactjs.native.example.sn-react - - - diff --git a/ios/untitled folder/sn_reactTests/Info.plist b/ios/untitled folder/sn_reactTests/Info.plist deleted file mode 100644 index 886825cc..00000000 --- a/ios/untitled folder/sn_reactTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/ios/untitled folder/sn_reactTests/sn_reactTests.m b/ios/untitled folder/sn_reactTests/sn_reactTests.m deleted file mode 100644 index 62a5d2f5..00000000 --- a/ios/untitled folder/sn_reactTests/sn_reactTests.m +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import - -#import -#import - -#define TIMEOUT_SECONDS 600 -#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" - -@interface sn_reactTests : XCTestCase - -@end - -@implementation sn_reactTests - -- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test -{ - if (test(view)) { - return YES; - } - for (UIView *subview in [view subviews]) { - if ([self findSubviewInView:subview matching:test]) { - return YES; - } - } - return NO; -} - -- (void)testRendersWelcomeScreen -{ - UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; - NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; - BOOL foundElement = NO; - - __block NSString *redboxError = nil; - RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { - if (level >= RCTLogLevelError) { - redboxError = message; - } - }); - - while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { - [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; - - foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { - if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { - return YES; - } - return NO; - }]; - } - - RCTSetLogFunction(RCTDefaultLogFunction); - - XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); - XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); -} - - -@end diff --git a/package-lock.json b/package-lock.json index 5f3b93e3..11928de0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "StandardNotes", - "version": "3.0.5", + "version": "3.0.6", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2375,6 +2375,11 @@ } } }, + "@react-native-community/async-storage": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@react-native-community/async-storage/-/async-storage-1.4.0.tgz", + "integrity": "sha512-Aksg16keqrxaluFRZwmo8O8ppP9TFylyCEwBElmxeZ+a6DQAvyMn5nS3n+lgSpkYsrwU2ZGVjDluhkjtBrkEqQ==" + }, "@react-navigation/core": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-3.0.2.tgz", @@ -10634,6 +10639,15 @@ } } }, + "react-native-webview": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-5.8.1.tgz", + "integrity": "sha512-b6pSvmjoiWtcz6YspggW02X+BRXJWuquHwkh37BRx1NMW1iwMZA31SnFQvTpPzWYYIb9WF/mRsy2nGtt9C6NIg==", + "requires": { + "escape-string-regexp": "1.0.5", + "invariant": "2.2.4" + } + }, "react-navigation": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/react-navigation/-/react-navigation-3.0.9.tgz", @@ -11543,11 +11557,6 @@ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, - "sn-models": { - "version": "0.1.14", - "resolved": "https://registry.npmjs.org/sn-models/-/sn-models-0.1.14.tgz", - "integrity": "sha512-p5Tp18sKP68saA4EkdAeYo+X3dNdmGwgqPKL0Bi0Y6lv2SO0LiHPbcBxKcsQjrikE8ePUviJVeckRfMgR5QbYA==" - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -11645,6 +11654,11 @@ "kind-of": "3.2.2" } }, + "snjs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/snjs/-/snjs-0.2.0.tgz", + "integrity": "sha512-wkvycOiFKnEewyFDlfN5k+zu3ppvzCdE9YQPR82dWMqwxZK3qCx8RuBGr2p0M4bjyqrPXyVwVrJHbE60kGVRug==" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -11746,9 +11760,9 @@ "integrity": "sha1-ATl5IuX2Ls8whFUiyVxP4dJefU4=" }, "standard-file-js": { - "version": "0.3.56", - "resolved": "https://registry.npmjs.org/standard-file-js/-/standard-file-js-0.3.56.tgz", - "integrity": "sha512-I/iOm53skG+4NsbKdzmGSra6fEj9Qm0xirhUAToaLyXpbWkuQMu+md6SMEJO8Bg9cFmjUhAk1xtxVr3+IPf/eA==" + "version": "0.3.58", + "resolved": "https://registry.npmjs.org/standard-file-js/-/standard-file-js-0.3.58.tgz", + "integrity": "sha512-xkoC+lDK12WPL2+ckD2Ki8WfTsy8TphvwqLS9OASuY06MHdVh9qGGooYvewjXSQkSQTBDrs7f+0mzEX0Rn2AZw==" }, "static-extend": { "version": "0.1.2", diff --git a/package.json b/package.json index a5ac46c0..f260721d 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "StandardNotes", - "version": "3.0.5", - "versionIOS": "3.0.5", - "versionAndroid": "3.0.5", + "version": "3.0.6", + "versionIOS": "3.0.6", + "versionAndroid": "3.0.6", "license": "AGPL-3.0-or-later", "private": true, "scripts": { @@ -12,6 +12,7 @@ "test": "jest" }, "dependencies": { + "@react-native-community/async-storage": "1.4.0", "base-64": "^0.1.0", "bugsnag-react-native": "^2.12.6", "immutable": "^3.8.1", @@ -25,11 +26,12 @@ "react-native-keychain": "^1.2.1", "react-native-store-review": "^0.1.3", "react-native-vector-icons": "6.1.0", + "react-native-webview": "5.8.1", "react-navigation": "^3.0.9", "react-navigation-header-buttons": "^2.1.1", "regenerator": "^0.13.3", - "sn-models": "0.1.14", - "standard-file-js": "0.3.56" + "snjs": "0.2.0", + "standard-file-js": "0.3.58" }, "devDependencies": { "babel-jest": "^23.6.0", diff --git a/src/global.js b/src/global.js index 7920205b..37bebdd5 100644 --- a/src/global.js +++ b/src/global.js @@ -45,10 +45,12 @@ import { SNNote, SNTag, SNTheme, - SNComponent -} from 'sn-models'; + SNComponent, + SNComponentManager +} from 'snjs'; global.SNNote = SNNote; global.SNTag = SNTag; global.SNTheme = SNTheme; global.SNComponent = SNComponent; +global.SNComponentManager = SNComponentManager; diff --git a/src/lib/componentManager.js b/src/lib/componentManager.js index 7266974e..d180e9b7 100644 --- a/src/lib/componentManager.js +++ b/src/lib/componentManager.js @@ -1,412 +1,71 @@ -/* This domain will be used to save context item client data */ -let ClientDataDomain = "org.standardnotes.sn.components"; +import ModelManager from "@SFJS/modelManager"; +import Sync from "@SFJS/syncManager"; +import AlertManager from "@SFJS/alertManager"; +import { Platform } from 'react-native'; +import StyleKit from "@Style/StyleKit" -import { Platform, Alert } from 'react-native'; - -import StyleKit from '@Style/StyleKit' -import ModelManager from './sfjs/modelManager' -import Sync from './sfjs/syncManager' -import SF from "./sfjs/sfjs" -import ApplicationState from "@Lib/ApplicationState" - -export default class ComponentManager { +export default class ComponentManager extends SNComponentManager { static instance = null; static get() { if (this.instance == null) { - this.instance = new ComponentManager(); + this.instance = new ComponentManager({ + modelManager: ModelManager.get(), + syncManager: Sync.get(), + alertManager: AlertManager.get(), + environment: "mobile", + platform: Platform.OS + }); } return this.instance; } - constructor() { - this.streamObservers = []; - this.contextStreamObservers = []; - this.activeComponents = []; - - // this.loggingEnabled = true; - - this.handlers = []; - - StyleKit.get().addThemeChangeObserver(() => { - this.postActiveThemesToAllComponents(); - }); - - ModelManager.get().addItemSyncObserver("component-manager", "*", (allItems, validItems, deletedItems, source) => { - - /* If the source of these new or updated items is from a Component itself saving items, we don't need to notify - components again of the same item. Regarding notifying other components than the issuing component, other mapping sources - will take care of that, like ModelManager.MappingSourceRemoteSaved - */ - if(source == SFModelManager.MappingSourceComponentRetrieved) { - return; - } - - for(let observer of this.contextStreamObservers) { - for(let handler of this.handlers) { - if(!handler.areas.includes(observer.component.area) && !handler.areas.includes("*")) { - continue; - } - if(handler.contextRequestHandler) { - var itemInContext = handler.contextRequestHandler(observer.component); - if(itemInContext) { - var matchingItem = _.find(allItems, {uuid: itemInContext.uuid}); - if(matchingItem) { - this.sendContextItemInReply(observer.component, matchingItem, observer.originalMessage, source); - } - } - } - } - } - }); + constructor({modelManager, syncManager, desktopManager, nativeExtManager, + alertManager, $uiRunner, platform, environment}) { + super({modelManager, syncManager, desktopManager, nativeExtManager, + alertManager, $uiRunner, platform, environment}); } - contextItemDidChangeInArea(area) { - for(let handler of this.handlers) { - if(handler.areas.includes(area) === false && !handler.areas.includes("*")) { - continue; - } - var observers = this.contextStreamObservers.filter(function(observer){ - return observer.component.area === area; - }) + /* + Overrides + */ - for(let observer of observers) { - if(handler.contextRequestHandler) { - var itemInContext = handler.contextRequestHandler(observer.component); - this.sendContextItemInReply(observer.component, itemInContext, observer.originalMessage); - } - } - } - } - - jsonForItem(item, component, source) { - var params = {uuid: item.uuid, content_type: item.content_type, created_at: item.created_at, updated_at: item.updated_at, deleted: item.deleted}; - params.content = item.createContentJSONFromProperties(); - params.clientData = item.getDomainDataItem(component.getClientDataKey(), ClientDataDomain) || {}; - - /* This means the this function is being triggered through a remote Saving response, which should not update - actual local content values. The reason is, Save responses may be delayed, and a user may have changed some values - in between the Save was initiated, and the time it completes. So we only want to update actual content values (and not just metadata) - when its another source, like ModelManager.MappingSourceRemoteRetrieved. - - 3/7/18: Add MappingSourceLocalSaved as well to handle fully offline saving. github.com/standardnotes/forum/issues/169 - */ - if(source && (source == SFModelManager.MappingSourceRemoteSaved || source == SFModelManager.MappingSourceLocalSaved)) { - params.isMetadataUpdate = true; - } - this.removePrivatePropertiesFromResponseItems([params], component); - return params; - } - - sendItemsInReply(component, items, message, source) { - if(this.loggingEnabled) {console.log("Web|componentManager|sendItemsInReply", component.name, items, message)}; - var response = {items: {}}; - var mapped = items.map(function(item) { - return this.jsonForItem(item, component, source); - }.bind(this)); - - response.items = mapped; - this.replyToMessage(component, message, response); - } - - sendContextItemInReply(component, item, originalMessage, source) { - if(this.loggingEnabled) {console.log("Web|componentManager|sendContextItemInReply", component.name, item, originalMessage)}; - var response = {item: this.jsonForItem(item, component, source)}; - this.replyToMessage(component, originalMessage, response); - } - - replyToMessage(component, originalMessage, replyData) { - var reply = { - action: "reply", - original: originalMessage, - data: replyData - } - - this.sendMessageToComponent(component, reply); - } - - sendMessageToComponent(component, message) { - let permissibleActionsWhileHidden = ["component-registered", "themes"]; - if(component.hidden && !permissibleActionsWhileHidden.includes(message.action)) { - if(this.loggingEnabled) { - console.log("Component disabled for current item, not sending any messages.", component.name); - } - return; - } - - if(this.loggingEnabled) { - console.log("Web|sendMessageToComponent", component.name, JSON.stringify(message)); - } - component.window.postMessage(JSON.stringify(message)); - } - - get components() { - return ModelManager.get().allItemsMatchingTypes(["SN|Component", "SN|Theme"]); - } - - componentsForArea(area) { - return this.components.filter(function(component){ - return component.area === area; - }) - } - - urlForComponent(component) { - var localReplacement = ApplicationState.isIOS ? "localhost" : "10.0.2.2"; - var url = component.hosted_url || component.url; - if(url) { - url = url.replace("localhost", localReplacement).replace("sn.local", localReplacement); - } - return url; - } - - componentForUrl(url) { - return this.components.filter(function(component){ - return component.url === url || component.hosted_url === url; - })[0]; - } - - componentForSessionKey(key) { - return _.find(this.components, {sessionKey: key}); - } - - isReadOnlyMessage(message) { - let writeActions = ["save-items", "delete-items", "create-item"] - // Ensure the message action is not one of the writeActions - return !writeActions.includes(message.action); - } - - handleMessage(component, message) { - - if(!component) { - if(this.loggingEnabled) { - console.log("Component not defined, returning"); - } - return; - } - - // Actions that won't succeeed with readonly mode - let readwriteActions = [ - "save-items", - "associate-item", - "deassociate-item", - "create-item", - "create-items", - "delete-items", - "set-component-data" - ]; - - if(component.readonly && readwriteActions.includes(message.action)) { - Alert.alert('Extended Expired', `The extension ${component.name} is trying to save, but it is in a locked state and cannot accept changes.`); - return; - } - - /* - Mobile only handles a subset of possible messages. - Possible Messages: - set-component-data - stream-context-item - save-items - */ - - if(message.action === "stream-context-item") { - this.handleStreamContextItemMessage(component, message); - } else if(message.action === "set-component-data") { - this.handleSetComponentDataMessage(component, message); - } else if(message.action === "save-items") { - this.handleSaveItemsMessage(component, message); - } - - // Notify observers - for(let handler of this.handlers) { - if(handler.areas.includes(component.area) || handler.areas.includes("*")) { - setTimeout(function () { - handler.actionHandler && handler.actionHandler(component, message.action, message.data); - }, 10); - } - } - } - - removePrivatePropertiesFromResponseItems(responseItems, component, options = {}) { - // Don't allow component to overwrite these properties. - var privateProperties = ["autoupdateDisabled", "permissions", "active"]; - if(options) { - if(options.includeUrls) { privateProperties = privateProperties.concat(["url", "hosted_url", "local_url"])} - } - for(var responseItem of responseItems) { - // Do not pass in actual items here, otherwise that would be destructive. - // Instead, generic JS/JSON objects should be passed. - for(var prop of privateProperties) { - delete responseItem.content[prop]; - } - } - } - - handleStreamContextItemMessage(component, message) { - - if(!_.find(this.contextStreamObservers, {identifier: component.uuid})) { - // for pushing laster as changes come in - this.contextStreamObservers.push({ - identifier: component.uuid, - component: component, - originalMessage: message - }) - } - - // push immediately now - for(let handler of this.handlersForArea(component.area)) { - if(handler.contextRequestHandler) { - var itemInContext = handler.contextRequestHandler(component); - this.sendContextItemInReply(component, itemInContext, message); - } - } - } - - isItemWithinComponentContextJurisdiction(item, component) { - for(let handler of this.handlersForArea(component.area)) { - if(handler.contextRequestHandler) { - var itemInContext = handler.contextRequestHandler(component); - if(itemInContext && itemInContext.uuid == item.uuid) { - return true; - } - } - } - return false; - } - - handlersForArea(area) { - return this.handlers.filter((candidate) => {return candidate.areas.includes(area)}); - } - - handleSaveItemsMessage(component, message) { - var responseItems = message.data.items; - - // Ensure you're just trying to save the context item - if(!(responseItems.length == 1 && this.isItemWithinComponentContextJurisdiction(responseItems[0], component))) { - return; - } - - this.removePrivatePropertiesFromResponseItems(responseItems, component, {includeUrls: true}); - - /* - We map the items here because modelManager is what updates the UI. If you were to instead get the items directly, - this would update them server side via sync, but would never make its way back to the UI. - */ - var localItems = ModelManager.get().mapResponseItemsToLocalModels(responseItems, SFModelManager.MappingSourceComponentRetrieved); - - for(var item of localItems) { - var responseItem = _.find(responseItems, {uuid: item.uuid}); - _.merge(item.content, responseItem.content); - if(responseItem.clientData) { - item.setDomainDataItem(component.url || component.uuid, responseItem.clientData, ClientDataDomain); - } - item.setDirty(true); - } - - Sync.get().sync().then((response) => { - // Allow handlers to be notified when a save begins and ends, to update the UI - var saveMessage = Object.assign({}, message); - saveMessage.action = (response && response.error) ? "save-error" : "save-success"; - this.replyToMessage(component, message, {error: response && response.error}) - this.handleMessage(component, saveMessage); - }); - } - - handleSetComponentDataMessage(component, message) { - component.componentData = message.data.componentData; - component.setDirty(true); - Sync.get().sync(); - } - - registerHandler(handler) { - this.handlers.push(handler); - } - - deregisterHandler(identifier) { - var handler = _.find(this.handlers, {identifier: identifier}); - this.handlers.splice(this.handlers.indexOf(handler), 1); - } - - // Called by other views when the iframe is ready - async registerComponentWindow(component, componentWindow) { - if(!component) { console.error("component is null");} - if(!componentWindow) { console.error("componentWindow is null");} - - if(component.window === componentWindow) { - if(this.loggingEnabled) { - console.log("Web|componentManager", "attempting to re-register same component window.") - } - } - - if(this.loggingEnabled) { - console.log("Web|componentManager|registerComponentWindow"); - } - - component.window = componentWindow; - component.sessionKey = await SF.get().crypto.generateUUID(); - - this.sendMessageToComponent(component, { - action: "component-registered", - sessionKey: component.sessionKey, - componentData: component.componentData, - data: { - uuid: component.uuid, - environment: "mobile", - platform: Platform.OS, - activeThemeUrls: [this.getActiveThemeUrl()] - } - }); - - // Some editors may not yet accept initial activeThemeUrls in component-registerd event - this.postActiveThemeToComponent(component); - } - - deactivateComponent(component, dontSync = false) { - component.active = false; - component.sessionKey = null; - - this.streamObservers = this.streamObservers.filter(function(o){ - return o.component !== component; - }) - - this.contextStreamObservers = this.contextStreamObservers.filter(function(o){ - return o.component !== component; - }) - } - - getActiveThemeUrl() { + urlsForActiveThemes() { let theme = StyleKit.get().activeTheme; + if(theme.content.isSystemTheme) { + return null; + } + if(theme) { let url = this.urlForComponent(theme); - return url; + return [url]; } } - postActiveThemeToComponent(component) { - let url = this.getActiveThemeUrl(); - if(!url) { - return; - } + /* + @param {object} dialog: {permissions, String, component, callback} + */ - var data = { themes: [url] } - - this.sendMessageToComponent(component, {action: "themes", data: data}) + presentPermissionsDialog(dialog) { + let text = `${dialog.component.name} would like to interact with your ${dialog.permissionsString}`; + this.alertManager.confirm({ + title: "Grant Permissions", + text: text, + confirmButtonText: "Continue", + cancelButtonText: "Cancel", + onConfirm: () => {dialog.callback(true)}, + onCancel: () => {dialog.callback(false)}, + }) } - postActiveThemesToAllComponents() { - for(var component of this.components) { - // Skip over components that are themes themselves, - // or components that are not active, or components that don't have a window - // On desktop/web, we check if component.active is true as well below, but on mobile, - // .active isn't set - if(component.isTheme() || !component.window) { - continue; - } - this.postActiveThemeToComponent(component); - } - } + + + /* + Custom functions, not overrides + */ getEditors() { return this.componentsForArea("editor-editor"); @@ -416,23 +75,6 @@ export default class ComponentManager { return this.getEditors().filter((e) => {return e.content.isMobileDefault})[0]; } - editorForNote(note) { - let editors = ModelManager.get().validItemsForContentType("SN|Component").filter(function(component){ - return component.area == "editor-editor"; - }) - - for(var editor of editors) { - if(editor.isExplicitlyEnabledForItem(note)) { - return editor; - } - } - - // No editor found for note. Use default editor, if note does not prefer system editor - if(!note.content.mobilePrefersPlainEditor) { - return this.getDefaultEditor(); - } - } - setEditorAsMobileDefault(editor, isDefault) { if(isDefault) { // Remove current default @@ -443,7 +85,7 @@ export default class ComponentManager { } } - // Could be null if plain editor + // Could be null if plain editor if(editor) { editor.content.isMobileDefault = isDefault; editor.setDirty(true); diff --git a/src/lib/reviewManager.js b/src/lib/reviewManager.js index ff4d0393..98fc6d51 100644 --- a/src/lib/reviewManager.js +++ b/src/lib/reviewManager.js @@ -2,7 +2,7 @@ import {Platform} from 'react-native'; import * as StoreReview from 'react-native-store-review'; import Storage from "./sfjs/storageManager"; -let NumRunsBeforeAskingForReview = [18, 65, 120] +let NumRunsBeforeAskingForReview = [18, 45, 105] export default class ReviewManager { diff --git a/src/lib/sfjs/alertManager.js b/src/lib/sfjs/alertManager.js index 2146de4e..46a239be 100644 --- a/src/lib/sfjs/alertManager.js +++ b/src/lib/sfjs/alertManager.js @@ -12,6 +12,19 @@ export default class AlertManager extends SFAlertManager { return this.instance; } + async alert({title, text, closeButtonText = "OK", onClose} = {}) { + return new Promise((resolve, reject) => { + // On iOS, confirm should go first. On Android, cancel should go first. + let buttons = [ + {text: closeButtonText, onPress: () => { + resolve(); + onClose && onClose(); + }}, + ]; + Alert.alert(title, text, buttons, { cancelable: true }) + }) + } + async confirm({title, text, confirmButtonText = "OK", cancelButtonText = "Cancel", onConfirm, onCancel} = {}) { return new Promise((resolve, reject) => { // On iOS, confirm should go first. On Android, cancel should go first. diff --git a/src/lib/sfjs/modelManager.js b/src/lib/sfjs/modelManager.js index aa890a16..2c56a55d 100644 --- a/src/lib/sfjs/modelManager.js +++ b/src/lib/sfjs/modelManager.js @@ -1,7 +1,7 @@ import Storage from "./storageManager" import "../../models/extend/item.js"; import { SFPredicate, SFPrivileges } from "standard-file-js"; -import { SNMfa, SNServerExtension, SNExtension, SNEditor } from 'sn-models'; +import { SNMfa, SNServerExtension, SNExtension, SNEditor } from 'snjs'; SFModelManager.ContentTypeClassMapping = { "Note" : SNNote, @@ -251,4 +251,25 @@ export default class ModelManager extends SFModelManager { return {notes: notes, tags: tags}; } + + /* + Misc + */ + + humanReadableDisplayForContentType(contentType) { + return { + "Note" : "note", + "Tag" : "tag", + "SN|SmartTag": "smart tag", + "Extension" : "action-based extension", + "SN|Component" : "component", + "SN|Editor" : "editor", + "SN|Theme" : "theme", + "SF|Extension" : "server extension", + "SF|MFA" : "two-factor authentication setting", + "SN|FileSafe|Credentials": "FileSafe credential", + "SN|FileSafe|FileMetadata": "FileSafe file", + "SN|FileSafe|Integration": "FileSafe integration" + }[contentType]; + } } diff --git a/src/lib/sfjs/privilegesManager.js b/src/lib/sfjs/privilegesManager.js index 794fc8e6..f4b94f66 100644 --- a/src/lib/sfjs/privilegesManager.js +++ b/src/lib/sfjs/privilegesManager.js @@ -107,7 +107,9 @@ export default class PrivilegesManager extends SFPrivilegesManager { let credentials = await this.netCredentialsForAction(action); let sources = []; for(var credential of credentials) { - sources = sources.concat(sourcesForCredential(credential)); + sources = sources.concat(sourcesForCredential(credential)).sort((a, b) => { + return a.sort - b.sort; + }) } return sources; diff --git a/src/lib/sfjs/storageManager.js b/src/lib/sfjs/storageManager.js index c6bcd6d6..2e3c251e 100644 --- a/src/lib/sfjs/storageManager.js +++ b/src/lib/sfjs/storageManager.js @@ -1,4 +1,6 @@ -import { AsyncStorage } from 'react-native'; +import { Platform } from 'react-native'; +import AsyncStorage from '@react-native-community/async-storage'; +import AlertManager from './alertManager'; export default class Storage extends SFStorageManager { @@ -12,6 +14,12 @@ export default class Storage extends SFStorageManager { return this.instance; } + constructor() { + super(); + this.isAndroid = Platform.OS == 'android'; + this.platformString = this.isAndroid ? "Android" : "iOS"; + } + async getItem(key) { try { return AsyncStorage.getItem(key); @@ -59,25 +67,109 @@ export default class Storage extends SFStorageManager { // Models - async getAllModels() { - var items = []; - var keys = await AsyncStorage.getAllKeys(); - var stores = await AsyncStorage.multiGet(keys); - stores.map((result, i, store) => { - // get at each store's key/value so you can work with it - let key = store[i][0]; - if(key.includes("Item-")) { + async getAllModels() { + const itemsFromStores = (stores) => { + let items = []; + stores.map((result, i, store) => { + let key = store[i][0]; let value = store[i][1]; if(value) { items.push(JSON.parse(value)); } + }) + + return items; + } + + /* + As of react-native-asyncstorage 1.4.0: + + If Android has items saved that are over ~1MB, then: + + let stores = await AsyncStorage.multiGet(keys); + items = items.concat(itemsFromStores(stores)); + + will fail silently and no items will load. + + let item = await AsyncStorage.getItem(key); + items.push(JSON.parse(item)); + + will fail with an exception 'Cursor Window: Window is full'. + But actually if you wrap it in a try catch, then it will throw an exception correctly. + So that's what we're using now on Android. + + let item = itemsFromStores(await AsyncStorage.multiGet([key]))[0]; + items.push(item); + + will succeed completely. + + Issue created here: https://github.com/react-native-community/react-native-async-storage/issues/105 + + So what we'll do for now is if Android, use multiGet with just 1 key each time. + We need to determine why multiGet([key]) works, but getItem(key) doesn't. + + It looks like the reason getItem fails while multiGet doesn't is because getItem + correctly returns the exception. However, even when there is an exception, getItem + internally still retrieves the item value. So the value and exception are both present, + but only the exception is sent. + + Whereas with multiGet, exceptions aren't reported at all, so the value is sent up. + When multiGet gets patched to reports errors, I suspect this loophole will no longer work. + + However, getItem's `callback` param can be used instead of the promise, which will return both a value and an exception, + and we can choose which one we want to handle. + + multiGet also currently totally fails if even 1 key fails: + https://github.com/react-native-community/react-native-async-storage/issues/106 + */ + + let keys = await this.getAllModelKeys(); + let items = []; + let failedItemIds = []; + if(this.isAndroid) { + for(let key of keys) { + try { + let item = await AsyncStorage.getItem(key); + if(item) { + items.push(JSON.parse(item)); + } + } catch (e) { + let id = key.replace("Item-", ""); + failedItemIds.push(id); + console.log("Error getting item", key, e); + } } - }) + } else { + try { + let stores = await AsyncStorage.multiGet(keys); + items = items.concat(itemsFromStores(stores)); + } catch(e) { + console.log("Error getting items", keys, e); + } + } + + if(failedItemIds.length > 0) { + this.showLoadFailForItemIds(failedItemIds); + } return items; } + showLoadFailForItemIds(failedItemIds) { + let text = `The following items could not be loaded. This may happen if you are in low-memory conditions, or if the note is very large in size. For compatibility with ${this.platformString}, we recommend breaking up large notes into smaller chunks using the desktop or web app.\n\nItems:\n` + let index = 0; + text += failedItemIds.map((id) => { + let result = id; + if(index != failedItemIds.length - 1) { + result += "\n"; + } + index++; + return result; + }) + AlertManager.get().alert({title: "Unable to load item", text: text}) + } + keyForItem(item) { return "Item-" + item.uuid; } diff --git a/src/models/extend/item.js b/src/models/extend/item.js index 46f45361..6991b990 100644 --- a/src/models/extend/item.js +++ b/src/models/extend/item.js @@ -16,11 +16,16 @@ SFItem.prototype.updateFromJSON = function(json) { } } -const original_dateToLocalizedString = SFItem.prototype.dateToLocalizedString; SFItem.prototype.dateToLocalizedString = function(date) { return moment(date).format('llll'); } +SFItem.prototype.updatedAtTimestamp = function() { + // date is a moment date + // in the base class we do date.getTime(), but that doesn't work with moment dates. + return this.updated_at.valueOf(); +} + // Define these getters Object.defineProperty(SFItem.prototype, "key", { diff --git a/src/screens/Authentication/Authenticate.js b/src/screens/Authentication/Authenticate.js index 749bdf06..a6246de9 100644 --- a/src/screens/Authentication/Authenticate.js +++ b/src/screens/Authentication/Authenticate.js @@ -77,6 +77,7 @@ export default class Authenticate extends Abstract { } submitPressed() { + // If we just pressed submit on the only pending source left, disable submit button if(this.pendingSources.length == 1) { this.setState({submitDisabled: true}); } @@ -114,13 +115,11 @@ export default class Authenticate extends Abstract { } async beginAuthenticationForSource(source) { - if(ApplicationState.get().getMostRecentState() == ApplicationState.LosingFocus) { - // Authentication modal may be displayed on lose focus just before the app is closing. - // In this state however, we don't want to begin auth. We'll wait until the app gains focus. - return; - } + // Authentication modal may be displayed on lose focus just before the app is closing. + // In this state however, we don't want to begin auth. We'll wait until the app gains focus. + let isLosingFocus = ApplicationState.get().getMostRecentState() == ApplicationState.LosingFocus; - if(source.type == "biometric") { + if(source.type == "biometric" && !isLosingFocus) { // Begin authentication right away, we're not waiting for any input this.validateAuthentication(source); } else if(source.type == "input") { @@ -128,6 +127,7 @@ export default class Authenticate extends Abstract { source.inputRef.focus(); } } + source.setWaitingForInput(); this.setState({activeSource: source}); this.forceUpdate(); @@ -160,10 +160,14 @@ export default class Authenticate extends Abstract { return; } + // Disable submit while we're processing. Will be re-enabled below. + this.setState({submitDisabled: true}); + let result = await source.authenticate(); if(source.isInSuccessState()) { this.successfulSources.push(source); _.pull(this.pendingSources, source); + this.forceUpdate(); } else { if(result.error && result.error.message) { Alert.alert("Unsuccessful", result.error.message); diff --git a/src/screens/Authentication/Sources/AuthenticationSourceAccountPassword.js b/src/screens/Authentication/Sources/AuthenticationSourceAccountPassword.js index 97f5273d..7a55d6c9 100644 --- a/src/screens/Authentication/Sources/AuthenticationSourceAccountPassword.js +++ b/src/screens/Authentication/Sources/AuthenticationSourceAccountPassword.js @@ -9,6 +9,10 @@ export default class AuthenticationSourceAccountPassword extends AuthenticationS super(); } + get sort() { + return 1; + } + get identifier() { return "account-password-auth-source"; } diff --git a/src/screens/Authentication/Sources/AuthenticationSourceBiometric.js b/src/screens/Authentication/Sources/AuthenticationSourceBiometric.js index bfad9aaf..0b71b7db 100644 --- a/src/screens/Authentication/Sources/AuthenticationSourceBiometric.js +++ b/src/screens/Authentication/Sources/AuthenticationSourceBiometric.js @@ -18,6 +18,10 @@ export default class AuthenticationSourceBiometric extends AuthenticationSource }) } + get sort() { + return 2; + } + get identifier() { return "biometric-auth-source"; } diff --git a/src/screens/Authentication/Sources/AuthenticationSourceLocalPasscode.js b/src/screens/Authentication/Sources/AuthenticationSourceLocalPasscode.js index eeb31316..0685a946 100644 --- a/src/screens/Authentication/Sources/AuthenticationSourceLocalPasscode.js +++ b/src/screens/Authentication/Sources/AuthenticationSourceLocalPasscode.js @@ -13,6 +13,10 @@ export default class AuthenticationSourceLocalPasscode extends AuthenticationSou }); } + get sort() { + return 0; + } + get identifier() { return "local-passcode-auth-source"; } diff --git a/src/screens/Webview.js b/src/screens/ComponentView.js similarity index 77% rename from src/screens/Webview.js rename to src/screens/ComponentView.js index 39c3f0f5..ed959850 100644 --- a/src/screens/Webview.js +++ b/src/screens/ComponentView.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; -import { Alert, View, WebView, Linking, Platform, Text } from 'react-native'; +import { Alert, View, Linking, Platform, Text } from 'react-native'; +import { WebView } from 'react-native-webview'; import ComponentManager from '@Lib/componentManager' import ModelManager from '@Lib/sfjs/modelManager' @@ -8,7 +9,7 @@ import StyleKit from "@Style/StyleKit" import ApplicationState from "@Lib/ApplicationState" import Icon from 'react-native-vector-icons/Ionicons'; -export default class Webview extends Component { +export default class ComponentView extends Component { constructor(props) { super(props); @@ -25,12 +26,6 @@ export default class Webview extends Component { } }); - this.keyboardListener = ApplicationState.get().addEventHandler((event, data) => { - if(event == ApplicationState.KeyboardChangeEvent) { - this.webView.injectJavaScript(`window.scrollTo(0,0); document.body.scrollTop = 0`); - } - }); - this.reloadData(); if(!this.note) { @@ -49,7 +44,7 @@ export default class Webview extends Component { componentDidMount() { if(Platform.OS == "android" && Platform.Version <= 23) { // postMessage doesn't work on Android <= 6 (API version 23) https://github.com/facebook/react-native/issues/11594 - Alert.alert('Editors Not Supported', `Your version of Android does not support web editors. Changes you make may not be properly saved. Please switch to the Plain Editor for the best experience.`, [{text: 'OK'}]) + Alert.alert('Editors Not Supported', `Web editors require Android 7.0 or greater. Your version does not support web editors. Changes you make may not be properly saved. Please switch to the Plain Editor for the best experience.`, [{text: 'OK'}]) } } @@ -71,7 +66,6 @@ export default class Webview extends Component { componentWillUnmount() { ComponentManager.get().deregisterHandler(this.identifier); ComponentManager.get().deactivateComponent(this.editor); - ApplicationState.get().removeEventHandler(this.keyboardListener); } onMessage = (message) => { @@ -80,7 +74,7 @@ export default class Webview extends Component { return; } - var data; + let data; try { data = JSON.parse(message.nativeEvent.data); } catch (e) { @@ -88,14 +82,6 @@ export default class Webview extends Component { return; } - // Ignore any incoming events (like save events) if the note is locked. Allow messages that are required for component setup (administrative) - if(this.note.locked && !ComponentManager.get().isReadOnlyMessage(data)) { - if(!this.didShowLockAlert) { - Alert.alert('Note Locked', "This note is locked. Changes you make in the web editor will not be saved. Please unlock this note to make changes.", [{text: 'OK'}]) - this.didShowLockAlert = true; - } - return; - } ComponentManager.get().handleMessage(this.editor, data); } @@ -107,6 +93,7 @@ export default class Webview extends Component { if(this.registrationTimeout) { clearTimeout(this.registrationTimeout); } + this.registrationTimeout = setTimeout(() => { ComponentManager.get().registerComponentWindow(this.editor, this.webView); }, 1); @@ -134,6 +121,26 @@ export default class Webview extends Component { this.props.onLoadError(); } + onShouldStartLoadWithRequest = (request) => { + /* + We want to handle link clicks within an editor by opening the browser instead of loading inline. + On iOS, onShouldStartLoadWithRequest is called for all requests including the initial request to load the editor. + On iOS, clicks in the editors have a navigationType of 'click', but on Android, this is not the case (no navigationType). + However, on Android, this function is not called for the initial request. + So that might be one way to determine if this request is a click or the actual editor load request. + But I don't think it's safe to rely on this being the case in the future. + So on Android, we'll handle url loads only if the url isn't equal to the editor url. + */ + + let editorUrl = ComponentManager.get().urlForComponent(this.editor); + if((ApplicationState.isIOS && request.navigationType == 'click') + || (ApplicationState.isAndroid && request.url != editorUrl)) { + ApplicationState.openURL(request.url); + return false; + } + return true; + } + render() { var editor = this.editor; var url = ComponentManager.get().urlForComponent(editor); @@ -158,12 +165,17 @@ export default class Webview extends Component { onMessage={this.onMessage} useWebKit={true} hideKeyboardAccessoryView={true} + onShouldStartLoadWithRequest={this.onShouldStartLoadWithRequest} cacheEnabled={true} - automaticallyAdjustContentInsets={false} - contentInset={{top: 0, left: 0, bottom: 0, right: 0}} scalesPageToFit={true /* Android only, not available with WKWebView */} injectedJavaScript = { - `window.isNative = "true"` + `(function() { + window.parent.postMessage = function(data) { + window.parent.ReactNativeWebView.postMessage(data); + }; + + return true; + })()` } /> diff --git a/src/screens/Compose.js b/src/screens/Compose.js index 0f1b3c3f..65747abf 100644 --- a/src/screens/Compose.js +++ b/src/screens/Compose.js @@ -7,7 +7,7 @@ import OptionsState from "@Lib/OptionsState" import SideMenuManager from "@SideMenu/SideMenuManager" import Abstract from "./Abstract" -import Webview from "./Webview" +import ComponentView from "./ComponentView" import ComponentManager from '@Lib/componentManager' import ApplicationState from "@Lib/ApplicationState" import LockedView from "@Containers/LockedView"; @@ -351,6 +351,7 @@ export default class Compose extends Abstract { } showSavedStatus(success) { + const debouceMs = 300; // minimum time message is shown if(success) { if(this.statusTimeout) clearTimeout(this.statusTimeout); this.statusTimeout = setTimeout(() => { @@ -361,14 +362,14 @@ export default class Compose extends Abstract { this.saveError = false; this.syncTakingTooLong = false; this.setSubTitle(status); - }, 200) + }, debouceMs) } else { if(this.statusTimeout) clearTimeout(this.statusTimeout); this.statusTimeout = setTimeout(function(){ this.saveError = true; this.syncTakingTooLong = false; this.setSubTitle("Sync Unavailable (changes saved offline)", StyleKit.variables.stylekitWarningColor); - }.bind(this), 200) + }.bind(this), debouceMs) } } @@ -403,7 +404,7 @@ export default class Compose extends Abstract { } } this.save(); - }, 275) + }, 325); } sync(note, callback) { @@ -510,7 +511,7 @@ export default class Compose extends Abstract { } {shouldDisplayEditor && - { // Debounce + const delay = 25; this.selectionTimeout = setTimeout(() => { this.setState({selected: true}); - }, 30); + }, delay); }; _onPressOut = () => { @@ -152,6 +153,13 @@ export default class NoteCell extends ThemedPureComponent { }) } + if(note.content.conflict_of) { + flags.push({ + text: "Conflicted Copy", + color: StyleKit.variables.stylekitDangerColor + }) + } + return flags; } @@ -200,10 +208,6 @@ export default class NoteCell extends ThemedPureComponent { Deleting... } - {note.conflict_of && - Conflicted Copy - } - {flags.length > 0 && {flags.map((flag) => diff --git a/src/screens/Notes/NoteList.js b/src/screens/Notes/NoteList.js index 3907c3b1..82aa2bc4 100644 --- a/src/screens/Notes/NoteList.js +++ b/src/screens/Notes/NoteList.js @@ -60,6 +60,7 @@ export default class NoteList extends ThemedComponent { locked={item.locked /* extraData */} protected={item.content.protected /* extraData */} hidePreview={item.content.hidePreview /* extraData */} + conflictOf={item.content.conflict_of /* extraData */} /> ) } diff --git a/src/screens/Notes/Notes.js b/src/screens/Notes/Notes.js index d2c397b3..74acbce8 100644 --- a/src/screens/Notes/Notes.js +++ b/src/screens/Notes/Notes.js @@ -332,7 +332,8 @@ export default class Notes extends Abstract { _onRefresh() { this.setSubTitle("Syncing..."); this.setState({refreshing: true}); - Sync.get().sync().then(() => { + // Perform integrity checks for hard reloads + Sync.get().sync({performIntegrityCheck: true}).then(() => { setTimeout(() => { this.setSubTitle(null); }, 100); @@ -353,8 +354,10 @@ export default class Notes extends Abstract { _onPressItem = (item: hash) => { var run = () => { - if(item.conflict_of) { - item.conflict_of = null; + if(item.content.conflict_of) { + item.content.conflict_of = null; + item.setDirty(true, true); + Sync.get().sync(); } this.selectNote(item); diff --git a/src/screens/Root.js b/src/screens/Root.js index 2af2d2b4..26e4c0f2 100644 --- a/src/screens/Root.js +++ b/src/screens/Root.js @@ -123,6 +123,7 @@ export default class Root extends Abstract { componentWillUnmount() { super.componentWillUnmount(); ApplicationState.get().removeStateObserver(this.stateObserver); + Sync.get().removeEventHandler(this.syncEventHandler); Sync.get().removeSyncStatusObserver(this.syncStatusObserver); clearInterval(this.syncTimer); } @@ -163,6 +164,9 @@ export default class Root extends Abstract { } initializeData() { + // Ensure no sync executes until initial data load + Sync.get().lockSyncing(); + let encryptionEnabled = KeysManager.get().isOfflineEncryptionEnabled(); this.setSubTitle(encryptionEnabled ? "Decrypting items..." : "Loading items..."); let incrementalCallback = (current, total) => { @@ -176,10 +180,12 @@ export default class Root extends Abstract { } let loadLocalCompletion = (items) => { + Sync.get().unlockSyncing(); this.setSubTitle("Syncing..."); this.dataLoaded = true; + // perform initial sync - Sync.get().sync().then(() => { + Sync.get().sync({performIntegrityCheck: true}).then(() => { this.setSubTitle(null); }); } diff --git a/src/screens/SideMenu/MainSideMenu.js b/src/screens/SideMenu/MainSideMenu.js index 76aeee45..ebbbab05 100644 --- a/src/screens/SideMenu/MainSideMenu.js +++ b/src/screens/SideMenu/MainSideMenu.js @@ -9,6 +9,7 @@ import ActionSheet from 'react-native-actionsheet' import Abstract from "@Screens/Abstract" import AlertManager from "@SFJS/alertManager" import Auth from "@SFJS/authManager" +import Sync from '@SFJS/syncManager' import SectionHeader from "@Components/SectionHeader"; import TableSection from "@Components/TableSection"; @@ -34,20 +35,41 @@ export default class MainSideMenu extends AbstractSideMenu { this.signoutObserver = Auth.get().addEventHandler((event) => { if(event == SFAuthManager.DidSignOutEvent) { + this.setState({outOfSync: false}); this.forceUpdate(); } }); + + this.syncEventHandler = Sync.get().addEventHandler((event, data) => { + if(event == "enter-out-of-sync") { + this.setState({outOfSync: true}); + } else if(event == "exit-out-of-sync") { + this.setState({outOfSync: false}); + } + }) } componentWillUnmount() { super.componentWillUnmount(); Auth.get().removeEventHandler(this.signoutObserver); + Sync.get().removeEventHandler(this.syncEventHandler); } presentSettings() { this.props.navigation.navigate("Settings"); } + outOfSyncPressed() { + AlertManager.get().confirm({ + title: "Potentially Out of Sync", + text: "We've detected that the data in the current application session may not match the data on the server. This can happen due to poor network conditions, or if a large note fails to download on your device. To resolve this issue, we recommend first creating a backup of your data in the Settings screen, the signing out of your account and signing back in.", + confirmButtonText: "Open Settings", + onConfirm: () => { + this.presentSettings(); + } + }) + } + get handler() { return SideMenuManager.get().getHandlerForLeftSideMenu(); } @@ -151,7 +173,11 @@ export default class MainSideMenu extends AbstractSideMenu { - {this.presentSettings()}}/> + {this.presentSettings()}} + onOutOfSyncPress={() => {this.outOfSyncPressed()}} + /> diff --git a/src/screens/SideMenu/SideMenuHero.js b/src/screens/SideMenu/SideMenuHero.js index 760a3c96..da139877 100644 --- a/src/screens/SideMenu/SideMenuHero.js +++ b/src/screens/SideMenu/SideMenuHero.js @@ -7,6 +7,7 @@ import ModelManager from "@SFJS/modelManager" import StyleKit from "@Style/StyleKit" import ThemedComponent from "@Components/ThemedComponent"; +import Circle from "@Components/Circle" export default class SideMenuHero extends ThemedComponent { @@ -43,6 +44,15 @@ export default class SideMenuHero extends ThemedComponent { {textData.text} + + {this.props.outOfSync && + + + + + Potentially Out of Sync + + } ) } @@ -70,6 +80,24 @@ export default class SideMenuHero extends ThemedComponent { fontSize: 13, color: StyleKit.variables.stylekitContrastForegroundColor, opacity: 0.6 + }, + + outOfSyncContainer: { + flex: 0, + flexDirection: 'row', + alignItems: "center" + }, + + iconCircle: { + marginTop: 10, + width: 15, + }, + + outOfSync: { + marginTop: 10, + fontSize: 13, + color: StyleKit.variables.stylekitWarningColor, + fontWeight: "bold" } } }