From 75490e9967cde64f7d97c14f886b3171a748a8ca Mon Sep 17 00:00:00 2001 From: Maria Marchenkova <35371977+marchenk0va@users.noreply.github.com> Date: Fri, 22 May 2020 18:09:44 +0200 Subject: [PATCH] [ios] Add vendored @react-native-community/segmented-control (#8038) --- apps/bare-expo/package.json | 1 + apps/native-component-list/package.json | 1 + .../src/navigation/ExpoComponents.ts | 2 + .../src/screens/ExpoComponentsScreen.tsx | 1 + .../src/screens/SegmentedControlScreen.tsx | 104 +++++ docs/common/navigation.js | 1 + .../SegmentedControl/RNSegmentedControl.h | 17 + .../SegmentedControl/RNSegmentedControl.m | 111 +++++ .../RNSegmentedControlManager.h | 12 + .../RNSegmentedControlManager.m | 34 ++ packages/expo/bundledNativeModules.json | 1 + .../src/commands/UpdateVendoredModule.ts | 10 + yarn.lock | 399 +++++++++++++++++- 13 files changed, 693 insertions(+), 1 deletion(-) create mode 100644 apps/native-component-list/src/screens/SegmentedControlScreen.tsx create mode 100644 ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.h create mode 100644 ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.m create mode 100644 ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.h create mode 100644 ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.m diff --git a/apps/bare-expo/package.json b/apps/bare-expo/package.json index a669fc60c31b0..457ea963f77c5 100644 --- a/apps/bare-expo/package.json +++ b/apps/bare-expo/package.json @@ -79,6 +79,7 @@ }, "dependencies": { "@babel/runtime": "^7.5.5", + "@react-native-community/segmented-control": "^1.4.0", "@react-navigation/web": "2.0.0-alpha.0", "expo": "~37.0.6", "expo-image": "~1.0.0-alpha.0", diff --git a/apps/native-component-list/package.json b/apps/native-component-list/package.json index faa8aa6c55e4f..791dbf1e20a52 100644 --- a/apps/native-component-list/package.json +++ b/apps/native-component-list/package.json @@ -16,6 +16,7 @@ "@react-native-community/datetimepicker": "2.2.2", "@react-native-community/masked-view": "0.1.6", "@react-native-community/netinfo": "5.5.0", + "@react-native-community/segmented-control": "^1.4.0", "@react-native-community/viewpager": "3.3.0", "@react-navigation/web": "2.0.0-alpha.0", "date-format": "^2.0.0", diff --git a/apps/native-component-list/src/navigation/ExpoComponents.ts b/apps/native-component-list/src/navigation/ExpoComponents.ts index e7bca43f29020..0bc43db1bd2d1 100644 --- a/apps/native-component-list/src/navigation/ExpoComponents.ts +++ b/apps/native-component-list/src/navigation/ExpoComponents.ts @@ -36,6 +36,7 @@ const ReanimatedImagePreview = optionalRequire(() => const ReanimatedProgress = optionalRequire(() => require('../screens/Reanimated/ReanimatedProgressScreen') ); +const SegmentedControl = optionalRequire(() => require('../screens/SegmentedControlScreen')); const SVGExample = optionalRequire(() => require('../screens/SVG/SVGExampleScreen')); const SVG = optionalRequire(() => require('../screens/SVG/SVGScreen')); const SharedElement = optionalRequire(() => require('../screens/SharedElementScreen')); @@ -67,6 +68,7 @@ const optionalScreens: { [key: string]: React.ComponentType | null } = { ReanimatedProgress, Gif, FacebookAds, + SegmentedControl, SVG, SVGExample, LinearGradient, diff --git a/apps/native-component-list/src/screens/ExpoComponentsScreen.tsx b/apps/native-component-list/src/screens/ExpoComponentsScreen.tsx index db0483c44ea1f..090f1da30958e 100644 --- a/apps/native-component-list/src/screens/ExpoComponentsScreen.tsx +++ b/apps/native-component-list/src/screens/ExpoComponentsScreen.tsx @@ -36,6 +36,7 @@ export default class ExpoComponentsScreen extends React.Component { 'MaskedView', 'ReanimatedImagePreview', 'ReanimatedProgress', + 'SegmentedControl', 'Screens', 'SharedElement', 'SVG', diff --git a/apps/native-component-list/src/screens/SegmentedControlScreen.tsx b/apps/native-component-list/src/screens/SegmentedControlScreen.tsx new file mode 100644 index 0000000000000..c6090205391dd --- /dev/null +++ b/apps/native-component-list/src/screens/SegmentedControlScreen.tsx @@ -0,0 +1,104 @@ +import SegmentedControl from '@react-native-community/segmented-control'; +import React, { useState } from 'react'; +import { StyleSheet, ScrollView, Text, View } from 'react-native'; + +// This example is a copy from https://github.com/react-native-community/segmented-control/blob/master/example + +const SegmentedControlScreen = () => { + const [values] = useState(['One', 'Two', 'Three']); + const [value, setValue] = useState('Unselected'); + const [selectedIndex, setIndex] = useState(undefined); + + const _onChange = event => { + setIndex(event.nativeEvent.selectedSegmentIndex); + }; + + const _onValueChange = (value: string) => { + setValue(value); + }; + + return ( + + + Segmented controls can have values + + + + + + + + + Segmented controls can have pre-selected values + + + + + Segmented controls can be momentary + + + + + Segmented controls can be disabled + + + + + Custom colors can be provided + + + + + + + + + + + Custom colors can be provided + + + + + Value: {value} Index: {selectedIndex} + + + + ); +}; + +const styles = StyleSheet.create({ + text: { + fontSize: 14, + textAlign: 'center', + fontWeight: '500', + margin: 10, + }, + segmentContainer: { + marginBottom: 10, + }, + segmentSection: { + marginBottom: 25, + }, + container: { + paddingTop: 80, + }, +}); + +export default SegmentedControlScreen; diff --git a/docs/common/navigation.js b/docs/common/navigation.js index d23020602e64d..03b89583a9d09 100644 --- a/docs/common/navigation.js +++ b/docs/common/navigation.js @@ -195,6 +195,7 @@ const sections = [ 'SafeAreaView', 'ScrollView', 'SectionList', + 'SegmentedControl', 'SegmentedControlIOS', 'Slider', 'SnapshotViewIOS', diff --git a/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.h b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.h new file mode 100644 index 0000000000000..f64aaff560b86 --- /dev/null +++ b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.h @@ -0,0 +1,17 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +#import + +@interface RNCSegmentedControl : UISegmentedControl + +@property (nonatomic, assign) NSInteger selectedIndex; +@property (nonatomic, copy) RCTBubblingEventBlock onChange; + +@end diff --git a/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.m b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.m new file mode 100644 index 0000000000000..a883ff2402139 --- /dev/null +++ b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControl.m @@ -0,0 +1,111 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNCSegmentedControl.h" + +#import +#import +#import + +@implementation RNCSegmentedControl + +- (instancetype)initWithFrame:(CGRect)frame +{ + if ((self = [super initWithFrame:frame])) { + _selectedIndex = self.selectedSegmentIndex; + [self addTarget:self action:@selector(didChange) + forControlEvents:UIControlEventValueChanged]; + } + return self; +} + +- (void)setValues:(NSArray *)values +{ + [self removeAllSegments]; + for (NSString *value in values) { + [self insertSegmentWithTitle:value atIndex:self.numberOfSegments animated:NO]; + } + super.selectedSegmentIndex = _selectedIndex; +} + +- (void)setSelectedIndex:(NSInteger)selectedIndex +{ + _selectedIndex = selectedIndex; + super.selectedSegmentIndex = selectedIndex; +} + +- (void)setBackgroundColor:(UIColor *)backgroundColor +{ + #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 + if (@available(iOS 13.0, *)) { + [super setBackgroundColor:backgroundColor]; + } + #endif +} + +- (void)setTextColor:(UIColor *)textColor +{ + #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 + if (@available(iOS 13.0, *)) { + [self setTitleTextAttributes:@{NSForegroundColorAttributeName: textColor} + forState:UIControlStateNormal]; + } + #endif +} + +- (void)setActiveTextColor:(UIColor *)textColor +{ + #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 + if (@available(iOS 13.0, *)) { + [self setTitleTextAttributes:@{NSForegroundColorAttributeName: textColor} + forState:UIControlStateSelected]; + } + #endif +} + +- (void)setTintColor:(UIColor *)tintColor +{ + [super setTintColor:tintColor]; +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 + if (@available(iOS 13.0, *)) { + [self setSelectedSegmentTintColor:tintColor]; + [self setTitleTextAttributes:@{NSForegroundColorAttributeName: tintColor} + forState:UIControlStateNormal]; + } +#endif +} + +- (void)didChange +{ + _selectedIndex = self.selectedSegmentIndex; + if (_onChange) { + _onChange(@{ + @"value": [self titleForSegmentAtIndex:_selectedIndex], + @"selectedSegmentIndex": @(_selectedIndex) + }); + } +} + +- (void)setAppearance:(NSString *)appearanceString +{ +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 + if (@available(iOS 13.0, *)) { + if ([appearanceString isEqual: @"dark"]) { + [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark]; + } else if ([appearanceString isEqual: @"light"]) { + [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleLight]; + } + } +#endif +} + +@end diff --git a/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.h b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.h new file mode 100644 index 0000000000000..21cdb17adb8e2 --- /dev/null +++ b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.h @@ -0,0 +1,12 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface RNCSegmentedControlManager : RCTViewManager + +@end diff --git a/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.m b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.m new file mode 100644 index 0000000000000..0e7ddbe70989c --- /dev/null +++ b/ios/Exponent/Versioned/Core/Api/Components/SegmentedControl/RNSegmentedControlManager.m @@ -0,0 +1,34 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RNCSegmentedControlManager.h" + +#import +#import +#import "RNCSegmentedControl.h" + +@implementation RNCSegmentedControlManager + +RCT_EXPORT_MODULE() + +- (UIView *)view +{ + return [RNCSegmentedControl new]; +} + +RCT_EXPORT_VIEW_PROPERTY(values, NSArray) +RCT_EXPORT_VIEW_PROPERTY(selectedIndex, NSInteger) +RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(backgroundColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(textColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(activeTextColor, UIColor) +RCT_EXPORT_VIEW_PROPERTY(momentary, BOOL) +RCT_EXPORT_VIEW_PROPERTY(enabled, BOOL) +RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock) +RCT_EXPORT_VIEW_PROPERTY(appearance, NSString) + +@end diff --git a/packages/expo/bundledNativeModules.json b/packages/expo/bundledNativeModules.json index 35f5323b86f1c..5b922268f1c1b 100644 --- a/packages/expo/bundledNativeModules.json +++ b/packages/expo/bundledNativeModules.json @@ -90,6 +90,7 @@ "@react-native-community/datetimepicker": "2.2.2", "@react-native-community/masked-view": "0.1.6", "@react-native-community/viewpager": "3.3.0", + "@react-native-community/segmented-control": "1.4.0", "expo-error-recovery": "~1.1.0", "expo-module-template": "~8.2.0", "expo-image-loader": "~1.0.1", diff --git a/tools/expotools/src/commands/UpdateVendoredModule.ts b/tools/expotools/src/commands/UpdateVendoredModule.ts index 40336ead6e4b2..4bb5366a2af46 100644 --- a/tools/expotools/src/commands/UpdateVendoredModule.ts +++ b/tools/expotools/src/commands/UpdateVendoredModule.ts @@ -333,6 +333,16 @@ const vendoredModulesConfig: { [key: string]: VendoredModuleConfig } = { }, ], }, + '@react-native-community/segmented-control': { + repoUrl: 'https://github.com/react-native-community/segmented-control', + installableInManagedApps: true, + steps: [ + { + sourceIosPath: 'ios', + targetIosPath: 'Api/Components/SegmentedControl', + }, + ], + }, }; async function getBundledNativeModulesAsync(): Promise<{ [key: string]: string }> { diff --git a/yarn.lock b/yarn.lock index 5f1bce2c3cb49..3f01255f383fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1792,6 +1792,16 @@ "@types/yargs" "^15.0.0" chalk "^3.0.0" +"@jest/types@^25.4.0": + version "25.4.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.4.0.tgz#5afeb8f7e1cba153a28e5ac3c9fe3eede7206d59" + integrity sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^15.0.0" + chalk "^3.0.0" + "@jimp/bmp@^0.9.8": version "0.9.8" resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.9.8.tgz#5933ab8fb359889bec380b0f7802163374933624" @@ -2264,6 +2274,11 @@ dependencies: serve-static "^1.13.1" + +"@react-native-community/cli-platform-android@^3.0.0-alpha.1", "@react-native-community/cli-platform-android@^3.0.3": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-3.1.4.tgz#61f964dc311623e60b0fb29c5f3732cc8a6f076f" + integrity sha512-ClSdY20F0gzWVLTqCv7vHjnUqOcuq10jd9GgHX6lGSc2GI+Ql3/aQg3tmG4uY3KXNNwAv3U8QCoYgg1WGfwiHA== "@react-native-community/cli-debugger-ui@^4.8.0": version "4.8.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.8.0.tgz#9a6419b29be69422e0056bbb1874775750351d22" @@ -2300,6 +2315,22 @@ slash "^3.0.0" xmldoc "^1.1.2" +"@react-native-community/cli-platform-android@^4.5.1": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-4.7.0.tgz#aace6b8004b8d3aae40d6affaad1c472e0310a25" + integrity sha512-Lb6D0ipmFwYLJeQy5/NI4uJpeSHw85rd84C40wwpoUfsCgZhA93WUJdFkuQEIDkfTqs5Yqgl+/szhIZdnIXPxw== + dependencies: + "@react-native-community/cli-tools" "^4.7.0" + chalk "^3.0.0" + execa "^1.0.0" + fs-extra "^8.1.0" + glob "^7.1.3" + jetifier "^1.6.2" + lodash "^4.17.15" + logkitty "^0.6.0" + slash "^3.0.0" + xmldoc "^1.1.2" + "@react-native-community/cli-platform-ios@3.0.0", "@react-native-community/cli-platform-ios@4.7.0", "@react-native-community/cli-platform-ios@^3.0.0-alpha.1": version "3.0.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-3.0.0.tgz#3a48a449c0c33af3b0b3d19d3256de99388fe15f" @@ -2351,6 +2382,11 @@ resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-3.0.0.tgz#488d46605cb05e88537e030f38da236eeda74652" integrity sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg== +"@react-native-community/cli-types@^4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-4.7.0.tgz#871905753f8ff83cf10c48e8df3fdd63cd7667a0" + integrity sha512-Pw05Rsh/ENFs/Utv1SVRFfdMAn+W9yy1AOhyIKB36JX0Xw00sIZQDyZVsVfmaLSOpRpJ/qUdKWXB/WYV4XYELw== + "@react-native-community/cli@^3.0.0-alpha.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-3.2.1.tgz#2a466801eb6080a1f73358c5d740c53c24ed8c6f" @@ -2397,6 +2433,50 @@ wcwidth "^1.0.1" ws "^1.1.0" +"@react-native-community/cli@^4.5.1": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-4.7.0.tgz#be692631356d14fd1ffe23f25b479dca9e8e7c95" + integrity sha512-DbpxcPC7lFCJ112dPXL4DBKh5TfH0QK2OTG7uEGjfsApT4c01Lae6OMTNSssXgXTcNJApqIT5a6GXK2vSE0CEQ== + dependencies: + "@hapi/joi" "^15.0.3" + "@react-native-community/cli-debugger-ui" "^4.7.0" + "@react-native-community/cli-tools" "^4.7.0" + "@react-native-community/cli-types" "^4.7.0" + chalk "^3.0.0" + command-exists "^1.2.8" + commander "^2.19.0" + compression "^1.7.1" + connect "^3.6.5" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + envinfo "^7.1.0" + errorhandler "^1.5.0" + execa "^1.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + glob "^7.1.3" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + leven "^3.1.0" + lodash "^4.17.15" + metro "^0.58.0" + metro-config "^0.58.0" + metro-core "^0.58.0" + metro-react-native-babel-transformer "^0.58.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + node-stream-zip "^1.9.1" + open "^6.2.0" + ora "^3.4.0" + pretty-format "^25.2.0" + semver "^6.3.0" + serve-static "^1.13.1" + shell-quote "1.6.1" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + ws "^1.1.0" + "@react-native-community/datetimepicker@2.2.2": version "2.2.2" resolved "https://registry.yarnpkg.com/@react-native-community/datetimepicker/-/datetimepicker-2.2.2.tgz#4c6388631179098cc5b289146e879764f79af4c1" @@ -2414,6 +2494,11 @@ resolved "https://registry.yarnpkg.com/@react-native-community/netinfo/-/netinfo-5.5.0.tgz#7f1d2e301b8a1294da44fb44d7b3fd6ea4d40c8a" integrity sha512-9fdOk1dxR3Bt+T4OuQxhf7EjyfbI6qVbPcNfTvVjGgRrx798ixAbBcCC+k5wp3LloVChVicXkyblu+wXEGiCWw== +"@react-native-community/segmented-control@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@react-native-community/segmented-control/-/segmented-control-1.4.0.tgz#16e449c76b2ea85784bc89cad2604a0bd5c42b42" + integrity sha512-uQg3SdYVTsmKKppX+DEGFz8z94wode1gzrsMQyVpI1/f19f/fkQgdg5LIq6dNzkXXDnS+lBDzqqxcVsStQYcyQ== + "@react-native-community/viewpager@3.3.0": version "3.3.0" resolved "https://registry.yarnpkg.com/@react-native-community/viewpager/-/viewpager-3.3.0.tgz#e613747a43a31a6f3278f817ba96fdaaa7941f23" @@ -3383,6 +3468,11 @@ analytics-node@3.3.0: remove-trailing-slash "^0.1.0" uuid "^3.2.1" +anser@^1.4.9: + version "1.4.9" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" + integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== + ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" @@ -6874,6 +6964,13 @@ eslint-plugin-react@^7.19.0: string.prototype.matchall "^4.0.2" xregexp "^4.3.0" +eslint-plugin-relay@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-relay/-/eslint-plugin-relay-1.4.1.tgz#5af2ac13e24bd01ad17b6a4014204918d65021cd" + integrity sha512-yb+p+4AxZTi2gXN7cZRfXMBFlRa5j6TtiVeq3yHXyy+tlgYNpxi/dDrP1+tcUTNP9vdaJovnfGZ5jp6kMiH9eg== + dependencies: + graphql "^14.0.0" + eslint-rule-composer@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" @@ -8491,6 +8588,11 @@ hermes-engine@^0.2.1: resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.2.1.tgz#25c0f1ff852512a92cb5c5cc47cf967e1e722ea2" integrity sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ== +hermes-engine@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.4.1.tgz#2d02b295596298643c4d24b86687eb554db9e950" + integrity sha512-Y3JFC8PD7eN3KpnrzrmvMAqp0IwnZrmP/oGOptvaSu33d7Zq/8b/2lHlZZkNvRl7/I1Q0umTX8TByK7zzLfTXA== + hex-color-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" @@ -11182,6 +11284,24 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +metro-babel-register@0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.58.0.tgz#5c44786d49a044048df56cf476a2263491d4f53a" + integrity sha512-P5+G3ufhSYL6cA3a7xkbSJzzFBvtivj/PhWvGXFXnuFssDlMAX1CTktff+0gpka5Cd6B6QLt0UAMWulUAAE4Eg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/register" "^7.0.0" + core-js "^2.2.2" + escape-string-regexp "^1.0.5" + metro-babel-register@^0.56.0, metro-babel-register@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.56.4.tgz#b0c627a1cfdd1bdd768f81af79481754e833a902" @@ -11216,6 +11336,16 @@ metro-babel-transformer@^0.56.4: "@babel/core" "^7.0.0" metro-source-map "^0.56.4" +metro-cache@0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.58.0.tgz#630ea0a4626dfb9591c71fdb85dce14b5e9a04ec" + integrity sha512-jjW9zCTKxhgKcVkyQ6LHyna9Zdf4TK/45vvT1fPyyTk1RY82ZYjU1qs+84ycKEd08Ka4YcK9xcUew9SIDJYI8Q== + dependencies: + jest-serializer "^24.4.0" + metro-core "0.58.0" + mkdirp "^0.5.1" + rimraf "^2.5.4" + metro-cache@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.56.4.tgz#542f9f8a35f8fb9d5576f46fd3ab4d4f42851a7e" @@ -11226,6 +11356,18 @@ metro-cache@^0.56.4: mkdirp "^0.5.1" rimraf "^2.5.4" +metro-config@0.58.0, metro-config@^0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.58.0.tgz#1e24b43a5a00971d75662b1a0d3c04a13d4a1746" + integrity sha512-4vgBliXwL56vjUlYplvGMVSNrJJpkHuLcD+O20trV3FvPxKg4ZsvuOcNSxqDSMU26FCtIEJ15ojcuCbRL7KY0w== + dependencies: + cosmiconfig "^5.0.5" + jest-validate "^24.7.0" + metro "0.58.0" + metro-cache "0.58.0" + metro-core "0.58.0" + pretty-format "^24.7.0" + metro-config@^0.56.0, metro-config@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.56.4.tgz#338fd8165fba59424cec427c1a881757945e57e9" @@ -11238,6 +11380,16 @@ metro-config@^0.56.0, metro-config@^0.56.4: metro-core "^0.56.4" pretty-format "^24.7.0" +metro-core@0.58.0, metro-core@^0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.58.0.tgz#ad9f6645a2b439a3fbce7ce4e19b01b00375768a" + integrity sha512-RzXUjGFmCLOyzUqcKDvr91AldGtIOxnzNZrWUIiG8uC3kerVLo0mQp4YH3+XVm6fMNiLMg6iER7HLqD+MbpUjQ== + dependencies: + jest-haste-map "^24.7.1" + lodash.throttle "^4.1.1" + metro-resolver "0.58.0" + wordwrap "^1.0.0" + metro-core@^0.56.0, metro-core@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.56.4.tgz#67cc41b3c0bf66e9c2306f50239a1080b1e82312" @@ -11248,6 +11400,17 @@ metro-core@^0.56.0, metro-core@^0.56.4: metro-resolver "^0.56.4" wordwrap "^1.0.0" +metro-inspector-proxy@0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.58.0.tgz#6fefb0cdf25655919d56c82ebe09cd26eb00e636" + integrity sha512-oFqTyNTJdCdvcw1Ha6SKE7ITbSaoTbO4xpYownIoJR+WZ0ZfxbWpp225JkHuBJm9UcBAnG9c0CME924m3uBbaw== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + rxjs "^5.4.3" + ws "^1.1.5" + yargs "^14.2.0" + metro-inspector-proxy@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.56.4.tgz#7343ff3c5908af4fd99e96b6d646e24e99816be4" @@ -11259,6 +11422,13 @@ metro-inspector-proxy@^0.56.4: ws "^1.1.5" yargs "^9.0.0" +metro-minify-uglify@0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.58.0.tgz#7e1066954bfd4f767ba6aca7feef676ca44c68b8" + integrity sha512-vRHsA7bCi7eCn3LXLm20EfY2NoWDyYOnmWaq/N8LB0OxL2L5DXRqMYAQK+prWGJ5S1yvVnDuuNVP+peQ9851TA== + dependencies: + uglify-es "^3.1.9" + metro-minify-uglify@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.56.4.tgz#13589dfb1d43343608aacb7f78ddfcc052daa63c" @@ -11348,6 +11518,17 @@ metro-react-native-babel-preset@^0.56.0, metro-react-native-babel-preset@^0.56.4 "@babel/template" "^7.0.0" react-refresh "^0.4.0" +metro-react-native-babel-transformer@0.58.0, metro-react-native-babel-transformer@^0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.58.0.tgz#5da0e5a1b83c01d11626905fa59f34fda53a21a5" + integrity sha512-3A73+cRq1eUPQ8g+hPNGgMUMCGmtQjwqHfoG1DwinAoJ/kr4WOXWWbGZo0xHJNBe/zdHGl0uHcDCp2knPglTdQ== + dependencies: + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.3.0" + metro-babel-transformer "0.58.0" + metro-react-native-babel-preset "0.58.0" + metro-source-map "0.58.0" + metro-react-native-babel-transformer@^0.56.0: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.4.tgz#3c6e48b605c305362ee624e45ff338656e35fc1d" @@ -11359,6 +11540,14 @@ metro-react-native-babel-transformer@^0.56.0: metro-react-native-babel-preset "^0.56.4" metro-source-map "^0.56.4" + +metro-resolver@0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.58.0.tgz#4d03edc52e2e25d45f16688adf3b3f268ea60df9" + integrity sha512-XFbAKvCHN2iWqKeiRARzEXn69eTDdJVJC7lu16S4dPQJ+Dy82dZBr5Es12iN+NmbJuFgrAuIHbpWrdnA9tOf6Q== + dependencies: + absolute-path "^0.0.0" + metro-react-native-babel-transformer@^0.58.0: version "0.58.0" resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.58.0.tgz#5da0e5a1b83c01d11626905fa59f34fda53a21a5" @@ -11370,6 +11559,7 @@ metro-react-native-babel-transformer@^0.58.0: metro-react-native-babel-preset "0.58.0" metro-source-map "0.58.0" + metro-resolver@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.56.4.tgz#9876f57bca37fd1bfcffd733541e2ee4a89fad7f" @@ -11425,6 +11615,68 @@ metro-symbolicate@^0.56.4: through2 "^2.0.1" vlq "^1.0.0" +metro@0.58.0, metro@^0.58.0: + version "0.58.0" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.58.0.tgz#c037318c112f80dc96199780c8b401ab72cfd142" + integrity sha512-yi/REXX+/s4r7RjzXht+E+qE6nzvFIrEXO5Q61h+70Q7RODMU8EnlpXx04JYk7DevHuMhFaX+NWhCtRINzR4zA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-external-helpers" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + async "^2.4.0" + babel-preset-fbjs "^3.3.0" + buffer-crc32 "^0.2.13" + chalk "^2.4.1" + ci-info "^2.0.0" + concat-stream "^1.6.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + eventemitter3 "^3.0.0" + fbjs "^1.0.0" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + image-size "^0.6.0" + invariant "^2.2.4" + jest-haste-map "^24.7.1" + jest-worker "^24.6.0" + json-stable-stringify "^1.0.1" + lodash.throttle "^4.1.1" + merge-stream "^1.0.1" + metro-babel-register "0.58.0" + metro-babel-transformer "0.58.0" + metro-cache "0.58.0" + metro-config "0.58.0" + metro-core "0.58.0" + metro-inspector-proxy "0.58.0" + metro-minify-uglify "0.58.0" + metro-react-native-babel-preset "0.58.0" + metro-resolver "0.58.0" + metro-source-map "0.58.0" + metro-symbolicate "0.58.0" + mime-types "2.1.11" + mkdirp "^0.5.1" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + resolve "^1.5.0" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^4.0.0" + temp "0.8.3" + throat "^4.1.0" + wordwrap "^1.0.0" + write-file-atomic "^1.2.0" + ws "^1.1.5" + xpipe "^1.0.5" + yargs "^14.2.0" + metro@^0.56.0, metro@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro/-/metro-0.56.4.tgz#be7e1380ee6ac3552c25ead8098eab261029e4d7" @@ -12059,6 +12311,11 @@ node-releases@^1.1.25, node-releases@^1.1.53: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee" integrity sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w== +node-stream-zip@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.9.1.tgz#66d210204da7c60e2d6d685eb21a11d016981fd0" + integrity sha512-7/Xs9gkuYF0WBimz5OrSc6UVKLDTxvBG2yLGtEK8PSx94d86o/6iQLvIe/140ATz35JDqHKWIxh3GcA3u5hB0w== + node-version@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" @@ -12214,7 +12471,7 @@ nth-check@^1.0.2, nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -nullthrows@^1.1.0: +nullthrows@^1.1.0, nullthrows@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== @@ -13531,6 +13788,16 @@ pretty-format@^25.1.0, pretty-format@^25.5.0: ansi-styles "^4.0.0" react-is "^16.12.0" +pretty-format@^25.2.0: + version "25.4.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.4.0.tgz#c58801bb5c4926ff4a677fe43f9b8b99812c7830" + integrity sha512-PI/2dpGjXK5HyXexLPZU/jw5T9Q6S1YVXxxVxco+LIqzUFHXIbKZKdUVt7GcX7QUCr31+3fzhi4gN4/wUYPVxQ== + dependencies: + "@jest/types" "^25.4.0" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^16.12.0" + pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" @@ -13960,6 +14227,14 @@ react-devtools-core@^3.6.3: shell-quote "^1.6.1" ws "^3.3.1" +react-devtools-core@^4.0.6: + version "4.6.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.6.0.tgz#2443b3c6fac78b801702af188abc6d83d56224e6" + integrity sha512-sjR3KC5VvGV7X6vzR3OTutPT5VeBcSKwoIXUwihpl1Nb4dkmweEbzCTPx2PYMVAqc+NZ5tPGhqBzXV+iGg5CNA== + dependencies: + shell-quote "^1.6.1" + ws "^7" + react-dom@16.9.0: version "16.9.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.9.0.tgz#5e65527a5e26f22ae3701131bcccaee9fb0d3962" @@ -14165,6 +14440,31 @@ react-native-unimodules@~0.8.0: unimodules-sensors-interface "~5.1.0" unimodules-task-manager-interface "~5.1.0" +react-native-unimodules@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/react-native-unimodules/-/react-native-unimodules-0.9.0.tgz#5ce642ac50d124b9d41c09ff7cb397e22f1110ea" + integrity sha512-zcdNo74d/x19d0JkNiKL+4d71OaivumgfKVdmOYPOGRMOlct6KL3177TvkxgmF7ddlJJIlfftSFtnPuiOfejQA== + dependencies: + "@unimodules/core" "~5.1.0" + "@unimodules/react-native-adapter" "~5.2.0" + chalk "^2.4.2" + expo-asset "~8.1.0" + expo-constants "~9.0.0" + expo-file-system "~8.1.0" + expo-image-loader "~1.0.0" + expo-permissions "~8.1.0" + unimodules-app-loader "~1.0.0" + unimodules-barcode-scanner-interface "~5.1.0" + unimodules-camera-interface "~5.1.0" + unimodules-constants-interface "~5.1.0" + unimodules-face-detector-interface "~5.1.0" + unimodules-file-system-interface "~5.1.0" + unimodules-font-interface "~5.1.0" + unimodules-image-loader-interface "~5.1.0" + unimodules-permissions-interface "~5.1.0" + unimodules-sensors-interface "~5.1.0" + unimodules-task-manager-interface "~5.1.0" + react-native-view-shot@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/react-native-view-shot/-/react-native-view-shot-3.1.2.tgz#8c8e84c67a4bc8b603e697dbbd59dbc9b4f84825" @@ -14194,6 +14494,78 @@ react-native-webview@8.1.2: escape-string-regexp "2.0.0" invariant "2.2.4" +react-native@*: + version "0.62.2" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.62.2.tgz#d831e11a3178705449142df19a70ac2ca16bad10" + integrity sha512-gADZZ3jcm2WFTjh8CCBCbl5wRSbdxqZGd+8UpNwLQFgrkp/uHorwAhLNqcd4+fHmADgPBltNL0uR1Vhv47zcOw== + dependencies: + "@babel/runtime" "^7.0.0" + "@react-native-community/cli" "^4.5.1" + "@react-native-community/cli-platform-android" "^4.5.1" + "@react-native-community/cli-platform-ios" "^4.5.0" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + connect "^3.6.5" + create-react-class "^15.6.3" + escape-string-regexp "^1.0.5" + eslint-plugin-relay "1.4.1" + event-target-shim "^5.0.1" + fbjs "^1.0.0" + fbjs-scripts "^1.1.0" + hermes-engine "~0.4.0" + invariant "^2.2.4" + jsc-android "^245459.0.0" + metro-babel-register "0.58.0" + metro-react-native-babel-transformer "0.58.0" + metro-source-map "0.58.0" + nullthrows "^1.1.1" + pretty-format "^24.7.0" + promise "^7.1.1" + prop-types "^15.7.2" + react-devtools-core "^4.0.6" + react-refresh "^0.4.0" + regenerator-runtime "^0.13.2" + scheduler "0.17.0" + stacktrace-parser "^0.1.3" + use-subscription "^1.0.0" + whatwg-fetch "^3.0.0" + +react-native@0.61.4: + version "0.61.4" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.61.4.tgz#9ec6e8a2aa8eac57143dcfa39115c7d9a139bc2c" + integrity sha512-L8U+dDEy4vP74yWYbb+2XKaZeUkbpCUoSzcmeEM8Oznt69q71Q4fuYyxZGrzVW6tMYw9ZzGXTkfLuOh2nvLeVw== + dependencies: + "@babel/runtime" "^7.0.0" + "@react-native-community/cli" "^3.0.0-alpha.1" + "@react-native-community/cli-platform-android" "^3.0.0-alpha.1" + "@react-native-community/cli-platform-ios" "^3.0.0-alpha.1" + abort-controller "^3.0.0" + art "^0.10.0" + base64-js "^1.1.2" + connect "^3.6.5" + create-react-class "^15.6.3" + escape-string-regexp "^1.0.5" + event-target-shim "^5.0.1" + fbjs "^1.0.0" + fbjs-scripts "^1.1.0" + hermes-engine "^0.2.1" + invariant "^2.2.4" + jsc-android "^245459.0.0" + metro-babel-register "^0.56.0" + metro-react-native-babel-transformer "^0.56.0" + metro-source-map "^0.56.0" + nullthrows "^1.1.0" + pretty-format "^24.7.0" + promise "^7.1.1" + prop-types "^15.7.2" + react-devtools-core "^3.6.3" + react-refresh "^0.4.0" + regenerator-runtime "^0.13.2" + scheduler "0.15.0" + stacktrace-parser "^0.1.3" + whatwg-fetch "^3.0.0" + react-navigation-header-buttons@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/react-navigation-header-buttons/-/react-navigation-header-buttons-1.2.1.tgz#847e25da0422068f6549b477f17360dae7f383b1" @@ -15053,6 +15425,14 @@ scheduler@0.15.0, scheduler@^0.15.0: loose-envify "^1.1.0" object-assign "^4.1.1" +scheduler@0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.17.0.tgz#7c9c673e4ec781fac853927916d1c426b6f3ddfe" + integrity sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" @@ -18165,6 +18545,23 @@ yargs@^13.0.0: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@^14.2.0: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + yargs@^15.3.1: version "15.3.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b"