forked from Ivasoft/mattermost-mobile
Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7590bb3063 | ||
|
|
69a2c58f5e | ||
|
|
7efb044aa9 | ||
|
|
25673ff7e0 | ||
|
|
78b23ae37e | ||
|
|
8ef6b35369 | ||
|
|
385a081f78 | ||
|
|
0377249592 | ||
|
|
caac14907e | ||
|
|
6fef6d6b92 | ||
|
|
64337b4851 | ||
|
|
713dd4e578 | ||
|
|
41ddeef2f7 | ||
|
|
00e05c5e8f | ||
|
|
a74fabcc98 | ||
|
|
bb9f96f409 | ||
|
|
3adec36c95 | ||
|
|
4c690b5578 | ||
|
|
39129fc6c4 | ||
|
|
370fa9b952 | ||
|
|
52e379ae51 |
@@ -1369,7 +1369,7 @@ This product contains a modified version of 'react-native-device-info' by Rebecc
|
||||
Get device information using react-native
|
||||
|
||||
* HOMEPAGE:
|
||||
* https://github.com/rebeccahughes/react-native-device-info#readme
|
||||
* https://github.com/react-native-community/react-native-device-info#readme
|
||||
|
||||
* LICENSE: MIT
|
||||
|
||||
@@ -1828,7 +1828,7 @@ SOFTWARE.
|
||||
|
||||
This product contains 'react-native-permissions' by Yonah Forst.
|
||||
|
||||
Check user permissions in React Native
|
||||
Check and request user permissions in React Native.
|
||||
|
||||
* HOMEPAGE:
|
||||
* https://github.com/yonahforst/react-native-permissions
|
||||
|
||||
@@ -118,7 +118,7 @@ android {
|
||||
applicationId "com.mattermost.rnbeta"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 183
|
||||
versionCode 186
|
||||
versionName "1.18.0"
|
||||
multiDexEnabled = true
|
||||
ndk {
|
||||
|
||||
@@ -230,7 +230,9 @@ public class CustomPushNotification extends PushNotification {
|
||||
}
|
||||
|
||||
if (badge != null) {
|
||||
CustomPushNotification.badgeCount = Integer.parseInt(badge);
|
||||
int badgeCount = Integer.parseInt(badge);
|
||||
CustomPushNotification.badgeCount = badgeCount;
|
||||
notification.setNumber(badgeCount);
|
||||
ApplicationBadgeHelper.instance.setApplicationIconBadgeNumber(mContext.getApplicationContext(), CustomPushNotification.badgeCount);
|
||||
} else {
|
||||
// HERE ADD THE DOT INDICATOR STUFF
|
||||
@@ -248,6 +250,7 @@ public class CustomPushNotification extends PushNotification {
|
||||
list = new ArrayList<Bundle>(bundleArray);
|
||||
} else {
|
||||
list = new ArrayList<Bundle>();
|
||||
list.add(bundle);
|
||||
}
|
||||
|
||||
for (Bundle data : list) {
|
||||
@@ -263,7 +266,6 @@ public class CustomPushNotification extends PushNotification {
|
||||
.setGroupSummary(true)
|
||||
.setStyle(messagingStyle)
|
||||
.setSmallIcon(smallIconResId)
|
||||
.setNumber(Integer.parseInt(badge))
|
||||
.setVisibility(Notification.VISIBILITY_PRIVATE)
|
||||
.setPriority(Notification.PRIORITY_HIGH)
|
||||
.setAutoCancel(true);
|
||||
@@ -361,7 +363,12 @@ public class CustomPushNotification extends PushNotification {
|
||||
return channelName;
|
||||
}
|
||||
|
||||
return message.split(":")[0];
|
||||
String senderName = message.split(":")[0];
|
||||
if (senderName != message) {
|
||||
return senderName;
|
||||
}
|
||||
|
||||
return " ";
|
||||
}
|
||||
|
||||
private String removeSenderFromMessage(String message) {
|
||||
|
||||
@@ -133,7 +133,6 @@ public class NotificationReplyBroadcastReceiver extends BroadcastReceiver {
|
||||
Notification notification =
|
||||
new Notification.Builder(mContext, CHANNEL_ID)
|
||||
.setContentTitle("Message failed to send.")
|
||||
.setContentText(packageName)
|
||||
.setSmallIcon(smallIconResId)
|
||||
.build();
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
} from 'react-native';
|
||||
|
||||
import ProfilePicture from 'app/components/profile_picture';
|
||||
import BotTag from 'app/components/bot_tag';
|
||||
import {makeStyleSheetFromTheme} from 'app/utils/theme';
|
||||
|
||||
export default class AtMentionItem extends PureComponent {
|
||||
@@ -19,6 +20,7 @@ export default class AtMentionItem extends PureComponent {
|
||||
onPress: PropTypes.func.isRequired,
|
||||
userId: PropTypes.string.isRequired,
|
||||
username: PropTypes.string,
|
||||
isBot: PropTypes.bool,
|
||||
theme: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
@@ -34,6 +36,7 @@ export default class AtMentionItem extends PureComponent {
|
||||
userId,
|
||||
username,
|
||||
theme,
|
||||
isBot,
|
||||
} = this.props;
|
||||
|
||||
const style = getStyleFromTheme(theme);
|
||||
@@ -54,6 +57,10 @@ export default class AtMentionItem extends PureComponent {
|
||||
/>
|
||||
</View>
|
||||
<Text style={style.rowUsername}>{`@${username}`}</Text>
|
||||
<BotTag
|
||||
show={isBot}
|
||||
theme={theme}
|
||||
/>
|
||||
{hasFullName && <Text style={style.rowUsername}>{' - '}</Text>}
|
||||
{hasFullName && <Text style={style.rowFullname}>{`${firstName} ${lastName}`}</Text>}
|
||||
</TouchableOpacity>
|
||||
|
||||
@@ -16,6 +16,7 @@ function mapStateToProps(state, ownProps) {
|
||||
firstName: user.first_name,
|
||||
lastName: user.last_name,
|
||||
username: user.username,
|
||||
isBot: Boolean(user.is_bot),
|
||||
theme: getTheme(state),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
} from 'react-native';
|
||||
|
||||
import {General} from 'mattermost-redux/constants';
|
||||
import BotTag from 'app/components/bot_tag';
|
||||
|
||||
import {makeStyleSheetFromTheme} from 'app/utils/theme';
|
||||
|
||||
@@ -18,6 +19,7 @@ export default class ChannelMentionItem extends PureComponent {
|
||||
displayName: PropTypes.string,
|
||||
name: PropTypes.string,
|
||||
type: PropTypes.string,
|
||||
isBot: PropTypes.bool.isRequired,
|
||||
onPress: PropTypes.func.isRequired,
|
||||
theme: PropTypes.object.isRequired,
|
||||
};
|
||||
@@ -38,6 +40,7 @@ export default class ChannelMentionItem extends PureComponent {
|
||||
name,
|
||||
theme,
|
||||
type,
|
||||
isBot,
|
||||
} = this.props;
|
||||
|
||||
const style = getStyleFromTheme(theme);
|
||||
@@ -53,6 +56,10 @@ export default class ChannelMentionItem extends PureComponent {
|
||||
style={style.row}
|
||||
>
|
||||
<Text style={style.rowDisplayName}>{'@' + displayName}</Text>
|
||||
<BotTag
|
||||
show={isBot}
|
||||
theme={theme}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
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';
|
||||
@@ -11,14 +13,25 @@ import {getChannelNameForSearchAutocomplete} from 'app/selectors/channel';
|
||||
|
||||
import ChannelMentionItem from './channel_mention_item';
|
||||
|
||||
import {getUser} from 'mattermost-redux/selectors/entities/users';
|
||||
|
||||
function mapStateToProps(state, ownProps) {
|
||||
const channel = getChannel(state, ownProps.channelId);
|
||||
const displayName = getChannelNameForSearchAutocomplete(state, ownProps.channelId);
|
||||
|
||||
let isBot = false;
|
||||
if (channel.type === General.DM_CHANNEL) {
|
||||
const teammate = getUser(state, channel.teammate_id);
|
||||
if (teammate && teammate.is_bot) {
|
||||
isBot = true;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
displayName,
|
||||
name: channel.name,
|
||||
type: channel.type,
|
||||
isBot,
|
||||
theme: getTheme(state),
|
||||
};
|
||||
}
|
||||
|
||||
50
app/components/bot_tag.js
Normal file
50
app/components/bot_tag.js
Normal file
@@ -0,0 +1,50 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
import React, {PureComponent} from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme';
|
||||
import FormattedText from 'app/components/formatted_text';
|
||||
|
||||
export default class BotTag extends PureComponent {
|
||||
static defaultProps = {
|
||||
show: true,
|
||||
};
|
||||
|
||||
static propTypes = {
|
||||
show: PropTypes.bool,
|
||||
theme: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
render() {
|
||||
if (!this.props.show) {
|
||||
return null;
|
||||
}
|
||||
const style = createStyleSheet(this.props.theme);
|
||||
|
||||
return (
|
||||
<FormattedText
|
||||
id='post_info.bot'
|
||||
defaultMessage='BOT'
|
||||
style={style.bot}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const createStyleSheet = makeStyleSheetFromTheme((theme) => {
|
||||
return {
|
||||
bot: {
|
||||
alignSelf: 'center',
|
||||
backgroundColor: changeOpacity(theme.centerChannelColor, 0.15),
|
||||
borderRadius: 2,
|
||||
color: theme.centerChannelColor,
|
||||
fontSize: 10,
|
||||
fontWeight: '600',
|
||||
marginRight: 5,
|
||||
marginLeft: 5,
|
||||
paddingVertical: 2,
|
||||
paddingHorizontal: 4,
|
||||
},
|
||||
};
|
||||
});
|
||||
@@ -8,10 +8,11 @@ import {
|
||||
Text,
|
||||
View,
|
||||
} from 'react-native';
|
||||
import Icon from 'react-native-vector-icons/FontAwesome';
|
||||
|
||||
import {General} from 'mattermost-redux/constants';
|
||||
|
||||
import Icon from 'app/components/vector_icon';
|
||||
|
||||
import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme';
|
||||
|
||||
export default class ChannelIcon extends React.PureComponent {
|
||||
@@ -26,6 +27,7 @@ export default class ChannelIcon extends React.PureComponent {
|
||||
theme: PropTypes.object.isRequired,
|
||||
type: PropTypes.string.isRequired,
|
||||
isArchived: PropTypes.bool.isRequired,
|
||||
isBot: PropTypes.bool.isRequired,
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
@@ -47,6 +49,7 @@ export default class ChannelIcon extends React.PureComponent {
|
||||
theme,
|
||||
type,
|
||||
isArchived,
|
||||
isBot,
|
||||
} = this.props;
|
||||
const style = getStyleSheet(theme);
|
||||
|
||||
@@ -83,6 +86,15 @@ export default class ChannelIcon extends React.PureComponent {
|
||||
<Icon
|
||||
name='archive'
|
||||
style={[style.icon, unreadIcon, activeIcon, {fontSize: size}]}
|
||||
type='fontawesome'
|
||||
/>
|
||||
);
|
||||
} else if (isBot) {
|
||||
icon = (
|
||||
<Icon
|
||||
name='robot'
|
||||
style={[style.icon, unreadIcon, activeIcon, {fontSize: size}, style.iconBot]}
|
||||
type='fontawesome5'
|
||||
/>
|
||||
);
|
||||
} else if (hasDraft) {
|
||||
@@ -90,6 +102,7 @@ export default class ChannelIcon extends React.PureComponent {
|
||||
<Icon
|
||||
name='pencil'
|
||||
style={[style.icon, unreadIcon, activeIcon, {fontSize: size}]}
|
||||
type='fontawesome'
|
||||
/>
|
||||
);
|
||||
} else if (type === General.OPEN_CHANNEL) {
|
||||
@@ -97,6 +110,7 @@ export default class ChannelIcon extends React.PureComponent {
|
||||
<Icon
|
||||
name='globe'
|
||||
style={[style.icon, unreadIcon, activeIcon, {fontSize: size}]}
|
||||
type='fontawesome'
|
||||
/>
|
||||
);
|
||||
} else if (type === General.PRIVATE_CHANNEL) {
|
||||
@@ -104,6 +118,7 @@ export default class ChannelIcon extends React.PureComponent {
|
||||
<Icon
|
||||
name='lock'
|
||||
style={[style.icon, unreadIcon, activeIcon, {fontSize: size}]}
|
||||
type='fontawesome'
|
||||
/>
|
||||
);
|
||||
} else if (type === General.GM_CHANNEL) {
|
||||
@@ -177,6 +192,9 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => {
|
||||
iconInfo: {
|
||||
color: theme.centerChannelColor,
|
||||
},
|
||||
iconBot: {
|
||||
marginLeft: -5,
|
||||
},
|
||||
groupBox: {
|
||||
alignSelf: 'flex-start',
|
||||
alignItems: 'center',
|
||||
|
||||
@@ -14,6 +14,7 @@ import {General} from 'mattermost-redux/constants';
|
||||
import {injectIntl, intlShape} from 'react-intl';
|
||||
|
||||
import ProfilePicture from 'app/components/profile_picture';
|
||||
import BotTag from 'app/components/bot_tag';
|
||||
import {preventDoubleTap} from 'app/utils/tap';
|
||||
import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme';
|
||||
import {t} from 'app/utils/i18n';
|
||||
@@ -91,16 +92,24 @@ class ChannelIntro extends PureComponent {
|
||||
const {currentChannelMembers, theme} = this.props;
|
||||
const style = getStyleSheet(theme);
|
||||
|
||||
return currentChannelMembers.map((member, index) => (
|
||||
<TouchableOpacity
|
||||
key={member.id}
|
||||
onPress={preventDoubleTap(() => this.goToUserProfile(member.id))}
|
||||
>
|
||||
<Text style={style.displayName}>
|
||||
{index === currentChannelMembers.length - 1 ? this.getDisplayName(member) : `${this.getDisplayName(member)}, `}
|
||||
</Text>
|
||||
</TouchableOpacity>
|
||||
));
|
||||
return currentChannelMembers.map((member, index) => {
|
||||
return (
|
||||
<TouchableOpacity
|
||||
key={member.id}
|
||||
onPress={preventDoubleTap(() => this.goToUserProfile(member.id))}
|
||||
>
|
||||
<View style={style.indicatorContainer}>
|
||||
<Text style={style.displayName}>
|
||||
{index === currentChannelMembers.length - 1 ? this.getDisplayName(member) : `${this.getDisplayName(member)}, `}
|
||||
</Text>
|
||||
<BotTag
|
||||
show={Boolean(member.is_bot)}
|
||||
theme={theme}
|
||||
/>
|
||||
</View>
|
||||
</TouchableOpacity>
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
buildDMContent = () => {
|
||||
@@ -382,6 +391,9 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => {
|
||||
flexWrap: 'wrap',
|
||||
justifyContent: 'flex-start',
|
||||
},
|
||||
indicatorContainer: {
|
||||
flexDirection: 'row',
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -11,8 +11,12 @@ import {handleSelectChannel, setChannelLoading} from 'app/actions/views/channel'
|
||||
import ChannelLoader from './channel_loader';
|
||||
|
||||
function mapStateToProps(state, ownProps) {
|
||||
const channelIsLoading = ownProps.hasOwnProperty('channelIsLoading') ?
|
||||
ownProps.channelIsLoading :
|
||||
state.views.channel.loading;
|
||||
|
||||
return {
|
||||
channelIsLoading: ownProps.channelIsLoading || state.views.channel.loading,
|
||||
channelIsLoading,
|
||||
theme: getTheme(state),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -41,18 +41,57 @@ exports[`UserListRow should match snapshot 1`] = `
|
||||
}
|
||||
>
|
||||
<View>
|
||||
<Text
|
||||
ellipsizeMode="tail"
|
||||
numberOfLines={1}
|
||||
<View
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 15,
|
||||
"flexDirection": "row",
|
||||
}
|
||||
}
|
||||
>
|
||||
@user
|
||||
</Text>
|
||||
<Text
|
||||
ellipsizeMode="tail"
|
||||
numberOfLines={1}
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 15,
|
||||
}
|
||||
}
|
||||
>
|
||||
@user
|
||||
</Text>
|
||||
<BotTag
|
||||
show={false}
|
||||
theme={
|
||||
Object {
|
||||
"awayIndicator": "#ffbc42",
|
||||
"buttonBg": "#166de0",
|
||||
"buttonColor": "#ffffff",
|
||||
"centerChannelBg": "#ffffff",
|
||||
"centerChannelColor": "#3d3c40",
|
||||
"codeTheme": "github",
|
||||
"dndIndicator": "#f74343",
|
||||
"errorTextColor": "#fd5960",
|
||||
"linkColor": "#2389d7",
|
||||
"mentionBj": "#ffffff",
|
||||
"mentionColor": "#145dbf",
|
||||
"mentionHighlightBg": "#ffe577",
|
||||
"mentionHighlightLink": "#166de0",
|
||||
"newMessageSeparator": "#ff8800",
|
||||
"onlineIndicator": "#06d6a0",
|
||||
"sidebarBg": "#145dbf",
|
||||
"sidebarHeaderBg": "#1153ab",
|
||||
"sidebarHeaderTextColor": "#ffffff",
|
||||
"sidebarText": "#ffffff",
|
||||
"sidebarTextActiveBorder": "#579eff",
|
||||
"sidebarTextActiveColor": "#ffffff",
|
||||
"sidebarTextHoverBg": "#4578bf",
|
||||
"sidebarUnreadText": "#ffffff",
|
||||
"type": "Mattermost",
|
||||
}
|
||||
}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
</CustomListRow>
|
||||
@@ -100,16 +139,55 @@ exports[`UserListRow should match snapshot for currentUser with (you) populated
|
||||
}
|
||||
>
|
||||
<View>
|
||||
<Text
|
||||
ellipsizeMode="tail"
|
||||
numberOfLines={1}
|
||||
<View
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 15,
|
||||
"flexDirection": "row",
|
||||
}
|
||||
}
|
||||
/>
|
||||
>
|
||||
<Text
|
||||
ellipsizeMode="tail"
|
||||
numberOfLines={1}
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 15,
|
||||
}
|
||||
}
|
||||
/>
|
||||
<BotTag
|
||||
show={false}
|
||||
theme={
|
||||
Object {
|
||||
"awayIndicator": "#ffbc42",
|
||||
"buttonBg": "#166de0",
|
||||
"buttonColor": "#ffffff",
|
||||
"centerChannelBg": "#ffffff",
|
||||
"centerChannelColor": "#3d3c40",
|
||||
"codeTheme": "github",
|
||||
"dndIndicator": "#f74343",
|
||||
"errorTextColor": "#fd5960",
|
||||
"linkColor": "#2389d7",
|
||||
"mentionBj": "#ffffff",
|
||||
"mentionColor": "#145dbf",
|
||||
"mentionHighlightBg": "#ffe577",
|
||||
"mentionHighlightLink": "#166de0",
|
||||
"newMessageSeparator": "#ff8800",
|
||||
"onlineIndicator": "#06d6a0",
|
||||
"sidebarBg": "#145dbf",
|
||||
"sidebarHeaderBg": "#1153ab",
|
||||
"sidebarHeaderTextColor": "#ffffff",
|
||||
"sidebarText": "#ffffff",
|
||||
"sidebarTextActiveBorder": "#579eff",
|
||||
"sidebarTextActiveColor": "#ffffff",
|
||||
"sidebarTextHoverBg": "#4578bf",
|
||||
"sidebarUnreadText": "#ffffff",
|
||||
"type": "Mattermost",
|
||||
}
|
||||
}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
</CustomListRow>
|
||||
@@ -157,18 +235,57 @@ exports[`UserListRow should match snapshot for deactivated user 1`] = `
|
||||
}
|
||||
>
|
||||
<View>
|
||||
<Text
|
||||
ellipsizeMode="tail"
|
||||
numberOfLines={1}
|
||||
<View
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 15,
|
||||
"flexDirection": "row",
|
||||
}
|
||||
}
|
||||
>
|
||||
@user
|
||||
</Text>
|
||||
<Text
|
||||
ellipsizeMode="tail"
|
||||
numberOfLines={1}
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 15,
|
||||
}
|
||||
}
|
||||
>
|
||||
@user
|
||||
</Text>
|
||||
<BotTag
|
||||
show={false}
|
||||
theme={
|
||||
Object {
|
||||
"awayIndicator": "#ffbc42",
|
||||
"buttonBg": "#166de0",
|
||||
"buttonColor": "#ffffff",
|
||||
"centerChannelBg": "#ffffff",
|
||||
"centerChannelColor": "#3d3c40",
|
||||
"codeTheme": "github",
|
||||
"dndIndicator": "#f74343",
|
||||
"errorTextColor": "#fd5960",
|
||||
"linkColor": "#2389d7",
|
||||
"mentionBj": "#ffffff",
|
||||
"mentionColor": "#145dbf",
|
||||
"mentionHighlightBg": "#ffe577",
|
||||
"mentionHighlightLink": "#166de0",
|
||||
"newMessageSeparator": "#ff8800",
|
||||
"onlineIndicator": "#06d6a0",
|
||||
"sidebarBg": "#145dbf",
|
||||
"sidebarHeaderBg": "#1153ab",
|
||||
"sidebarHeaderTextColor": "#ffffff",
|
||||
"sidebarText": "#ffffff",
|
||||
"sidebarTextActiveBorder": "#579eff",
|
||||
"sidebarTextActiveColor": "#ffffff",
|
||||
"sidebarTextHoverBg": "#4578bf",
|
||||
"sidebarUnreadText": "#ffffff",
|
||||
"type": "Mattermost",
|
||||
}
|
||||
}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
<View>
|
||||
<Text
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
import {displayUsername} from 'mattermost-redux/utils/user_utils';
|
||||
|
||||
import ProfilePicture from 'app/components/profile_picture';
|
||||
import BotTag from 'app/components/bot_tag';
|
||||
import {makeStyleSheetFromTheme, changeOpacity} from 'app/utils/theme';
|
||||
import CustomListRow from 'app/components/custom_list/custom_list_row';
|
||||
|
||||
@@ -78,13 +79,19 @@ export default class UserListRow extends React.PureComponent {
|
||||
</View>
|
||||
<View style={style.textContainer}>
|
||||
<View>
|
||||
<Text
|
||||
style={style.username}
|
||||
ellipsizeMode='tail'
|
||||
numberOfLines={1}
|
||||
>
|
||||
{usernameDisplay}
|
||||
</Text>
|
||||
<View style={style.indicatorContainer}>
|
||||
<Text
|
||||
style={style.username}
|
||||
ellipsizeMode='tail'
|
||||
numberOfLines={1}
|
||||
>
|
||||
{usernameDisplay}
|
||||
</Text>
|
||||
<BotTag
|
||||
show={Boolean(user.is_bot)}
|
||||
theme={theme}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
{showTeammateDisplay &&
|
||||
<View>
|
||||
@@ -140,6 +147,9 @@ const getStyleFromTheme = makeStyleSheetFromTheme((theme) => {
|
||||
fontSize: 15,
|
||||
color: theme.centerChannelColor,
|
||||
},
|
||||
indicatorContainer: {
|
||||
flexDirection: 'row',
|
||||
},
|
||||
deactivated: {
|
||||
marginTop: 2,
|
||||
fontSize: 12,
|
||||
|
||||
@@ -119,6 +119,7 @@ export default class FileUploadItem extends PureComponent {
|
||||
Authorization: `Bearer ${Client4.getToken()}`,
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
'Content-Type': 'multipart/form-data',
|
||||
'X-CSRF-Token': Client4.csrf,
|
||||
};
|
||||
|
||||
const fileInfo = {
|
||||
|
||||
@@ -44,6 +44,7 @@ function makeMapStateToProps() {
|
||||
overrideUsername: post?.props?.override_username, // eslint-disable-line camelcase
|
||||
theme: getTheme(state),
|
||||
username: user.username,
|
||||
isBot: user.is_bot || false,
|
||||
userTimezone,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -14,6 +14,7 @@ import FormattedText from 'app/components/formatted_text';
|
||||
import FormattedTime from 'app/components/formatted_time';
|
||||
import FormattedDate from 'app/components/formatted_date';
|
||||
import ReplyIcon from 'app/components/reply_icon';
|
||||
import BotTag from 'app/components/bot_tag';
|
||||
import {emptyFunction} from 'app/utils/general';
|
||||
import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme';
|
||||
|
||||
@@ -38,6 +39,7 @@ export default class PostHeader extends PureComponent {
|
||||
showFullDate: PropTypes.bool,
|
||||
theme: PropTypes.object.isRequired,
|
||||
username: PropTypes.string,
|
||||
isBot: PropTypes.bool,
|
||||
userTimezone: PropTypes.string,
|
||||
enableTimezone: PropTypes.bool,
|
||||
};
|
||||
@@ -61,6 +63,7 @@ export default class PostHeader extends PureComponent {
|
||||
isSystemMessage,
|
||||
fromAutoResponder,
|
||||
overrideUsername,
|
||||
isBot,
|
||||
} = this.props;
|
||||
|
||||
if (fromWebHook) {
|
||||
@@ -74,13 +77,24 @@ export default class PostHeader extends PureComponent {
|
||||
<Text style={style.displayName}>
|
||||
{name}
|
||||
</Text>
|
||||
<FormattedText
|
||||
id='post_info.bot'
|
||||
defaultMessage='BOT'
|
||||
style={style.bot}
|
||||
<BotTag
|
||||
theme={this.props.theme}
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
} else if (isBot) {
|
||||
return (
|
||||
<TouchableOpacity onPress={this.handleUsernamePress}>
|
||||
<View style={style.indicatorContainer}>
|
||||
<Text style={style.displayName}>
|
||||
{this.props.displayName}
|
||||
</Text>
|
||||
<BotTag
|
||||
theme={this.props.theme}
|
||||
/>
|
||||
</View>
|
||||
</TouchableOpacity>
|
||||
);
|
||||
} else if (fromAutoResponder) {
|
||||
let name = this.props.displayName;
|
||||
if (overrideUsername && enablePostUsernameOverride) {
|
||||
@@ -291,17 +305,6 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => {
|
||||
indicatorContainer: {
|
||||
flexDirection: 'row',
|
||||
},
|
||||
bot: {
|
||||
alignSelf: 'center',
|
||||
backgroundColor: changeOpacity(theme.centerChannelColor, 0.15),
|
||||
borderRadius: 2,
|
||||
color: theme.centerChannelColor,
|
||||
fontSize: 10,
|
||||
fontWeight: '600',
|
||||
marginRight: 5,
|
||||
paddingVertical: 2,
|
||||
paddingHorizontal: 4,
|
||||
},
|
||||
displayName: {
|
||||
color: theme.centerChannelColor,
|
||||
fontSize: 15,
|
||||
|
||||
@@ -111,7 +111,7 @@ export default class ProfilePicture extends PureComponent {
|
||||
}
|
||||
|
||||
render() {
|
||||
const {edit, showStatus, theme} = this.props;
|
||||
const {edit, showStatus, theme, user} = this.props;
|
||||
const {pictureUrl} = this.state;
|
||||
const style = getStyleSheet(theme);
|
||||
|
||||
@@ -172,7 +172,7 @@ export default class ProfilePicture extends PureComponent {
|
||||
return (
|
||||
<View style={{width: this.props.size + STATUS_BUFFER, height: this.props.size + STATUS_BUFFER}}>
|
||||
{image}
|
||||
{(showStatus || edit) &&
|
||||
{(showStatus || edit) && (user && !user.is_bot) &&
|
||||
<View style={[style.statusWrapper, statusStyle, {borderRadius: this.props.statusSize / 2}]}>
|
||||
{statusIcon}
|
||||
</View>
|
||||
|
||||
@@ -39,6 +39,7 @@ exports[`ChannelItem should match snapshot 1`] = `
|
||||
hasDraft={false}
|
||||
isActive={false}
|
||||
isArchived={false}
|
||||
isBot={false}
|
||||
isInfo={false}
|
||||
isUnread={true}
|
||||
membersCount={1}
|
||||
@@ -153,6 +154,7 @@ exports[`ChannelItem should match snapshot for current user i.e currentUser (you
|
||||
hasDraft={false}
|
||||
isActive={true}
|
||||
isArchived={false}
|
||||
isBot={false}
|
||||
isInfo={false}
|
||||
isUnread={true}
|
||||
membersCount={1}
|
||||
@@ -267,6 +269,7 @@ exports[`ChannelItem should match snapshot for current user i.e currentUser (you
|
||||
hasDraft={false}
|
||||
isActive={true}
|
||||
isArchived={false}
|
||||
isBot={false}
|
||||
isInfo={false}
|
||||
isUnread={true}
|
||||
membersCount={1}
|
||||
@@ -381,6 +384,7 @@ exports[`ChannelItem should match snapshot for deactivated user and is currentCh
|
||||
hasDraft={false}
|
||||
isActive={true}
|
||||
isArchived={true}
|
||||
isBot={false}
|
||||
isInfo={false}
|
||||
isUnread={true}
|
||||
membersCount={1}
|
||||
@@ -484,6 +488,7 @@ exports[`ChannelItem should match snapshot for deactivated user and is searchRes
|
||||
hasDraft={false}
|
||||
isActive={false}
|
||||
isArchived={true}
|
||||
isBot={false}
|
||||
isInfo={false}
|
||||
isUnread={true}
|
||||
membersCount={1}
|
||||
@@ -593,6 +598,7 @@ exports[`ChannelItem should match snapshot with draft 1`] = `
|
||||
hasDraft={true}
|
||||
isActive={false}
|
||||
isArchived={false}
|
||||
isBot={false}
|
||||
isInfo={false}
|
||||
isUnread={true}
|
||||
membersCount={1}
|
||||
@@ -698,6 +704,7 @@ exports[`ChannelItem should match snapshot with mentions and muted 1`] = `
|
||||
hasDraft={false}
|
||||
isActive={false}
|
||||
isArchived={false}
|
||||
isBot={false}
|
||||
isInfo={false}
|
||||
isUnread={true}
|
||||
membersCount={1}
|
||||
|
||||
@@ -39,6 +39,7 @@ export default class ChannelItem extends PureComponent {
|
||||
theme: PropTypes.object.isRequired,
|
||||
unreadMsgs: PropTypes.number.isRequired,
|
||||
isSearchResult: PropTypes.bool,
|
||||
isBot: PropTypes.bool.isRequired,
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
@@ -99,6 +100,7 @@ export default class ChannelItem extends PureComponent {
|
||||
theme,
|
||||
isSearchResult,
|
||||
channel,
|
||||
isBot,
|
||||
} = this.props;
|
||||
|
||||
const isArchived = channel.delete_at > 0;
|
||||
@@ -183,6 +185,7 @@ export default class ChannelItem extends PureComponent {
|
||||
theme={theme}
|
||||
type={channel.type}
|
||||
isArchived={isArchived}
|
||||
isBot={isBot}
|
||||
/>
|
||||
);
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ describe('ChannelItem', () => {
|
||||
theme: Preferences.THEMES.default,
|
||||
unreadMsgs: 1,
|
||||
isSearchResult: false,
|
||||
isBot: false,
|
||||
};
|
||||
|
||||
test('should match snapshot', () => {
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
} from 'mattermost-redux/selectors/entities/channels';
|
||||
import {getTheme, getTeammateNameDisplaySetting} from 'mattermost-redux/selectors/entities/preferences';
|
||||
import {getCurrentUserId, getUser} from 'mattermost-redux/selectors/entities/users';
|
||||
import {isChannelMuted} from 'mattermost-redux/utils/channel_utils';
|
||||
import {getUserIdFromChannelName, isChannelMuted} from 'mattermost-redux/utils/channel_utils';
|
||||
import {displayUsername} from 'mattermost-redux/utils/user_utils';
|
||||
|
||||
import {getDraftForChannel} from 'app/selectors/views';
|
||||
@@ -29,12 +29,19 @@ function makeMapStateToProps() {
|
||||
const channelDraft = getDraftForChannel(state, channel.id);
|
||||
|
||||
let displayName = channel.display_name;
|
||||
let isBot = false;
|
||||
|
||||
if (channel.type === General.DM_CHANNEL) {
|
||||
if (!ownProps.isSearchResult) {
|
||||
const teammate = getUser(state, channel.teammate_id);
|
||||
if (ownProps.isSearchResult) {
|
||||
isBot = channel.isBot;
|
||||
} else {
|
||||
const teammateId = getUserIdFromChannelName(currentUserId, channel.name);
|
||||
const teammate = getUser(state, teammateId);
|
||||
const teammateNameDisplay = getTeammateNameDisplaySetting(state);
|
||||
displayName = displayUsername(teammate, teammateNameDisplay, false);
|
||||
if (teammate && teammate.is_bot) {
|
||||
isBot = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +80,7 @@ function makeMapStateToProps() {
|
||||
showUnreadForMsgs,
|
||||
theme: getTheme(state),
|
||||
unreadMsgs,
|
||||
isBot,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -218,6 +218,7 @@ class FilteredList extends Component {
|
||||
nickname: u.nickname,
|
||||
fullname: `${u.first_name} ${u.last_name}`,
|
||||
delete_at: u.delete_at,
|
||||
isBot: u.is_bot,
|
||||
|
||||
// need name key for DM's as we use it for sortChannelsByDisplayName with same display_name
|
||||
name: displayName,
|
||||
@@ -263,6 +264,7 @@ class FilteredList extends Component {
|
||||
nickname: u.nickname,
|
||||
fullname: `${u.first_name} ${u.last_name}`,
|
||||
delete_at: u.delete_at,
|
||||
isBot: u.is_bot,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ import PropTypes from 'prop-types';
|
||||
import React, {PureComponent} from 'react';
|
||||
import {Text} from 'react-native';
|
||||
import FontAwesomeIcon from 'react-native-vector-icons/FontAwesome';
|
||||
import FontAwesome5Icon from 'react-native-vector-icons/FontAwesome5';
|
||||
import FoundationIcon from 'react-native-vector-icons/Foundation';
|
||||
import IonIcon from 'react-native-vector-icons/Ionicons';
|
||||
import MaterialIcon from 'react-native-vector-icons/MaterialIcons';
|
||||
@@ -33,6 +34,14 @@ export default class VectorIcon extends PureComponent {
|
||||
size={size}
|
||||
/>
|
||||
);
|
||||
case 'fontawesome5':
|
||||
return (
|
||||
<FontAwesome5Icon
|
||||
name={name}
|
||||
style={style}
|
||||
size={size}
|
||||
/>
|
||||
);
|
||||
case 'foundation':
|
||||
return (
|
||||
<FoundationIcon
|
||||
|
||||
@@ -58,6 +58,7 @@ export default class ChannelInfo extends PureComponent {
|
||||
canManageUsers: PropTypes.bool.isRequired,
|
||||
canEditChannel: PropTypes.bool.isRequired,
|
||||
ignoreChannelMentions: PropTypes.bool.isRequired,
|
||||
isBot: PropTypes.bool.isRequired,
|
||||
};
|
||||
|
||||
static contextTypes = {
|
||||
@@ -510,6 +511,7 @@ export default class ChannelInfo extends PureComponent {
|
||||
navigator,
|
||||
status,
|
||||
theme,
|
||||
isBot,
|
||||
} = this.props;
|
||||
|
||||
const style = getStyleSheet(theme);
|
||||
@@ -548,6 +550,7 @@ export default class ChannelInfo extends PureComponent {
|
||||
theme={theme}
|
||||
type={currentChannel.type}
|
||||
isArchived={currentChannel.delete_at !== 0}
|
||||
isBot={isBot}
|
||||
/>
|
||||
}
|
||||
<View style={style.rowsContainer}>
|
||||
|
||||
@@ -29,6 +29,7 @@ export default class ChannelInfoHeader extends React.PureComponent {
|
||||
theme: PropTypes.object.isRequired,
|
||||
type: PropTypes.string.isRequired,
|
||||
isArchived: PropTypes.bool.isRequired,
|
||||
isBot: PropTypes.bool.isRequired,
|
||||
};
|
||||
|
||||
render() {
|
||||
@@ -45,6 +46,7 @@ export default class ChannelInfoHeader extends React.PureComponent {
|
||||
theme,
|
||||
type,
|
||||
isArchived,
|
||||
isBot,
|
||||
} = this.props;
|
||||
|
||||
const style = getStyleSheet(theme);
|
||||
@@ -62,6 +64,7 @@ export default class ChannelInfoHeader extends React.PureComponent {
|
||||
theme={theme}
|
||||
type={type}
|
||||
isArchived={isArchived}
|
||||
isBot={isBot}
|
||||
/>
|
||||
<Text
|
||||
ellipsizeMode='tail'
|
||||
|
||||
@@ -60,9 +60,14 @@ function mapStateToProps(state) {
|
||||
const currentUser = getUser(state, currentUserId);
|
||||
|
||||
let status;
|
||||
let isBot = false;
|
||||
if (currentChannel.type === General.DM_CHANNEL) {
|
||||
const teammateId = getUserIdFromChannelName(currentUserId, currentChannel.name);
|
||||
const teammate = getUser(state, teammateId);
|
||||
status = getStatusForUserId(state, teammateId);
|
||||
if (teammate && teammate.is_bot) {
|
||||
isBot = true;
|
||||
}
|
||||
}
|
||||
|
||||
const isAdmin = checkIsAdmin(roles);
|
||||
@@ -88,6 +93,7 @@ function mapStateToProps(state) {
|
||||
status,
|
||||
theme: getTheme(state),
|
||||
canManageUsers,
|
||||
isBot,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -226,6 +226,7 @@ export default class EditProfile extends PureComponent {
|
||||
Authorization: `Bearer ${Client4.getToken()}`,
|
||||
'X-Requested-With': 'XMLHttpRequest',
|
||||
'Content-Type': 'multipart/form-data',
|
||||
'X-CSRF-Token': Client4.csrf,
|
||||
};
|
||||
|
||||
const fileInfo = {
|
||||
|
||||
@@ -87,6 +87,7 @@ function mapStateToProps(state, ownProps) {
|
||||
canCopyPermalink = false;
|
||||
canEdit = false;
|
||||
canPin = false;
|
||||
canFlag = false;
|
||||
}
|
||||
if (ownProps.hasBeenDeleted) {
|
||||
canDelete = false;
|
||||
|
||||
@@ -32,6 +32,57 @@ exports[`user_profile should match snapshot 1`] = `
|
||||
statusSize={40}
|
||||
userId="4hzdnk6mg7gepe7yze6m3domnc"
|
||||
/>
|
||||
<View
|
||||
style={
|
||||
Object {
|
||||
"flexDirection": "row",
|
||||
"marginTop": 15,
|
||||
}
|
||||
}
|
||||
>
|
||||
<Text
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 17,
|
||||
"fontWeight": "600",
|
||||
}
|
||||
}
|
||||
>
|
||||
fred
|
||||
</Text>
|
||||
<BotTag
|
||||
show={false}
|
||||
theme={
|
||||
Object {
|
||||
"awayIndicator": "#ffbc42",
|
||||
"buttonBg": "#166de0",
|
||||
"buttonColor": "#ffffff",
|
||||
"centerChannelBg": "#ffffff",
|
||||
"centerChannelColor": "#3d3c40",
|
||||
"codeTheme": "github",
|
||||
"dndIndicator": "#f74343",
|
||||
"errorTextColor": "#fd5960",
|
||||
"linkColor": "#2389d7",
|
||||
"mentionBj": "#ffffff",
|
||||
"mentionColor": "#145dbf",
|
||||
"mentionHighlightBg": "#ffe577",
|
||||
"mentionHighlightLink": "#166de0",
|
||||
"newMessageSeparator": "#ff8800",
|
||||
"onlineIndicator": "#06d6a0",
|
||||
"sidebarBg": "#145dbf",
|
||||
"sidebarHeaderBg": "#1153ab",
|
||||
"sidebarHeaderTextColor": "#ffffff",
|
||||
"sidebarText": "#ffffff",
|
||||
"sidebarTextActiveBorder": "#579eff",
|
||||
"sidebarTextActiveColor": "#ffffff",
|
||||
"sidebarTextHoverBg": "#4578bf",
|
||||
"sidebarUnreadText": "#ffffff",
|
||||
"type": "Mattermost",
|
||||
}
|
||||
}
|
||||
/>
|
||||
</View>
|
||||
<Text
|
||||
style={
|
||||
Object {
|
||||
@@ -41,7 +92,7 @@ exports[`user_profile should match snapshot 1`] = `
|
||||
}
|
||||
}
|
||||
>
|
||||
@undefined
|
||||
@fred
|
||||
</Text>
|
||||
</View>
|
||||
<View
|
||||
@@ -52,6 +103,31 @@ exports[`user_profile should match snapshot 1`] = `
|
||||
}
|
||||
}
|
||||
>
|
||||
<View>
|
||||
<Text
|
||||
style={
|
||||
Object {
|
||||
"color": undefined,
|
||||
"fontSize": 13,
|
||||
"fontWeight": "600",
|
||||
"marginBottom": 10,
|
||||
"marginTop": 25,
|
||||
}
|
||||
}
|
||||
>
|
||||
USERNAME
|
||||
</Text>
|
||||
<Text
|
||||
style={
|
||||
Object {
|
||||
"color": "#3d3c40",
|
||||
"fontSize": 15,
|
||||
}
|
||||
}
|
||||
>
|
||||
fred
|
||||
</Text>
|
||||
</View>
|
||||
<View>
|
||||
<Text
|
||||
style={
|
||||
|
||||
@@ -10,6 +10,8 @@ import {makeDirectChannel} from 'app/actions/views/more_dms';
|
||||
import {getTeammateNameDisplaySetting, getTheme, getBool} from 'mattermost-redux/selectors/entities/preferences';
|
||||
import {getConfig} from 'mattermost-redux/selectors/entities/general';
|
||||
import Preferences from 'mattermost-redux/constants/preferences';
|
||||
import {loadBot} from 'mattermost-redux/actions/bots';
|
||||
import {getBotAccounts} from 'mattermost-redux/selectors/entities/bots';
|
||||
|
||||
import {isTimezoneEnabled} from 'app/utils/timezone';
|
||||
|
||||
@@ -26,6 +28,7 @@ function mapStateToProps(state, ownProps) {
|
||||
createChannelRequest,
|
||||
currentDisplayName: state.views.channel.displayName,
|
||||
user: state.entities.users.profiles[ownProps.userId],
|
||||
bot: getBotAccounts(state)[ownProps.userId],
|
||||
teammateNameDisplay: getTeammateNameDisplaySetting(state),
|
||||
enableTimezone,
|
||||
militaryTime,
|
||||
@@ -38,6 +41,7 @@ function mapDispatchToProps(dispatch) {
|
||||
actions: bindActionCreators({
|
||||
makeDirectChannel,
|
||||
setChannelDisplayName,
|
||||
loadBot,
|
||||
}, dispatch),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import ProfilePicture from 'app/components/profile_picture';
|
||||
import FormattedText from 'app/components/formatted_text';
|
||||
import FormattedTime from 'app/components/formatted_time';
|
||||
import StatusBar from 'app/components/status_bar';
|
||||
import BotTag from 'app/components/bot_tag';
|
||||
import {alertErrorWithFallback} from 'app/utils/general';
|
||||
import {changeOpacity, makeStyleSheetFromTheme, setNavigatorStyles} from 'app/utils/theme';
|
||||
import {t} from 'app/utils/i18n';
|
||||
@@ -30,6 +31,7 @@ export default class UserProfile extends PureComponent {
|
||||
actions: PropTypes.shape({
|
||||
makeDirectChannel: PropTypes.func.isRequired,
|
||||
setChannelDisplayName: PropTypes.func.isRequired,
|
||||
loadBot: PropTypes.func.isRequired,
|
||||
}).isRequired,
|
||||
config: PropTypes.object.isRequired,
|
||||
currentDisplayName: PropTypes.string,
|
||||
@@ -37,6 +39,7 @@ export default class UserProfile extends PureComponent {
|
||||
teammateNameDisplay: PropTypes.string,
|
||||
theme: PropTypes.object.isRequired,
|
||||
user: PropTypes.object.isRequired,
|
||||
bot: PropTypes.object,
|
||||
militaryTime: PropTypes.bool.isRequired,
|
||||
enableTimezone: PropTypes.bool.isRequired,
|
||||
};
|
||||
@@ -51,6 +54,12 @@ export default class UserProfile extends PureComponent {
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
if (this.props.user && this.props.user.is_bot) {
|
||||
this.props.actions.loadBot(this.props.user.id);
|
||||
}
|
||||
}
|
||||
|
||||
close = () => {
|
||||
const {navigator, theme} = this.props;
|
||||
|
||||
@@ -78,7 +87,17 @@ export default class UserProfile extends PureComponent {
|
||||
const displayName = displayUsername(user, teammateNameDisplay);
|
||||
|
||||
if (displayName) {
|
||||
return <Text style={style.displayName}>{displayName}</Text>;
|
||||
return (
|
||||
<View style={style.indicatorContainer}>
|
||||
<Text style={style.displayName}>
|
||||
{displayName}
|
||||
</Text>
|
||||
<BotTag
|
||||
show={Boolean(user.is_bot)}
|
||||
theme={theme}
|
||||
/>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return null;
|
||||
@@ -198,8 +217,34 @@ export default class UserProfile extends PureComponent {
|
||||
return additionalOptions;
|
||||
};
|
||||
|
||||
renderDetailsBlock = (style) => {
|
||||
if (this.props.user.is_bot) {
|
||||
if (!this.props.bot) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<View style={style.content}>
|
||||
<View>
|
||||
<Text style={style.header}>{'DESCRIPTION'}</Text>
|
||||
<Text style={style.text}>{this.props.bot.description || ''}</Text>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<View style={style.content}>
|
||||
{this.props.enableTimezone && this.buildTimezoneBlock()}
|
||||
{this.buildDisplayBlock('username')}
|
||||
{this.props.config.ShowEmailAddress === 'true' && this.buildDisplayBlock('email')}
|
||||
{this.buildDisplayBlock('nickname')}
|
||||
{this.buildDisplayBlock('position')}
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
const {config, theme, user, enableTimezone} = this.props;
|
||||
const {theme, user} = this.props;
|
||||
const style = createStyleSheet(theme);
|
||||
|
||||
if (!user) {
|
||||
@@ -222,13 +267,7 @@ export default class UserProfile extends PureComponent {
|
||||
{this.getDisplayName()}
|
||||
<Text style={style.username}>{`@${user.username}`}</Text>
|
||||
</View>
|
||||
<View style={style.content}>
|
||||
{enableTimezone && this.buildTimezoneBlock()}
|
||||
{this.buildDisplayBlock('username')}
|
||||
{config.ShowEmailAddress === 'true' && this.buildDisplayBlock('email')}
|
||||
{this.buildDisplayBlock('nickname')}
|
||||
{this.buildDisplayBlock('position')}
|
||||
</View>
|
||||
{this.renderDetailsBlock(style)}
|
||||
<UserProfileRow
|
||||
action={this.sendMessage}
|
||||
defaultMessage='Send Message'
|
||||
@@ -254,7 +293,6 @@ const createStyleSheet = makeStyleSheetFromTheme((theme) => {
|
||||
marginHorizontal: 15,
|
||||
},
|
||||
displayName: {
|
||||
marginTop: 15,
|
||||
color: theme.centerChannelColor,
|
||||
fontSize: 17,
|
||||
fontWeight: '600',
|
||||
@@ -284,6 +322,10 @@ const createStyleSheet = makeStyleSheetFromTheme((theme) => {
|
||||
color: theme.centerChannelColor,
|
||||
fontSize: 15,
|
||||
},
|
||||
indicatorContainer: {
|
||||
marginTop: 15,
|
||||
flexDirection: 'row',
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import {shallow} from 'enzyme';
|
||||
import Preferences from 'mattermost-redux/constants/preferences';
|
||||
|
||||
import UserProfile from './user_profile.js';
|
||||
import BotTag from 'app/components/bot_tag';
|
||||
|
||||
jest.mock('react-intl');
|
||||
jest.mock('app/utils/theme', () => {
|
||||
@@ -20,6 +21,7 @@ describe('user_profile', () => {
|
||||
const actions = {
|
||||
setChannelDisplayName: jest.fn(),
|
||||
makeDirectChannel: jest.fn(),
|
||||
loadBot: jest.fn(),
|
||||
};
|
||||
const baseProps = {
|
||||
actions,
|
||||
@@ -33,21 +35,53 @@ describe('user_profile', () => {
|
||||
teams: [],
|
||||
theme: Preferences.THEMES.default,
|
||||
enableTimezone: false,
|
||||
user: {
|
||||
militaryTime: false,
|
||||
};
|
||||
|
||||
const user = {
|
||||
email: 'test@test.com',
|
||||
first_name: 'test',
|
||||
id: '4hzdnk6mg7gepe7yze6m3domnc',
|
||||
last_name: 'fake',
|
||||
nickname: 'nick',
|
||||
username: 'fred',
|
||||
is_bot: false,
|
||||
};
|
||||
|
||||
test('should match snapshot', async () => {
|
||||
const wrapper = shallow(
|
||||
<UserProfile
|
||||
{...baseProps}
|
||||
user={user}
|
||||
/>,
|
||||
{context: {intl: {formatMessage: jest.fn()}}},
|
||||
);
|
||||
expect(wrapper.getElement()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('should contain bot tag', async () => {
|
||||
const botUser = {
|
||||
email: 'test@test.com',
|
||||
first_name: 'test',
|
||||
id: '4hzdnk6mg7gepe7yze6m3domnc',
|
||||
last_name: 'fake',
|
||||
nickname: 'nick',
|
||||
},
|
||||
militaryTime: false,
|
||||
};
|
||||
username: 'fred',
|
||||
is_bot: true,
|
||||
};
|
||||
|
||||
test('should match snapshot', async () => {
|
||||
const wrapper = shallow(
|
||||
<UserProfile {...baseProps}/>,
|
||||
<UserProfile
|
||||
{...baseProps}
|
||||
user={botUser}
|
||||
/>,
|
||||
{context: {intl: {formatMessage: jest.fn()}}},
|
||||
);
|
||||
expect(wrapper.getElement()).toMatchSnapshot();
|
||||
expect(wrapper.containsMatchingElement(
|
||||
<BotTag
|
||||
show={true}
|
||||
theme={baseProps.theme}
|
||||
/>
|
||||
)).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{firstUser} und {secondUser} wurden durch {actor} **zum Team hinzugefügt**.",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} und {lastUser} **sind dem Kanal beigetreten**.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **ist dem Kanal beigetreten**.",
|
||||
"combined_system_message.joined_channel.one_you": "**sind dem Kanal beigetreten**.",
|
||||
"combined_system_message.joined_channel.one_you": "Sie **sind dem Kanal beigetreten**.",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} und {secondUser} **sind dem Kanal beigetreten**.",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} und {lastUser} **sind dem Team beigetreten**.",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **ist dem Team beigetreten**.",
|
||||
"combined_system_message.joined_team.one_you": "**ist dem Team beigetreten**.",
|
||||
"combined_system_message.joined_team.one_you": "Sie **sind dem Team beigetreten**.",
|
||||
"combined_system_message.joined_team.two": "{firstUser} und {secondUser} **sind dem Team beigetreten**.",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} und {lastUser} **haben den Kanal verlassen**.",
|
||||
"combined_system_message.left_channel.one": "{firstUser} **hat den Kanal verlassen**.",
|
||||
"combined_system_message.left_channel.one_you": "**hat den Kanal verlassen**.",
|
||||
"combined_system_message.left_channel.one_you": "Sie **haben den Kanal verlassen**.",
|
||||
"combined_system_message.left_channel.two": "{firstUser} und {secondUser} **haben den Kanal verlassen**.",
|
||||
"combined_system_message.left_team.many_expanded": "{users} und {lastUser} **haben das Team verlassen**.",
|
||||
"combined_system_message.left_team.one": "{firstUser} **hat das Team verlassen**.",
|
||||
"combined_system_message.left_team.one_you": "**hat das Team verlassen**.",
|
||||
"combined_system_message.left_team.one_you": "Sie **haben das Team verlassen**.",
|
||||
"combined_system_message.left_team.two": "{firstUser} und {secondUser} **haben das Team verlassen**.",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} und {lastUser} wurden **aus dem Kanal entfernt**.",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} wurde **aus dem Kanal entfernt**.",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "Sie",
|
||||
"create_comment.addComment": "Kommentar hinzufügen...",
|
||||
"create_post.deactivated": "Sie betrachten einen archivierten Kanal mit einem deaktivierten Benutzer.",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "In {channelDisplayName} schreiben",
|
||||
"edit_post.editPost": "Nachricht bearbeiten...",
|
||||
"edit_post.save": "Speichern",
|
||||
"error.team_not_found.title": "Team nicht gefunden",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Text kopieren",
|
||||
"mobile.post_info.flag": "Markieren",
|
||||
"mobile.post_info.pin": "An Kanal anheften",
|
||||
"mobile.post_info.reply": "Antworten",
|
||||
"mobile.post_info.unflag": "Markierung entfernen",
|
||||
"mobile.post_info.unpin": "Vom Kanal abheften",
|
||||
"mobile.post_pre_header.flagged": "Markiert",
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{firstUser} y {secondUser} **agregados al equipo** por {actor}.",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} and {lastUser} **se unieron al canal**.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **se unió al canal**.",
|
||||
"combined_system_message.joined_channel.one_you": "**unieron al canal**.",
|
||||
"combined_system_message.joined_channel.one_you": "Tú **te uniste al canal**.",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} y {secondUser} **se unieron al canal**.",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} y {lastUser} **se unieron al equipo**.",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **se unió al equipo**.",
|
||||
"combined_system_message.joined_team.one_you": "**unieron al equipo**.",
|
||||
"combined_system_message.joined_team.one_you": "Tú **te uniste al equipo**.",
|
||||
"combined_system_message.joined_team.two": "{firstUser} y {secondUser} **se unieron al equipo**.",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} y {lastUser} **abandonaron el canal**.",
|
||||
"combined_system_message.left_channel.one": "{firstUser} **abandonó el canal**.",
|
||||
"combined_system_message.left_channel.one_you": "**abandonaron el canal**.",
|
||||
"combined_system_message.left_channel.one_you": "Tú **abandonaste el canal**.",
|
||||
"combined_system_message.left_channel.two": "{firstUser} y {secondUser} **abandonaron el canal**.",
|
||||
"combined_system_message.left_team.many_expanded": "{users} y {lastUser} **abandonaron el equipo**.",
|
||||
"combined_system_message.left_team.one": "{firstUser} **abandonó el equipo**.",
|
||||
"combined_system_message.left_team.one_you": "**abandonó el equipo**.",
|
||||
"combined_system_message.left_team.one_you": "Tú **abandonaste el equipo**.",
|
||||
"combined_system_message.left_team.two": "{firstUser} y {secondUser} **abandonaron el equipo**.",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} y {lastUser} fueron **eliminados del canal**.",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} fue **eliminado del canal**.",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "Tu",
|
||||
"create_comment.addComment": "Agregar un comentario...",
|
||||
"create_post.deactivated": "Estás viendo un canal archivado con un usuario desactivado.",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "Escribir a {channelDisplayName}",
|
||||
"edit_post.editPost": "Editar el mensaje...",
|
||||
"edit_post.save": "Guardar",
|
||||
"error.team_not_found.title": "Equipo no encontrado",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Copiar Texto",
|
||||
"mobile.post_info.flag": "Marcar",
|
||||
"mobile.post_info.pin": "Anclar al Canal",
|
||||
"mobile.post_info.reply": "Responder",
|
||||
"mobile.post_info.unflag": "Desmarcar",
|
||||
"mobile.post_info.unpin": "Desprender del Canal",
|
||||
"mobile.post_pre_header.flagged": "Marcado",
|
||||
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Copier le texte",
|
||||
"mobile.post_info.flag": "Marquer avec un indicateur",
|
||||
"mobile.post_info.pin": "Épingler au canal",
|
||||
"mobile.post_info.reply": "Répondre",
|
||||
"mobile.post_info.unflag": "Supprimer l'indicateur",
|
||||
"mobile.post_info.unpin": "Désépingler du canal",
|
||||
"mobile.post_pre_header.flagged": "Marqué d'un indicateur",
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{firstUser} e {secondUser} **aggiunti al gruppo** da {actor}.",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} e {lastUser} **aggiunti al canale**.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **aggiunto al canale**.",
|
||||
"combined_system_message.joined_channel.one_you": "**si è unito al canale**.",
|
||||
"combined_system_message.joined_channel.one_you": "**Ti sei è unito al canale**.",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} e {secondUser} **aggiunto al canale**.",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} e {lastUser} **aggiunti al gruppo**.",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **aggiunto al gruppo**.",
|
||||
"combined_system_message.joined_team.one_you": "**si è unito al gruppo**.",
|
||||
"combined_system_message.joined_team.one_you": "**Ti sei è unito al gruppo**.",
|
||||
"combined_system_message.joined_team.two": "{firstUser} e {secondUser} **aggiunto al gruppo**.",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} e {lastUser} hanno **abbandonato il canale**.",
|
||||
"combined_system_message.left_channel.one": "{firstUser} ha **abbandonato il canale**.",
|
||||
"combined_system_message.left_channel.one_you": "**ha abbandonato il canale**.",
|
||||
"combined_system_message.left_channel.one_you": "**Hai abbandonato il canale**.",
|
||||
"combined_system_message.left_channel.two": "{firstUser} e {secondUser} hanno **abbandonato il canale**.",
|
||||
"combined_system_message.left_team.many_expanded": "{users} e {lastUser} hanno **abbandonato il canale**.",
|
||||
"combined_system_message.left_team.one": "{firstUser} ha **abbandonato il gruppo**.",
|
||||
"combined_system_message.left_team.one_you": "**ha abbandonato il gruppo**.",
|
||||
"combined_system_message.left_team.one_you": "**Hai abbandonato il gruppo**.",
|
||||
"combined_system_message.left_team.two": "{firstUser} e {secondUser} hanno **abbandonato il gruppo**.",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} e {lastUser} sono stati **rimossi dal canale**.",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} è stato **rimosso dal canale**.",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "Tu",
|
||||
"create_comment.addComment": "Aggiungi un commento...",
|
||||
"create_post.deactivated": "Stai visualizzando un canale archiviato con un utente disattivato.",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "Scrive su {channelDisplayName}",
|
||||
"edit_post.editPost": "Modifica post...",
|
||||
"edit_post.save": "Salva",
|
||||
"error.team_not_found.title": "Gruppo Non Trovato",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Copia Testo",
|
||||
"mobile.post_info.flag": "Contrassegna",
|
||||
"mobile.post_info.pin": "Blocca al canale",
|
||||
"mobile.post_info.reply": "Rispondi",
|
||||
"mobile.post_info.unflag": "Togli contrassegno",
|
||||
"mobile.post_info.unpin": "Sblocca dal canale",
|
||||
"mobile.post_pre_header.flagged": "Contrassegnato",
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "あなた",
|
||||
"create_comment.addComment": "コメントを追加する...",
|
||||
"create_post.deactivated": "無効化されたユーザーのいるアーカイブされたチャンネルを見ています。",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "{channelDisplayName}へ投稿する",
|
||||
"edit_post.editPost": "投稿を編集する...",
|
||||
"edit_post.save": "保存する",
|
||||
"error.team_not_found.title": "チームが見つかりません",
|
||||
@@ -145,8 +145,8 @@
|
||||
"mobile.android.photos_permission_denied_title": "フォトライブラリーへのアクセスを要求しています",
|
||||
"mobile.android.storage_permission_denied_description": "Androidデバイスから画像をアップロードするには権限設定を変更してください。",
|
||||
"mobile.android.storage_permission_denied_title": "ファイルストレージへのアクセスを要求しています",
|
||||
"mobile.android.videos_permission_denied_description": "ライブラリからビデオをアップロードするには権限設定を変更してください。",
|
||||
"mobile.android.videos_permission_denied_title": "ビデオライブラリーへのアクセスを要求しています",
|
||||
"mobile.android.videos_permission_denied_description": "ライブラリから動画をアップロードするには権限設定を変更してください。",
|
||||
"mobile.android.videos_permission_denied_title": "動画ライブラリーへのアクセスを要求しています",
|
||||
"mobile.announcement_banner.title": "アナウンス",
|
||||
"mobile.authentication_error.message": "Mattermostでエラーが発生しました。新しいセッションを開始するため再度認証してください。",
|
||||
"mobile.authentication_error.title": "認証エラー",
|
||||
@@ -251,7 +251,7 @@
|
||||
"mobile.file_upload.camera_video": "動画を撮る",
|
||||
"mobile.file_upload.library": "フォトライブラリー",
|
||||
"mobile.file_upload.max_warning": "最大5ファイルまでアップロードできます。",
|
||||
"mobile.file_upload.video": "ビデオライブラリー",
|
||||
"mobile.file_upload.video": "動画ライブラリー",
|
||||
"mobile.flagged_posts.empty_description": "フラグはメッセージに追跡のためのマークを付ける一つの方法です。あなたのフラグは個人のもので、他のユーザーからは見えません。",
|
||||
"mobile.flagged_posts.empty_title": "フラグの立てられた投稿はありません",
|
||||
"mobile.help.title": "ヘルプ",
|
||||
@@ -260,7 +260,7 @@
|
||||
"mobile.intro_messages.default_message": "ここはチームメイトが利用登録した際に最初に見るチャンネルです - みんなが知るべき情報を投稿してください。",
|
||||
"mobile.intro_messages.default_welcome": "{name}へようこそ!",
|
||||
"mobile.intro_messages.DM": "{teammate}とのダイレクトメッセージの履歴の最初です。ダイレクトメッセージとそこで共有されているファイルは、この領域の外のユーザーからは見ることができません。",
|
||||
"mobile.ios.photos_permission_denied_description": "写真やビデオを保存するために権限設定を変更してください。",
|
||||
"mobile.ios.photos_permission_denied_description": "写真や動画を保存するために権限設定を変更してください。",
|
||||
"mobile.join_channel.error": "チャンネル {displayName} に参加できませんでした。接続を確認し、もう一度試してみてください。",
|
||||
"mobile.loading_channels": "チャンネルをロードしています...",
|
||||
"mobile.loading_members": "メンバーをロードしています...",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "テキストをコピーする",
|
||||
"mobile.post_info.flag": "フラグ",
|
||||
"mobile.post_info.pin": "チャンネルにピン留めする",
|
||||
"mobile.post_info.reply": "返信する",
|
||||
"mobile.post_info.unflag": "フラグを消す",
|
||||
"mobile.post_info.unpin": "チャンネルへのピン留めをやめる",
|
||||
"mobile.post_pre_header.flagged": "フラグ済み",
|
||||
@@ -438,7 +439,7 @@
|
||||
"mobile.video_playback.failed_title": "動画の再生に失敗しました",
|
||||
"mobile.video.save_error_message": "動画ファイルを保存するには、まずダウンロードする必要があります。",
|
||||
"mobile.video.save_error_title": "動画保存エラー",
|
||||
"mobile.youtube_playback_error.description": "YouTubeビデオを再生する際にエラーが発生しました。\n詳細: {details}",
|
||||
"mobile.youtube_playback_error.description": "YouTube動画を再生する際にエラーが発生しました。\n詳細: {details}",
|
||||
"mobile.youtube_playback_error.title": "YouTube再生エラー",
|
||||
"modal.manual_status.auto_responder.message_": "あなたのステータスを \"{status}\" に変更し、自動返信を無効化してもよろしいですか?",
|
||||
"modal.manual_status.auto_responder.message_away": "あなたのステータスを \"離席中\" に変更し、自動返信を無効化してもよろしいですか?",
|
||||
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Copy Text",
|
||||
"mobile.post_info.flag": "중요 지정",
|
||||
"mobile.post_info.pin": "공지하기",
|
||||
"mobile.post_info.reply": "답글",
|
||||
"mobile.post_info.unflag": "중요 메시지 해제",
|
||||
"mobile.post_info.unpin": "공지 해제하기",
|
||||
"mobile.post_pre_header.flagged": "Flagged",
|
||||
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Copy Text",
|
||||
"mobile.post_info.flag": "Markeer",
|
||||
"mobile.post_info.pin": "Pin to Channel",
|
||||
"mobile.post_info.reply": "Antwoord",
|
||||
"mobile.post_info.unflag": "Demarkeer",
|
||||
"mobile.post_info.unpin": "Unpin from Channel",
|
||||
"mobile.post_pre_header.flagged": "Flagged",
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{firstUser} i {secondUser} zostali **dodani do zespołu** przez {actor}.",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} i {lastUser} **dołączyli do kanału**.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **dołączył do kanału**.",
|
||||
"combined_system_message.joined_channel.one_you": "**dołączył do kanału**.",
|
||||
"combined_system_message.joined_channel.one_you": "Ty **dołączyłeś do kanału**.",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} i {secondUser} **dołączyli do kanału**.",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} i {lastUser} **dołączyli do zespołu**.",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **dołączył do zespołu**.",
|
||||
"combined_system_message.joined_team.one_you": "**dołączył do zespołu**.",
|
||||
"combined_system_message.joined_team.one_you": "Ty **dołączyłeś do zespołu**.",
|
||||
"combined_system_message.joined_team.two": "{firstUser} i {secondUser} **dołączyli do zespołu**.",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} i {lastUser} **opuścili kanał**.",
|
||||
"combined_system_message.left_channel.one": "{firstUser} **opuścił kanał**.",
|
||||
"combined_system_message.left_channel.one_you": "**opuścił kanał**.",
|
||||
"combined_system_message.left_channel.one_you": "Ty **opuściłeś kanał**.",
|
||||
"combined_system_message.left_channel.two": "{firstUser} i {secondUser} **opuścili kanał**.",
|
||||
"combined_system_message.left_team.many_expanded": "{users} i {lastUser} **opuścili zespół**.",
|
||||
"combined_system_message.left_team.one": "{firstUser} **opuścił zespół**.",
|
||||
"combined_system_message.left_team.one_you": "**opuścił zespół**.",
|
||||
"combined_system_message.left_team.one_you": "Ty **opuściłeś zespół**.",
|
||||
"combined_system_message.left_team.two": "{firstUser} i {secondUser} **opuścili zespół**.",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} i {lastUser} zostali **usunięci z kanału**.",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} został **usunięty z kanału**.",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "Ty",
|
||||
"create_comment.addComment": "Dodaj komentarz...",
|
||||
"create_post.deactivated": "Przeglądasz zarchiwizowany kanał z deaktywowanym użytkownikiem.",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "Napisz na {channelDisplayName}",
|
||||
"edit_post.editPost": "Edytuj post...",
|
||||
"edit_post.save": "Zapisz",
|
||||
"error.team_not_found.title": "Zespół Nie Znaleziony",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Kopiuj Tekst",
|
||||
"mobile.post_info.flag": "Oflaguj",
|
||||
"mobile.post_info.pin": "Przypnij do kanału",
|
||||
"mobile.post_info.reply": "Odpowiedz",
|
||||
"mobile.post_info.unflag": "Usuń flagę",
|
||||
"mobile.post_info.unpin": "Odepnij od kanału",
|
||||
"mobile.post_pre_header.flagged": "Oflagowany",
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{firstUser} e {secondUser} **adicionado a equipe** por {actor}.",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} e {lastUser} **entraram no canal**.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **entrou no canal**.",
|
||||
"combined_system_message.joined_channel.one_you": "**entrou no canal**.",
|
||||
"combined_system_message.joined_channel.one_you": "Você **entrou no canal**.",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} e {secondUser} **entraram no canal**.",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} e {lastUser} **entraram na equipe**.",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **entraram na equipe**.",
|
||||
"combined_system_message.joined_team.one_you": "**entrou na equipe**.",
|
||||
"combined_system_message.joined_team.one_you": "Você **entrou na equipe**.",
|
||||
"combined_system_message.joined_team.two": "{firstUser} e {secondUser} **entraram na equipe**.",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} e {lastUser} **deixaram o canal**.",
|
||||
"combined_system_message.left_channel.one": "{firstUser} **deixou o canal**.",
|
||||
"combined_system_message.left_channel.one_you": "**deixou o canal**.",
|
||||
"combined_system_message.left_channel.one_you": "Você **deixou o canal**.",
|
||||
"combined_system_message.left_channel.two": "{firstUser} e {secondUser} **deixaram o canal**.",
|
||||
"combined_system_message.left_team.many_expanded": "{users} e {lastUser} **deixaram a equipe**.",
|
||||
"combined_system_message.left_team.one": "{firstUser} **deixou a equipe**.",
|
||||
"combined_system_message.left_team.one_you": "**deixou a equipe**.",
|
||||
"combined_system_message.left_team.one_you": "Você **deixou a equipe**.",
|
||||
"combined_system_message.left_team.two": "{firstUser} e {secondUser} **deixaram a equipe**.",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} e {lastUser} foram **removidos do canal**.",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} foi **removido do canal**.",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "Você",
|
||||
"create_comment.addComment": "Adicionar um comentário...",
|
||||
"create_post.deactivated": "Você está vendo um canal arquivado com um usuário inativo.",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "Escrever para {channelDisplayName}",
|
||||
"edit_post.editPost": "Editar o post...",
|
||||
"edit_post.save": "Salvar",
|
||||
"error.team_not_found.title": "Equipe Não Encontrado",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Copiar Texto",
|
||||
"mobile.post_info.flag": "Marcar",
|
||||
"mobile.post_info.pin": "Fixar no Canal",
|
||||
"mobile.post_info.reply": "Responder",
|
||||
"mobile.post_info.unflag": "Desmarcar",
|
||||
"mobile.post_info.unpin": "Desafixar do Canal",
|
||||
"mobile.post_pre_header.flagged": "Marcado",
|
||||
|
||||
@@ -44,20 +44,20 @@
|
||||
"combined_system_message.added_to_team.one_you": "Ai fost ** adăugat la echipa ** de {actor}.",
|
||||
"combined_system_message.added_to_team.two": "{firstUser} și {secondUser} ** au adăugat echipei ** de către {actor}.",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} și {lastUser} ** s-au alăturat canalului **.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} ** sa alăturat canalului **.",
|
||||
"combined_system_message.joined_channel.one_you": "**s-au alăturat canalului**.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **s-a alăturat canalului**.",
|
||||
"combined_system_message.joined_channel.one_you": "Tu **te-ai alăturat canalului**.",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} și {secondUser} ** s-au alăturat canalului **.",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} și {lastUser} **s-au alăturat echipei**.",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **sa alăturat echipei**.",
|
||||
"combined_system_message.joined_team.one_you": "**sa alăturat echipei**.",
|
||||
"combined_system_message.joined_team.one_you": "Tu **te-ai alăturat echipei**.",
|
||||
"combined_system_message.joined_team.two": "{firstUser} și {secondUser} **s-au alăturat echipei**.",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} și {lastUser} ** au părăsit canalul **.",
|
||||
"combined_system_message.left_channel.one": "{firstUser} ** a părăsit canalul **.",
|
||||
"combined_system_message.left_channel.one_you": "**a părăsit canalul**.",
|
||||
"combined_system_message.left_channel.one_you": "Tu **ai părăsit canalul**.",
|
||||
"combined_system_message.left_channel.two": "{firstUser} și {secondUser} ** au părăsit canalul **.",
|
||||
"combined_system_message.left_team.many_expanded": "{users} și {lastUser} ** au părăsit echipa **.",
|
||||
"combined_system_message.left_team.one": "{firstUser} ** a părăsit echipa **.",
|
||||
"combined_system_message.left_team.one_you": "**a părăsit echipa**.",
|
||||
"combined_system_message.left_team.one_you": "Tu **ai părăsit echipa**.",
|
||||
"combined_system_message.left_team.two": "{firstUser} și {secondUser} ** au părăsit echipa **.",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} și {lastUser} au fost ** eliminate din canal **.",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} a fost ** eliminat din canal **.",
|
||||
@@ -70,8 +70,8 @@
|
||||
"combined_system_message.you": "Tu",
|
||||
"create_comment.addComment": "Adauga un comentariu...",
|
||||
"create_post.deactivated": "Vizualizați un canal arhivat cu un utilizator dezactivat.",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"edit_post.editPost": "Editați postarea ...",
|
||||
"create_post.write": "Scrieți la {channelDisplayName}",
|
||||
"edit_post.editPost": "Editați postarea...",
|
||||
"edit_post.save": "Salvați",
|
||||
"error.team_not_found.title": "Echipa nu a fost găsită",
|
||||
"file_attachment.download": "Descarca",
|
||||
@@ -262,10 +262,10 @@
|
||||
"mobile.intro_messages.DM": "Acesta este începutul istoricului mesajului dvs. direct cu {teammate}. Mesajele directe și fișierele partajate aici nu sunt afișate persoanelor din afara acestei zone.",
|
||||
"mobile.ios.photos_permission_denied_description": "Pentru a salva imagini și videoclipuri în bibliotecă, modificați setările de permisiune.",
|
||||
"mobile.join_channel.error": "Nu am putut să ne alăturăm canalului {displayName}. Verificați conexiunea dvs. și încercați din nou.",
|
||||
"mobile.loading_channels": "Se încarcă canalele ...",
|
||||
"mobile.loading_members": "Încărcarea membrilor ...",
|
||||
"mobile.loading_channels": "Se încarcă canalele...",
|
||||
"mobile.loading_members": "Încărcarea membrilor...",
|
||||
"mobile.loading_options": "Încărcare Opțiuni...",
|
||||
"mobile.loading_posts": "Se încarcă mesajele ...",
|
||||
"mobile.loading_posts": "Se încarcă mesajele...",
|
||||
"mobile.login_options.choose_title": "Alegeți metoda dvs. de conectare",
|
||||
"mobile.long_post_title": "{channelName} - Postați",
|
||||
"mobile.managed.blocked_by": "Blocat de {vendor}",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Copiază textul",
|
||||
"mobile.post_info.flag": "Steag",
|
||||
"mobile.post_info.pin": "Conectați la Canal",
|
||||
"mobile.post_info.reply": "Răspuns",
|
||||
"mobile.post_info.unflag": "Anulați semnalarea",
|
||||
"mobile.post_info.unpin": "Eliberați-vă din canal",
|
||||
"mobile.post_pre_header.flagged": "Marcat",
|
||||
@@ -368,17 +369,17 @@
|
||||
"mobile.reply_post.failed": "Mesajul nu a putut fi trimis.",
|
||||
"mobile.request.invalid_response": "A primit răspuns rău de la server.",
|
||||
"mobile.reset_status.alert_cancel": "Anulare",
|
||||
"mobile.reset_status.alert_ok": "OK",
|
||||
"mobile.reset_status.alert_ok": "Bun",
|
||||
"mobile.reset_status.title_ooo": "Dezactivați \"Afară din birou\"?",
|
||||
"mobile.retry_message": "Mesajele refăcute au eșuat. Trageți în sus pentru a încerca din nou.",
|
||||
"mobile.routes.channel_members.action": "Eliminați membrii",
|
||||
"mobile.routes.channel_members.action_message": "Trebuie să selectați cel puțin un membru pentru a fi eliminat din canal.",
|
||||
"mobile.routes.channel_members.action_message_confirm": "Sigur doriți să eliminați membrii selectați din canal?",
|
||||
"mobile.routes.channelInfo": "Info",
|
||||
"mobile.routes.channelInfo": "Informații",
|
||||
"mobile.routes.channelInfo.createdBy": "Creat de {creator} pe ",
|
||||
"mobile.routes.channelInfo.delete_channel": "Arhiva canalului",
|
||||
"mobile.routes.channelInfo.favorite": "Favorit",
|
||||
"mobile.routes.code": "Limbaj-{language}",
|
||||
"mobile.routes.code": "{language} Cod",
|
||||
"mobile.routes.code.noLanguage": "Cod",
|
||||
"mobile.routes.edit_profile": "Editati Profil",
|
||||
"mobile.routes.login": "Conectare",
|
||||
@@ -410,7 +411,7 @@
|
||||
"mobile.server_upgrade.button": "OK",
|
||||
"mobile.server_upgrade.description": "\nEste necesară o actualizare a serverului pentru a utiliza aplicația Mattermost. Contactați administratorul de sistem pentru detalii.\n",
|
||||
"mobile.server_upgrade.title": "Este necesară actualizarea serverului",
|
||||
"mobile.server_url.invalid_format": "Adresa URL trebuie să înceapă cu http: // sau https: //",
|
||||
"mobile.server_url.invalid_format": "Adresa URL trebuie să înceapă cu http:// sau https://",
|
||||
"mobile.session_expired": "Sesiune expirată: vă rugăm să vă autentificați pentru a continua să primiți notificări.",
|
||||
"mobile.set_status.away": "Plecat",
|
||||
"mobile.set_status.dnd": "Nu deranjaţi",
|
||||
@@ -447,8 +448,8 @@
|
||||
"modal.manual_status.auto_responder.message_online": "Doriți să vă schimbați statusul la \"Online\" și să dezactivați răspunsurile automate?",
|
||||
"more_channels.noMore": "Nu mai există canale care să se alăture",
|
||||
"more_channels.title": "Mai multe canale",
|
||||
"msg_typing.areTyping": "{users} și {last} introduc ...",
|
||||
"msg_typing.isTyping": "{user} introduce textul ...",
|
||||
"msg_typing.areTyping": "{users} și {last} scriu...",
|
||||
"msg_typing.isTyping": "{user} scrie...",
|
||||
"navbar_dropdown.logout": "Deconectare",
|
||||
"navbar.leave": "Părăsiți canalul",
|
||||
"password_form.title": "Resetare parolă",
|
||||
@@ -504,7 +505,7 @@
|
||||
"suggestion.mention.here": "Notifică pe toată lumea din canal și on-line",
|
||||
"suggestion.mention.members": "Am putut sa ma membrii canalului",
|
||||
"suggestion.mention.morechannels": "Alte canale",
|
||||
"suggestion.mention.nonmembers": "~[canal]",
|
||||
"suggestion.mention.nonmembers": "Nu este în canal",
|
||||
"suggestion.mention.special": "MENȚIUNI SPECIALE",
|
||||
"suggestion.search.direct": "Mesaje Directe",
|
||||
"suggestion.search.private": "Canale private",
|
||||
@@ -515,7 +516,7 @@
|
||||
"user.settings.display.militaryClock": "Ceas 24 de ore (exemplu: 16:00)",
|
||||
"user.settings.display.normalClock": "Ceas de 12 ore (exemplu: 4:00 PM)",
|
||||
"user.settings.display.preferTime": "Selectați modul în care preferați timpul afișat.",
|
||||
"user.settings.general.email": "Email",
|
||||
"user.settings.general.email": "E-mail",
|
||||
"user.settings.general.emailCantUpdate": "Emailul trebuie actualizat folosind un client web sau o aplicație desktop.",
|
||||
"user.settings.general.emailGitlabCantUpdate": "Conectarea are loc prin GitLab. E-mailul nu poate fi actualizat. Adresa de e-mail utilizată pentru notificări este {email}.",
|
||||
"user.settings.general.emailGoogleCantUpdate": "Conectarea are loc prin Google. E-mailul nu poate fi actualizat. Adresa de e-mail utilizată pentru notificări este {email}.",
|
||||
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Копировать текст",
|
||||
"mobile.post_info.flag": "Отметить",
|
||||
"mobile.post_info.pin": "Прикрепить сообщение",
|
||||
"mobile.post_info.reply": "Ответить",
|
||||
"mobile.post_info.unflag": "Снять отметку",
|
||||
"mobile.post_info.unpin": "Открепить сообщение",
|
||||
"mobile.post_pre_header.flagged": "Отмеченные",
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{firstUser} ve {secondUser} {actor} tarafından **takıma eklendi**.",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} ve {lastUser} **kanala katıldı**.",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **kanala katıldı**.",
|
||||
"combined_system_message.joined_channel.one_you": "**kanala katıldı**.",
|
||||
"combined_system_message.joined_channel.one_you": "**Kanala katıldınız**.",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} ve {secondUser} **kanala katıldı**.",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} ve {lastUser} **takıma katıldı**.",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **takıma katıldı**.",
|
||||
"combined_system_message.joined_team.one_you": "**takıma katıldı**.",
|
||||
"combined_system_message.joined_team.one_you": "**Takıma katıldınız**.",
|
||||
"combined_system_message.joined_team.two": "{firstUser} ve {secondUser} **takıma katıldı**.",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} ve {lastUser} **kanaldan ayrıldı**.",
|
||||
"combined_system_message.left_channel.one": "{firstUser} **kanaldan ayrıldı**.",
|
||||
"combined_system_message.left_channel.one_you": "**kanaldan ayrıldı**.",
|
||||
"combined_system_message.left_channel.one_you": "**Kanaldan ayrıldınız**.",
|
||||
"combined_system_message.left_channel.two": "{firstUser} ve {secondUser} **kanaldan ayrıldı**.",
|
||||
"combined_system_message.left_team.many_expanded": "{users} ve {lastUser} **takımdan ayrıldı**.",
|
||||
"combined_system_message.left_team.one": "{firstUser} **takımdan ayrıldı**.",
|
||||
"combined_system_message.left_team.one_you": "**takımdan ayrıldı**.",
|
||||
"combined_system_message.left_team.one_you": "**Takımdan ayrıldınız**.",
|
||||
"combined_system_message.left_team.two": "{firstUser} ve {secondUser} **takımdan ayrıldı**.",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} ve {lastUser} **kanaldan çıkarıldı**.",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} **kanaldan çıkarıldı**.",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "Siz",
|
||||
"create_comment.addComment": "Yorum yazın...",
|
||||
"create_post.deactivated": "Devre dışı bırakılmış bir kullanıcı ile arşivlenmiş bir kanala bakıyorsunuz.",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "{channelDisplayName} kanalına yazın",
|
||||
"edit_post.editPost": "İletiyi düzenle...",
|
||||
"edit_post.save": "Kaydet",
|
||||
"error.team_not_found.title": "Takım Bulunamadı",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Metni Kopyala",
|
||||
"mobile.post_info.flag": "İşaretle",
|
||||
"mobile.post_info.pin": "Kanala Sabitle",
|
||||
"mobile.post_info.reply": "Yanıtla",
|
||||
"mobile.post_info.unflag": "İşareti Kaldır",
|
||||
"mobile.post_info.unpin": "Kanal Sabitlemesini Kaldır",
|
||||
"mobile.post_pre_header.flagged": "İşaretlenmiş",
|
||||
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "Копіювати текст",
|
||||
"mobile.post_info.flag": "Відзначити ",
|
||||
"mobile.post_info.pin": "Прикріпити в каналі",
|
||||
"mobile.post_info.reply": "Відповідь",
|
||||
"mobile.post_info.unflag": "Не позначено ",
|
||||
"mobile.post_info.unpin": "Від'єднати від каналу ",
|
||||
"mobile.post_pre_header.flagged": "Позначено",
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{actor} 添加了 {firstUser} 和 {secondUser} 至**此团队**。",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users} 以及 {lastUser} **加入了此频道**。",
|
||||
"combined_system_message.joined_channel.one": "{firstUser} **加入了此频道**。",
|
||||
"combined_system_message.joined_channel.one_you": "**加入了频道**。",
|
||||
"combined_system_message.joined_channel.one_you": "您**加入了频道**。",
|
||||
"combined_system_message.joined_channel.two": "{firstUser} 和 {secondUser} **加入了此频道**。",
|
||||
"combined_system_message.joined_team.many_expanded": "{users} 以及 {lastUser} **加入了此团队**。",
|
||||
"combined_system_message.joined_team.one": "{firstUser} **加入了此团队**。",
|
||||
"combined_system_message.joined_team.one_you": "**加入了团队**。",
|
||||
"combined_system_message.joined_team.one_you": "您**加入了团队**。",
|
||||
"combined_system_message.joined_team.two": "{firstUser} 和 {secondUser} **加入了此团队**。",
|
||||
"combined_system_message.left_channel.many_expanded": "{users} 以及 {lastUser} **离开了此频道**。",
|
||||
"combined_system_message.left_channel.one": "{firstUser} **离开了此频道**。",
|
||||
"combined_system_message.left_channel.one_you": "**离开了频道**。",
|
||||
"combined_system_message.left_channel.one_you": "您**离开了频道**。",
|
||||
"combined_system_message.left_channel.two": "{firstUser} 和 {secondUser} **离开了此频道**。",
|
||||
"combined_system_message.left_team.many_expanded": "{users} 以及 {lastUser} **离开了此团队**。",
|
||||
"combined_system_message.left_team.one": "{firstUser} **离开了此团队**。",
|
||||
"combined_system_message.left_team.one_you": "**离开了团队**。",
|
||||
"combined_system_message.left_team.one_you": "您**离开了团队**。",
|
||||
"combined_system_message.left_team.two": "{firstUser} 以及 {secondUser} **离开了此团队**。",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users} 以及 {lastUser} **被移出此频道**。",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser} **被移出此频道**。",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "您",
|
||||
"create_comment.addComment": "添加一个评论...",
|
||||
"create_post.deactivated": "您正在查看已注销用户的归档频道。",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "写入到{channelDisplayName}",
|
||||
"edit_post.editPost": "编辑信息...",
|
||||
"edit_post.save": "保存",
|
||||
"error.team_not_found.title": "未找到团队",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "复制文字",
|
||||
"mobile.post_info.flag": "标记",
|
||||
"mobile.post_info.pin": "置顶到频道",
|
||||
"mobile.post_info.reply": "回复",
|
||||
"mobile.post_info.unflag": "取消标记",
|
||||
"mobile.post_info.unpin": "从频道取消置顶",
|
||||
"mobile.post_pre_header.flagged": "已标记",
|
||||
|
||||
@@ -45,19 +45,19 @@
|
||||
"combined_system_message.added_to_team.two": "{firstUser}與{secondUser}已由{actor}**加入至此團隊**。",
|
||||
"combined_system_message.joined_channel.many_expanded": "{users}與{lastUser}已**加入至此頻道**。",
|
||||
"combined_system_message.joined_channel.one": "{firstUser}已**加入至此頻道**。",
|
||||
"combined_system_message.joined_channel.one_you": "**加入此頻道**",
|
||||
"combined_system_message.joined_channel.one_you": "你**已加入頻道**",
|
||||
"combined_system_message.joined_channel.two": "{firstUser}與{secondUser}已**加入至此頻道**。",
|
||||
"combined_system_message.joined_team.many_expanded": "{users}與{lastUser}已**加入至此團隊**。",
|
||||
"combined_system_message.joined_team.one": "{firstUser}已**加入至此團隊**。",
|
||||
"combined_system_message.joined_team.one_you": "**加入此團隊**",
|
||||
"combined_system_message.joined_team.one_you": "你**已加入團隊**",
|
||||
"combined_system_message.joined_team.two": "{firstUser}與{secondUser}已**加入至此團隊**。",
|
||||
"combined_system_message.left_channel.many_expanded": "{users}與{lastUser}已**離開此頻道**。",
|
||||
"combined_system_message.left_channel.one": "{firstUser}已**離開此頻道**。",
|
||||
"combined_system_message.left_channel.one_you": "**離開此頻道**",
|
||||
"combined_system_message.left_channel.one_you": "你**已離開頻道**",
|
||||
"combined_system_message.left_channel.two": "{firstUser}與{secondUser}已**離開此頻道**。",
|
||||
"combined_system_message.left_team.many_expanded": "{users}與{lastUser}已**離開此團隊**。",
|
||||
"combined_system_message.left_team.one": "{firstUser}已**離開此團隊**。",
|
||||
"combined_system_message.left_team.one_you": "**離開了團隊**。",
|
||||
"combined_system_message.left_team.one_you": "你**已離開團隊**。",
|
||||
"combined_system_message.left_team.two": "{firstUser}與{secondUser}已**離開此團隊**。",
|
||||
"combined_system_message.removed_from_channel.many_expanded": "{users}與{lastUser}已**被移出此頻道**。",
|
||||
"combined_system_message.removed_from_channel.one": "{firstUser}已**被移出此頻道**。",
|
||||
@@ -70,7 +70,7 @@
|
||||
"combined_system_message.you": "您",
|
||||
"create_comment.addComment": "新增註解...",
|
||||
"create_post.deactivated": "正以被停用的使用者觀看被封存的頻道。",
|
||||
"create_post.write": "Write to {channelDisplayName}",
|
||||
"create_post.write": "寫給 {channelDisplayName}",
|
||||
"edit_post.editPost": "修改訊息...",
|
||||
"edit_post.save": "儲存",
|
||||
"error.team_not_found.title": "找不到團隊",
|
||||
@@ -338,6 +338,7 @@
|
||||
"mobile.post_info.copy_text": "複製文字",
|
||||
"mobile.post_info.flag": "標記",
|
||||
"mobile.post_info.pin": "釘選至頻道",
|
||||
"mobile.post_info.reply": "回覆",
|
||||
"mobile.post_info.unflag": "取消標記",
|
||||
"mobile.post_info.unpin": "解除釘選",
|
||||
"mobile.post_pre_header.flagged": "已被標記",
|
||||
|
||||
@@ -2540,7 +2540,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CURRENT_PROJECT_VERSION = 183;
|
||||
CURRENT_PROJECT_VERSION = 186;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||
ENABLE_BITCODE = NO;
|
||||
@@ -2598,7 +2598,7 @@
|
||||
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
CURRENT_PROJECT_VERSION = 183;
|
||||
CURRENT_PROJECT_VERSION = 186;
|
||||
DEAD_CODE_STRIPPING = NO;
|
||||
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
|
||||
ENABLE_BITCODE = NO;
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>183</string>
|
||||
<string>186</string>
|
||||
<key>ITSAppUsesNonExemptEncryption</key>
|
||||
<false/>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
|
||||
@@ -15,15 +15,30 @@ class ChannelsViewController: UIViewController {
|
||||
return tableView
|
||||
}()
|
||||
|
||||
var navbarTitle: String? = "Channels"
|
||||
var channelDecks = [Section]()
|
||||
var filteredDecks: [Section]?
|
||||
weak var delegate: ChannelsViewControllerDelegate?
|
||||
|
||||
override func viewWillAppear(_ animated: Bool) {
|
||||
super.viewWillAppear(animated)
|
||||
if #available(iOS 11.0, *) {
|
||||
navigationItem.hidesSearchBarWhenScrolling = false
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidAppear(_ animated: Bool) {
|
||||
super.viewDidAppear(animated)
|
||||
if #available(iOS 11.0, *) {
|
||||
navigationItem.hidesSearchBarWhenScrolling = true
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
filteredDecks = channelDecks
|
||||
title = "Channels"
|
||||
title = navbarTitle
|
||||
configureSearchBar()
|
||||
view.addSubview(tableView)
|
||||
}
|
||||
@@ -34,13 +49,17 @@ class ChannelsViewController: UIViewController {
|
||||
searchController.dimsBackgroundDuringPresentation = false
|
||||
searchController.searchBar.searchBarStyle = .minimal
|
||||
searchController.searchBar.autocapitalizationType = .none
|
||||
searchController.searchBar.delegate = self
|
||||
|
||||
self.definesPresentationContext = true
|
||||
|
||||
if #available(iOS 11.0, *) {
|
||||
// For iOS 11 and later, place the search bar in the navigation bar.
|
||||
self.definesPresentationContext = true
|
||||
|
||||
// Make the search bar always visible.
|
||||
navigationItem.hidesSearchBarWhenScrolling = true
|
||||
// Give space at the top so provide a better look and feel
|
||||
let offset = UIOffset(horizontal: 0.0, vertical: 6.0)
|
||||
searchController.searchBar.searchFieldBackgroundPositionAdjustment = offset
|
||||
|
||||
|
||||
navigationItem.searchController = searchController
|
||||
} else {
|
||||
@@ -130,5 +149,27 @@ extension ChannelsViewController: UISearchBarDelegate {
|
||||
|
||||
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
|
||||
searchBar.showsCancelButton = true
|
||||
|
||||
// Center the Cancel Button
|
||||
if #available(iOS 11.0, *) {
|
||||
searchBar.cancelButton?.titleEdgeInsets = UIEdgeInsets(top: 12.0, left: 0, bottom: 0, right: 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// get the cancel button of the Search Bar
|
||||
extension UISearchBar {
|
||||
var cancelButton : UIButton? {
|
||||
let topView: UIView = self.subviews[0] as UIView
|
||||
|
||||
if let pvtClass = NSClassFromString("UINavigationButton") {
|
||||
for v in topView.subviews {
|
||||
if v.isKind(of: pvtClass) {
|
||||
return v as? UIButton
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.18.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>183</string>
|
||||
<string>186</string>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsArbitraryLoads</key>
|
||||
|
||||
@@ -19,6 +19,7 @@ class ShareViewController: SLComposeServiceViewController {
|
||||
private var serverURL: String?
|
||||
private var message: String?
|
||||
private var publicURL: String?
|
||||
private var tempContainerURL: URL? = UploadSessionManager.shared.tempContainerURL() as URL?
|
||||
|
||||
fileprivate var selectedChannel: Item?
|
||||
fileprivate var selectedTeam: Item?
|
||||
@@ -121,6 +122,7 @@ class ShareViewController: SLComposeServiceViewController {
|
||||
channels.tapHandler = {
|
||||
let vc = ChannelsViewController()
|
||||
vc.channelDecks = channelDecks!
|
||||
vc.navbarTitle = self.selectedTeam?.title
|
||||
vc.delegate = self
|
||||
self.pushConfigurationViewController(vc)
|
||||
}
|
||||
@@ -161,6 +163,7 @@ class ShareViewController: SLComposeServiceViewController {
|
||||
if id == currentChannelId {
|
||||
item.selected = true
|
||||
selectedChannel = item
|
||||
placeholder = "Write to \(item.title!)"
|
||||
}
|
||||
section.items.append(item)
|
||||
}
|
||||
@@ -175,10 +178,12 @@ class ShareViewController: SLComposeServiceViewController {
|
||||
dispatchGroup.enter()
|
||||
itemProvider.loadItem(forTypeIdentifier: kUTTypeMovie as String, options: nil, completionHandler: ({item, error in
|
||||
if error == nil {
|
||||
let attachment = self.saveAttachment(url: item as! URL)
|
||||
if (attachment != nil) {
|
||||
attachment?.type = kUTTypeMovie as String
|
||||
self.attachments.append(attachment!)
|
||||
if let url = item as? URL {
|
||||
let attachment = self.saveAttachment(url: url)
|
||||
if (attachment != nil) {
|
||||
attachment?.type = kUTTypeMovie as String
|
||||
self.attachments.append(attachment!)
|
||||
}
|
||||
}
|
||||
}
|
||||
self.dispatchGroup.leave()
|
||||
@@ -187,10 +192,25 @@ class ShareViewController: SLComposeServiceViewController {
|
||||
dispatchGroup.enter()
|
||||
itemProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil, completionHandler: ({item, error in
|
||||
if error == nil {
|
||||
let attachment = self.saveAttachment(url: item as! URL)
|
||||
if (attachment != nil) {
|
||||
attachment?.type = kUTTypeImage as String
|
||||
self.attachments.append(attachment!)
|
||||
if let url = item as? URL {
|
||||
let attachment = self.saveAttachment(url: url)
|
||||
if (attachment != nil) {
|
||||
attachment?.type = kUTTypeImage as String
|
||||
self.attachments.append(attachment!)
|
||||
}
|
||||
} else if let image = item as? UIImage {
|
||||
if let data = image.pngData() {
|
||||
let tempImageURL = self.tempContainerURL?
|
||||
.appendingPathComponent(UUID().uuidString)
|
||||
.appendingPathExtension(".png")
|
||||
if (try? data.write(to: tempImageURL!)) != nil {
|
||||
let attachment = self.saveAttachment(url: tempImageURL!)
|
||||
if (attachment != nil) {
|
||||
attachment?.type = kUTTypeImage as String
|
||||
self.attachments.append(attachment!)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
self.dispatchGroup.leave()
|
||||
@@ -199,10 +219,12 @@ class ShareViewController: SLComposeServiceViewController {
|
||||
dispatchGroup.enter()
|
||||
itemProvider.loadItem(forTypeIdentifier: kUTTypeFileURL as String, options: nil, completionHandler: ({item, error in
|
||||
if error == nil {
|
||||
let attachment = self.saveAttachment(url: item as! URL)
|
||||
if (attachment != nil) {
|
||||
attachment?.type = kUTTypeFileURL as String
|
||||
self.attachments.append(attachment!)
|
||||
if let url = item as? URL {
|
||||
let attachment = self.saveAttachment(url: url)
|
||||
if (attachment != nil) {
|
||||
attachment?.type = kUTTypeFileURL as String
|
||||
self.attachments.append(attachment!)
|
||||
}
|
||||
}
|
||||
}
|
||||
self.dispatchGroup.leave()
|
||||
@@ -333,16 +355,17 @@ class ShareViewController: SLComposeServiceViewController {
|
||||
}
|
||||
|
||||
func saveAttachment(url: URL) -> AttachmentItem? {
|
||||
let tempURL: URL? = UploadSessionManager.shared.tempContainerURL() as URL?
|
||||
let fileMgr = FileManager.default
|
||||
let fileName = url.lastPathComponent
|
||||
let tempFileURL = tempURL?.appendingPathComponent(fileName)
|
||||
let tempFileURL = tempContainerURL?.appendingPathComponent(fileName)
|
||||
|
||||
do {
|
||||
try? FileManager.default.removeItem(at: tempFileURL!)
|
||||
try fileMgr.copyItem(at: url, to: tempFileURL!)
|
||||
let attr = try fileMgr.attributesOfItem(atPath: (tempFileURL?.path)!) as NSDictionary
|
||||
if (tempFileURL != url) {
|
||||
try? FileManager.default.removeItem(at: tempFileURL!)
|
||||
try fileMgr.copyItem(at: url, to: tempFileURL!)
|
||||
}
|
||||
|
||||
let attr = try fileMgr.attributesOfItem(atPath: (tempFileURL?.path)!) as NSDictionary
|
||||
let attachment = AttachmentItem()
|
||||
attachment.fileName = fileName
|
||||
attachment.fileURL = tempFileURL
|
||||
|
||||
@@ -17,7 +17,7 @@ class TeamsViewController: UIViewController {
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
title = "Teams"
|
||||
title = "Team"
|
||||
view.addSubview(tableView)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,6 @@
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>183</string>
|
||||
<string>186</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
86
package-lock.json
generated
86
package-lock.json
generated
@@ -1599,7 +1599,7 @@
|
||||
},
|
||||
"ansi-colors": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
|
||||
"integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
|
||||
"requires": {
|
||||
"ansi-wrap": "^0.1.0"
|
||||
@@ -1615,7 +1615,7 @@
|
||||
},
|
||||
"ansi-escapes": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
|
||||
"integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
|
||||
},
|
||||
"ansi-gray": {
|
||||
@@ -1974,7 +1974,7 @@
|
||||
},
|
||||
"array-equal": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
|
||||
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
|
||||
"dev": true
|
||||
},
|
||||
@@ -2607,7 +2607,7 @@
|
||||
},
|
||||
"chalk": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
||||
"resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
||||
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
|
||||
"requires": {
|
||||
"ansi-styles": "^2.2.1",
|
||||
@@ -2923,7 +2923,7 @@
|
||||
},
|
||||
"combined-stream": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
|
||||
"resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
|
||||
"integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
|
||||
"requires": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
@@ -2940,8 +2940,8 @@
|
||||
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
|
||||
},
|
||||
"commonmark": {
|
||||
"version": "github:mattermost/commonmark.js#d5a7a7bfb373778d3bfd4575962c10fb3f3909c6",
|
||||
"from": "github:mattermost/commonmark.js#d5a7a7bfb373778d3bfd4575962c10fb3f3909c6",
|
||||
"version": "github:mattermost/commonmark.js#6c3136c18ae8bb7842f8491d160f370a334fd903",
|
||||
"from": "github:mattermost/commonmark.js#6c3136c18ae8bb7842f8491d160f370a334fd903",
|
||||
"requires": {
|
||||
"entities": "~ 1.1.1",
|
||||
"mdurl": "~ 1.0.1",
|
||||
@@ -3129,7 +3129,7 @@
|
||||
},
|
||||
"css-select": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
|
||||
"integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
@@ -3581,7 +3581,7 @@
|
||||
},
|
||||
"es6-promisify": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
|
||||
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
|
||||
"requires": {
|
||||
"es6-promise": "^4.0.3"
|
||||
@@ -3949,7 +3949,7 @@
|
||||
},
|
||||
"event-target-shim": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz",
|
||||
"integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE="
|
||||
},
|
||||
"eventemitter3": {
|
||||
@@ -4061,7 +4061,7 @@
|
||||
},
|
||||
"external-editor": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
|
||||
"integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
|
||||
"requires": {
|
||||
"chardet": "^0.4.0",
|
||||
@@ -4323,7 +4323,7 @@
|
||||
},
|
||||
"fs-extra": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
|
||||
"integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
|
||||
"requires": {
|
||||
"graceful-fs": "^4.1.2",
|
||||
@@ -5143,7 +5143,7 @@
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.6.3",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||
"resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
|
||||
"requires": {
|
||||
"depd": "~1.1.2",
|
||||
@@ -5462,7 +5462,7 @@
|
||||
},
|
||||
"is-builtin-module": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
|
||||
"integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
|
||||
"requires": {
|
||||
"builtin-modules": "^1.0.0"
|
||||
@@ -8869,7 +8869,7 @@
|
||||
},
|
||||
"jsonfile": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
|
||||
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
|
||||
"requires": {
|
||||
"graceful-fs": "^4.1.6"
|
||||
@@ -9009,7 +9009,7 @@
|
||||
},
|
||||
"load-json-file": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
|
||||
"integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
|
||||
"requires": {
|
||||
"graceful-fs": "^4.1.2",
|
||||
@@ -9093,7 +9093,7 @@
|
||||
},
|
||||
"lodash.isempty": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
|
||||
"integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4="
|
||||
},
|
||||
"lodash.isequal": {
|
||||
@@ -9238,8 +9238,8 @@
|
||||
"integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A=="
|
||||
},
|
||||
"mattermost-redux": {
|
||||
"version": "github:mattermost/mattermost-redux#98856a37d8f5ee6fab2e49f29b2b950d91c11537",
|
||||
"from": "github:mattermost/mattermost-redux#98856a37d8f5ee6fab2e49f29b2b950d91c11537",
|
||||
"version": "github:mattermost/mattermost-redux#f42382de3861bda2348256a5a37191f3ac9ef3f0",
|
||||
"from": "github:mattermost/mattermost-redux#f42382de3861bda2348256a5a37191f3ac9ef3f0",
|
||||
"requires": {
|
||||
"deep-equal": "1.0.1",
|
||||
"eslint-plugin-header": "2.0.0",
|
||||
@@ -9660,7 +9660,7 @@
|
||||
},
|
||||
"minimist": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
|
||||
},
|
||||
"mixin-deep": {
|
||||
@@ -9684,7 +9684,7 @@
|
||||
},
|
||||
"mkdirp": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
@@ -9692,7 +9692,7 @@
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
|
||||
}
|
||||
}
|
||||
@@ -9909,7 +9909,7 @@
|
||||
},
|
||||
"npmlog": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz",
|
||||
"resolved": "http://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz",
|
||||
"integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=",
|
||||
"requires": {
|
||||
"ansi": "~0.3.1",
|
||||
@@ -11161,7 +11161,7 @@
|
||||
},
|
||||
"opn": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
|
||||
"resolved": "http://registry.npmjs.org/opn/-/opn-3.0.3.tgz",
|
||||
"integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=",
|
||||
"requires": {
|
||||
"object-assign": "^4.0.1"
|
||||
@@ -11178,7 +11178,7 @@
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
|
||||
"integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
|
||||
},
|
||||
"wordwrap": {
|
||||
@@ -11240,7 +11240,7 @@
|
||||
},
|
||||
"os-tmpdir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
|
||||
},
|
||||
"output-file-sync": {
|
||||
@@ -11380,7 +11380,7 @@
|
||||
},
|
||||
"path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
|
||||
},
|
||||
"path-is-inside": {
|
||||
@@ -11430,7 +11430,7 @@
|
||||
},
|
||||
"pify": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
|
||||
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
|
||||
},
|
||||
"pirates": {
|
||||
@@ -11994,8 +11994,8 @@
|
||||
}
|
||||
},
|
||||
"react-native-notifications": {
|
||||
"version": "github:mattermost/react-native-notifications#fcfed22dfee7a02e43f4d8acc5cf6310fa18bd6a",
|
||||
"from": "github:mattermost/react-native-notifications#fcfed22dfee7a02e43f4d8acc5cf6310fa18bd6a",
|
||||
"version": "github:mattermost/react-native-notifications#c58499aedf9bd4c9a405196ec807019ed316f2bb",
|
||||
"from": "github:mattermost/react-native-notifications#c58499aedf9bd4c9a405196ec807019ed316f2bb",
|
||||
"requires": {
|
||||
"core-js": "^1.0.0",
|
||||
"uuid": "^2.0.3"
|
||||
@@ -12303,7 +12303,7 @@
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.6",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
@@ -13285,7 +13285,7 @@
|
||||
},
|
||||
"safe-regex": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
|
||||
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
|
||||
"requires": {
|
||||
"ret": "~0.1.10"
|
||||
@@ -13584,7 +13584,7 @@
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.1.6.tgz",
|
||||
"resolved": "http://registry.npmjs.org/sax/-/sax-1.1.6.tgz",
|
||||
"integrity": "sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA="
|
||||
},
|
||||
"sc-auth": {
|
||||
@@ -13634,7 +13634,7 @@
|
||||
"dependencies": {
|
||||
"async": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/async/-/async-2.0.0.tgz",
|
||||
"integrity": "sha1-0JAK04WvE4BFQKEJxCFm4657K50=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
@@ -13733,7 +13733,7 @@
|
||||
},
|
||||
"serialize-error": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
|
||||
"integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go="
|
||||
},
|
||||
"serve-static": {
|
||||
@@ -13854,7 +13854,7 @@
|
||||
},
|
||||
"xmlbuilder": {
|
||||
"version": "8.2.2",
|
||||
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
|
||||
"resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz",
|
||||
"integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M="
|
||||
}
|
||||
}
|
||||
@@ -14076,7 +14076,7 @@
|
||||
},
|
||||
"inquirer": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz",
|
||||
"integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
@@ -14468,7 +14468,7 @@
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
@@ -14481,7 +14481,7 @@
|
||||
},
|
||||
"strip-eof": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
|
||||
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
|
||||
},
|
||||
"strip-json-comments": {
|
||||
@@ -14557,7 +14557,7 @@
|
||||
"dependencies": {
|
||||
"rimraf": {
|
||||
"version": "2.2.8",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
|
||||
"resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
|
||||
"integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI="
|
||||
}
|
||||
}
|
||||
@@ -14680,7 +14680,7 @@
|
||||
},
|
||||
"through": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
|
||||
"resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
|
||||
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
|
||||
},
|
||||
"through2": {
|
||||
@@ -15190,7 +15190,7 @@
|
||||
},
|
||||
"wrap-ansi": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||
"resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
|
||||
"requires": {
|
||||
"string-width": "^1.0.1",
|
||||
@@ -15279,7 +15279,7 @@
|
||||
},
|
||||
"xmlbuilder": {
|
||||
"version": "9.0.7",
|
||||
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
|
||||
"resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
|
||||
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
|
||||
},
|
||||
"xmldoc": {
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
"@babel/polyfill": "7.2.5",
|
||||
"@babel/runtime": "7.3.1",
|
||||
"analytics-react-native": "1.2.0",
|
||||
"commonmark": "github:mattermost/commonmark.js#d5a7a7bfb373778d3bfd4575962c10fb3f3909c6",
|
||||
"commonmark": "github:mattermost/commonmark.js#6c3136c18ae8bb7842f8491d160f370a334fd903",
|
||||
"commonmark-react-renderer": "github:mattermost/commonmark-react-renderer#3a2ac19cab725ad28b170fdc1d397dddedcf87eb",
|
||||
"deep-equal": "1.0.1",
|
||||
"emoji-regex": "7.0.3",
|
||||
@@ -18,7 +18,7 @@
|
||||
"intl": "1.2.5",
|
||||
"jail-monkey": "2.0.0",
|
||||
"jsc-android": "236355.1.1",
|
||||
"mattermost-redux": "github:mattermost/mattermost-redux#98856a37d8f5ee6fab2e49f29b2b950d91c11537",
|
||||
"mattermost-redux": "github:mattermost/mattermost-redux#f42382de3861bda2348256a5a37191f3ac9ef3f0",
|
||||
"mime-db": "1.38.0",
|
||||
"moment-timezone": "0.5.23",
|
||||
"prop-types": "15.7.2",
|
||||
@@ -43,7 +43,7 @@
|
||||
"react-native-linear-gradient": "2.5.3",
|
||||
"react-native-local-auth": "github:mattermost/react-native-local-auth#cc9ce2f468fbf7b431dfad3191a31aaa9227a6ab",
|
||||
"react-native-navigation": "github:migbot/react-native-navigation#03c623c373f818827a463ca0fe90f86f56e71b2f",
|
||||
"react-native-notifications": "github:mattermost/react-native-notifications#fcfed22dfee7a02e43f4d8acc5cf6310fa18bd6a",
|
||||
"react-native-notifications": "github:mattermost/react-native-notifications#c58499aedf9bd4c9a405196ec807019ed316f2bb",
|
||||
"react-native-passcode-status": "1.1.1",
|
||||
"react-native-permissions": "1.1.1",
|
||||
"react-native-recyclerview-list": "mattermost/react-native-recyclerview-list#a2d26bc7b2623cae25e947ba3905f702434717bf",
|
||||
@@ -109,7 +109,8 @@
|
||||
"postinstall": "make post-install",
|
||||
"test": "jest --forceExit --detectOpenHandles",
|
||||
"test:watch": "jest --watch",
|
||||
"test:coverage": "jest --coverage"
|
||||
"test:coverage": "jest --coverage",
|
||||
"updatesnapshot": "jest --updateSnapshot"
|
||||
},
|
||||
"rnpm": {
|
||||
"assets": [
|
||||
|
||||
Reference in New Issue
Block a user