MM-26817 Upgrade to RN 0.63 (#4566)

* Upgrade to RN 0.63

* Bump to RN 0.63.1

* Fix RN patch

* Use JSC Intl version

* Update android/app/build.gradle

Co-authored-by: Miguel Alatzar <migbot@users.noreply.github.com>

* Fix Android external storage permission

* Fix emoji imageUrl when no server url is present

* Patch react-native-image-picker

* Allow to post attachment only messages

Co-authored-by: Miguel Alatzar <migbot@users.noreply.github.com>
This commit is contained in:
Elias Nahum 2020-07-20 18:08:11 -04:00 committed by GitHub
parent 26fa5a5e8f
commit a99e938e9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
69 changed files with 5015 additions and 2502 deletions

View file

@ -26,12 +26,13 @@
"no-undefined": 0,
"react/display-name": [2, { "ignoreTranspilerName": false }],
"react/jsx-filename-extension": 0,
"@typescript-eslint/camelcase": [
2,
"camelcase": [
0,
{
"properties": "never"
}
],
"@typescript-eslint/ban-types": 0,
"@typescript-eslint/no-non-null-assertion": 0,
"@typescript-eslint/no-unused-vars": [
2,

View file

@ -71,4 +71,4 @@ untyped-import
untyped-type-import
[version]
^0.113.0
^0.122.0

View file

@ -1918,41 +1918,6 @@ SOFTWARE.
---
## react-native-keyboard-aware-scroll-view
This product contains 'react-native-keyboard-aware-scroll-view' by Alvaro Medina Ballester.
A React Native ScrollView component that resizes when the keyboard appears.
* HOMEPAGE:
* https://github.com/APSL/react-native-keyboard-aware-scroll-view#readme
* LICENSE: MIT
The MIT License (MIT)
Copyright (c) 2015 APSL
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
## react-native-keyboard-tracking-view
This product contains a modified version of 'react-native-keyboard-tracking-view' by Artal Druk.

View file

@ -108,8 +108,7 @@ def enableSeparateBuildPerCPUArchitecture = false
*/
def enableProguardInReleaseBuilds = false
// Add v8-android - prebuilt libv8android.so into APK
def jscFlavor = 'org.chromium:v8-android:+'
def jscFlavor = 'org.webkit:android-jsc-intl:+'
/**
* Whether to enable the Hermes VM.
@ -194,14 +193,6 @@ android {
targetCompatibility 1.8
}
packagingOptions {
// Make sure libjsc.so does not packed in APK
exclude "**/libjsc.so"
pickFirst "lib/armeabi-v7a/libc++_shared.so"
pickFirst "lib/arm64-v8a/libc++_shared.so"
pickFirst "lib/x86/libc++_shared.so"
pickFirst "lib/x86_64/libc++_shared.so"
}
}
repositories {

View file

@ -19,6 +19,7 @@
android:theme="@style/AppTheme"
android:installLocation="auto"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
>
<meta-data android:name="firebase_analytics_collection_deactivated" android:value="true" />
<meta-data android:name="android.content.APP_RESTRICTIONS"

View file

@ -2,10 +2,10 @@
buildscript {
ext {
buildToolsVersion = "28.0.3"
buildToolsVersion = "29.0.2"
minSdkVersion = 24
compileSdkVersion = 28
targetSdkVersion = 28
compileSdkVersion = 29
targetSdkVersion = 29
supportLibVersion = "28.0.0"
kotlinVersion = "1.3.61"
RNNKotlinVersion = kotlinVersion
@ -18,7 +18,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.google.gms:google-services:4.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
@ -48,17 +48,17 @@ allprojects {
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
// url "$rootDir/../node_modules/react-native/android"
url("$rootDir/../node_modules/react-native/android")
// Replace AAR from original RN with AAR from react-native-v8
url("$rootDir/../node_modules/react-native-v8/dist")
// url("$rootDir/../node_modules/react-native-v8/dist")
}
maven {
// Local Maven repo containing AARs with JSC library built for Android
// url "$rootDir/../node_modules/jsc-android/dist"
url("$rootDir/../node_modules/jsc-android/dist")
// prebuilt libv8android.so
url("$rootDir/../node_modules/v8-android/dist")
// url("$rootDir/../node_modules/v8-android/dist")
}
maven {
url "https://www.jitpack.io"

View file

@ -30,4 +30,4 @@ android.useAndroidX=true
android.enableJetifier=true
# Version of flipper SDK to use with React Native
FLIPPER_VERSION=0.33.1
FLIPPER_VERSION=0.37.0

Binary file not shown.

View file

@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-all.zip

29
android/gradlew vendored
View file

@ -154,19 +154,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
i=`expr $i + 1`
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
@ -175,14 +175,9 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

27
android/gradlew.bat vendored
View file

@ -13,64 +13,91 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View file

@ -54,7 +54,6 @@ const mockRolesRequest = (rolesToLoad = []) => {
const mockTeamMemberRequest = (tm = []) => {
nock(Client4.getUserRoute('me')).
log(console.log).
get('/teams/members').
reply(200, tm);
};

View file

@ -1,26 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`FormattedTime should render correctly 1`] = `
<View
pointerEvents="box-none"
style={
Object {
"flex": 1,
}
}
>
<View
collapsable={true}
pointerEvents="box-none"
style={
Object {
"flex": 1,
}
}
>
<Text>
7:02 PM
</Text>
</View>
</View>
`;
exports[`FormattedTime should render correctly 1`] = `undefined`;

View file

@ -18,7 +18,7 @@ exports[`AnnouncementBanner should match snapshot 1`] = `
]
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Array [
@ -57,7 +57,7 @@ exports[`AnnouncementBanner should match snapshot 1`] = `
name="info"
size={16}
/>
</Component>
</ForwardRef>
</ForwardRef(AnimatedComponentWrapper)>
`;

View file

@ -3,7 +3,8 @@
import React from 'react';
import PropTypes from 'prop-types';
import {Clipboard, Text} from 'react-native';
import {Text} from 'react-native';
import Clipboard from '@react-native-community/clipboard';
import {intlShape} from 'react-intl';
import MaterialIcon from 'react-native-vector-icons/MaterialIcons';

View file

@ -62,6 +62,7 @@ export default class AtMention extends PureComponent {
// Not invoked, render nothing.
if (matchTerm === null) {
this.props.onResultCountChange(0);
this.setState({
mentionComplete: false,
sections: [],

View file

@ -12,10 +12,6 @@ describe('ChannelLoader', () => {
const baseProps = {
channelIsLoading: true,
theme: Preferences.THEMES.default,
actions: {
handleSelectChannel: jest.fn(),
setChannelLoading: jest.fn(),
},
isLandscape: false,
};

View file

@ -5,20 +5,18 @@ exports[`EditChannelInfo should match snapshot 1`] = `
<Connect(StatusBar) />
<KeyboardAwareScrollView
enableAutomaticScroll={true}
enableOnAndroid={false}
enableResetScrollToCoords={true}
extraHeight={75}
extraScrollHeight={0}
keyboardOpeningTime={250}
getTextInputRefs={[Function]}
keyboardShouldPersistTaps="always"
onKeyboardDidHide={[Function]}
onKeyboardDidShow={[Function]}
scrollToBottomOnKBShow={false}
scrollToInputAdditionalOffset={75}
startScrolledToBottom={false}
style={
Object {
"flex": 1,
}
}
viewIsInsideTabBar={false}
>
<TouchableWithoutFeedback
onPress={[Function]}
@ -283,14 +281,6 @@ exports[`EditChannelInfo should match snapshot 1`] = `
value="header"
/>
</View>
<Connect(Autocomplete)
cursorPosition={6}
expandDown={true}
maxHeight={200}
nestedScrollEnabled={true}
onChangeText={[Function]}
value="header"
/>
<View
style={
Object {
@ -319,5 +309,20 @@ exports[`EditChannelInfo should match snapshot 1`] = `
</View>
</TouchableWithoutFeedback>
</KeyboardAwareScrollView>
<KeyboardTrackingView
style={
Object {
"justifyContent": "flex-end",
}
}
>
<Connect(Autocomplete)
cursorPosition={6}
maxHeight={200}
nestedScrollEnabled={true}
onChangeText={[Function]}
value="header"
/>
</KeyboardTrackingView>
</React.Fragment>
`;

View file

@ -8,7 +8,8 @@ import {
TouchableWithoutFeedback,
View,
} from 'react-native';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scrollview';
import {KeyboardTrackingView} from 'react-native-keyboard-tracking-view';
import {General} from '@mm-redux/constants';
@ -91,7 +92,7 @@ export default class EditChannelInfo extends PureComponent {
}
if (this.scroll?.current) {
this.scroll.current.scrollToPosition(0, 0, true);
this.scroll.current.scrollTo({x: 0, y: 0, animated: true});
}
};
@ -183,7 +184,7 @@ export default class EditChannelInfo extends PureComponent {
scrollHeaderToTop = () => {
if (this.scroll.current) {
this.scroll.current.scrollToPosition(0, this.state.headerPosition);
this.scroll.current.scrollTo({x: 0, y: this.state.headerPosition});
}
}
@ -343,14 +344,6 @@ export default class EditChannelInfo extends PureComponent {
keyboardAppearance={getKeyboardAppearanceFromTheme(theme)}
/>
</View>
<Autocomplete
cursorPosition={header.length}
maxHeight={200}
onChangeText={this.onHeaderChangeText}
value={header}
nestedScrollEnabled={true}
expandDown={true}
/>
<View style={style.headerHelpText}>
<FormattedText
style={[style.helpText, padding(isLandscape)]}
@ -361,6 +354,15 @@ export default class EditChannelInfo extends PureComponent {
</View>
</TouchableWithoutFeedback>
</KeyboardAwareScrollView>
<KeyboardTrackingView style={style.autocompleteContainer}>
<Autocomplete
cursorPosition={header.length}
maxHeight={200}
onChangeText={this.onHeaderChangeText}
value={header}
nestedScrollEnabled={true}
/>
</KeyboardTrackingView>
</React.Fragment>
);
}
@ -368,6 +370,9 @@ export default class EditChannelInfo extends PureComponent {
const getStyleSheet = makeStyleSheetFromTheme((theme) => {
return {
autocompleteContainer: {
justifyContent: 'flex-end',
},
container: {
flex: 1,
},

View file

@ -17,6 +17,7 @@ function mapStateToProps(state, ownProps) {
const config = getConfig(state);
const emojiName = ownProps.emojiName;
const customEmojis = getCustomEmojisByName(state);
const serverUrl = Client4.getUrl();
let imageUrl = '';
let unicode;
@ -26,9 +27,13 @@ function mapStateToProps(state, ownProps) {
const emoji = Emojis[EmojiIndicesByAlias.get(emojiName)];
unicode = emoji.filename;
if (BuiltInEmojis.includes(emojiName)) {
imageUrl = Client4.getSystemEmojiImageUrl(emoji.filename);
if (serverUrl) {
imageUrl = Client4.getSystemEmojiImageUrl(emoji.filename);
} else {
displayTextOnly = true;
}
}
} else if (customEmojis.has(emojiName)) {
} else if (customEmojis.has(emojiName) && serverUrl) {
const emoji = customEmojis.get(emojiName);
imageUrl = Client4.getCustomEmojiImageUrl(emoji.id);
isCustomEmoji = true;

View file

@ -9997,7 +9997,7 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
}
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10023,8 +10023,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10048,8 +10048,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10073,8 +10073,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10098,8 +10098,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10123,8 +10123,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10148,8 +10148,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10173,8 +10173,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10198,8 +10198,8 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
style={
Object {
@ -10223,7 +10223,7 @@ exports[`components/emoji_picker/emoji_picker.ios should match snapshot 1`] = `
]
}
/>
</Component>
</ForwardRef>
</View>
</View>
</KeyboardTrackingView>

View file

@ -2,7 +2,7 @@
// See LICENSE.txt for license information.
import React from 'react';
import {render} from '@testing-library/react-native';
import TestRenderer from 'react-test-renderer';
import {IntlProvider} from 'react-intl';
import moment from 'moment-timezone';
@ -21,9 +21,10 @@ describe('FormattedTime', () => {
let wrapper = renderWithIntl(
<FormattedTime {...baseProps}/>,
);
let element = wrapper.root.find((el) => el.type === 'Text' && el.children && el.children[0] === '7:02 PM');
expect(wrapper.baseElement).toMatchSnapshot();
expect(wrapper.getByText('7:02 PM')).toBeTruthy();
expect(element).toBeTruthy();
wrapper = renderWithIntl(
<FormattedTime
@ -32,7 +33,8 @@ describe('FormattedTime', () => {
/>,
);
expect(wrapper.getByText('19:02')).toBeTruthy();
element = wrapper.root.find((el) => el.type === 'Text' && el.children && el.children[0] === '19:02');
expect(element).toBeTruthy();
});
it('should support localization', () => {
@ -42,7 +44,8 @@ describe('FormattedTime', () => {
'es',
);
expect(wrapper.getByText('7:02 PM')).toBeTruthy();
let element = wrapper.root.find((el) => el.type === 'Text' && el.children && el.children[0] === '7:02 PM');
expect(element).toBeTruthy();
moment.locale('ko');
wrapper = renderWithIntl(
@ -50,7 +53,8 @@ describe('FormattedTime', () => {
'ko',
);
expect(wrapper.getByText('오후 7:02')).toBeTruthy();
element = wrapper.root.find((el) => el.type === 'Text' && el.children && el.children[0] === '오후 7:02');
expect(element).toBeTruthy();
wrapper = renderWithIntl(
<FormattedTime
@ -60,7 +64,8 @@ describe('FormattedTime', () => {
'ko',
);
expect(wrapper.getByText('19:02')).toBeTruthy();
element = wrapper.root.find((el) => el.type === 'Text' && el.children && el.children[0] === '19:02');
expect(element).toBeTruthy();
});
it('should fallback to default short format for unsupported locale of react-intl ', () => {
@ -73,7 +78,8 @@ describe('FormattedTime', () => {
'es',
);
expect(wrapper.getByText('8:47 AM')).toBeTruthy();
let element = wrapper.root.find((el) => el.type === 'Text' && el.children && el.children[0] === '8:47 AM');
expect(element).toBeTruthy();
wrapper = renderWithIntl(
<FormattedTime
@ -84,10 +90,11 @@ describe('FormattedTime', () => {
'es',
);
expect(wrapper.getByText('8:47')).toBeTruthy();
element = wrapper.root.find((el) => el.type === 'Text' && el.children && el.children[0] === '8:47');
expect(element).toBeTruthy();
});
});
function renderWithIntl(component, locale = 'en') {
return render(<IntlProvider locale={locale}>{component}</IntlProvider>);
return TestRenderer.create(<IntlProvider locale={locale}>{component}</IntlProvider>);
}

View file

@ -5,12 +5,12 @@ import {PropTypes} from 'prop-types';
import React from 'react';
import {intlShape} from 'react-intl';
import {
Clipboard,
Keyboard,
StyleSheet,
Text,
View,
} from 'react-native';
import Clipboard from '@react-native-community/clipboard';
import CustomPropTypes from 'app/constants/custom_prop_types';
import FormattedText from 'app/components/formatted_text';

View file

@ -5,7 +5,6 @@ import PropTypes from 'prop-types';
import React from 'react';
import {intlShape} from 'react-intl';
import {
Clipboard,
Linking,
Platform,
StyleSheet,
@ -13,6 +12,7 @@ import {
View,
} from 'react-native';
import FastImage from 'react-native-fast-image';
import Clipboard from '@react-native-community/clipboard';
import brokenImageIcon from '@assets/images/icons/brokenimage.png';
import ImageViewPort from '@components/image_viewport';

View file

@ -3,7 +3,8 @@
import React, {Children, PureComponent} from 'react';
import PropTypes from 'prop-types';
import {Alert, Clipboard, Linking, Text} from 'react-native';
import {Alert, Linking, Text} from 'react-native';
import Clipboard from '@react-native-community/clipboard';
import urlParse from 'url-parse';
import {intlShape} from 'react-intl';

View file

@ -3055,7 +3055,7 @@ function nodeToString(node) {
}
const ignoredKeys = {_sourcepos: true, _lastLineBlank: true, _open: true, _string_content: true, _info: true, _isFenced: true, _fenceChar: true, _fenceLength: true, _fenceOffset: true, _onEnter: true, _onExit: true};
function astToJson(node, visited = [], indent = '') { // eslint-disable-line @typescript-eslint/no-unused-vars
function astToJson(node, visited = [], indent = '') {
let out = '{';
const myVisited = [...visited];
@ -3081,7 +3081,7 @@ function astToJson(node, visited = [], indent = '') { // eslint-disable-line @ty
} else if (typeof value === 'boolean') {
out += String(value);
} else if (typeof value === 'object') {
out += astToJson(value, myVisited, indent + ' ');
out += astToJson(value, myVisited, indent + ' '); // eslint-disable-line @typescript-eslint/no-unused-vars
}
if (i !== keys.length - 1) {

View file

@ -11,12 +11,14 @@ import {ViewTypes} from '@constants';
import NetworkIndicator from './network_indicator';
jest.useFakeTimers();
describe('AttachmentFooter', () => {
Animated.sequence = jest.fn(() => ({
start: jest.fn((cb) => cb()),
}));
Animated.timing = jest.fn(() => ({
start: jest.fn(),
start: jest.fn((cb) => cb()),
}));
const baseProps = {
@ -43,7 +45,7 @@ describe('AttachmentFooter', () => {
const wrapper = shallow(<NetworkIndicator {...baseProps}/>);
const instance = wrapper.instance();
it('emits INDICATOR_BAR_VISIBLE with true only if not already visible', () => {
it('emits INDICATOR_BAR_VISIBLE with true only if not already visible', async () => {
instance.visible = true;
instance.show();
expect(EventEmitter.emit).not.toHaveBeenCalled();
@ -52,6 +54,7 @@ describe('AttachmentFooter', () => {
instance.show();
expect(EventEmitter.emit).toHaveBeenCalledWith(ViewTypes.INDICATOR_BAR_VISIBLE, true);
expect(instance.visible).toBe(true);
expect(wrapper.state('opacity')).toBe(1);
});
});
@ -60,7 +63,7 @@ describe('AttachmentFooter', () => {
const wrapper = shallow(<NetworkIndicator {...baseProps}/>);
const instance = wrapper.instance();
it('emits INDICATOR_BAR_VISIBLE with false only if visible', () => {
it('emits INDICATOR_BAR_VISIBLE with false only if visible', async () => {
instance.visible = false;
instance.connected();
expect(EventEmitter.emit).not.toHaveBeenCalled();
@ -69,6 +72,7 @@ describe('AttachmentFooter', () => {
instance.connected();
expect(EventEmitter.emit).toHaveBeenCalledWith(ViewTypes.INDICATOR_BAR_VISIBLE, false);
expect(instance.visible).toBe(false);
expect(wrapper.state('opacity')).toBe(0);
});
});
});

View file

@ -1,12 +1,12 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`PasteableTextInput should render pasteable text input 1`] = `
<TextInput
<Component
allowFontScaling={true}
onPaste={[Function]}
rejectResponderTermination={true}
underlineColorAndroid="transparent"
>
My Text
</TextInput>
</Component>
`;

View file

@ -46,7 +46,7 @@ exports[`PostList setting channel deep link 1`] = `
onScrollToIndexFailed={[Function]}
onViewableItemsChanged={null}
refreshControl={
<RefreshControl
<RefreshControlMock
colors={
Array [
"#3d3c40",
@ -123,7 +123,7 @@ exports[`PostList setting permalink deep link 1`] = `
onScrollToIndexFailed={[Function]}
onViewableItemsChanged={null}
refreshControl={
<RefreshControl
<RefreshControlMock
colors={
Array [
"#3d3c40",
@ -200,7 +200,7 @@ exports[`PostList should match snapshot 1`] = `
onScrollToIndexFailed={[Function]}
onViewableItemsChanged={null}
refreshControl={
<RefreshControl
<RefreshControlMock
colors={
Array [
"#3d3c40",

View file

@ -30,6 +30,7 @@ export default class ProgressiveImage extends PureComponent {
static defaultProps = {
style: {},
defaultSource: undefined,
resizeMode: 'contain',
};

View file

@ -20,6 +20,7 @@ describe('ProgressiveImage', () => {
resizeMode: 'contain',
theme: Preferences.THEMES.default,
tintDefaultSource: false,
defaultSource: null,
};
const wrapper = shallow(<ProgressiveImage {...baseProps}/>);
@ -50,6 +51,7 @@ describe('ProgressiveImage', () => {
resizeMode: 'contain',
theme: Preferences.THEMES.default,
tintDefaultSource: false,
defaultSource: null,
};
const wrapper = shallow(<ProgressiveImage {...baseProps}/>);

View file

@ -10,10 +10,12 @@ import Preferences from '@mm-redux/constants/preferences';
describe('Reactions', () => {
const baseProps = {
theme: Preferences.THEMES.default,
recentEmojis: [],
addReaction: jest.fn(),
deviceWidth: undefined,
isLandscape: false,
openReactionScreen: jest.fn(),
recentEmojis: [],
theme: Preferences.THEMES.default,
};
test('Should match snapshot with default emojis', () => {

View file

@ -125,7 +125,7 @@ describe('SafeAreaIos', () => {
expect(wrapper.state().safeAreaInsets).not.toEqual(TEST_INSETS_1.safeAreaInsets);
});
test('should set safe area insets on change if mounted and DeviceTypes.IS_IPHONE_WITH_INSETS is true', () => {
test('should set safe area insets on change if mounted and DeviceTypes.IS_IPHONE_WITH_INSETS is true', async () => {
DeviceTypes.IS_IPHONE_WITH_INSETS = true;
mattermostManaged.hasSafeAreaInsets = false;
@ -140,7 +140,7 @@ describe('SafeAreaIos', () => {
expect(wrapper.state().safeAreaInsets).toEqual(TEST_INSETS_2.safeAreaInsets);
});
test('should set safe area insets on change if mounted and mattermostManaged.hasSafeAreaInsets is true', () => {
test('should set safe area insets on change if mounted and mattermostManaged.hasSafeAreaInsets is true', async () => {
DeviceTypes.IS_IPHONE_WITH_INSETS = false;
mattermostManaged.hasSafeAreaInsets = true;
@ -155,7 +155,7 @@ describe('SafeAreaIos', () => {
expect(wrapper.state().safeAreaInsets).toEqual(TEST_INSETS_2.safeAreaInsets);
});
test('should not set safe area insets on change if mounted and neither DeviceTypes.IS_IPHONE_WITH_INSETS nor mattermostManaged.hasSafeAreaInsets is true', () => {
test('should not set safe area insets on change if mounted and neither DeviceTypes.IS_IPHONE_WITH_INSETS nor mattermostManaged.hasSafeAreaInsets is true', async () => {
DeviceTypes.IS_IPHONE_WITH_INSETS = false;
mattermostManaged.hasSafeAreaInsets = false;
@ -170,7 +170,7 @@ describe('SafeAreaIos', () => {
expect(wrapper.state().safeAreaInsets).not.toEqual(TEST_INSETS_2.safeAreaInsets);
});
test('should set safe area insets on change not mounted', () => {
test('should set safe area insets on change not mounted', async () => {
DeviceTypes.IS_IPHONE_WITH_INSETS = true;
mattermostManaged.hasSafeAreaInsets = true;
@ -186,7 +186,7 @@ describe('SafeAreaIos', () => {
expect(wrapper.state().safeAreaInsets).not.toEqual(TEST_INSETS_2.safeAreaInsets);
});
test('should set portrait safe area insets', () => {
test('should set portrait safe area insets', async () => {
const wrapper = shallow(
<SafeAreaIos {...baseProps}/>,
);
@ -203,7 +203,7 @@ describe('SafeAreaIos', () => {
expect(EphemeralStore.safeAreaInsets[LANDSCAPE]).toEqual(null);
});
test('should set portrait safe area insets from EphemeralStore', () => {
test('should set portrait safe area insets from EphemeralStore', async () => {
const wrapper = shallow(
<SafeAreaIos {...baseProps}/>,
);
@ -236,7 +236,7 @@ describe('SafeAreaIos', () => {
expect(EphemeralStore.safeAreaInsets[PORTRAIT]).toEqual(null);
});
test('should set landscape safe area insets from EphemeralStore', () => {
test('should set landscape safe area insets from EphemeralStore', async () => {
const wrapper = shallow(
<SafeAreaIos {...baseProps}/>,
);
@ -252,7 +252,7 @@ describe('SafeAreaIos', () => {
expect(EphemeralStore.safeAreaInsets[PORTRAIT]).toEqual(null);
});
test('should add safeAreaInsetsForRootViewDidChange listener when EphemeralStore values are not set', () => {
test('should add safeAreaInsetsForRootViewDidChange listener when EphemeralStore values are not set', async () => {
const addEventListener = jest.spyOn(SafeArea, 'addEventListener');
expect(EphemeralStore.safeAreaInsets[PORTRAIT]).toEqual(null);
@ -281,7 +281,7 @@ describe('SafeAreaIos', () => {
expect(addEventListener).not.toHaveBeenCalled();
});
test('should remove safeAreaInsetsForRootViewDidChange listener when EphemeralStore values are set', () => {
test('should remove safeAreaInsetsForRootViewDidChange listener when EphemeralStore values are set', async () => {
const removeEventListener = jest.spyOn(SafeArea, 'removeEventListener');
const wrapper = shallow(

View file

@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`ChannelItem should match snapshot 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -99,11 +99,11 @@ exports[`ChannelItem should match snapshot 1`] = `
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot for current user i.e currentUser (you) 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -211,11 +211,11 @@ exports[`ChannelItem should match snapshot for current user i.e currentUser (you
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot for current user i.e currentUser (you) when isSearchResult 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -323,11 +323,11 @@ exports[`ChannelItem should match snapshot for current user i.e currentUser (you
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot for deactivated user and is currentChannel 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -435,11 +435,11 @@ exports[`ChannelItem should match snapshot for deactivated user and is currentCh
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot for deactivated user and is searchResult 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -537,11 +537,11 @@ exports[`ChannelItem should match snapshot for deactivated user and is searchRes
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot for deactivated user and not searchResults or currentChannel 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -639,11 +639,11 @@ exports[`ChannelItem should match snapshot for deactivated user and not searchRe
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot for isManualUnread 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -741,7 +741,7 @@ exports[`ChannelItem should match snapshot for isManualUnread 1`] = `
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot for no displayName 1`] = `null`;
@ -749,7 +749,7 @@ exports[`ChannelItem should match snapshot for no displayName 1`] = `null`;
exports[`ChannelItem should match snapshot for showUnreadForMsgs 1`] = `null`;
exports[`ChannelItem should match snapshot with draft 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -847,11 +847,11 @@ exports[`ChannelItem should match snapshot with draft 1`] = `
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelItem should match snapshot with mentions and muted 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -982,5 +982,5 @@ exports[`ChannelItem should match snapshot with mentions and muted 1`] = `
/>
</View>
</View>
</Component>
</ForwardRef>
`;

View file

@ -47,7 +47,7 @@ exports[`components/widgets/settings/RadioSetting should match snapshot when err
]
}
>
<Component
<ForwardRef
onPress={[Function]}
>
<View
@ -87,8 +87,8 @@ exports[`components/widgets/settings/RadioSetting should match snapshot when err
}
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
>
<View
@ -128,8 +128,8 @@ exports[`components/widgets/settings/RadioSetting should match snapshot when err
}
}
/>
</Component>
<Component
</ForwardRef>
<ForwardRef
onPress={[Function]}
>
<View
@ -164,7 +164,7 @@ exports[`components/widgets/settings/RadioSetting should match snapshot when err
width={12}
/>
</View>
</Component>
</ForwardRef>
</View>
<View
style={null}

View file

@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`ChannelDrawerButton should match, full snapshot 1`] = `
<Component
<ForwardRef
accessibilityHint="Opens the channels and teams drawer"
accessibilityLabel="Channels and teams"
accessibilityRole="button"
@ -36,11 +36,11 @@ exports[`ChannelDrawerButton should match, full snapshot 1`] = `
/>
</View>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelDrawerButton should match, full snapshot 2`] = `
<Component
<ForwardRef
accessibilityHint="Opens the channels and teams drawer"
accessibilityLabel="Channels and teams"
accessibilityRole="button"
@ -104,5 +104,5 @@ exports[`ChannelDrawerButton should match, full snapshot 2`] = `
/>
</View>
</View>
</Component>
</ForwardRef>
`;

View file

@ -62,11 +62,14 @@ export default class ChannelNavBar extends PureComponent {
}
};
handlePermanentSidebar = () => {
handlePermanentSidebar = async () => {
if (DeviceTypes.IS_TABLET && this.mounted) {
AsyncStorage.getItem(DeviceTypes.PERMANENT_SIDEBAR_SETTINGS).then((enabled) => {
try {
const enabled = await AsyncStorage.getItem(DeviceTypes.PERMANENT_SIDEBAR_SETTINGS);
this.setState({permanentSidebar: enabled === 'true'});
});
} catch {
// do nothing
}
}
};

View file

@ -33,12 +33,12 @@ describe('ChannelNavBar', () => {
expect(wrapper.getElement()).toMatchSnapshot();
});
test('should not set the permanentSidebar state if not Tablet', () => {
test('should not set the permanentSidebar state if not Tablet', async () => {
const wrapper = shallow(
<ChannelNavBar {...baseProps}/>,
);
wrapper.instance().handlePermanentSidebar();
await wrapper.instance().handlePermanentSidebar();
expect(wrapper.state('permanentSidebar')).toBeUndefined();
});
@ -50,11 +50,10 @@ describe('ChannelNavBar', () => {
DeviceTypes.IS_TABLET = true;
await wrapper.instance().handlePermanentSidebar();
expect(wrapper.state('permanentSidebar')).toBeDefined();
});
test('drawerButtonVisible appears for android tablets', () => {
test('drawerButtonVisible appears for android tablets', async () => {
const wrapper = shallow(
<ChannelNavBar {...baseProps}/>,
);
@ -65,7 +64,7 @@ describe('ChannelNavBar', () => {
expect(wrapper.instance().drawerButtonVisible()).toBe(true);
});
test('drawerButtonVisible appears for android phones', () => {
test('drawerButtonVisible appears for android phones', async () => {
const wrapper = shallow(
<ChannelNavBar {...baseProps}/>,
);
@ -76,7 +75,7 @@ describe('ChannelNavBar', () => {
expect(wrapper.instance().drawerButtonVisible()).toBe(true);
});
test('drawerButtonVisible appears for iOS phones', () => {
test('drawerButtonVisible appears for iOS phones', async () => {
const wrapper = shallow(
<ChannelNavBar {...baseProps}/>,
);
@ -87,7 +86,7 @@ describe('ChannelNavBar', () => {
expect(wrapper.instance().drawerButtonVisible()).toBe(true);
});
test('drawerButtonVisible appears for iOS tablets with PermanentSidebar at default false, and not in splitview', () => {
test('drawerButtonVisible appears for iOS tablets with PermanentSidebar at default false, and not in splitview', async () => {
const wrapper = shallow(
<ChannelNavBar {...baseProps}/>,
);
@ -100,7 +99,7 @@ describe('ChannelNavBar', () => {
expect(wrapper.instance().drawerButtonVisible()).toBe(true);
});
test('drawerButtonVisible does not appear for iOS tablets with permanentSidebar enabled', () => {
test('drawerButtonVisible does not appear for iOS tablets with permanentSidebar enabled', async () => {
const wrapper = shallow(
<ChannelNavBar {...baseProps}/>,
);
@ -113,7 +112,7 @@ describe('ChannelNavBar', () => {
expect(wrapper.instance().drawerButtonVisible()).toBe(false);
});
test('drawerButtonVisible appears for iOS tablets with splitview enabled', () => {
test('drawerButtonVisible appears for iOS tablets with splitview enabled', async () => {
const wrapper = shallow(
<ChannelNavBar {...baseProps}/>,
);

View file

@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`ChannelTitle should match snapshot 1`] = `
<Component
<ForwardRef
style={
Object {
"flex": 1,
@ -47,11 +47,11 @@ exports[`ChannelTitle should match snapshot 1`] = `
}
/>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelTitle should match snapshot when is DM and has guests and the teammate is the guest (when can show subtitles) 1`] = `
<Component
<ForwardRef
style={
Object {
"flex": 1,
@ -122,11 +122,11 @@ exports[`ChannelTitle should match snapshot when is DM and has guests and the te
}
/>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelTitle should match snapshot when is DM and has guests but the teammate is not the guest (when can show subtitles) 1`] = `
<Component
<ForwardRef
style={
Object {
"flex": 1,
@ -172,11 +172,11 @@ exports[`ChannelTitle should match snapshot when is DM and has guests but the te
}
/>
</View>
</Component>
</ForwardRef>
`;
exports[`ChannelTitle should match snapshot when isSelfDMChannel is true 1`] = `
<Component
<ForwardRef
style={
Object {
"flex": 1,
@ -230,5 +230,5 @@ exports[`ChannelTitle should match snapshot when isSelfDMChannel is true 1`] = `
}
/>
</View>
</Component>
</ForwardRef>
`;

View file

@ -92,7 +92,7 @@ exports[`channel_info_header should match snapshot 1`] = `
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -126,7 +126,7 @@ exports[`channel_info_header should match snapshot 1`] = `
Purpose string
</Text>
</View>
</Component>
</ForwardRef>
</View>
<View
style={
@ -138,7 +138,7 @@ exports[`channel_info_header should match snapshot 1`] = `
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -275,7 +275,7 @@ exports[`channel_info_header should match snapshot 1`] = `
value="Header string"
/>
</View>
</Component>
</ForwardRef>
</View>
<Text
style={
@ -431,7 +431,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests and is
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -465,7 +465,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests and is
Purpose string
</Text>
</View>
</Component>
</ForwardRef>
</View>
<View
style={
@ -477,7 +477,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests and is
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -614,7 +614,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests and is
value="Header string"
/>
</View>
</Component>
</ForwardRef>
</View>
<Text
style={
@ -742,7 +742,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests but its
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -776,7 +776,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests but its
Purpose string
</Text>
</View>
</Component>
</ForwardRef>
</View>
<View
style={
@ -788,7 +788,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests but its
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -925,7 +925,7 @@ exports[`channel_info_header should match snapshot when DM and hasGuests but its
value="Header string"
/>
</View>
</Component>
</ForwardRef>
</View>
<Text
style={
@ -1081,7 +1081,7 @@ exports[`channel_info_header should match snapshot when GM and hasGuests 1`] = `
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -1115,7 +1115,7 @@ exports[`channel_info_header should match snapshot when GM and hasGuests 1`] = `
Purpose string
</Text>
</View>
</Component>
</ForwardRef>
</View>
<View
style={
@ -1127,7 +1127,7 @@ exports[`channel_info_header should match snapshot when GM and hasGuests 1`] = `
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -1264,7 +1264,7 @@ exports[`channel_info_header should match snapshot when GM and hasGuests 1`] = `
value="Header string"
/>
</View>
</Component>
</ForwardRef>
</View>
<Text
style={
@ -1392,7 +1392,7 @@ exports[`channel_info_header should match snapshot when is group constrained 1`]
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -1426,7 +1426,7 @@ exports[`channel_info_header should match snapshot when is group constrained 1`]
Purpose string
</Text>
</View>
</Component>
</ForwardRef>
</View>
<View
style={
@ -1438,7 +1438,7 @@ exports[`channel_info_header should match snapshot when is group constrained 1`]
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -1575,7 +1575,7 @@ exports[`channel_info_header should match snapshot when is group constrained 1`]
value="Header string"
/>
</View>
</Component>
</ForwardRef>
</View>
<Text
style={
@ -1753,7 +1753,7 @@ exports[`channel_info_header should match snapshot when public channel and hasGu
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -1787,7 +1787,7 @@ exports[`channel_info_header should match snapshot when public channel and hasGu
Purpose string
</Text>
</View>
</Component>
</ForwardRef>
</View>
<View
style={
@ -1799,7 +1799,7 @@ exports[`channel_info_header should match snapshot when public channel and hasGu
]
}
>
<Component
<ForwardRef
onLongPress={[Function]}
>
<View
@ -1936,7 +1936,7 @@ exports[`channel_info_header should match snapshot when public channel and hasGu
value="Header string"
/>
</View>
</Component>
</ForwardRef>
</View>
<Text
style={

View file

@ -4,13 +4,13 @@
import React from 'react';
import PropTypes from 'prop-types';
import {
Clipboard,
Platform,
Text,
TouchableHighlight,
View,
} from 'react-native';
import {intlShape} from 'react-intl';
import Clipboard from '@react-native-community/clipboard';
import {General} from '@mm-redux/constants';

View file

@ -6,7 +6,7 @@ import PropTypes from 'prop-types';
import {intlShape} from 'react-intl';
import {Alert, View} from 'react-native';
import RNFetchBlob from 'rn-fetch-blob';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scrollview';
import DocumentPicker from 'react-native-document-picker';
import {Navigation} from 'react-native-navigation';
@ -200,7 +200,7 @@ export default class EditProfile extends PureComponent {
this.setState({error, updating: false});
this.emitCanUpdateAccount(true);
if (this.scrollView) {
this.scrollView.props.scrollToPosition(0, 0);
this.scrollView.props.scrollTo({x: 0, y: 0});
}
};

View file

@ -133,7 +133,7 @@ exports[`ForgotPassword should match snapshot 1`] = `
]
}
/>
<TextInput
<Component
allowFontScaling={true}
autoCapitalize="none"
autoCorrect={false}
@ -244,7 +244,7 @@ exports[`ForgotPassword snapshot for error on failure of email regex 1`] = `
]
}
/>
<TextInput
<Component
allowFontScaling={true}
autoCapitalize="none"
autoCorrect={false}

View file

@ -94,7 +94,7 @@ exports[`ImagePreview should match snapshot 1`] = `
}
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -111,7 +111,7 @@ exports[`ImagePreview should match snapshot 1`] = `
name="md-close"
size={26}
/>
</Component>
</ForwardRef>
<Text
style={
Object {
@ -125,7 +125,7 @@ exports[`ImagePreview should match snapshot 1`] = `
>
1/2
</Text>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -142,7 +142,7 @@ exports[`ImagePreview should match snapshot 1`] = `
name="ios-download"
size={26}
/>
</Component>
</ForwardRef>
</View>
</View>
</ForwardRef(AnimatedComponentWrapper)>
@ -234,7 +234,7 @@ exports[`ImagePreview should match snapshot 1`] = `
exports[`ImagePreview should match snapshot and not renderDownloadButton for local files 1`] = `null`;
exports[`ImagePreview should match snapshot, renderDownloadButton 1`] = `
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -251,5 +251,5 @@ exports[`ImagePreview should match snapshot, renderDownloadButton 1`] = `
name="ios-download"
size={26}
/>
</Component>
</ForwardRef>
`;

View file

@ -17,7 +17,7 @@ import {
View,
} from 'react-native';
import Button from 'react-native-button';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scrollview';
import {resetToChannel, goToScreen} from '@actions/navigation';
import ErrorText from '@components/error_text';
@ -55,6 +55,7 @@ export default class Login extends PureComponent {
this.loginRef = React.createRef();
this.passwordRef = React.createRef();
this.scroll = React.createRef();
this.loginId = '';
this.password = '';
@ -213,7 +214,9 @@ export default class Login extends PureComponent {
};
orientationDidChange = () => {
this.scroll.scrollToPosition(0, 0, true);
if (this.scroll.current) {
this.scroll.current.scrollTo({x: 0, y: 0, animated: true});
}
};
passwordFocus = () => {
@ -290,10 +293,6 @@ export default class Login extends PureComponent {
actions.scheduleExpiredNotification(intl);
};
scrollRef = (ref) => {
this.scroll = ref;
};
setEmmUsernameIfAvailable = async () => {
const managedConfig = await mattermostManaged.getConfig();
if (managedConfig?.username && this.loginRef.current) {

View file

@ -270,7 +270,7 @@ LongPost {
}
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -287,7 +287,7 @@ LongPost {
name="close"
size={20}
/>
</Component>
</ForwardRef>
<View
style={
Object {

View file

@ -28,7 +28,7 @@ exports[`OptionModalList should match snapshot for Android 1`] = `
}
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -64,7 +64,7 @@ exports[`OptionModalList should match snapshot for Android 1`] = `
}
}
/>
</Component>
</ForwardRef>
</View>
<View
style={
@ -74,7 +74,7 @@ exports[`OptionModalList should match snapshot for Android 1`] = `
}
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -110,9 +110,9 @@ exports[`OptionModalList should match snapshot for Android 1`] = `
}
}
/>
</Component>
</ForwardRef>
</View>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -135,7 +135,7 @@ exports[`OptionModalList should match snapshot for Android 1`] = `
}
}
/>
</Component>
</ForwardRef>
</View>
</View>
`;
@ -203,7 +203,7 @@ exports[`OptionModalList should match snapshot for iOS 1`] = `
]
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -240,7 +240,7 @@ exports[`OptionModalList should match snapshot for iOS 1`] = `
}
}
/>
</Component>
</ForwardRef>
</View>
<View
style={
@ -249,7 +249,7 @@ exports[`OptionModalList should match snapshot for iOS 1`] = `
]
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -286,7 +286,7 @@ exports[`OptionModalList should match snapshot for iOS 1`] = `
}
}
/>
</Component>
</ForwardRef>
</View>
</View>
<View
@ -300,7 +300,7 @@ exports[`OptionModalList should match snapshot for iOS 1`] = `
}
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -324,7 +324,7 @@ exports[`OptionModalList should match snapshot for iOS 1`] = `
}
}
/>
</Component>
</ForwardRef>
</View>
</View>
`;

View file

@ -52,7 +52,7 @@ exports[`Permalink should match snapshot 1`] = `
}
}
>
<Component
<ForwardRef
onPress={[Function]}
style={
Object {
@ -69,7 +69,7 @@ exports[`Permalink should match snapshot 1`] = `
name="close"
size={20}
/>
</Component>
</ForwardRef>
<View
style={
Object {

View file

@ -50,7 +50,7 @@ describe('PinnedPosts', () => {
expect(wrapper.getElement()).toMatchSnapshot();
});
test('should match snapshot when component waiting for response', () => {
test('should match snapshot when component waiting for response', async () => {
const error = new Error('foo');
const newProps = {

View file

@ -3,7 +3,8 @@
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {Alert, Clipboard, StyleSheet, View} from 'react-native';
import {Alert, StyleSheet, View} from 'react-native';
import Clipboard from '@react-native-community/clipboard';
import {intlShape} from 'react-intl';
import MaterialIcon from 'react-native-vector-icons/MaterialIcons';

View file

@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`ReactionHeaderItem should match snapshot 1`] = `
<Component
<ForwardRef
onPress={[Function]}
style={
Array [
@ -41,7 +41,7 @@ exports[`ReactionHeaderItem should match snapshot 1`] = `
3
</Text>
</React.Fragment>
</Component>
</ForwardRef>
`;
exports[`ReactionHeaderItem should match snapshot, renderContent 1`] = `

View file

@ -23,7 +23,7 @@ exports[`ReactionRow should match snapshot, renderContent 1`] = `
]
}
>
<Component
<ForwardRef
onPress={[Function]}
>
<View
@ -39,7 +39,7 @@ exports[`ReactionRow should match snapshot, renderContent 1`] = `
userId="user_id"
/>
</View>
</Component>
</ForwardRef>
</View>
<Text
ellipsizeMode="tail"

View file

@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Search RecentItem should match snapshot and respond to events 1`] = `
<Component
<ForwardRef
onPress={[Function]}
underlayColor="rgba(69,120,191,0.5)"
>
@ -79,5 +79,5 @@ exports[`Search RecentItem should match snapshot and respond to events 1`] = `
</Text>
</View>
</View>
</Component>
</ForwardRef>
`;

View file

@ -49,7 +49,7 @@ exports[`NotificationSettingsEmailAndroid should match snapshot 1`] = `
`;
exports[`NotificationSettingsEmailAndroid should match snapshot 2`] = `
<Modal
<Component
animationType="slide"
hardwareAccelerated={false}
onRequestClose={[Function]}
@ -105,7 +105,7 @@ exports[`NotificationSettingsEmailAndroid should match snapshot 2`] = `
<View
style={Object {}}
>
<Component
<ForwardRef
onPress={[Function]}
style={Object {}}
>
@ -114,7 +114,7 @@ exports[`NotificationSettingsEmailAndroid should match snapshot 2`] = `
id="mobile.notification_settings.modal_cancel"
style={Object {}}
/>
</Component>
</ForwardRef>
<View>
<View
style={
@ -123,7 +123,7 @@ exports[`NotificationSettingsEmailAndroid should match snapshot 2`] = `
}
}
/>
<Component
<ForwardRef
onPress={[Function]}
style={Object {}}
>
@ -132,11 +132,11 @@ exports[`NotificationSettingsEmailAndroid should match snapshot 2`] = `
id="mobile.notification_settings.modal_save"
style={Object {}}
/>
</Component>
</ForwardRef>
</View>
</View>
</View>
</View>
</View>
</Modal>
</Component>
`;

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_5" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="splash.png" translatesAutoresizingMaskIntoConstraints="NO" id="UpL-W2-INZ">
<rect key="frame" x="87" y="328" width="240" height="240"/>
<constraints>
<constraint firstAttribute="height" constant="240" id="WUO-wG-itC"/>
<constraint firstAttribute="width" constant="240" id="Ys9-fh-wVA"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="UpL-W2-INZ" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="eka-4s-Xin"/>
<constraint firstItem="UpL-W2-INZ" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="lI4-YK-lDO"/>
</constraints>
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="52" y="374.66266866566718"/>
</scene>
</scenes>
<resources>
<image name="splash.png" width="720" height="720"/>
</resources>
</document>

View file

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="splash.png" translatesAutoresizingMaskIntoConstraints="NO" id="ZkI-RL-69Z">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="ZkI-RL-69Z" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="7dE-9J-TdO"/>
<constraint firstAttribute="trailing" secondItem="ZkI-RL-69Z" secondAttribute="trailing" id="KFm-od-sbN"/>
<constraint firstAttribute="bottom" secondItem="ZkI-RL-69Z" secondAttribute="bottom" id="afY-hI-KgI"/>
<constraint firstItem="ZkI-RL-69Z" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="eMX-qT-GeJ"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
<resources>
<image name="splash.png" width="720" height="1280"/>
</resources>
</document>

View file

@ -14,15 +14,17 @@ if (Platform.OS === 'android') {
}
if (__DEV__) {
const YellowBox = require('react-native/Libraries/YellowBox/YellowBox');
YellowBox.ignoreWarnings([
const LogBox = require('react-native/Libraries/LogBox/LogBox');
LogBox.ignoreLogs([
'Warning: componentWillReceiveProps',
'Warning: componentWillMount',
'Warning: StatusBarIOS',
'`-[RCTRootView cancelTouches]`',
'Animated',
// Hide warnings caused by React Native (https://github.com/facebook/react-native/issues/20841)
'Require cycle: node_modules/react-native/Libraries/Network/fetch.js',
'Warning: Cannot update a component from inside the function body of a different component',
]);
}

View file

@ -29,6 +29,7 @@
69AC753E496743BABB7A7124 /* OpenSans-SemiboldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0E617BF0F36D4E738F51D169 /* OpenSans-SemiboldItalic.ttf */; };
6C9B1EFD6561083917AF06CF /* libPods-Mattermost.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DEEFB3ED6175724A2653247 /* libPods-Mattermost.a */; };
71F30A436B5847DF9D319D15 /* Roboto-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7F54ABFAE6CE4A6DB11D1ED7 /* Roboto-BlackItalic.ttf */; };
7F0F4B0A24BA173900E14C60 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7F0F4B0924BA173900E14C60 /* LaunchScreen.storyboard */; };
7F151D3E221B062700FAD8F3 /* RuntimeUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F151D3D221B062700FAD8F3 /* RuntimeUtils.swift */; };
7F151D41221B069200FAD8F3 /* 0155-keys.png in Resources */ = {isa = PBXBuildFile; fileRef = 7F151D40221B069200FAD8F3 /* 0155-keys.png */; };
7F240A1C220D3A2300637665 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F240A1B220D3A2300637665 /* ShareViewController.swift */; };
@ -39,7 +40,6 @@
7F240ADB220E089300637665 /* Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F240ADA220E089300637665 /* Item.swift */; };
7F240ADD220E094A00637665 /* TeamsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F240ADC220E094A00637665 /* TeamsViewController.swift */; };
7F292A711E8AB73400A450A3 /* SplashScreenResource in Resources */ = {isa = PBXBuildFile; fileRef = 7F292A701E8AB73400A450A3 /* SplashScreenResource */; };
7F292AA61E8ABB1100A450A3 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7F292AA41E8ABB1100A450A3 /* LaunchScreen.xib */; };
7F292AA71E8ABB1100A450A3 /* splash.png in Resources */ = {isa = PBXBuildFile; fileRef = 7F292AA51E8ABB1100A450A3 /* splash.png */; };
7F581D35221ED5C60099E66B /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F581D34221ED5C60099E66B /* NotificationService.swift */; };
7F581D39221ED5C60099E66B /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 7F581D32221ED5C60099E66B /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
@ -187,6 +187,7 @@
71E626D4980A4560B26F0E1C /* Roboto-Bold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Roboto-Bold.ttf"; path = "../assets/fonts/Roboto-Bold.ttf"; sourceTree = "<group>"; };
75387D8184A144939E9E7561 /* 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 = "<group>"; };
7CA9B66DCC1F47AF86A50CDA /* 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 = "<group>"; };
7F0F4B0924BA173900E14C60 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = SplashScreenResource/LaunchScreen.storyboard; sourceTree = "<group>"; };
7F151D3D221B062700FAD8F3 /* RuntimeUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RuntimeUtils.swift; path = Mattermost/RuntimeUtils.swift; sourceTree = "<group>"; };
7F151D40221B069200FAD8F3 /* 0155-keys.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "0155-keys.png"; path = "Mattermost/0155-keys.png"; sourceTree = "<group>"; };
7F151D42221B07F700FAD8F3 /* MattermostShare-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MattermostShare-Bridging-Header.h"; sourceTree = "<group>"; };
@ -203,7 +204,6 @@
7F240ADA220E089300637665 /* Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Item.swift; sourceTree = "<group>"; };
7F240ADC220E094A00637665 /* TeamsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TeamsViewController.swift; sourceTree = "<group>"; };
7F292A701E8AB73400A450A3 /* SplashScreenResource */ = {isa = PBXFileReference; lastKnownFileType = folder; path = SplashScreenResource; sourceTree = "<group>"; };
7F292AA41E8ABB1100A450A3 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LaunchScreen.xib; path = SplashScreenResource/LaunchScreen.xib; sourceTree = "<group>"; };
7F292AA51E8ABB1100A450A3 /* splash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = splash.png; path = SplashScreenResource/splash.png; sourceTree = "<group>"; };
7F325D6DAAF1047EB948EFF7 /* Pods-Mattermost-MattermostTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mattermost-MattermostTests.debug.xcconfig"; path = "Target Support Files/Pods-Mattermost-MattermostTests/Pods-Mattermost-MattermostTests.debug.xcconfig"; sourceTree = "<group>"; };
7F43D6051F6BF9EB001FC614 /* libPods-Mattermost.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libPods-Mattermost.a"; path = "../../../../../../../Library/Developer/Xcode/DerivedData/Mattermost-czlinsdviifujheezzjvmisotjrm/Build/Products/Debug-iphonesimulator/libPods-Mattermost.a"; sourceTree = "<group>"; };
@ -372,7 +372,6 @@
7F151D3D221B062700FAD8F3 /* RuntimeUtils.swift */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
7F292AA41E8ABB1100A450A3 /* LaunchScreen.xib */,
7FF2AF8A2086483E00FFBDF4 /* KeyShareConsumer.storyboard */,
13B07FB71A68108700A75B9A /* main.m */,
7F63D2C21E6DD98A001FAE12 /* Mattermost.entitlements */,
@ -387,6 +386,7 @@
7F292AA51E8ABB1100A450A3 /* splash.png */,
7F5BA34522B99B7B005B05D3 /* Mattermost+RCTUITextView.h */,
7F5BA34622B99B7B005B05D3 /* Mattermost+RCTUITextView.m */,
7F0F4B0924BA173900E14C60 /* LaunchScreen.storyboard */,
);
name = Mattermost;
sourceTree = "<group>";
@ -689,9 +689,9 @@
499F7AF1235511FD00E7AF6E /* Mattermost-Regular.otf in Resources */,
7F151D41221B069200FAD8F3 /* 0155-keys.png in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
7F0F4B0A24BA173900E14C60 /* LaunchScreen.storyboard in Resources */,
7F292AA71E8ABB1100A450A3 /* splash.png in Resources */,
7FF2AF8B2086483E00FFBDF4 /* KeyShareConsumer.storyboard in Resources */,
7F292AA61E8ABB1100A450A3 /* LaunchScreen.xib in Resources */,
7F292A711E8AB73400A450A3 /* SplashScreenResource in Resources */,
9358B95F95184EE0A4DCE629 /* OpenSans-Bold.ttf in Resources */,
55C6561DDBBA45929D88B6D1 /* OpenSans-BoldItalic.ttf in Resources */,
@ -811,6 +811,7 @@
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Octicons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf",
"${PODS_ROOT}/../../node_modules/react-native-vector-icons/Fonts/Zocial.ttf",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
"${PODS_ROOT}/YoutubePlayer-in-WKWebView/WKYTPlayerView/WKYTPlayerView.bundle",
);
name = "[CP] Copy Pods Resources";
@ -831,6 +832,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Octicons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/WKYTPlayerView.bundle",
);
runOnlyForDeploymentPostprocessing = 0;

View file

@ -64,6 +64,8 @@
<string>Share contacts in your Mattermost instance</string>
<key>NSCameraUsageDescription</key>
<string>Take a Photo or Video and upload it to your Mattermost instance</string>
<key>NSFaceIDUsageDescription</key>
<string>Mattermost uses Face ID to restrict unauthorized users from accessing the app.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Send your current location to your Mattermost instance</string>
<key>NSLocationWhenInUseUsageDescription</key>
@ -72,14 +74,12 @@
<string>Capture audio when recording a video to share to your Mattermost instance</string>
<key>NSMotionUsageDescription</key>
<string>Share your route in your Mattermost instance</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Upload Photos and Videos from your device to your Mattermost instance</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Save downloaded Photos and Videos from your Mattermost instance to your device</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Upload Photos and Videos from your device to your Mattermost instance</string>
<key>NSSpeechRecognitionUsageDescription</key>
<string>Send voice messages to your Mattermost instance</string>
<key>NSFaceIDUsageDescription</key>
<string>Mattermost uses Face ID to restrict unauthorized users from accessing the app.</string>
<key>UIAppFonts</key>
<array>
<string>Entypo.ttf</string>

View file

@ -1,38 +1,12 @@
platform :ios, '9.0'
require_relative '../node_modules/react-native/scripts/react_native_pods'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
platform :ios, '10.0'
target 'Mattermost' do
# Pods for Mattermost
pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
pod 'React', :path => '../node_modules/react-native/'
pod 'React-Core', :path => '../node_modules/react-native/'
pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
config = use_native_modules!
use_react_native!(:path => config["reactNativePath"])
permissions_path = '../node_modules/react-native-permissions/ios'
pod 'Permission-Camera', :path => "#{permissions_path}/Camera.podspec"
@ -40,6 +14,13 @@ target 'Mattermost' do
pod 'XCDYouTubeKit', '2.8.2'
pod 'Swime', '3.0.6'
use_native_modules!
end
# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable these next few lines.
# use_flipper!
# post_install do |installer|
# flipper_post_install(installer)
# end

View file

@ -3,20 +3,20 @@ PODS:
- BVLinearGradient (2.5.6):
- React
- DoubleConversion (1.1.6)
- FBLazyVector (0.62.2)
- FBReactNativeSpec (0.62.2):
- Folly (= 2018.10.22.00)
- RCTRequired (= 0.62.2)
- RCTTypeSafety (= 0.62.2)
- React-Core (= 0.62.2)
- React-jsi (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- Folly (2018.10.22.00):
- FBLazyVector (0.63.1)
- FBReactNativeSpec (0.63.1):
- Folly (= 2020.01.13.00)
- RCTRequired (= 0.63.1)
- RCTTypeSafety (= 0.63.1)
- React-Core (= 0.63.1)
- React-jsi (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- Folly (2020.01.13.00):
- boost-for-react-native
- DoubleConversion
- Folly/Default (= 2018.10.22.00)
- Folly/Default (= 2020.01.13.00)
- glog
- Folly/Default (2018.10.22.00):
- Folly/Default (2020.01.13.00):
- boost-for-react-native
- DoubleConversion
- glog
@ -39,172 +39,175 @@ PODS:
- RNPermissions
- Permission-PhotoLibrary (2.1.4):
- RNPermissions
- RCTRequired (0.62.2)
- RCTTypeSafety (0.62.2):
- FBLazyVector (= 0.62.2)
- Folly (= 2018.10.22.00)
- RCTRequired (= 0.62.2)
- React-Core (= 0.62.2)
- RCTRequired (0.63.1)
- RCTTypeSafety (0.63.1):
- FBLazyVector (= 0.63.1)
- Folly (= 2020.01.13.00)
- RCTRequired (= 0.63.1)
- React-Core (= 0.63.1)
- RCTYouTube (2.0.1):
- React
- YoutubePlayer-in-WKWebView (~> 0.3.1)
- React (0.62.2):
- React-Core (= 0.62.2)
- React-Core/DevSupport (= 0.62.2)
- React-Core/RCTWebSocket (= 0.62.2)
- React-RCTActionSheet (= 0.62.2)
- React-RCTAnimation (= 0.62.2)
- React-RCTBlob (= 0.62.2)
- React-RCTImage (= 0.62.2)
- React-RCTLinking (= 0.62.2)
- React-RCTNetwork (= 0.62.2)
- React-RCTSettings (= 0.62.2)
- React-RCTText (= 0.62.2)
- React-RCTVibration (= 0.62.2)
- React-Core (0.62.2):
- Folly (= 2018.10.22.00)
- React (0.63.1):
- React-Core (= 0.63.1)
- React-Core/DevSupport (= 0.63.1)
- React-Core/RCTWebSocket (= 0.63.1)
- React-RCTActionSheet (= 0.63.1)
- React-RCTAnimation (= 0.63.1)
- React-RCTBlob (= 0.63.1)
- React-RCTImage (= 0.63.1)
- React-RCTLinking (= 0.63.1)
- React-RCTNetwork (= 0.63.1)
- React-RCTSettings (= 0.63.1)
- React-RCTText (= 0.63.1)
- React-RCTVibration (= 0.63.1)
- React-callinvoker (0.63.1)
- React-Core (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default (= 0.62.2)
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-Core/Default (= 0.63.1)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/CoreModulesHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/CoreModulesHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/Default (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/Default (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/DevSupport (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/DevSupport (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default (= 0.62.2)
- React-Core/RCTWebSocket (= 0.62.2)
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-jsinspector (= 0.62.2)
- React-Core/Default (= 0.63.1)
- React-Core/RCTWebSocket (= 0.63.1)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- React-jsinspector (= 0.63.1)
- Yoga
- React-Core/RCTActionSheetHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTActionSheetHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTAnimationHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTAnimationHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTBlobHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTBlobHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTImageHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTImageHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTLinkingHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTLinkingHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTNetworkHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTNetworkHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTSettingsHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTSettingsHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTTextHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTTextHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTVibrationHeaders (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTVibrationHeaders (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-Core/RCTWebSocket (0.62.2):
- Folly (= 2018.10.22.00)
- React-Core/RCTWebSocket (0.63.1):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default (= 0.62.2)
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsiexecutor (= 0.62.2)
- React-Core/Default (= 0.63.1)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsiexecutor (= 0.63.1)
- Yoga
- React-CoreModules (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- Folly (= 2018.10.22.00)
- RCTTypeSafety (= 0.62.2)
- React-Core/CoreModulesHeaders (= 0.62.2)
- React-RCTImage (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- React-cxxreact (0.62.2):
- React-CoreModules (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.1)
- React-Core/CoreModulesHeaders (= 0.63.1)
- React-jsi (= 0.63.1)
- React-RCTImage (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- React-cxxreact (0.63.1):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2018.10.22.00)
- Folly (= 2020.01.13.00)
- glog
- React-jsinspector (= 0.62.2)
- React-jsi (0.62.2):
- React-callinvoker (= 0.63.1)
- React-jsinspector (= 0.63.1)
- React-jsi (0.63.1):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2018.10.22.00)
- Folly (= 2020.01.13.00)
- glog
- React-jsi/Default (= 0.62.2)
- React-jsi/Default (0.62.2):
- React-jsi/Default (= 0.63.1)
- React-jsi/Default (0.63.1):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2018.10.22.00)
- Folly (= 2020.01.13.00)
- glog
- React-jsiexecutor (0.62.2):
- React-jsiexecutor (0.63.1):
- DoubleConversion
- Folly (= 2018.10.22.00)
- Folly (= 2020.01.13.00)
- glog
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- React-jsinspector (0.62.2)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- React-jsinspector (0.63.1)
- react-native-cameraroll (1.6.2):
- React
- react-native-cookies (3.2.0):
@ -237,65 +240,66 @@ PODS:
- React
- react-native-webview (7.0.1):
- React
- React-RCTActionSheet (0.62.2):
- React-Core/RCTActionSheetHeaders (= 0.62.2)
- React-RCTAnimation (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- Folly (= 2018.10.22.00)
- RCTTypeSafety (= 0.62.2)
- React-Core/RCTAnimationHeaders (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- React-RCTBlob (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- Folly (= 2018.10.22.00)
- React-Core/RCTBlobHeaders (= 0.62.2)
- React-Core/RCTWebSocket (= 0.62.2)
- React-jsi (= 0.62.2)
- React-RCTNetwork (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- React-RCTImage (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- Folly (= 2018.10.22.00)
- RCTTypeSafety (= 0.62.2)
- React-Core/RCTImageHeaders (= 0.62.2)
- React-RCTNetwork (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- React-RCTLinking (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- React-Core/RCTLinkingHeaders (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- React-RCTNetwork (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- Folly (= 2018.10.22.00)
- RCTTypeSafety (= 0.62.2)
- React-Core/RCTNetworkHeaders (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- React-RCTSettings (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- Folly (= 2018.10.22.00)
- RCTTypeSafety (= 0.62.2)
- React-Core/RCTSettingsHeaders (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- React-RCTText (0.62.2):
- React-Core/RCTTextHeaders (= 0.62.2)
- React-RCTVibration (0.62.2):
- FBReactNativeSpec (= 0.62.2)
- Folly (= 2018.10.22.00)
- React-Core/RCTVibrationHeaders (= 0.62.2)
- ReactCommon/turbomodule/core (= 0.62.2)
- ReactCommon/callinvoker (0.62.2):
- React-RCTActionSheet (0.63.1):
- React-Core/RCTActionSheetHeaders (= 0.63.1)
- React-RCTAnimation (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.1)
- React-Core/RCTAnimationHeaders (= 0.63.1)
- React-jsi (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- React-RCTBlob (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- Folly (= 2020.01.13.00)
- React-Core/RCTBlobHeaders (= 0.63.1)
- React-Core/RCTWebSocket (= 0.63.1)
- React-jsi (= 0.63.1)
- React-RCTNetwork (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- React-RCTImage (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.1)
- React-Core/RCTImageHeaders (= 0.63.1)
- React-jsi (= 0.63.1)
- React-RCTNetwork (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- React-RCTLinking (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- React-Core/RCTLinkingHeaders (= 0.63.1)
- React-jsi (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- React-RCTNetwork (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.1)
- React-Core/RCTNetworkHeaders (= 0.63.1)
- React-jsi (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- React-RCTSettings (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.1)
- React-Core/RCTSettingsHeaders (= 0.63.1)
- React-jsi (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- React-RCTText (0.63.1):
- React-Core/RCTTextHeaders (= 0.63.1)
- React-RCTVibration (0.63.1):
- FBReactNativeSpec (= 0.63.1)
- Folly (= 2020.01.13.00)
- React-Core/RCTVibrationHeaders (= 0.63.1)
- React-jsi (= 0.63.1)
- ReactCommon/turbomodule/core (= 0.63.1)
- ReactCommon/turbomodule/core (0.63.1):
- DoubleConversion
- Folly (= 2018.10.22.00)
- Folly (= 2020.01.13.00)
- glog
- React-cxxreact (= 0.62.2)
- ReactCommon/turbomodule/core (0.62.2):
- DoubleConversion
- Folly (= 2018.10.22.00)
- glog
- React-Core (= 0.62.2)
- React-cxxreact (= 0.62.2)
- React-jsi (= 0.62.2)
- ReactCommon/callinvoker (= 0.62.2)
- React-callinvoker (= 0.63.1)
- React-Core (= 0.63.1)
- React-cxxreact (= 0.63.1)
- React-jsi (= 0.63.1)
- ReactNativeExceptionHandler (2.10.8):
- React
- ReactNativeKeyboardTrackingView (5.7.0):
@ -308,6 +312,8 @@ PODS:
- React-Core
- RNCAsyncStorage (1.10.1):
- React
- RNCClipboard (1.2.3):
- React
- RNCMaskedView (0.1.10):
- React
- RNDeviceInfo (5.5.7):
@ -371,6 +377,7 @@ DEPENDENCIES:
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
- RCTYouTube (from `../node_modules/react-native-youtube`)
- React (from `../node_modules/react-native/`)
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
- React-Core (from `../node_modules/react-native/`)
- React-Core/DevSupport (from `../node_modules/react-native/`)
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
@ -402,13 +409,13 @@ DEPENDENCIES:
- 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`)
- ReactCommon/callinvoker (from `../node_modules/react-native/ReactCommon`)
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
- ReactNativeExceptionHandler (from `../node_modules/react-native-exception-handler`)
- ReactNativeKeyboardTrackingView (from `../node_modules/react-native-keyboard-tracking-view`)
- ReactNativeNavigation (from `../node_modules/react-native-navigation`)
- rn-fetch-blob (from `../node_modules/rn-fetch-blob`)
- "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)"
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
- "RNCMaskedView (from `../node_modules/@react-native-community/masked-view`)"
- RNDeviceInfo (from `../node_modules/react-native-device-info`)
- RNFastImage (from `../node_modules/react-native-fast-image`)
@ -469,6 +476,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native-youtube"
React:
:path: "../node_modules/react-native/"
React-callinvoker:
:path: "../node_modules/react-native/ReactCommon/callinvoker"
React-Core:
:path: "../node_modules/react-native/"
React-CoreModules:
@ -539,6 +548,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/rn-fetch-blob"
RNCAsyncStorage:
:path: "../node_modules/@react-native-community/async-storage"
RNCClipboard:
:path: "../node_modules/@react-native-community/clipboard"
RNCMaskedView:
:path: "../node_modules/@react-native-community/masked-view"
RNDeviceInfo:
@ -575,27 +586,28 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
FBLazyVector: 4aab18c93cd9546e4bfed752b4084585eca8b245
FBReactNativeSpec: 5465d51ccfeecb7faa12f9ae0024f2044ce4044e
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
DoubleConversion: cde416483dac037923206447da6e1454df403714
FBLazyVector: a50434c875bd42f2b1c99c712bda892a1dc659c7
FBReactNativeSpec: 393853a536428e05a9da00b6290042f09809b15b
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3
jail-monkey: d7c5048b2336f22ee9c9e0efa145f1f917338ea9
libwebp: 946cb3063cea9236285f7e9a8505d806d30e07f3
MMKV: 5eb44526fcf38152328ebfeff5ec585972ace00d
MMKVCore: 2748bf702287a814a6c514d054033e41e07f5c0f
Permission-Camera: 3ed116545ee8806cd706bca0e1a9a2c3cd36c6bd
Permission-PhotoLibrary: 56e71522b008d9abca150680c1f8050f267cdffb
RCTRequired: cec6a34b3ac8a9915c37e7e4ad3aa74726ce4035
RCTTypeSafety: 93006131180074cffa227a1075802c89a49dd4ce
RCTRequired: d9b1a9e6fa097744ca3ede59f86a35096df7202b
RCTTypeSafety: c227cd061983e9e964115afbc4e8730d6a6f1395
RCTYouTube: 7ff7d42f5ed42d185198681e967fd2c2b661375d
React: 29a8b1a02bd764fb7644ef04019270849b9a7ac3
React-Core: b12bffb3f567fdf99510acb716ef1abd426e0e05
React-CoreModules: 4a9b87bbe669d6c3173c0132c3328e3b000783d0
React-cxxreact: e65f9c2ba0ac5be946f53548c1aaaee5873a8103
React-jsi: b6dc94a6a12ff98e8877287a0b7620d365201161
React-jsiexecutor: 1540d1c01bb493ae3124ed83351b1b6a155db7da
React-jsinspector: 512e560d0e985d0e8c479a54a4e5c147a9c83493
React: 86e972a20967ee4137aa19dc48319405927c2e94
React-callinvoker: 87ee376c25277d74e164ff036b27084e343f3e69
React-Core: f5ec03baf7ed58d9f3ee04a8f84e4c97ee8bf4c9
React-CoreModules: 958898aa8c069280e866e35a2f29480a81fcf335
React-cxxreact: 90de76b9b51575668ad7fd4e33a5a8c143beecc2
React-jsi: b32a31da32e030f30bbf9a8d3a9c8325df9e793f
React-jsiexecutor: 7ab9cdcdd18d57652fb041f8a147fe9658d4e00a
React-jsinspector: 2e28bb487e42dda6c94dbfa0c648d1343767a0fb
react-native-cameraroll: 94bec91c68b94ac946c61b497b594bb38692c41b
react-native-cookies: 854d59c4135c70b92a02ca4930e68e4e2eb58150
react-native-document-picker: d694111879537cec2c258a1dcd2243d9df746824
@ -610,21 +622,22 @@ SPEC CHECKSUMS:
react-native-safe-area-context: 5f3e081f937ab7c44c179d551f332fa494cfcf8f
react-native-video: 961749da457e73bf0b5565edfbaffc25abfb8974
react-native-webview: 0d1c2b4e7ffb0543a74fa0512f2f8dc5fb0e49e2
React-RCTActionSheet: f41ea8a811aac770e0cc6e0ad6b270c644ea8b7c
React-RCTAnimation: 49ab98b1c1ff4445148b72a3d61554138565bad0
React-RCTBlob: a332773f0ebc413a0ce85942a55b064471587a71
React-RCTImage: e70be9b9c74fe4e42d0005f42cace7981c994ac3
React-RCTLinking: c1b9739a88d56ecbec23b7f63650e44672ab2ad2
React-RCTNetwork: 73138b6f45e5a2768ad93f3d57873c2a18d14b44
React-RCTSettings: 6e3738a87e21b39a8cb08d627e68c44acf1e325a
React-RCTText: fae545b10cfdb3d247c36c56f61a94cfd6dba41d
React-RCTVibration: 4356114dbcba4ce66991096e51a66e61eda51256
ReactCommon: ed4e11d27609d571e7eee8b65548efc191116eb3
React-RCTActionSheet: 1702a1a85e550b5c36e2e03cb2bd3adea053de95
React-RCTAnimation: ddda576010a878865a4eab83a78acd92176ef6a1
React-RCTBlob: 34334384284c81577409d5205bd2b9ff594d8ab6
React-RCTImage: e2a661266dca295cffb33909cc64675a2efedb26
React-RCTLinking: cd39b9b5e9cbb9e827854e30dfa92d7db074cea8
React-RCTNetwork: 16939b7e4058d6f662b304a1f61689e249a2bfcc
React-RCTSettings: 24726a62de0c326f9ebfc3838898a501b87ce711
React-RCTText: 4f95d322b7e6da72817284abf8a2cdcec18b9cd8
React-RCTVibration: f3a9123c244f35c40d3c9f3ec3f0b9e5717bb292
ReactCommon: 2905859f84a94a381bb0d8dd3921ccb1a0047cb8
ReactNativeExceptionHandler: 8025d98049c25f186835a3af732dd7c9974d6dce
ReactNativeKeyboardTrackingView: 02137fac3b2ebd330d74fa54ead48b14750a2306
ReactNativeNavigation: 667586f6924fbd09512e2933fe70497db914b758
rn-fetch-blob: 17961aec08caae68bb8fc0e5b40f93b3acfa6932
RNCAsyncStorage: f640ddf9266df777c38e112ea5881ead7188b59c
RNCClipboard: 5f3218dcdc28405aa2ae72b78e388f150b826dd3
RNCMaskedView: f5c7d14d6847b7b44853f7acb6284c1da30a3459
RNDeviceInfo: 498ccbf8b1361fe858581e3c1193ecee1a031e62
RNFastImage: 35ae972d6727c84ee3f5c6897e07f84d0a3445e9
@ -646,9 +659,9 @@ SPEC CHECKSUMS:
Sentry: 14bdd673870e8cf64932b149fad5bbbf39a9b390
Swime: d7b2c277503b6cea317774aedc2dce05613f8b0b
XCDYouTubeKit: 79baadb0560673a67c771eba45f83e353fd12c1f
Yoga: 3ebccbdd559724312790e7742142d062476b698e
Yoga: d5bd05a2b6b94c52323745c2c2b64557c8c66f64
YoutubePlayer-in-WKWebView: af2f5929fc78882d94bfdfeea999b661b78d9717
PODFILE CHECKSUM: b702b8a61a954eeed0648fa4ec502da4ea8b6748
PODFILE CHECKSUM: 1aabd16b6a9ed2037b4d7443027d222817790468
COCOAPODS: 1.7.5

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_5" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="splash.png" translatesAutoresizingMaskIntoConstraints="NO" id="UpL-W2-INZ">
<rect key="frame" x="0.0" y="241" width="414" height="414"/>
<constraints>
<constraint firstAttribute="width" constant="414" id="S4P-Ok-V6e"/>
<constraint firstAttribute="height" constant="414" id="Xu2-0Q-1av"/>
</constraints>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="UpL-W2-INZ" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="eka-4s-Xin"/>
<constraint firstItem="UpL-W2-INZ" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="lI4-YK-lDO"/>
</constraints>
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="50.724637681159422" y="374.33035714285711"/>
</scene>
</scenes>
<resources>
<image name="splash.png" width="720" height="720"/>
</resources>
</document>

View file

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11757"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="splash.png" translatesAutoresizingMaskIntoConstraints="NO" id="ZkI-RL-69Z">
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="ZkI-RL-69Z" firstAttribute="top" secondItem="iN0-l3-epB" secondAttribute="top" id="7dE-9J-TdO"/>
<constraint firstAttribute="trailing" secondItem="ZkI-RL-69Z" secondAttribute="trailing" id="KFm-od-sbN"/>
<constraint firstAttribute="bottom" secondItem="ZkI-RL-69Z" secondAttribute="bottom" id="afY-hI-KgI"/>
<constraint firstItem="ZkI-RL-69Z" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" id="eMX-qT-GeJ"/>
</constraints>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="548" y="455"/>
</view>
</objects>
<resources>
<image name="splash.png" width="720" height="1280"/>
</resources>
</document>

View file

@ -2,7 +2,7 @@
// See LICENSE.txt for license information.
module.exports = {
preset: '@testing-library/react-native',
preset: 'react-native',
verbose: true,
globals: {
'ts-jest': {

6011
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -7,9 +7,10 @@
"license": "Apache 2.0",
"private": true,
"dependencies": {
"@babel/runtime": "7.9.6",
"@babel/runtime": "7.10.4",
"@react-native-community/async-storage": "1.10.1",
"@react-native-community/cameraroll": "1.6.2",
"@react-native-community/clipboard": "1.2.3",
"@react-native-community/masked-view": "0.1.10",
"@react-native-community/netinfo": "5.8.1",
"@react-navigation/native": "5.3.2",
@ -32,7 +33,7 @@
"prop-types": "15.7.2",
"react": "16.13.1",
"react-intl": "2.8.0",
"react-native": "0.62.2",
"react-native": "0.63.1",
"react-native-android-open-settings": "1.3.0",
"react-native-animatable": "1.3.3",
"react-native-button": "3.0.1",
@ -50,7 +51,7 @@
"react-native-hw-keyboard-event": "0.0.4",
"react-native-image-gallery": "github:mattermost/react-native-image-gallery#c1a9f7118e90cc87d47620bc0584c9cac4b0cf38",
"react-native-image-picker": "2.3.1",
"react-native-keyboard-aware-scroll-view": "0.9.1",
"react-native-keyboard-aware-scrollview": "2.1.0",
"react-native-keyboard-tracking-view": "5.7.0",
"react-native-keychain": "4.0.5",
"react-native-linear-gradient": "2.5.6",
@ -91,57 +92,57 @@
"url-parse": "1.4.7"
},
"devDependencies": {
"@babel/cli": "7.8.4",
"@babel/core": "7.9.6",
"@babel/plugin-transform-runtime": "7.9.6",
"@babel/preset-env": "7.9.6",
"@babel/register": "7.9.0",
"@testing-library/react-native": "5.0.3",
"@babel/cli": "7.10.4",
"@babel/core": "7.10.4",
"@babel/plugin-transform-runtime": "7.10.4",
"@babel/preset-env": "7.10.4",
"@babel/register": "7.10.4",
"@react-native-community/eslint-config": "1.1.0",
"@types/enzyme": "3.10.5",
"@types/enzyme-adapter-react-16": "1.0.6",
"@types/jest": "25.2.2",
"@types/jest": "26.0.4",
"@types/moment-timezone": "0.5.13",
"@types/react": "16.9.35",
"@types/react-native": "0.62.10",
"@types/react": "16.9.43",
"@types/react-native": "0.62.18",
"@types/react-test-renderer": "16.9.2",
"@types/shallow-equals": "1.0.0",
"@typescript-eslint/eslint-plugin": "2.33.0",
"@typescript-eslint/parser": "2.33.0",
"@typescript-eslint/eslint-plugin": "3.6.0",
"@typescript-eslint/parser": "3.6.0",
"babel-eslint": "10.1.0",
"babel-jest": "26.0.1",
"babel-jest": "26.1.0",
"babel-plugin-module-resolver": "4.0.0",
"babel-plugin-transform-remove-console": "6.9.4",
"deep-freeze": "0.0.1",
"enzyme": "3.11.0",
"enzyme-adapter-react-16": "1.15.2",
"enzyme-to-json": "3.4.4",
"eslint": "7.0.0",
"enzyme-to-json": "3.5.0",
"eslint": "7.4.0",
"eslint-plugin-header": "3.0.0",
"eslint-plugin-jest": "23.13.0",
"eslint-plugin-jest": "23.18.0",
"eslint-plugin-mattermost": "github:mattermost/eslint-plugin-mattermost#070ce792d105482ffb2b27cfc0b7e78b3d20acee",
"eslint-plugin-react": "7.20.0",
"eslint-plugin-react": "7.20.3",
"harmony-reflect": "1.6.1",
"husky": "4.2.5",
"isomorphic-fetch": "2.2.1",
"jest": "26.0.1",
"jest-cli": "26.0.1",
"jest": "26.1.0",
"jest-cli": "26.1.0",
"jest-enzyme": "7.1.2",
"jetifier": "1.6.5",
"jetifier": "1.6.6",
"jsdom-global": "3.0.2",
"metro-react-native-babel-preset": "0.59.0",
"metro-react-native-babel-preset": "0.60.0",
"mmjstool": "github:mattermost/mattermost-utilities#086f4ffdca4e31a0be22f6bcdfa093ed83fb29e",
"mock-async-storage": "2.2.0",
"mock-socket": "9.0.3",
"nock": "12.0.3",
"nyc": "15.0.1",
"nock": "13.0.2",
"nyc": "15.1.0",
"patch-package": "6.2.2",
"react-dom": "16.13.1",
"react-test-renderer": "16.13.1",
"redux-mock-store": "1.5.4",
"redux-persist-node-storage": "2.0.0",
"socketcluster": "16.0.1",
"ts-jest": "26.0.0",
"typescript": "3.9.2",
"ts-jest": "26.1.1",
"typescript": "3.9.6",
"underscore": "1.10.2",
"util": "0.12.3"
},
@ -156,8 +157,8 @@
"fix": "eslint --ignore-path .gitignore --ignore-pattern node_modules --quiet . --fix",
"postinstall": "make post-install",
"tsc": "NODE_OPTIONS=--max_old_space_size=12000 tsc --noEmit",
"test": "jest --forceExit --detectOpenHandles",
"test:watch": "jest --watch",
"test": "jest --forceExit --runInBand --detectOpenHandles",
"test:watch": "jest --watch --runInBand --detectOpenHandles",
"test:coverage": "jest --coverage",
"updatesnapshot": "jest --updateSnapshot",
"mmjstool": "mmjstool"

View file

@ -21,7 +21,7 @@
- react-native-video
- react-native/Libraries/Core/Devtools
- react-native/Libraries/Utilities/deepFreezeAndThrowOnMutationInDev
- react-native/Libraries/YellowBox
- react-native/Libraries/LogBox
- redux-devtools-instrument
- remove-redux-devtools
- remotedev-utils

View file

@ -1,21 +1,21 @@
diff --git a/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js b/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js
index c14b13e..8ea534f 100644
index e8598a6..62bcf45 100644
--- a/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js
+++ b/node_modules/react-native/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js
@@ -564,7 +564,7 @@ export const Commands: NativeCommands = codegenNativeCommands<NativeCommands>({
});
@@ -560,7 +560,7 @@ if (global.RN$Bridgeless) {
AndroidTextInputNativeComponent = 'AndroidTextInput';
} else {
AndroidTextInputNativeComponent = requireNativeComponent<NativeProps>(
- 'AndroidTextInput',
+ 'PasteableTextInputAndroid',
);
}
const AndroidTextInputNativeComponent: HostComponent<NativeProps> = requireNativeComponent<NativeProps>(
- 'AndroidTextInput',
+ 'PasteableTextInputAndroid',
);
export default AndroidTextInputNativeComponent;
diff --git a/node_modules/react-native/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h b/node_modules/react-native/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h
index bb1c8d2..a0ea89f 100644
index 2da6323..1f64ffe 100644
--- a/node_modules/react-native/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h
+++ b/node_modules/react-native/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h
@@ -2809,6 +2809,7 @@ namespace JS {
@@ -2796,6 +2796,7 @@ namespace JS {
namespace NativeWebSocketModule {
struct SpecConnectOptions {
id<NSObject> _Nullable headers() const;
@ -23,17 +23,18 @@ index bb1c8d2..a0ea89f 100644
SpecConnectOptions(NSDictionary *const v) : _v(v) {}
private:
@@ -3870,3 +3871,8 @@ inline id<NSObject> _Nullable JS::NativeWebSocketModule::SpecConnectOptions::hea
@@ -3862,3 +3863,9 @@ inline id<NSObject> _Nullable JS::NativeWebSocketModule::SpecConnectOptions::hea
id const p = _v[@"headers"];
return p;
}
+
+inline NSString *JS::NativeWebSocketModule::SpecConnectOptions::certificate() const
+{
+ id const p = _v[@"certificate"];
+ return p;
+}
diff --git a/node_modules/react-native/Libraries/Lists/VirtualizedList.js b/node_modules/react-native/Libraries/Lists/VirtualizedList.js
index 5ef712c..d6f9082 100644
index 9ec105f..18f7bf6 100644
--- a/node_modules/react-native/Libraries/Lists/VirtualizedList.js
+++ b/node_modules/react-native/Libraries/Lists/VirtualizedList.js
@@ -20,6 +20,7 @@ const ScrollView = require('../Components/ScrollView/ScrollView');
@ -44,7 +45,7 @@ index 5ef712c..d6f9082 100644
const flattenStyle = require('../StyleSheet/flattenStyle');
const infoLog = require('../Utilities/infoLog');
@@ -2100,7 +2101,7 @@ class VirtualizedCellWrapper extends React.Component<{
@@ -2186,7 +2187,7 @@ function describeNestedLists(childList: {
const styles = StyleSheet.create({
verticallyInverted: {
@ -84,7 +85,7 @@ index 1b17cff..70a59b6 100644
#pragma mark - RCTSRWebSocketDelegate
diff --git a/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m b/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m
index b967c14..e24e926 100644
index b967c14..1a38e00 100644
--- a/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m
+++ b/node_modules/react-native/Libraries/WebSocket/RCTSRWebSocket.m
@@ -228,7 +228,7 @@ @implementation RCTSRWebSocket
@ -125,14 +126,14 @@ index b967c14..e24e926 100644
}
- (void)_RCTSR_commonInit
@@ -344,6 +348,37 @@ - (void)setReadyState:(RCTSRReadyState)aReadyState
@@ -344,6 +348,36 @@ - (void)setReadyState:(RCTSRReadyState)aReadyState
#endif
+- (SecIdentityRef) GetIdentityByName:(NSString *)name
+{
+ NSMutableDictionary * query = [[NSMutableDictionary alloc] init];
+
+
+ //Set up the invariant pieces of the query
+ [query setObject:(id)kSecMatchLimitAll forKey:(id)kSecMatchLimit];
+ [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnRef];
@ -140,7 +141,7 @@ index b967c14..e24e926 100644
+ [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnAttributes];
+ [query setObject:(id)kSecClassIdentity forKey:(id)kSecClass];
+ [query setObject:name forKey:(id)kSecAttrLabel];
+
+
+ OSStatus resultCode = noErr;
+ CFTypeRef result = nil;
+ //Execute the query saving the results in items.
@ -153,17 +154,16 @@ index b967c14..e24e926 100644
+ {
+ identity = (SecIdentityRef)value;
+ }
+
+
+ return identity;
+ }
+ return nil;
+}
+
+
- (void)open
{
assert(_url);
@@ -515,6 +550,24 @@ - (void)_initializeStreams
@@ -515,6 +549,24 @@ - (void)_initializeStreams
RCTLogInfo(@"SocketRocket: In debug mode. Allowing connection to any root cert");
#endif
@ -189,10 +189,10 @@ index b967c14..e24e926 100644
forKey:(__bridge id)kCFStreamPropertySSLSettings];
}
diff --git a/node_modules/react-native/Libraries/WebSocket/WebSocket.js b/node_modules/react-native/Libraries/WebSocket/WebSocket.js
index a1679bd..9445e3e 100644
index 0b051c4..d5bbf3f 100644
--- a/node_modules/react-native/Libraries/WebSocket/WebSocket.js
+++ b/node_modules/react-native/Libraries/WebSocket/WebSocket.js
@@ -92,7 +92,7 @@ class WebSocket extends (EventTarget(...WEBSOCKET_EVENTS): any) {
@@ -91,7 +91,7 @@ class WebSocket extends (EventTarget(...WEBSOCKET_EVENTS): any) {
protocols = [protocols];
}
@ -201,7 +201,7 @@ index a1679bd..9445e3e 100644
// Preserve deprecated backwards compatibility for the 'origin' option
/* $FlowFixMe(>=0.68.0 site=react_native_fb) This comment suppresses an
@@ -129,7 +129,7 @@ class WebSocket extends (EventTarget(...WEBSOCKET_EVENTS): any) {
@@ -128,7 +128,7 @@ class WebSocket extends (EventTarget(...WEBSOCKET_EVENTS): any) {
this._eventEmitter = new NativeEventEmitter(NativeWebSocketModule);
this._socketId = nextWebSocketId++;
this._registerEvents();
@ -211,7 +211,7 @@ index a1679bd..9445e3e 100644
get binaryType(): ?BinaryType {
diff --git a/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm b/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm
index 06734d3..6d1d5ed 100644
index 9648b18..3594b43 100644
--- a/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm
+++ b/node_modules/react-native/React/CoreModules/RCTWebSocketModule.mm
@@ -88,7 +88,7 @@ - (void)invalidate
@ -219,24 +219,24 @@ index 06734d3..6d1d5ed 100644
}
- RCTSRWebSocket *webSocket = [[RCTSRWebSocket alloc] initWithURLRequest:request protocols:protocols];
+ RCTSRWebSocket *webSocket = [[RCTSRWebSocket alloc] initWithURLRequest:request protocols:protocols certificate:options.certificate()];
+ RCTSRWebSocket *webSocket = [[RCTSRWebSocket alloc] initWithURLRequest:request protocols:protocols certificate:options.certificate()];
[webSocket setDelegateDispatchQueue:[self methodQueue]];
webSocket.delegate = self;
webSocket.reactTag = @(socketID);
diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index d886a9b..8febb59 100644
index 6441d93..4a0cd01 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -143,7 +143,7 @@ afterEvaluate {
@@ -157,7 +157,7 @@ afterEvaluate {
// Set up dev mode
def devEnabled = !(config."devDisabledIn${targetName}"
- || targetName.toLowerCase().contains("release"))
+ || targetName.toLowerCase().contains("release") || targetName.toLowerCase().contains("unsigned"))
def extraArgs = extraPackagerArgs;
def extraArgs = config.extraPackagerArgs ?: [];
@@ -163,7 +163,7 @@ afterEvaluate {
@@ -177,7 +177,7 @@ afterEvaluate {
def hermesFlags;
def hbcTempFile = file("${jsBundleFile}.hbc")
exec {
@ -245,7 +245,7 @@ index d886a9b..8febb59 100644
// Can't use ?: since that will also substitute valid empty lists
hermesFlags = config.hermesFlagsRelease
if (hermesFlags == null) hermesFlags = ["-O", "-output-source-map"]
@@ -207,7 +207,7 @@ afterEvaluate {
@@ -221,7 +221,7 @@ afterEvaluate {
? config."bundleIn${targetName}"
: config."bundleIn${variant.buildType.name.capitalize()}" != null
? config."bundleIn${variant.buildType.name.capitalize()}"
@ -254,7 +254,7 @@ index d886a9b..8febb59 100644
}
// Expose a minimal interface on the application variant and the task itself:
@@ -299,7 +299,7 @@ afterEvaluate {
@@ -313,7 +313,7 @@ afterEvaluate {
// This should really be done by packaging all Hermes releated libs into
// two separate HermesDebug and HermesRelease AARs, but until then we'll
// kludge it by deleting the .so files out of the /transforms/ directory.

View file

@ -1,5 +1,5 @@
diff --git a/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java b/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java
index 48fb5c1..3def244 100644
index 48fb5c1..3872d91 100644
--- a/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java
+++ b/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/ImagePickerModule.java
@@ -3,6 +3,7 @@ package com.imagepicker;
@ -233,7 +233,7 @@ index 48fb5c1..3def244 100644
if (imageConfig.resized == null)
{
removeUselessFiles(requestCode, imageConfig);
@@ -523,6 +508,63 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
@@ -523,6 +508,64 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
this.options = null;
}
@ -284,7 +284,8 @@ index 48fb5c1..3def244 100644
+ extractImageFromResult(activity, cameraCaptureURI, requestCode);
+ } else {
+ Uri selectedMediaUri = data.getData();
+ if (selectedMediaUri.toString().contains("image")) {
+ String mime = getMimeType(activity, selectedMediaUri);
+ if (mime.contains("image")) {
+ extractImageFromResult(activity, selectedMediaUri, requestCode);
+ } else {
+ extractVideoFromResult(selectedMediaUri);
@ -297,7 +298,7 @@ index 48fb5c1..3def244 100644
public void invokeCustomButton(@NonNull final String action)
{
responseHelper.invokeCustomButton(this.callback, action);
@@ -551,7 +593,8 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
@@ -551,7 +594,8 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
{
return callback == null || (cameraCaptureURI == null && requestCode == REQUEST_LAUNCH_IMAGE_CAPTURE)
|| (requestCode != REQUEST_LAUNCH_IMAGE_CAPTURE && requestCode != REQUEST_LAUNCH_IMAGE_LIBRARY
@ -307,7 +308,7 @@ index 48fb5c1..3def244 100644
}
private void updatedResultResponse(@Nullable final Uri uri,
@@ -571,22 +614,23 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
@@ -571,22 +615,23 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
@NonNull final Callback callback,
@NonNull final int requestCode)
{
@ -340,7 +341,7 @@ index 48fb5c1..3def244 100644
if (!permissionsGranted)
{
final Boolean dontAskAgain = ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) && ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA);
@@ -787,4 +831,22 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
@@ -787,4 +832,22 @@ public class ImagePickerModule extends ReactContextBaseJavaModule
videoDurationLimit = options.getInt("durationLimit");
}
}
@ -363,3 +364,113 @@ index 48fb5c1..3def244 100644
+ cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraCaptureURI);
+ }
}
diff --git a/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/utils/RealPathUtil.java b/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/utils/RealPathUtil.java
index cc90dce..c1cc74d 100644
--- a/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/utils/RealPathUtil.java
+++ b/node_modules/react-native-image-picker/android/src/main/java/com/imagepicker/utils/RealPathUtil.java
@@ -7,16 +7,22 @@ import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
+import android.provider.OpenableColumns;
import android.content.ContentUris;
import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.webkit.MimeTypeMap;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
-import java.io.File;
+import java.io.*;
+import java.nio.channels.FileChannel;
public class RealPathUtil {
+ public static final String CACHE_DIR_NAME = "mmShare";
+
public static @Nullable Uri compatUriFromFile(@NonNull final Context context,
@NonNull final File file) {
Uri result = null;
@@ -58,12 +64,7 @@ public class RealPathUtil {
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
-
- final String id = DocumentsContract.getDocumentId(uri);
- final Uri contentUri = ContentUris.withAppendedId(
- Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
-
- return getDataColumn(context, contentUri, null, null);
+ return getPathFromSavingTempFile(context, uri);
}
// MediaProvider
else if (isMediaDocument(uri)) {
@@ -89,7 +90,7 @@ public class RealPathUtil {
}
}
// MediaStore (and general)
- else if ("content".equalsIgnoreCase(uri.getScheme())) {
+ if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
@@ -98,7 +99,7 @@ public class RealPathUtil {
if (isFileProviderUri(context, uri))
return getFileProviderPath(context, uri);
- return getDataColumn(context, uri, null, null);
+ return getPathFromSavingTempFile(context, uri);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
@@ -108,6 +109,49 @@ public class RealPathUtil {
return null;
}
+
+ public static String getPathFromSavingTempFile(Context context, final Uri uri) {
+ File tmpFile;
+ String fileName = null;
+
+ // Try and get the filename from the Uri
+ try {
+ Cursor returnCursor =
+ context.getContentResolver().query(uri, null, null, null, null);
+ int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
+ returnCursor.moveToFirst();
+ fileName = returnCursor.getString(nameIndex);
+ } catch (Exception e) {
+ // just continue to get the filename with the last segment of the path
+ }
+
+ try {
+ if (fileName == null) {
+ fileName = uri.getLastPathSegment().toString().trim();
+ }
+
+
+ File cacheDir = new File(context.getCacheDir(), CACHE_DIR_NAME);
+ if (!cacheDir.exists()) {
+ cacheDir.mkdirs();
+ }
+
+ tmpFile = new File(cacheDir, fileName);
+ tmpFile.createNewFile();
+
+ ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "r");
+
+ FileChannel src = new FileInputStream(pfd.getFileDescriptor()).getChannel();
+ FileChannel dst = new FileOutputStream(tmpFile).getChannel();
+ dst.transferFrom(src, 0, src.size());
+ src.close();
+ dst.close();
+ } catch (IOException ex) {
+ return null;
+ }
+ return tmpFile.getAbsolutePath();
+ }
+
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.