diff --git a/ios/.xcode.env.local b/ios/.xcode.env.local
new file mode 100644
index 0000000000..02cdf9420d
--- /dev/null
+++ b/ios/.xcode.env.local
@@ -0,0 +1 @@
+export NODE_BINARY="/Users/paulfrazee/.nvm/versions/node/v18.8.0/bin/node"
diff --git a/ios/Podfile.lock b/ios/Podfile.lock
new file mode 100644
index 0000000000..e489f570aa
--- /dev/null
+++ b/ios/Podfile.lock
@@ -0,0 +1,881 @@
+PODS:
+ - boost (1.76.0)
+ - BVLinearGradient (2.6.2):
+ - React-Core
+ - DoubleConversion (1.1.6)
+ - EXApplication (5.1.1):
+ - ExpoModulesCore
+ - EXCamera (13.2.1):
+ - ExpoModulesCore
+ - EXConstants (14.2.1):
+ - ExpoModulesCore
+ - EXFileSystem (15.2.2):
+ - ExpoModulesCore
+ - EXFont (11.1.1):
+ - ExpoModulesCore
+ - EXImageLoader (4.1.1):
+ - ExpoModulesCore
+ - React-Core
+ - EXJSONUtils (0.5.1)
+ - EXManifests (0.5.2):
+ - EXJSONUtils
+ - EXMediaLibrary (15.2.2):
+ - ExpoModulesCore
+ - React-Core
+ - Expo (48.0.6):
+ - ExpoModulesCore
+ - expo-dev-client (2.1.5):
+ - EXManifests
+ - expo-dev-launcher
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - EXUpdatesInterface
+ - expo-dev-launcher (2.1.5):
+ - EXManifests
+ - expo-dev-launcher/Main (= 2.1.5)
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - ExpoModulesCore
+ - EXUpdatesInterface
+ - React-Core
+ - expo-dev-launcher/Main (2.1.5):
+ - EXManifests
+ - expo-dev-launcher/Unsafe
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - ExpoModulesCore
+ - EXUpdatesInterface
+ - React-Core
+ - expo-dev-launcher/Unsafe (2.1.5):
+ - EXManifests
+ - expo-dev-menu
+ - expo-dev-menu-interface
+ - ExpoModulesCore
+ - EXUpdatesInterface
+ - React-Core
+ - expo-dev-menu (2.1.3):
+ - expo-dev-menu/Main (= 2.1.3)
+ - expo-dev-menu-interface (1.1.1)
+ - expo-dev-menu/GestureHandler (2.1.3)
+ - expo-dev-menu/Main (2.1.3):
+ - EXManifests
+ - expo-dev-menu-interface
+ - expo-dev-menu/Vendored
+ - ExpoModulesCore
+ - React-Core
+ - expo-dev-menu/Reanimated (2.1.3):
+ - DoubleConversion
+ - FBLazyVector
+ - FBReactNativeSpec
+ - glog
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-callinvoker
+ - React-Core
+ - React-Core/DevSupport
+ - React-Core/RCTWebSocket
+ - React-CoreModules
+ - React-cxxreact
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-RCTActionSheet
+ - React-RCTAnimation
+ - React-RCTBlob
+ - React-RCTImage
+ - React-RCTLinking
+ - React-RCTNetwork
+ - React-RCTSettings
+ - React-RCTText
+ - React-RCTVibration
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - expo-dev-menu/SafeAreaView (2.1.3)
+ - expo-dev-menu/Vendored (2.1.3):
+ - expo-dev-menu/GestureHandler
+ - expo-dev-menu/Reanimated
+ - expo-dev-menu/SafeAreaView
+ - ExpoImagePicker (14.1.1):
+ - ExpoModulesCore
+ - ExpoKeepAwake (12.0.1):
+ - ExpoModulesCore
+ - ExpoModulesCore (1.2.4):
+ - React-Core
+ - React-RCTAppDelegate
+ - ReactCommon/turbomodule/core
+ - EXSplashScreen (0.18.1):
+ - ExpoModulesCore
+ - React-Core
+ - EXUpdatesInterface (0.9.1)
+ - FBLazyVector (0.71.1)
+ - FBReactNativeSpec (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTRequired (= 0.71.1)
+ - RCTTypeSafety (= 0.71.1)
+ - React-Core (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - fmt (6.2.1)
+ - glog (0.3.5)
+ - hermes-engine (0.71.1):
+ - hermes-engine/Pre-built (= 0.71.1)
+ - hermes-engine/Pre-built (0.71.1)
+ - libevent (2.1.12)
+ - libwebp (1.2.4):
+ - libwebp/demux (= 1.2.4)
+ - libwebp/mux (= 1.2.4)
+ - libwebp/webp (= 1.2.4)
+ - libwebp/demux (1.2.4):
+ - libwebp/webp
+ - libwebp/mux (1.2.4):
+ - libwebp/demux
+ - libwebp/webp (1.2.4)
+ - RCT-Folly (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - RCT-Folly/Default (= 2021.07.22.00)
+ - RCT-Folly/Default (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - RCT-Folly/Futures (2021.07.22.00):
+ - boost
+ - DoubleConversion
+ - fmt (~> 6.2.1)
+ - glog
+ - libevent
+ - RCTRequired (0.71.1)
+ - RCTTypeSafety (0.71.1):
+ - FBLazyVector (= 0.71.1)
+ - RCTRequired (= 0.71.1)
+ - React-Core (= 0.71.1)
+ - React (0.71.1):
+ - React-Core (= 0.71.1)
+ - React-Core/DevSupport (= 0.71.1)
+ - React-Core/RCTWebSocket (= 0.71.1)
+ - React-RCTActionSheet (= 0.71.1)
+ - React-RCTAnimation (= 0.71.1)
+ - React-RCTBlob (= 0.71.1)
+ - React-RCTImage (= 0.71.1)
+ - React-RCTLinking (= 0.71.1)
+ - React-RCTNetwork (= 0.71.1)
+ - React-RCTSettings (= 0.71.1)
+ - React-RCTText (= 0.71.1)
+ - React-RCTVibration (= 0.71.1)
+ - React-callinvoker (0.71.1)
+ - React-Codegen (0.71.1):
+ - FBReactNativeSpec
+ - hermes-engine
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - React-jsi
+ - React-jsiexecutor
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - React-Core (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.71.1)
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/CoreModulesHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/Default (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/DevSupport (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.71.1)
+ - React-Core/RCTWebSocket (= 0.71.1)
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-jsinspector (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTActionSheetHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTAnimationHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTBlobHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTImageHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTLinkingHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTNetworkHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTSettingsHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTTextHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTVibrationHeaders (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-Core/RCTWebSocket (0.71.1):
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Core/Default (= 0.71.1)
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - Yoga
+ - React-CoreModules (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.1)
+ - React-Codegen (= 0.71.1)
+ - React-Core/CoreModulesHeaders (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-RCTImage (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-cxxreact (0.71.1):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-jsinspector (= 0.71.1)
+ - React-logger (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - React-runtimeexecutor (= 0.71.1)
+ - React-hermes (0.71.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - RCT-Folly/Futures (= 2021.07.22.00)
+ - React-cxxreact (= 0.71.1)
+ - React-jsiexecutor (= 0.71.1)
+ - React-jsinspector (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - React-jsi (0.71.1):
+ - boost (= 1.76.0)
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - RCT-Folly (= 2021.07.22.00)
+ - React-jsiexecutor (0.71.1):
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - React-jsinspector (0.71.1)
+ - React-logger (0.71.1):
+ - glog
+ - react-native-blur (4.3.0):
+ - React-Core
+ - react-native-cameraroll (5.2.4):
+ - React-Core
+ - react-native-image-resizer (3.0.5):
+ - React-Core
+ - react-native-pager-view (6.1.4):
+ - React-Core
+ - react-native-paste-input (0.6.2):
+ - React-Core
+ - Swime (= 3.0.6)
+ - react-native-safe-area-context (4.5.0):
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - ReactCommon/turbomodule/core
+ - react-native-splash-screen (3.3.0):
+ - React-Core
+ - react-native-version-number (0.3.6):
+ - React
+ - react-native-webview (11.26.1):
+ - React-Core
+ - React-perflogger (0.71.1)
+ - React-RCTActionSheet (0.71.1):
+ - React-Core/RCTActionSheetHeaders (= 0.71.1)
+ - React-RCTAnimation (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.1)
+ - React-Codegen (= 0.71.1)
+ - React-Core/RCTAnimationHeaders (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-RCTAppDelegate (0.71.1):
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-Core
+ - ReactCommon/turbomodule/core
+ - React-RCTBlob (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.71.1)
+ - React-Core/RCTBlobHeaders (= 0.71.1)
+ - React-Core/RCTWebSocket (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-RCTNetwork (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-RCTImage (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.1)
+ - React-Codegen (= 0.71.1)
+ - React-Core/RCTImageHeaders (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-RCTNetwork (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-RCTLinking (0.71.1):
+ - React-Codegen (= 0.71.1)
+ - React-Core/RCTLinkingHeaders (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-RCTNetwork (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.1)
+ - React-Codegen (= 0.71.1)
+ - React-Core/RCTNetworkHeaders (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-RCTSettings (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - RCTTypeSafety (= 0.71.1)
+ - React-Codegen (= 0.71.1)
+ - React-Core/RCTSettingsHeaders (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-RCTText (0.71.1):
+ - React-Core/RCTTextHeaders (= 0.71.1)
+ - React-RCTVibration (0.71.1):
+ - RCT-Folly (= 2021.07.22.00)
+ - React-Codegen (= 0.71.1)
+ - React-Core/RCTVibrationHeaders (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - ReactCommon/turbomodule/core (= 0.71.1)
+ - React-runtimeexecutor (0.71.1):
+ - React-jsi (= 0.71.1)
+ - ReactCommon/turbomodule/bridging (0.71.1):
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.71.1)
+ - React-Core (= 0.71.1)
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-logger (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - ReactCommon/turbomodule/core (0.71.1):
+ - DoubleConversion
+ - glog
+ - RCT-Folly (= 2021.07.22.00)
+ - React-callinvoker (= 0.71.1)
+ - React-Core (= 0.71.1)
+ - React-cxxreact (= 0.71.1)
+ - React-jsi (= 0.71.1)
+ - React-logger (= 0.71.1)
+ - React-perflogger (= 0.71.1)
+ - rn-fetch-blob (0.12.0):
+ - React-Core
+ - RNBackgroundFetch (4.1.8):
+ - React-Core
+ - RNCAsyncStorage (1.17.11):
+ - React-Core
+ - RNCClipboard (1.11.2):
+ - React-Core
+ - RNFastImage (8.6.3):
+ - React-Core
+ - SDWebImage (~> 5.11.1)
+ - SDWebImageWebPCoder (~> 0.8.4)
+ - RNFS (2.20.0):
+ - React-Core
+ - RNGestureHandler (2.9.0):
+ - React-Core
+ - RNImageCropPicker (0.38.1):
+ - React-Core
+ - React-RCTImage
+ - RNImageCropPicker/QBImagePickerController (= 0.38.1)
+ - TOCropViewController
+ - RNImageCropPicker/QBImagePickerController (0.38.1):
+ - React-Core
+ - React-RCTImage
+ - TOCropViewController
+ - RNInAppBrowser (3.7.0):
+ - React-Core
+ - RNNotifee (7.5.0):
+ - React-Core
+ - RNNotifee/NotifeeCore (= 7.5.0)
+ - RNNotifee/NotifeeCore (7.5.0):
+ - React-Core
+ - RNReactNativeHapticFeedback (1.14.0):
+ - React-Core
+ - RNReanimated (2.14.4):
+ - DoubleConversion
+ - FBLazyVector
+ - FBReactNativeSpec
+ - glog
+ - RCT-Folly
+ - RCTRequired
+ - RCTTypeSafety
+ - React-callinvoker
+ - React-Core
+ - React-Core/DevSupport
+ - React-Core/RCTWebSocket
+ - React-CoreModules
+ - React-cxxreact
+ - React-jsi
+ - React-jsiexecutor
+ - React-jsinspector
+ - React-RCTActionSheet
+ - React-RCTAnimation
+ - React-RCTBlob
+ - React-RCTImage
+ - React-RCTLinking
+ - React-RCTNetwork
+ - React-RCTSettings
+ - React-RCTText
+ - ReactCommon/turbomodule/core
+ - Yoga
+ - RNScreens (3.20.0):
+ - React-Core
+ - React-RCTImage
+ - RNSVG (12.5.1):
+ - React-Core
+ - SDWebImage (5.11.1):
+ - SDWebImage/Core (= 5.11.1)
+ - SDWebImage/Core (5.11.1)
+ - SDWebImageWebPCoder (0.8.5):
+ - libwebp (~> 1.0)
+ - SDWebImage/Core (~> 5.10)
+ - segment-analytics-react-native (2.13.1):
+ - React-Core
+ - sovran-react-native
+ - sovran-react-native (0.4.5):
+ - React-Core
+ - Swime (3.0.6)
+ - TOCropViewController (2.6.1)
+ - Yoga (1.14.0)
+
+DEPENDENCIES:
+ - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
+ - BVLinearGradient (from `../node_modules/react-native-linear-gradient`)
+ - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
+ - EXApplication (from `../node_modules/expo-application/ios`)
+ - EXCamera (from `../node_modules/expo-camera/ios`)
+ - EXConstants (from `../node_modules/expo-constants/ios`)
+ - EXFileSystem (from `../node_modules/expo-file-system/ios`)
+ - EXFont (from `../node_modules/expo-font/ios`)
+ - EXImageLoader (from `../node_modules/expo-image-loader/ios`)
+ - EXJSONUtils (from `../node_modules/expo-json-utils/ios`)
+ - EXManifests (from `../node_modules/expo-manifests/ios`)
+ - EXMediaLibrary (from `../node_modules/expo-media-library/ios`)
+ - Expo (from `../node_modules/expo`)
+ - expo-dev-client (from `../node_modules/expo-dev-client/ios`)
+ - expo-dev-launcher (from `../node_modules/expo-dev-launcher`)
+ - expo-dev-menu (from `../node_modules/expo-dev-menu`)
+ - expo-dev-menu-interface (from `../node_modules/expo-dev-menu-interface/ios`)
+ - ExpoImagePicker (from `../node_modules/expo-image-picker/ios`)
+ - ExpoKeepAwake (from `../node_modules/expo-keep-awake/ios`)
+ - ExpoModulesCore (from `../node_modules/expo-modules-core`)
+ - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`)
+ - EXUpdatesInterface (from `../node_modules/expo-updates-interface/ios`)
+ - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
+ - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
+ - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
+ - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
+ - libevent (~> 2.1.12)
+ - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
+ - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
+ - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
+ - React (from `../node_modules/react-native/`)
+ - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
+ - React-Codegen (from `build/generated/ios`)
+ - React-Core (from `../node_modules/react-native/`)
+ - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
+ - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
+ - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
+ - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`)
+ - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
+ - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
+ - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
+ - React-logger (from `../node_modules/react-native/ReactCommon/logger`)
+ - "react-native-blur (from `../node_modules/@react-native-community/blur`)"
+ - "react-native-cameraroll (from `../node_modules/@react-native-camera-roll/camera-roll`)"
+ - "react-native-image-resizer (from `../node_modules/@bam.tech/react-native-image-resizer`)"
+ - react-native-pager-view (from `../node_modules/react-native-pager-view`)
+ - "react-native-paste-input (from `../node_modules/@mattermost/react-native-paste-input`)"
+ - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
+ - react-native-splash-screen (from `../node_modules/react-native-splash-screen`)
+ - react-native-version-number (from `../node_modules/react-native-version-number`)
+ - react-native-webview (from `../node_modules/react-native-webview`)
+ - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
+ - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
+ - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
+ - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`)
+ - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
+ - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
+ - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
+ - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
+ - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
+ - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
+ - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
+ - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
+ - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
+ - rn-fetch-blob (from `../node_modules/rn-fetch-blob`)
+ - RNBackgroundFetch (from `../node_modules/react-native-background-fetch`)
+ - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)"
+ - "RNCClipboard (from `../node_modules/@react-native-clipboard/clipboard`)"
+ - RNFastImage (from `../node_modules/react-native-fast-image`)
+ - RNFS (from `../node_modules/react-native-fs`)
+ - RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
+ - RNImageCropPicker (from `../node_modules/react-native-image-crop-picker`)
+ - RNInAppBrowser (from `../node_modules/react-native-inappbrowser-reborn`)
+ - "RNNotifee (from `../node_modules/@notifee/react-native`)"
+ - RNReactNativeHapticFeedback (from `../node_modules/react-native-haptic-feedback`)
+ - RNReanimated (from `../node_modules/react-native-reanimated`)
+ - RNScreens (from `../node_modules/react-native-screens`)
+ - RNSVG (from `../node_modules/react-native-svg`)
+ - "segment-analytics-react-native (from `../node_modules/@segment/analytics-react-native`)"
+ - "sovran-react-native (from `../node_modules/@segment/sovran-react-native`)"
+ - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
+
+SPEC REPOS:
+ trunk:
+ - fmt
+ - libevent
+ - libwebp
+ - SDWebImage
+ - SDWebImageWebPCoder
+ - Swime
+ - TOCropViewController
+
+EXTERNAL SOURCES:
+ boost:
+ :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
+ BVLinearGradient:
+ :path: "../node_modules/react-native-linear-gradient"
+ DoubleConversion:
+ :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
+ EXApplication:
+ :path: "../node_modules/expo-application/ios"
+ EXCamera:
+ :path: "../node_modules/expo-camera/ios"
+ EXConstants:
+ :path: "../node_modules/expo-constants/ios"
+ EXFileSystem:
+ :path: "../node_modules/expo-file-system/ios"
+ EXFont:
+ :path: "../node_modules/expo-font/ios"
+ EXImageLoader:
+ :path: "../node_modules/expo-image-loader/ios"
+ EXJSONUtils:
+ :path: "../node_modules/expo-json-utils/ios"
+ EXManifests:
+ :path: "../node_modules/expo-manifests/ios"
+ EXMediaLibrary:
+ :path: "../node_modules/expo-media-library/ios"
+ Expo:
+ :path: "../node_modules/expo"
+ expo-dev-client:
+ :path: "../node_modules/expo-dev-client/ios"
+ expo-dev-launcher:
+ :path: "../node_modules/expo-dev-launcher"
+ expo-dev-menu:
+ :path: "../node_modules/expo-dev-menu"
+ expo-dev-menu-interface:
+ :path: "../node_modules/expo-dev-menu-interface/ios"
+ ExpoImagePicker:
+ :path: "../node_modules/expo-image-picker/ios"
+ ExpoKeepAwake:
+ :path: "../node_modules/expo-keep-awake/ios"
+ ExpoModulesCore:
+ :path: "../node_modules/expo-modules-core"
+ EXSplashScreen:
+ :path: "../node_modules/expo-splash-screen/ios"
+ EXUpdatesInterface:
+ :path: "../node_modules/expo-updates-interface/ios"
+ FBLazyVector:
+ :path: "../node_modules/react-native/Libraries/FBLazyVector"
+ FBReactNativeSpec:
+ :path: "../node_modules/react-native/React/FBReactNativeSpec"
+ glog:
+ :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
+ hermes-engine:
+ :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
+ RCT-Folly:
+ :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
+ RCTRequired:
+ :path: "../node_modules/react-native/Libraries/RCTRequired"
+ RCTTypeSafety:
+ :path: "../node_modules/react-native/Libraries/TypeSafety"
+ React:
+ :path: "../node_modules/react-native/"
+ React-callinvoker:
+ :path: "../node_modules/react-native/ReactCommon/callinvoker"
+ React-Codegen:
+ :path: build/generated/ios
+ React-Core:
+ :path: "../node_modules/react-native/"
+ React-CoreModules:
+ :path: "../node_modules/react-native/React/CoreModules"
+ React-cxxreact:
+ :path: "../node_modules/react-native/ReactCommon/cxxreact"
+ React-hermes:
+ :path: "../node_modules/react-native/ReactCommon/hermes"
+ React-jsi:
+ :path: "../node_modules/react-native/ReactCommon/jsi"
+ React-jsiexecutor:
+ :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
+ React-jsinspector:
+ :path: "../node_modules/react-native/ReactCommon/jsinspector"
+ React-logger:
+ :path: "../node_modules/react-native/ReactCommon/logger"
+ react-native-blur:
+ :path: "../node_modules/@react-native-community/blur"
+ react-native-cameraroll:
+ :path: "../node_modules/@react-native-camera-roll/camera-roll"
+ react-native-image-resizer:
+ :path: "../node_modules/@bam.tech/react-native-image-resizer"
+ react-native-pager-view:
+ :path: "../node_modules/react-native-pager-view"
+ react-native-paste-input:
+ :path: "../node_modules/@mattermost/react-native-paste-input"
+ react-native-safe-area-context:
+ :path: "../node_modules/react-native-safe-area-context"
+ react-native-splash-screen:
+ :path: "../node_modules/react-native-splash-screen"
+ react-native-version-number:
+ :path: "../node_modules/react-native-version-number"
+ react-native-webview:
+ :path: "../node_modules/react-native-webview"
+ React-perflogger:
+ :path: "../node_modules/react-native/ReactCommon/reactperflogger"
+ React-RCTActionSheet:
+ :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
+ React-RCTAnimation:
+ :path: "../node_modules/react-native/Libraries/NativeAnimation"
+ React-RCTAppDelegate:
+ :path: "../node_modules/react-native/Libraries/AppDelegate"
+ React-RCTBlob:
+ :path: "../node_modules/react-native/Libraries/Blob"
+ React-RCTImage:
+ :path: "../node_modules/react-native/Libraries/Image"
+ React-RCTLinking:
+ :path: "../node_modules/react-native/Libraries/LinkingIOS"
+ React-RCTNetwork:
+ :path: "../node_modules/react-native/Libraries/Network"
+ React-RCTSettings:
+ :path: "../node_modules/react-native/Libraries/Settings"
+ React-RCTText:
+ :path: "../node_modules/react-native/Libraries/Text"
+ React-RCTVibration:
+ :path: "../node_modules/react-native/Libraries/Vibration"
+ React-runtimeexecutor:
+ :path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
+ ReactCommon:
+ :path: "../node_modules/react-native/ReactCommon"
+ rn-fetch-blob:
+ :path: "../node_modules/rn-fetch-blob"
+ RNBackgroundFetch:
+ :path: "../node_modules/react-native-background-fetch"
+ RNCAsyncStorage:
+ :path: "../node_modules/@react-native-async-storage/async-storage"
+ RNCClipboard:
+ :path: "../node_modules/@react-native-clipboard/clipboard"
+ RNFastImage:
+ :path: "../node_modules/react-native-fast-image"
+ RNFS:
+ :path: "../node_modules/react-native-fs"
+ RNGestureHandler:
+ :path: "../node_modules/react-native-gesture-handler"
+ RNImageCropPicker:
+ :path: "../node_modules/react-native-image-crop-picker"
+ RNInAppBrowser:
+ :path: "../node_modules/react-native-inappbrowser-reborn"
+ RNNotifee:
+ :path: "../node_modules/@notifee/react-native"
+ RNReactNativeHapticFeedback:
+ :path: "../node_modules/react-native-haptic-feedback"
+ RNReanimated:
+ :path: "../node_modules/react-native-reanimated"
+ RNScreens:
+ :path: "../node_modules/react-native-screens"
+ RNSVG:
+ :path: "../node_modules/react-native-svg"
+ segment-analytics-react-native:
+ :path: "../node_modules/@segment/analytics-react-native"
+ sovran-react-native:
+ :path: "../node_modules/@segment/sovran-react-native"
+ Yoga:
+ :path: "../node_modules/react-native/ReactCommon/yoga"
+
+SPEC CHECKSUMS:
+ boost: 57d2868c099736d80fcd648bf211b4431e51a558
+ BVLinearGradient: 34a999fda29036898a09c6a6b728b0b4189e1a44
+ DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
+ EXApplication: d8f53a7eee90a870a75656280e8d4b85726ea903
+ EXCamera: a323a5942b5e7fc8349e17d728e91c18840ad561
+ EXConstants: f348da07e21b23d2b085e270d7b74f282df1a7d9
+ EXFileSystem: 844e86ca9b5375486ecc4ef06d3838d5597d895d
+ EXFont: 6ea3800df746be7233208d80fe379b8ed74f4272
+ EXImageLoader: fd053169a8ee932dd83bf1fe5487a50c26d27c2b
+ EXJSONUtils: 48b1e764ac35160e6f54d21ab60d7d9501f3e473
+ EXManifests: 500666d48e8dd7ca5a482c9e729e4a7a6c34081b
+ EXMediaLibrary: 792fe9b828b5bfa2c5a8b629730f175af2938285
+ Expo: 04ba1ddde0be07aff4306ae636a1804810679145
+ expo-dev-client: 7c1ef51516853465f4d448c14ddf365167d20361
+ expo-dev-launcher: 90de99d9e5d1a883d81355ca10e87c2f3c81d46e
+ expo-dev-menu: 6e08131cecb399ef306fbbe1ea14b99b473e9bfc
+ expo-dev-menu-interface: 6c82ae323c4b8724dead4763ce3ff24a2108bdb1
+ ExpoImagePicker: 270dea232b3a072d981dd564e2cafc63a864edb1
+ ExpoKeepAwake: 69f5f627670d62318410392d03e0b5db0f85759a
+ ExpoModulesCore: 1667335d4f4c9b7801990930e6f0eea42c916a21
+ EXSplashScreen: cd7fb052dff5ba8311d5c2455ecbebffe1b7a8ca
+ EXUpdatesInterface: dd699d1930e28639dcbd70a402caea98e86364ca
+ FBLazyVector: ad72713385db5289b19f1ead07e8e4aa26dcb01d
+ FBReactNativeSpec: df2602c11e33d310433496e28a48b4b2be652a61
+ fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
+ glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
+ hermes-engine: 922ccd744f50d9bfde09e9677bf0f3b562ea5fb9
+ libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
+ libwebp: f62cb61d0a484ba548448a4bd52aabf150ff6eef
+ RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1
+ RCTRequired: fd4d923b964658aa0c4091a32c8b2004c6d9e3a6
+ RCTTypeSafety: c276d85975bde3d8448907235c70bf0da257adfd
+ React: e481a67971af1ce9639c9f746b753dd0e84ca108
+ React-callinvoker: 1051c04a94fa9d243786b86380606bad701a3b31
+ React-Codegen: 14b1e716d361d5ad95e0ce1a338f3fa0733a98b5
+ React-Core: 698fc3baecb80d511d987475a16d036cec6d287f
+ React-CoreModules: 59245305f41ff0adfeac334acc0594dea4585a7c
+ React-cxxreact: 49accd2954b0f532805dbcd1918fa6962f32f247
+ React-hermes: d068733294581a085e95b6024e8d951b005e26d3
+ React-jsi: 122b9bce14f4c6c7cb58f28f87912cfe091885fa
+ React-jsiexecutor: 60cf272aababc5212410e4249d17cea14fc36caa
+ React-jsinspector: ff56004b0c974b688a6548c156d5830ad751ae07
+ React-logger: 60a0b5f8bed667ecf9e24fecca1f30d125de6d75
+ react-native-blur: 50c9feabacbc5f49b61337ebc32192c6be7ec3c3
+ react-native-cameraroll: cb752fda6d5268f1646b4390bd5be1f27706b9a0
+ react-native-image-resizer: 00ceb0e05586c7aadf061eea676957a6c2ec60fa
+ react-native-pager-view: b58cb9e9f42f64e50cab3040815772c1d119a2e2
+ react-native-paste-input: 3392800944a47c00dddbff23c31c281482209679
+ react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc
+ react-native-splash-screen: 4312f786b13a81b5169ef346d76d33bc0c6dc457
+ react-native-version-number: b415bbec6a13f2df62bf978e85bc0d699462f37f
+ react-native-webview: 9f111dfbcfc826084d6c507f569e5e03342ee1c1
+ React-perflogger: ec8eef2a8f03ecfa6361c2c5fb9197ef4a29cc85
+ React-RCTActionSheet: a0c023b86cf4c862fa9c4eb0f6f91fbe878fb2de
+ React-RCTAnimation: 168d53718c74153947c0109f55900faa64d79439
+ React-RCTAppDelegate: a8efbab128b34aa07a9491c85a41401210b1bec5
+ React-RCTBlob: 9bcbfc893bfda9f6b2eb016329d38c0f6366d31a
+ React-RCTImage: 3fcd4570b4b0f1ac2f4b4b6308dba33ce66c5b50
+ React-RCTLinking: 1edb8e1bb3fc39bf9e13c63d6aaaa3f0c3d18683
+ React-RCTNetwork: 500a79e0e0f67678077df727fabba87a55c043e1
+ React-RCTSettings: cc4414eb84ad756d619076c3999fecbf12896d6f
+ React-RCTText: 2a34261f3da6e34f47a62154def657546ebfa5e1
+ React-RCTVibration: 49d531ec8498e0afa2c9b22c2205784372e3d4f3
+ React-runtimeexecutor: 311feb67600774723fe10eb8801d3138cae9ad67
+ ReactCommon: 03be76588338a27a88d103b35c3c44a3fd43d136
+ rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba
+ RNBackgroundFetch: 8e16176ff415daac743a6eb57afc8e9e14dbe623
+ RNCAsyncStorage: 8616bd5a58af409453ea4e1b246521bb76578d60
+ RNCClipboard: 3f0451a8100393908bea5c5c5b16f96d45f30bfc
+ RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
+ RNFS: 4ac0f0ea233904cb798630b3c077808c06931688
+ RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
+ RNImageCropPicker: 648356d68fbf9911a1016b3e3723885d28373eda
+ RNInAppBrowser: e36d6935517101ccba0e875bac8ad7b0cb655364
+ RNNotifee: 053c0ace9c73634709a0214fd9c436a5777a562f
+ RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c
+ RNReanimated: cc5e3aa479cb9170bcccf8204291a6950a3be128
+ RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f
+ RNSVG: d7d7bc8229af3842c9cfc3a723c815a52cdd1105
+ SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
+ SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
+ segment-analytics-react-native: f962dff3a084655a29f9403b8c139c75a3362524
+ sovran-react-native: fd3dc8f1a4b14acdc4ad25fc6b4ac4f52a2a2a15
+ Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
+ TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
+ Yoga: 921eb014669cf9c718ada68b08d362517d564e0c
+
+PODFILE CHECKSUM: 5570c7b7d6ce7895f95d9db8a3a99b136a3f42c4
+
+COCOAPODS: 1.11.3
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png
new file mode 100644
index 0000000000..fea9a3533d
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png
new file mode 100644
index 0000000000..299b8c1005
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png
new file mode 100644
index 0000000000..30fe7e1f08
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png
new file mode 100644
index 0000000000..ba88e11113
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png
new file mode 100644
index 0000000000..093b2f9313
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png
new file mode 100644
index 0000000000..f391f36620
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png
new file mode 100644
index 0000000000..299b8c1005
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png
new file mode 100644
index 0000000000..140a420ab0
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png
new file mode 100644
index 0000000000..f8e4593041
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png
new file mode 100644
index 0000000000..f8e4593041
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png
new file mode 100644
index 0000000000..0a2ce9f158
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png
new file mode 100644
index 0000000000..cb5bd19880
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png
new file mode 100644
index 0000000000..a416fe21aa
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png
new file mode 100644
index 0000000000..4263af789a
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png differ
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/bluesky/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000000..f920cb0ec1
--- /dev/null
+++ b/ios/bluesky/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images": [
+ {
+ "idiom": "iphone",
+ "size": "20x20",
+ "scale": "2x",
+ "filename": "App-Icon-20x20@2x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "20x20",
+ "scale": "3x",
+ "filename": "App-Icon-20x20@3x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "scale": "1x",
+ "filename": "App-Icon-29x29@1x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "scale": "2x",
+ "filename": "App-Icon-29x29@2x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "29x29",
+ "scale": "3x",
+ "filename": "App-Icon-29x29@3x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "40x40",
+ "scale": "2x",
+ "filename": "App-Icon-40x40@2x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "40x40",
+ "scale": "3x",
+ "filename": "App-Icon-40x40@3x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "60x60",
+ "scale": "2x",
+ "filename": "App-Icon-60x60@2x.png"
+ },
+ {
+ "idiom": "iphone",
+ "size": "60x60",
+ "scale": "3x",
+ "filename": "App-Icon-60x60@3x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "20x20",
+ "scale": "1x",
+ "filename": "App-Icon-20x20@1x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "20x20",
+ "scale": "2x",
+ "filename": "App-Icon-20x20@2x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "29x29",
+ "scale": "1x",
+ "filename": "App-Icon-29x29@1x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "29x29",
+ "scale": "2x",
+ "filename": "App-Icon-29x29@2x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "40x40",
+ "scale": "1x",
+ "filename": "App-Icon-40x40@1x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "40x40",
+ "scale": "2x",
+ "filename": "App-Icon-40x40@2x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "76x76",
+ "scale": "1x",
+ "filename": "App-Icon-76x76@1x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "76x76",
+ "scale": "2x",
+ "filename": "App-Icon-76x76@2x.png"
+ },
+ {
+ "idiom": "ipad",
+ "size": "83.5x83.5",
+ "scale": "2x",
+ "filename": "App-Icon-83.5x83.5@2x.png"
+ },
+ {
+ "idiom": "ios-marketing",
+ "size": "1024x1024",
+ "scale": "1x",
+ "filename": "ItunesArtwork@2x.png"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "expo"
+ }
+}
\ No newline at end of file
diff --git a/ios/bluesky/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/ios/bluesky/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png
new file mode 100644
index 0000000000..35e5b79b2f
Binary files /dev/null and b/ios/bluesky/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png differ
diff --git a/ios/bluesky/Images.xcassets/Contents.json b/ios/bluesky/Images.xcassets/Contents.json
new file mode 100644
index 0000000000..ed285c2e5f
--- /dev/null
+++ b/ios/bluesky/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "expo"
+ }
+}
diff --git a/ios/bluesky/Images.xcassets/SplashScreen.imageset/Contents.json b/ios/bluesky/Images.xcassets/SplashScreen.imageset/Contents.json
new file mode 100644
index 0000000000..3cf8489772
--- /dev/null
+++ b/ios/bluesky/Images.xcassets/SplashScreen.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images": [
+ {
+ "idiom": "universal",
+ "filename": "image.png",
+ "scale": "1x"
+ },
+ {
+ "idiom": "universal",
+ "scale": "2x"
+ },
+ {
+ "idiom": "universal",
+ "scale": "3x"
+ }
+ ],
+ "info": {
+ "version": 1,
+ "author": "expo"
+ }
+}
\ No newline at end of file
diff --git a/ios/bluesky/Images.xcassets/SplashScreen.imageset/image.png b/ios/bluesky/Images.xcassets/SplashScreen.imageset/image.png
new file mode 100644
index 0000000000..e0e67b90ac
Binary files /dev/null and b/ios/bluesky/Images.xcassets/SplashScreen.imageset/image.png differ
diff --git a/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/Contents.json b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/Contents.json
new file mode 100644
index 0000000000..ded1a4df0e
--- /dev/null
+++ b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "icon 2.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "icon.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "icon 1.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon 1.png b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon 1.png
new file mode 100644
index 0000000000..1dda9a342c
Binary files /dev/null and b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon 1.png differ
diff --git a/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon 2.png b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon 2.png
new file mode 100644
index 0000000000..1dda9a342c
Binary files /dev/null and b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon 2.png differ
diff --git a/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon.png b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon.png
new file mode 100644
index 0000000000..1dda9a342c
Binary files /dev/null and b/ios/bluesky/Images.xcassets/SplashScreenBackground.imageset/icon.png differ
diff --git a/ios/bluesky/SplashScreen.storyboard b/ios/bluesky/SplashScreen.storyboard
new file mode 100644
index 0000000000..36ea46d75c
--- /dev/null
+++ b/ios/bluesky/SplashScreen.storyboard
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jest/jestSetup.js b/jest/jestSetup.js
index 461aee20ac..c3f82a8723 100644
--- a/jest/jestSetup.js
+++ b/jest/jestSetup.js
@@ -64,10 +64,6 @@ jest.mock('@segment/analytics-react-native', () => ({
}),
}))
-jest.mock('react-native-permissions', () =>
- require('react-native-permissions/mock'),
-)
-
jest.mock('expo-camera', () => ({
Camera: {
useCameraPermissions: jest.fn(() => [true]),
diff --git a/package.json b/package.json
index 6ec8099401..2537aa3175 100644
--- a/package.json
+++ b/package.json
@@ -73,7 +73,6 @@
"react-native-inappbrowser-reborn": "^3.6.3",
"react-native-linear-gradient": "^2.6.2",
"react-native-pager-view": "^6.0.2",
- "react-native-permissions": "^3.6.1",
"react-native-progress": "^5.0.0",
"react-native-reanimated": "^2.9.1",
"react-native-root-siblings": "^4.1.1",
diff --git a/src/lib/analytics.tsx b/src/lib/analytics.tsx
index 5358a86821..725dd2328e 100644
--- a/src/lib/analytics.tsx
+++ b/src/lib/analytics.tsx
@@ -16,7 +16,7 @@ export function init(store: RootStoreModel) {
// this method is a copy of segment's own lifecycle event tracking
// we handle it manually to ensure that it never fires while the app is backgrounded
// -prf
- segmentClient.onContextLoaded(() => {
+ segmentClient.isReady.onChange(() => {
if (AppState.currentState !== 'active') {
store.log.debug('Prevented a metrics ping while the app was backgrounded')
return
diff --git a/src/lib/hooks/usePermissions.ts b/src/lib/hooks/usePermissions.ts
new file mode 100644
index 0000000000..1bb7a01f8e
--- /dev/null
+++ b/src/lib/hooks/usePermissions.ts
@@ -0,0 +1,50 @@
+import {Alert} from 'react-native'
+import {Camera} from 'expo-camera'
+import * as MediaLibrary from 'expo-media-library'
+import {Linking} from 'react-native'
+
+const openSettings = () => {
+ Linking.openURL('app-settings:')
+}
+
+const openPermissionAlert = (perm: string) => {
+ Alert.alert(
+ 'Permission needed',
+ `Bluesky does not have permission to access your ${perm}.`,
+ [
+ {
+ text: 'Cancel',
+ style: 'cancel',
+ },
+ {text: 'Open Settings', onPress: () => openSettings()},
+ ],
+ )
+}
+
+export function usePhotoLibraryPermission() {
+ const [mediaLibraryPermissions] = MediaLibrary.usePermissions()
+ const requestPhotoAccessIfNeeded = async () => {
+ if (mediaLibraryPermissions?.status === 'granted') {
+ return true
+ } else {
+ openPermissionAlert('photo library')
+ return false
+ }
+ }
+ return {requestPhotoAccessIfNeeded}
+}
+
+export function useCameraPermission() {
+ const [cameraPermissionStatus] = Camera.useCameraPermissions()
+
+ const requestCameraAccessIfNeeded = async () => {
+ if (cameraPermissionStatus.granted) {
+ return true
+ } else {
+ openPermissionAlert('camera')
+ return false
+ }
+ }
+
+ return {requestCameraAccessIfNeeded}
+}
diff --git a/src/lib/permissions.ts b/src/lib/permissions.ts
deleted file mode 100644
index ab2c73ca6c..0000000000
--- a/src/lib/permissions.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import {Alert} from 'react-native'
-import {
- check,
- openSettings,
- Permission,
- PermissionStatus,
- PERMISSIONS,
- RESULTS,
-} from 'react-native-permissions'
-
-export const PHOTO_LIBRARY = PERMISSIONS.IOS.PHOTO_LIBRARY
-export const CAMERA = PERMISSIONS.IOS.CAMERA
-
-/**
- * Returns `true` if the user has granted permission or hasn't made
- * a decision yet. Returns `false` if unavailable or not granted.
- */
-export async function hasAccess(perm: Permission): Promise {
- const status = await check(perm)
- return isntANo(status)
-}
-
-export async function requestAccessIfNeeded(
- perm: Permission,
-): Promise {
- if (await hasAccess(perm)) {
- return true
- }
- let permDescription
- if (perm === PHOTO_LIBRARY) {
- permDescription = 'photo library'
- } else if (perm === CAMERA) {
- permDescription = 'camera'
- } else {
- return false
- }
- Alert.alert(
- 'Permission needed',
- `Bluesky does not have permission to access your ${permDescription}.`,
- [
- {
- text: 'Cancel',
- style: 'cancel',
- },
- {text: 'Open Settings', onPress: () => openSettings()},
- ],
- )
- return false
-}
-
-export async function requestPhotoAccessIfNeeded() {
- return requestAccessIfNeeded(PHOTO_LIBRARY)
-}
-
-export async function requestCameraAccessIfNeeded() {
- return requestAccessIfNeeded(CAMERA)
-}
-
-function isntANo(status: PermissionStatus): boolean {
- return status !== RESULTS.UNAVAILABLE && status !== RESULTS.BLOCKED
-}
diff --git a/src/lib/permissions.web.ts b/src/lib/permissions.web.ts
deleted file mode 100644
index 5b69637ed6..0000000000
--- a/src/lib/permissions.web.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-At the moment, Web doesn't have any equivalence for these.
-*/
-
-export const PHOTO_LIBRARY = ''
-export const CAMERA = ''
-
-export async function hasAccess(_perm: any): Promise {
- return true
-}
-
-export async function requestAccessIfNeeded(_perm: any): Promise {
- return true
-}
-
-export async function requestPhotoAccessIfNeeded() {
- return requestAccessIfNeeded(PHOTO_LIBRARY)
-}
-
-export async function requestCameraAccessIfNeeded() {
- return requestAccessIfNeeded(CAMERA)
-}
diff --git a/src/view/com/composer/photos/PhotoCarouselPicker.tsx b/src/view/com/composer/photos/PhotoCarouselPicker.tsx
index 580e9746ea..e8747f74e9 100644
--- a/src/view/com/composer/photos/PhotoCarouselPicker.tsx
+++ b/src/view/com/composer/photos/PhotoCarouselPicker.tsx
@@ -18,9 +18,9 @@ import {compressIfNeeded} from 'lib/media/manip'
import {usePalette} from 'lib/hooks/usePalette'
import {useStores} from 'state/index'
import {
- requestPhotoAccessIfNeeded,
- requestCameraAccessIfNeeded,
-} from 'lib/permissions'
+ usePhotoLibraryPermission,
+ useCameraPermission,
+} from 'lib/hooks/usePermissions'
import {
POST_IMG_MAX_WIDTH,
POST_IMG_MAX_HEIGHT,
@@ -38,6 +38,8 @@ export const PhotoCarouselPicker = ({
const pal = usePalette('default')
const store = useStores()
const [isSetup, setIsSetup] = React.useState(false)
+ const {requestCameraAccessIfNeeded} = useCameraPermission()
+ const {requestPhotoAccessIfNeeded} = usePhotoLibraryPermission()
const localPhotos = React.useMemo(
() => new UserLocalPhotosModel(store),
@@ -68,7 +70,7 @@ export const PhotoCarouselPicker = ({
// ignore
store.log.warn('Error using camera', err)
}
- }, [store, selectedPhotos, onSelectPhotos])
+ }, [store, selectedPhotos, onSelectPhotos, requestCameraAccessIfNeeded])
const handleSelectPhoto = useCallback(
async (item: PhotoIdentifier) => {
@@ -116,7 +118,7 @@ export const PhotoCarouselPicker = ({
)
}
onSelectPhotos([...selectedPhotos, ...result])
- }, [track, store, selectedPhotos, onSelectPhotos])
+ }, [track, store, selectedPhotos, onSelectPhotos, requestPhotoAccessIfNeeded])
return (
(