Merge branch 'master' into mark-as-unread

This commit is contained in:
Harrison Healey 2019-10-03 09:28:30 -04:00
commit 3f13c868f7
23 changed files with 226 additions and 100 deletions

View file

@ -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 {

View file

@ -2,6 +2,7 @@
exports[`Fade should render {opacity: 0} 1`] = `
<AnimatedComponent
pointerEvents="box-none"
style={
Object {
"opacity": 0,
@ -21,6 +22,7 @@ exports[`Fade should render {opacity: 0} 1`] = `
exports[`Fade should render {opacity: 1} 1`] = `
<AnimatedComponent
pointerEvents="box-none"
style={
Object {
"opacity": 1,

View file

@ -10,7 +10,6 @@ import {isMinimumServerVersion} from 'mattermost-redux/utils/helpers';
import {debounce} from 'mattermost-redux/actions/helpers';
import {CHANNEL_MENTION_REGEX, CHANNEL_MENTION_SEARCH_REGEX} from 'app/constants/autocomplete';
import AutocompleteDivider from 'app/components/autocomplete/autocomplete_divider';
import AutocompleteSectionHeader from 'app/components/autocomplete/autocomplete_section_header';
import ChannelMentionItem from 'app/components/autocomplete/channel_mention_item';
import {makeStyleSheetFromTheme} from 'app/utils/theme';
@ -231,7 +230,6 @@ export default class ChannelMention extends PureComponent {
sections={sections}
renderItem={this.renderItem}
renderSectionHeader={this.renderSectionHeader}
ItemSeparatorComponent={AutocompleteDivider}
initialNumToRender={10}
nestedScrollEnabled={nestedScrollEnabled}
/>

View file

@ -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 = (
<TouchableWithFeedback
key={channelId}
onPress={this.completeMention}
@ -71,17 +74,25 @@ export default class ChannelMentionItem extends PureComponent {
/>
</TouchableWithFeedback>
);
} else {
component = (
<TouchableWithFeedback
key={channelId}
onPress={this.completeMention}
style={[style.row, padding(isLandscape)]}
type={'opacity'}
>
<Text style={style.rowDisplayName}>{displayName}</Text>
<Text style={style.rowName}>{` (~${name})`}</Text>
</TouchableWithFeedback>
);
}
return (
<TouchableWithFeedback
key={channelId}
onPress={this.completeMention}
style={[style.row, padding(isLandscape)]}
type={'opacity'}
>
<Text style={style.rowDisplayName}>{displayName}</Text>
<Text style={style.rowName}>{` (~${name})`}</Text>
</TouchableWithFeedback>
<React.Fragment>
{component}
<AutocompleteDivider/>
</React.Fragment>
);
}
}

View file

@ -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),
};

View file

@ -47,6 +47,7 @@ export default class Fade extends PureComponent {
opacity: fadeAnim,
transform: disableScale ? [] : [{scale: fadeAnim}],
}}
pointerEvents={'box-none'}
>
{this.props.children}
</Animated.View>

View file

@ -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,

View file

@ -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,

View file

@ -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;
}
}

View file

@ -417,10 +417,10 @@ export default class List extends PureComponent {
/>
{UnreadIndicator &&
<UnreadIndicator
show={showIndicator}
style={styles.above}
onPress={this.scrollToTop}
theme={theme}
style={styles.above}
visible={showIndicator}
/>
}
</View>

View file

@ -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 = (
<View
style={[style.wrapper, this.props.style]}
pointerEvents={visible ? 'auto' : 'none'}
>
<FormattedText
style={[style.indicatorText, this.props.textStyle]}
id='sidebar.unreads'
defaultMessage='More unreads'
/>
<IonIcon
size={14}
name='md-arrow-round-up'
color={theme.mentionColor}
style={style.arrow}
/>
</View>
);
if (visible) {
return (
<TouchableWithoutFeedback onPress={onPress}>
{content}
</TouchableWithoutFeedback>
);
}
return content;
};
render() {
const {visible, theme} = this.props;
const style = getStyleSheet(theme);
return (
<Fade
visible={show}
visible={visible}
style={style.container}
duration={150}
disableScale={true}
>
<TouchableWithoutFeedback onPress={onPress}>
<View style={[style.wrapper, this.props.style]}>
<FormattedText
style={[style.indicatorText, this.props.textStyle]}
id='sidebar.unreads'
defaultMessage='More unreads'
/>
<IonIcon
size={14}
name='md-arrow-round-up'
color={theme.mentionColor}
style={style.arrow}
/>
</View>
</TouchableWithoutFeedback>
{this.renderContent()}
</Fade>
);
}

View file

@ -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');

View file

@ -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 (
<View style={style.container}>
<ScrollView style={style.scrollView}>
<ScrollView
ref={this.scrollView}
style={style.scrollView}
>
<StatusBar/>
{error && (
<ErrorText
textStyle={style.errorContainer}
error={error}
/>
)}
{Boolean(introductionText) &&
<DialogIntroductionText
value={introductionText}
@ -216,6 +241,12 @@ const getStyleFromTheme = makeStyleSheetFromTheme((theme) => {
container: {
backgroundColor: changeOpacity(theme.centerChannelColor, 0.03),
},
errorContainer: {
marginTop: 15,
marginLeft: 15,
fontSize: 14,
fontWeight: 'bold',
},
scrollView: {
marginBottom: 20,
marginTop: 10,

View file

@ -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(
<InteractiveDialog {...props}/>
);
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(
<InteractiveDialog {...baseProps}/>
);
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();
});
});
});

View file

@ -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 = "<group>"; };
77810F0A063349439B0D8B6B /* libJailMonkey.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libJailMonkey.a; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
7F11AA06228848D8001C9540 /* KeyboardTrackingView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = KeyboardTrackingView.xcodeproj; path = "../node_modules/react-native-keyboard-tracking-view/lib/KeyboardTrackingView.xcodeproj"; sourceTree = "<group>"; };
7F151D3D221B062700FAD8F3 /* RuntimeUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RuntimeUtils.swift; path = Mattermost/RuntimeUtils.swift; sourceTree = "<group>"; };
@ -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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
EE3EE4548D3F4A49B1274722 /* libRNLocalAuth.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNLocalAuth.a; sourceTree = "<group>"; };
EE671DF7637347CD8C069819 /* libRNDeviceInfo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDeviceInfo.a; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
E2D17ED040D0465DBF9112D3 /* Mattermost-Regular.otf */ = {isa = PBXFileReference; name = "Mattermost-Regular.otf"; path = "../assets/fonts/Mattermost-Regular.otf"; sourceTree = "<group>"; 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;

View file

@ -34,7 +34,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>235</string>
<string>236</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>

View file

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>1.24.0</string>
<key>CFBundleVersion</key>
<string>235</string>
<string>236</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>

View file

@ -19,6 +19,6 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>235</string>
<string>236</string>
</dict>
</plist>

View file

@ -19,7 +19,7 @@
<key>CFBundleShortVersionString</key>
<string>1.24.0</string>
<key>CFBundleVersion</key>
<string>235</string>
<string>236</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>

View file

@ -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

View file

@ -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

16
package-lock.json generated
View file

@ -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"
}

View file

@ -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",