Merge branch 'master' into mark-as-unread
This commit is contained in:
commit
3f13c868f7
23 changed files with 226 additions and 100 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ export default class Fade extends PureComponent {
|
|||
opacity: fadeAnim,
|
||||
transform: disableScale ? [] : [{scale: fadeAnim}],
|
||||
}}
|
||||
pointerEvents={'box-none'}
|
||||
>
|
||||
{this.props.children}
|
||||
</Animated.View>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>235</string>
|
||||
<string>236</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,6 @@
|
|||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>235</string>
|
||||
<string>236</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
16
package-lock.json
generated
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in a new issue