diff --git a/android/app/build.gradle b/android/app/build.gradle index 2364f67d7..e41b27d79 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -123,7 +123,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion missingDimensionStrategy "RNN.reactNativeVersion", "reactNative57_5" - versionCode 235 + versionCode 236 versionName "1.24.0" multiDexEnabled = true ndk { diff --git a/app/components/__snapshots__/fade.test.js.snap b/app/components/__snapshots__/fade.test.js.snap index d576df934..41ef885f1 100644 --- a/app/components/__snapshots__/fade.test.js.snap +++ b/app/components/__snapshots__/fade.test.js.snap @@ -2,6 +2,7 @@ exports[`Fade should render {opacity: 0} 1`] = ` diff --git a/app/components/autocomplete/channel_mention_item/channel_mention_item.js b/app/components/autocomplete/channel_mention_item/channel_mention_item.js index 226af6fe9..599249a43 100644 --- a/app/components/autocomplete/channel_mention_item/channel_mention_item.js +++ b/app/components/autocomplete/channel_mention_item/channel_mention_item.js @@ -8,6 +8,7 @@ import { } from 'react-native'; import {General} from 'mattermost-redux/constants'; +import AutocompleteDivider from 'app/components/autocomplete/autocomplete_divider'; import {BotTag, GuestTag} from 'app/components/tag'; import {paddingHorizontal as padding} from 'app/components/safe_area_view/iphone_x_spacing'; import TouchableWithFeedback from 'app/components/touchable_with_feedback'; @@ -49,11 +50,13 @@ export default class ChannelMentionItem extends PureComponent { const style = getStyleFromTheme(theme); + let component; if (type === General.DM_CHANNEL || type === General.GM_CHANNEL) { if (!displayName) { return null; } - return ( + + component = ( ); + } else { + component = ( + + {displayName} + {` (~${name})`} + + ); } + return ( - - {displayName} - {` (~${name})`} - + + {component} + + ); } } diff --git a/app/components/autocomplete/channel_mention_item/index.js b/app/components/autocomplete/channel_mention_item/index.js index 3bf635684..c70208684 100644 --- a/app/components/autocomplete/channel_mention_item/index.js +++ b/app/components/autocomplete/channel_mention_item/index.js @@ -4,28 +4,28 @@ import {connect} from 'react-redux'; import {General} from 'mattermost-redux/constants'; - import {getChannel} from 'mattermost-redux/selectors/entities/channels'; - import {getTheme} from 'mattermost-redux/selectors/entities/preferences'; +import {getUser} from 'mattermost-redux/selectors/entities/users'; import {getChannelNameForSearchAutocomplete} from 'app/selectors/channel'; +import {isLandscape} from 'app/selectors/device'; +import {isGuest as isGuestUser} from 'app/utils/users'; import ChannelMentionItem from './channel_mention_item'; -import {getUser} from 'mattermost-redux/selectors/entities/users'; - -import {isLandscape} from 'app/selectors/device'; - function mapStateToProps(state, ownProps) { const channel = getChannel(state, ownProps.channelId); - const displayName = getChannelNameForSearchAutocomplete(state, ownProps.channelId); + let displayName = getChannelNameForSearchAutocomplete(state, ownProps.channelId); let isBot = false; + let isGuest = false; if (channel.type === General.DM_CHANNEL) { const teammate = getUser(state, channel.teammate_id); - if (teammate && teammate.is_bot) { - isBot = true; + if (teammate) { + displayName = teammate.username; + isBot = teammate.is_bot || false; + isGuest = isGuestUser(teammate) || false; } } @@ -34,6 +34,7 @@ function mapStateToProps(state, ownProps) { name: channel.name, type: channel.type, isBot, + isGuest, theme: getTheme(state), isLandscape: isLandscape(state), }; diff --git a/app/components/fade.js b/app/components/fade.js index bb7ac30ed..9819ec841 100644 --- a/app/components/fade.js +++ b/app/components/fade.js @@ -47,6 +47,7 @@ export default class Fade extends PureComponent { opacity: fadeAnim, transform: disableScale ? [] : [{scale: fadeAnim}], }} + pointerEvents={'box-none'} > {this.props.children} diff --git a/app/components/sidebars/main/channels_list/channel_item/__snapshots__/channel_item.test.js.snap b/app/components/sidebars/main/channels_list/channel_item/__snapshots__/channel_item.test.js.snap index 2fc47d998..93f9b9c3e 100644 --- a/app/components/sidebars/main/channels_list/channel_item/__snapshots__/channel_item.test.js.snap +++ b/app/components/sidebars/main/channels_list/channel_item/__snapshots__/channel_item.test.js.snap @@ -82,7 +82,7 @@ exports[`ChannelItem should match snapshot 1`] = ` Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, @@ -197,7 +197,7 @@ exports[`ChannelItem should match snapshot for current user i.e currentUser (you Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, @@ -311,7 +311,7 @@ exports[`ChannelItem should match snapshot for current user i.e currentUser (you Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, @@ -425,7 +425,7 @@ exports[`ChannelItem should match snapshot for deactivated user and is currentCh Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, @@ -528,7 +528,7 @@ exports[`ChannelItem should match snapshot for deactivated user and is searchRes Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, @@ -632,7 +632,7 @@ exports[`ChannelItem should match snapshot for deactivated user and not searchRe Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, @@ -740,7 +740,7 @@ exports[`ChannelItem should match snapshot with draft 1`] = ` Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, @@ -846,7 +846,7 @@ exports[`ChannelItem should match snapshot with mentions and muted 1`] = ` Array [ Object { "alignSelf": "center", - "color": "rgba(255,255,255,0.88)", + "color": "rgba(255,255,255,0.6)", "flex": 1, "fontFamily": "Open Sans", "fontSize": 16, diff --git a/app/components/sidebars/main/channels_list/channel_item/channel_item.js b/app/components/sidebars/main/channels_list/channel_item/channel_item.js index 5a6ea5e63..1022d8b7f 100644 --- a/app/components/sidebars/main/channels_list/channel_item/channel_item.js +++ b/app/components/sidebars/main/channels_list/channel_item/channel_item.js @@ -241,7 +241,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => { paddingLeft: 11, }, text: { - color: changeOpacity(theme.sidebarText, 0.88), + color: changeOpacity(theme.sidebarText, 0.6), fontSize: 16, lineHeight: 24, paddingRight: 10, diff --git a/app/components/sidebars/main/channels_list/channel_item/index.js b/app/components/sidebars/main/channels_list/channel_item/index.js index f79b7dedf..60c4141c2 100644 --- a/app/components/sidebars/main/channels_list/channel_item/index.js +++ b/app/components/sidebars/main/channels_list/channel_item/index.js @@ -35,18 +35,16 @@ function makeMapStateToProps() { let isArchived = channel.delete_at > 0; if (channel.type === General.DM_CHANNEL) { - if (ownProps.isSearchResult) { - isBot = Boolean(channel.isBot); - } else { - const teammateId = getUserIdFromChannelName(currentUserId, channel.name); - const teammate = getUser(state, teammateId); + const teammateId = getUserIdFromChannelName(currentUserId, channel.name); + const teammate = getUser(state, teammateId); + + isBot = Boolean(ownProps.isSearchResult ? channel.isBot : teammate?.is_bot); //eslint-disable-line camelcase + + if (teammate) { const teammateNameDisplay = getTeammateNameDisplaySetting(state); displayName = displayUsername(teammate, teammateNameDisplay, false); - if (teammate) { - isArchived = teammate.delete_at > 0; - isBot = teammate.is_bot || false; - } - isGuest = isGuestUser(teammate); + isArchived = teammate.delete_at > 0; + isGuest = isGuestUser(teammate) || false; } } diff --git a/app/components/sidebars/main/channels_list/list/list.js b/app/components/sidebars/main/channels_list/list/list.js index da9af34b6..39b8238c3 100644 --- a/app/components/sidebars/main/channels_list/list/list.js +++ b/app/components/sidebars/main/channels_list/list/list.js @@ -417,10 +417,10 @@ export default class List extends PureComponent { /> {UnreadIndicator && } diff --git a/app/components/sidebars/main/channels_list/unread_indicator/index.js b/app/components/sidebars/main/channels_list/unread_indicator/index.js index ce095e486..bcbb436da 100644 --- a/app/components/sidebars/main/channels_list/unread_indicator/index.js +++ b/app/components/sidebars/main/channels_list/unread_indicator/index.js @@ -16,7 +16,7 @@ import {makeStyleSheetFromTheme} from 'app/utils/theme'; export default class UnreadIndicator extends PureComponent { static propTypes = { - show: PropTypes.bool, + visible: PropTypes.bool, style: ViewPropTypes.style, onPress: PropTypes.func, theme: PropTypes.object.isRequired, @@ -27,31 +27,52 @@ export default class UnreadIndicator extends PureComponent { onPress: () => true, }; - render() { - const {onPress, show, theme} = this.props; + renderContent = () => { + const {onPress, visible, theme} = this.props; const style = getStyleSheet(theme); + + const content = ( + + + + + ); + + if (visible) { + return ( + + {content} + + ); + } + + return content; + }; + + render() { + const {visible, theme} = this.props; + const style = getStyleSheet(theme); + return ( - - - - - - + {this.renderContent()} ); } diff --git a/app/init/fetch.js b/app/init/fetch.js index 57cd167a4..1d1c1c40a 100644 --- a/app/init/fetch.js +++ b/app/init/fetch.js @@ -147,7 +147,8 @@ const initFetchConfig = async () => { // no managed config } - Client4.setUserAgent(DeviceInfo.getUserAgent()); + const userAgent = await DeviceInfo.getUserAgent(); + Client4.setUserAgent(userAgent); if (Platform.OS === 'ios') { const certificate = await mattermostBucket.getPreference('cert'); diff --git a/app/screens/interactive_dialog/interactive_dialog.js b/app/screens/interactive_dialog/interactive_dialog.js index 03f70ea44..079b3a6dd 100644 --- a/app/screens/interactive_dialog/interactive_dialog.js +++ b/app/screens/interactive_dialog/interactive_dialog.js @@ -8,6 +8,7 @@ import {Navigation} from 'react-native-navigation'; import {checkDialogElementForError, checkIfErrorsMatchElements} from 'mattermost-redux/utils/integration_utils'; +import ErrorText from 'app/components/error_text'; import StatusBar from 'app/components/status_bar'; import FormattedText from 'app/components/formatted_text'; @@ -48,10 +49,13 @@ export default class InteractiveDialog extends PureComponent { this.state = { values, + error: null, errors: {}, isLandscape: this.isLandscape(), submitting: false, }; + + this.scrollView = React.createRef(); } componentDidMount() { @@ -123,17 +127,29 @@ export default class InteractiveDialog extends PureComponent { this.submitted = true; - if (!data || !data.errors || Object.keys(data.errors).length === 0) { + let hasErrors = false; + + if (data) { + if (data.errors && + Object.keys(data.errors).length >= 0 && + checkIfErrorsMatchElements(data.errors, elements) + ) { + hasErrors = true; + this.setState({errors: data.errors}); + } + + if (data.error) { + hasErrors = true; + this.setState({error: data.error}); + if (this.scrollView?.current) { + this.scrollView.current.scrollTo({x: 0, y: 0}); + } + } + } + + if (!hasErrors) { this.handleHide(); - return; } - - if (checkIfErrorsMatchElements(data.errors, elements)) { - this.setState({errors: data.errors}); - return; - } - - this.handleHide(); } notifyOnCancelIfNeeded = () => { @@ -168,13 +184,22 @@ export default class InteractiveDialog extends PureComponent { render() { const {introductionText, elements, theme} = this.props; - const {errors, isLandscape, values} = this.state; + const {error, errors, isLandscape, values} = this.state; const style = getStyleFromTheme(theme); return ( - + + {error && ( + + )} {Boolean(introductionText) && { container: { backgroundColor: changeOpacity(theme.centerChannelColor, 0.03), }, + errorContainer: { + marginTop: 15, + marginLeft: 15, + fontSize: 14, + fontWeight: 'bold', + }, scrollView: { marginBottom: 20, marginTop: 10, diff --git a/app/screens/interactive_dialog/interactive_dialog.test.js b/app/screens/interactive_dialog/interactive_dialog.test.js index dafcd2ec3..62ecb0273 100644 --- a/app/screens/interactive_dialog/interactive_dialog.test.js +++ b/app/screens/interactive_dialog/interactive_dialog.test.js @@ -7,6 +7,8 @@ import Preferences from 'mattermost-redux/constants/preferences'; import InteractiveDialog from './interactive_dialog'; +import ErrorText from 'app/components/error_text'; + describe('InteractiveDialog', () => { const baseProps = { url: 'http://mattermost.com', @@ -18,7 +20,8 @@ describe('InteractiveDialog', () => { state: 'somestate', theme: Preferences.THEMES.default, actions: { - submitInteractiveDialog: jest.fn(), + submitInteractiveDialog: jest.fn(() => ({})), + dismissModal: jest.fn(), }, componentId: 'component-id', }; @@ -140,4 +143,38 @@ describe('InteractiveDialog', () => { expect(baseProps.actions.submitInteractiveDialog).toHaveBeenCalledTimes(1); expect(baseProps.actions.submitInteractiveDialog).toHaveBeenCalledWith(dialog); }); + + describe('generic error message', () => { + test('should show error when submit returns an error', async () => { + const props = { + ...baseProps, + actions: { + ...baseProps.actions, + submitInteractiveDialog: async () => ({ + data: {error: 'This is an error message.'}, + }), + }, + }; + + const wrapper = shallow( + + ); + wrapper.instance().scrollView = {current: {scrollTo: jest.fn()}}; + + await wrapper.instance().handleSubmit(); + expect(wrapper.find(ErrorText).find({error: 'This is an error message.'})).toHaveLength(1); + expect(wrapper.instance().scrollView.current.scrollTo).toHaveBeenCalledWith({x: 0, y: 0}); + }); + + test('should show no error when submit does not return an error', async () => { + const wrapper = shallow( + + ); + wrapper.instance().scrollView = {current: {scrollTo: jest.fn()}}; + + await wrapper.instance().handleSubmit(); + expect(wrapper.find(ErrorText)).not.toExist(); + expect(wrapper.instance().scrollView.current.scrollTo).not.toHaveBeenCalled(); + }); + }); }); diff --git a/ios/Mattermost.xcodeproj/project.pbxproj b/ios/Mattermost.xcodeproj/project.pbxproj index d93df45aa..eddc1fc0f 100644 --- a/ios/Mattermost.xcodeproj/project.pbxproj +++ b/ios/Mattermost.xcodeproj/project.pbxproj @@ -5,6 +5,7 @@ }; objectVersion = 46; objects = { + /* Begin PBXBuildFile section */ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; @@ -23,6 +24,7 @@ 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 1A892F126F594A27B6AA095E /* Mattermost-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = E2D17ED040D0465DBF9112D3 /* Mattermost-Regular.otf */; }; 1BCA51319AC6442991C6A208 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0A091BF1A3D04650AD306A0D /* Zocial.ttf */; }; 2B4C9B708010475DA575B81D /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = F1F071EE85494E269A50AE88 /* SimpleLineIcons.ttf */; }; 2D5296A8926B4D7FBAF2D6E2 /* OpenSans-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6561AEAC21CC40B8A72ABB93 /* OpenSans-Light.ttf */; }; @@ -41,7 +43,6 @@ 552835DCC0C24FC691EE6CAB /* Roboto-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F0B22D2C9924FAFA7FB681C /* Roboto-LightItalic.ttf */; }; 55C6561DDBBA45929D88B6D1 /* OpenSans-BoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 32AC3D4EA79E44738A6E9766 /* OpenSans-BoldItalic.ttf */; }; 5A0920184BD344979BCFCD5C /* libRCTVideo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B89192186C764B9FA473403A /* libRCTVideo.a */; }; - 5CB86E9DFB94485CAA748DF3 /* YTPlayerView-iframe-player.html in Resources */ = {isa = PBXBuildFile; fileRef = 79CB6EBA24FE4ABFB0C155F0 /* YTPlayerView-iframe-player.html */; }; 5E1AF7B72B8D4A4E9E53FF9D /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 005346E5C0E542BFABAE1411 /* FontAwesome.ttf */; }; 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 62A8448264674B4D95A5A7C2 /* OpenSans-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = C78A387124874496AD2C1466 /* OpenSans-Semibold.ttf */; }; @@ -125,7 +126,6 @@ F006936FC2884C24A1321FC0 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 356C9186FA374641A00EB2EA /* MaterialIcons.ttf */; }; F083DB472349411A8E6E7AAD /* OpenSans-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BE17F630DB5D41FD93F32D22 /* OpenSans-LightItalic.ttf */; }; F23C99AA5FA10E457A76803A /* libPods-MattermostTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4246DC09024BB33A3E491E25 /* libPods-MattermostTests.a */; }; - 1A892F126F594A27B6AA095E /* Mattermost-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = E2D17ED040D0465DBF9112D3 /* Mattermost-Regular.otf */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -807,7 +807,6 @@ 7535D128F00C4A47A182627E /* libRNCookieManagerIOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNCookieManagerIOS.a; sourceTree = ""; }; 77810F0A063349439B0D8B6B /* libJailMonkey.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libJailMonkey.a; sourceTree = ""; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; - 79CB6EBA24FE4ABFB0C155F0 /* YTPlayerView-iframe-player.html */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "YTPlayerView-iframe-player.html"; path = "../node_modules/react-native-youtube/assets/YTPlayerView-iframe-player.html"; sourceTree = ""; }; 7DCC3D826CE640AF8F491692 /* BVLinearGradient.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = BVLinearGradient.xcodeproj; path = "../node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj"; sourceTree = ""; }; 7F11AA06228848D8001C9540 /* KeyboardTrackingView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = KeyboardTrackingView.xcodeproj; path = "../node_modules/react-native-keyboard-tracking-view/lib/KeyboardTrackingView.xcodeproj"; sourceTree = ""; }; 7F151D3D221B062700FAD8F3 /* RuntimeUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RuntimeUtils.swift; path = Mattermost/RuntimeUtils.swift; sourceTree = ""; }; @@ -906,13 +905,13 @@ DC1D660B55BE462A9C3B8028 /* FontAwesome5_Solid.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome5_Solid.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome5_Solid.ttf"; sourceTree = ""; }; DE10E26B8E5644FB95A079FE /* AntDesign.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = AntDesign.ttf; path = "../node_modules/react-native-vector-icons/Fonts/AntDesign.ttf"; sourceTree = ""; }; DF9DAAAA482343F3910A1A4C /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTVideo.xcodeproj; path = "../node_modules/react-native-video/ios/RCTVideo.xcodeproj"; sourceTree = ""; }; + E2D17ED040D0465DBF9112D3 /* Mattermost-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = "Mattermost-Regular.otf"; path = "../assets/fonts/Mattermost-Regular.otf"; sourceTree = ""; }; EBA6063A99C141098D40C67A /* RNPasscodeStatus.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNPasscodeStatus.xcodeproj; path = "../node_modules/react-native-passcode-status/ios/RNPasscodeStatus.xcodeproj"; sourceTree = ""; }; EDC04CBCF81642219D199CBB /* Octicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Octicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Octicons.ttf"; sourceTree = ""; }; EE3EE4548D3F4A49B1274722 /* libRNLocalAuth.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNLocalAuth.a; sourceTree = ""; }; EE671DF7637347CD8C069819 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = ""; }; F1F071EE85494E269A50AE88 /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = ""; }; FBBEC29EE2D3418D9AC33BD5 /* OpenSans-ExtraBoldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "OpenSans-ExtraBoldItalic.ttf"; path = "../assets/fonts/OpenSans-ExtraBoldItalic.ttf"; sourceTree = ""; }; - E2D17ED040D0465DBF9112D3 /* Mattermost-Regular.otf */ = {isa = PBXFileReference; name = "Mattermost-Regular.otf"; path = "../assets/fonts/Mattermost-Regular.otf"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = unknown; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1078,7 +1077,6 @@ BC977883E2624E05975CA65B /* OpenSans-Regular.ttf */, C78A387124874496AD2C1466 /* OpenSans-Semibold.ttf */, 0E617BF0F36D4E738F51D169 /* OpenSans-SemiboldItalic.ttf */, - 79CB6EBA24FE4ABFB0C155F0 /* YTPlayerView-iframe-player.html */, 6EFF13DD24CE4E26953E598A /* Roboto-Black.ttf */, 7F54ABFAE6CE4A6DB11D1ED7 /* Roboto-BlackItalic.ttf */, 71E626D4980A4560B26F0E1C /* Roboto-Bold.ttf */, @@ -1674,6 +1672,7 @@ 37DA4BA41E6F55AD002B058E /* Embed Frameworks */, AE4769B235D14E6C9C64EA78 /* Upload Debug Symbols to Sentry */, 7FFE32A91FD9CB650038C7A0 /* Embed App Extensions */, + 27FBE48ACE3E38C56E5D745C /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -2560,7 +2559,6 @@ A08D512E7ADC40CCAD055A9E /* OpenSans-Regular.ttf in Resources */, 62A8448264674B4D95A5A7C2 /* OpenSans-Semibold.ttf in Resources */, 69AC753E496743BABB7A7124 /* OpenSans-SemiboldItalic.ttf in Resources */, - 5CB86E9DFB94485CAA748DF3 /* YTPlayerView-iframe-player.html in Resources */, DDE492F7425D451884DAA088 /* Roboto-Black.ttf in Resources */, 71F30A436B5847DF9D319D15 /* Roboto-BlackItalic.ttf in Resources */, E052494CD6104A65840485E7 /* Roboto-Bold.ttf in Resources */, @@ -2634,6 +2632,28 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 27FBE48ACE3E38C56E5D745C /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-Mattermost/Pods-Mattermost-resources.sh", + "${PODS_ROOT}/YoutubePlayer-in-WKWebView/WKYTPlayerView/WKYTPlayerView.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + ); + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/WKYTPlayerView.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Mattermost/Pods-Mattermost-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; AE4769B235D14E6C9C64EA78 /* Upload Debug Symbols to Sentry */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -2836,7 +2856,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 235; + CURRENT_PROJECT_VERSION = 236; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; @@ -2897,7 +2917,7 @@ CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 235; + CURRENT_PROJECT_VERSION = 236; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = UQ8HT4Q2XM; ENABLE_BITCODE = NO; diff --git a/ios/Mattermost/Info.plist b/ios/Mattermost/Info.plist index f34300666..6f8e32fcb 100644 --- a/ios/Mattermost/Info.plist +++ b/ios/Mattermost/Info.plist @@ -34,7 +34,7 @@ CFBundleVersion - 235 + 236 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/ios/MattermostShare/Info.plist b/ios/MattermostShare/Info.plist index 5ce937768..037b0b60e 100644 --- a/ios/MattermostShare/Info.plist +++ b/ios/MattermostShare/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.24.0 CFBundleVersion - 235 + 236 NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/ios/MattermostTests/Info.plist b/ios/MattermostTests/Info.plist index be0177058..5aba5d2c3 100644 --- a/ios/MattermostTests/Info.plist +++ b/ios/MattermostTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 235 + 236 diff --git a/ios/NotificationService/Info.plist b/ios/NotificationService/Info.plist index 1adadb3c4..be47a6a67 100644 --- a/ios/NotificationService/Info.plist +++ b/ios/NotificationService/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 1.24.0 CFBundleVersion - 235 + 236 NSExtension NSExtensionPointIdentifier diff --git a/ios/Podfile b/ios/Podfile index 1e97b0909..3a701463e 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -7,6 +7,7 @@ target 'Mattermost' do # Pods for Mattermost pod 'XCDYouTubeKit', '2.7.1' + pod 'YoutubePlayer-in-WKWebView', '~> 0.3.1' target 'MattermostTests' do inherit! :search_paths diff --git a/ios/Podfile.lock b/ios/Podfile.lock index de555aa2b..dd0e6c594 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,16 +1,20 @@ PODS: - XCDYouTubeKit (2.7.1) + - YoutubePlayer-in-WKWebView (0.3.3) DEPENDENCIES: - XCDYouTubeKit (= 2.7.1) + - YoutubePlayer-in-WKWebView (~> 0.3.1) SPEC REPOS: https://github.com/cocoapods/specs.git: - XCDYouTubeKit + - YoutubePlayer-in-WKWebView SPEC CHECKSUMS: XCDYouTubeKit: c8567fd5cb388a3099fa26eee4b30df2a467847d + YoutubePlayer-in-WKWebView: 7694e858c5c3472ed067d6fe34eb9b944845e63c -PODFILE CHECKSUM: 63cb0d0aef536c8cbf15bf664fcfe31852a13dd1 +PODFILE CHECKSUM: e565d3af8eabb0e489b73c79433e140e30f8fa9c COCOAPODS: 1.5.3 diff --git a/package-lock.json b/package-lock.json index ac0399f29..015aaed3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14039,8 +14039,8 @@ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" }, "mattermost-redux": { - "version": "github:mattermost/mattermost-redux#b485e4a847f42be7ac7c8369ac1f7736069c45ca", - "from": "github:mattermost/mattermost-redux#b485e4a847f42be7ac7c8369ac1f7736069c45ca", + "version": "github:mattermost/mattermost-redux#dc5f8c1f30cbc6a25d4304f2923f5b78e674099d", + "from": "github:mattermost/mattermost-redux#dc5f8c1f30cbc6a25d4304f2923f5b78e674099d", "requires": { "deep-equal": "1.0.1", "eslint-plugin-header": "3.0.0", @@ -16501,8 +16501,8 @@ } }, "react-native-device-info": { - "version": "github:mattermost/react-native-device-info#a434e5378a59825b4c33c9a31bf0d8dc98a45966", - "from": "github:mattermost/react-native-device-info#a434e5378a59825b4c33c9a31bf0d8dc98a45966" + "version": "github:mattermost/react-native-device-info#58871122b6e1eb82c23674252430ad7e0a5afef3", + "from": "github:mattermost/react-native-device-info#58871122b6e1eb82c23674252430ad7e0a5afef3" }, "react-native-doc-viewer": { "version": "2.7.8", @@ -16553,8 +16553,8 @@ } }, "react-native-keyboard-tracking-view": { - "version": "github:enahum/react-native-keyboard-tracking-view#66979a750e42fefe06366f0c924b29368bb586f2", - "from": "github:enahum/react-native-keyboard-tracking-view#66979a750e42fefe06366f0c924b29368bb586f2" + "version": "github:enahum/react-native-keyboard-tracking-view#e23db601692c6b43de9a0bb399b4766df6701fca", + "from": "github:enahum/react-native-keyboard-tracking-view#e23db601692c6b43de9a0bb399b4766df6701fca" }, "react-native-keychain": { "version": "3.1.3", @@ -16901,8 +16901,8 @@ } }, "react-native-youtube": { - "version": "github:mattermost/react-native-youtube#3f395b620ae4e05a3f1c6bdeef3a1158e78daadc", - "from": "github:mattermost/react-native-youtube#3f395b620ae4e05a3f1c6bdeef3a1158e78daadc", + "version": "github:mattermost/react-native-youtube#22954c394146ec9a09ce5510056c17714a7155b2", + "from": "github:mattermost/react-native-youtube#22954c394146ec9a09ce5510056c17714a7155b2", "requires": { "prop-types": "^15.5.0" } diff --git a/package.json b/package.json index c65c8039f..7ef0ff97c 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "intl": "1.2.5", "jail-monkey": "2.2.0", "jsc-android": "241213.2.0", - "mattermost-redux": "github:mattermost/mattermost-redux#b485e4a847f42be7ac7c8369ac1f7736069c45ca", + "mattermost-redux": "github:mattermost/mattermost-redux#dc5f8c1f30cbc6a25d4304f2923f5b78e674099d", "mime-db": "1.40.0", "moment-timezone": "0.5.25", "prop-types": "15.7.2", @@ -34,7 +34,7 @@ "react-native-calendars": "github:mattermost/react-native-calendars#4937ec5a3bf7e86f9f35fcd85eb4aa6133f45b58", "react-native-circular-progress": "1.1.0", "react-native-cookies": "github:joeferraro/react-native-cookies#f11374745deba9f18f7b8a9bb4b0b2573026f522", - "react-native-device-info": "github:mattermost/react-native-device-info#a434e5378a59825b4c33c9a31bf0d8dc98a45966", + "react-native-device-info": "github:mattermost/react-native-device-info#58871122b6e1eb82c23674252430ad7e0a5afef3", "react-native-doc-viewer": "2.7.8", "react-native-document-picker": "2.3.0", "react-native-exception-handler": "2.10.7", @@ -43,7 +43,7 @@ "react-native-image-gallery": "github:mattermost/react-native-image-gallery#c1a9f7118e90cc87d47620bc0584c9cac4b0cf38", "react-native-image-picker": "0.28.1", "react-native-keyboard-aware-scroll-view": "0.8.0", - "react-native-keyboard-tracking-view": "github:enahum/react-native-keyboard-tracking-view#66979a750e42fefe06366f0c924b29368bb586f2", + "react-native-keyboard-tracking-view": "github:enahum/react-native-keyboard-tracking-view#e23db601692c6b43de9a0bb399b4766df6701fca", "react-native-keychain": "3.1.3", "react-native-linear-gradient": "2.5.4", "react-native-local-auth": "github:mattermost/react-native-local-auth#cc9ce2f468fbf7b431dfad3191a31aaa9227a6ab", @@ -61,7 +61,7 @@ "react-native-vector-icons": "6.4.2", "react-native-video": "4.4.1", "react-native-webview": "github:mattermost/react-native-webview#b5e22940a613869d3999feac9451ee65352f4fbe", - "react-native-youtube": "github:mattermost/react-native-youtube#3f395b620ae4e05a3f1c6bdeef3a1158e78daadc", + "react-native-youtube": "github:mattermost/react-native-youtube#22954c394146ec9a09ce5510056c17714a7155b2", "react-navigation": "3.9.1", "react-redux": "7.0.3", "redux": "4.0.1",