Compare commits

...

21 Commits
v1 ... v1.18.0

Author SHA1 Message Date
Saturnino Abril
7590bb3063 Bump app build number to 186 (#2716) 2019-04-16 11:58:07 +08:00
Miguel Alatzar
69a2c58f5e Ensure the correct value for channelIsLoading is used (#2712) 2019-04-15 10:54:23 -07:00
Saturnino Abril
7efb044aa9 Bump app build number to 185 (#2708) 2019-04-10 16:57:52 +08:00
Elias Nahum
25673ff7e0 MM-14959 iOS Share Extension channel search open by default (#2698) 2019-04-09 14:39:35 -04:00
JoramWilander
78b23ae37e Update mattermost-redux 2019-04-09 13:27:09 -04:00
Elias Nahum
8ef6b35369 translations PR 20190408 (#2704) 2019-04-09 07:52:21 -04:00
Miguel Alatzar
385a081f78 Set canFlag to false for system messages (#2705) 2019-04-09 11:16:47 +08:00
Elias Nahum
0377249592 MM-14960 Use the correct icon set for channel types (#2699) 2019-04-08 10:51:10 -07:00
Miguel Alatzar
caac14907e [MM-14830] Check for null pushNotification prior to calling sendNotificationScheduled on it (#2702)
* Update react-native-notifications dependency commit hash

* Add package-lock.json
2019-04-08 08:33:33 -04:00
Miguel Alatzar
6fef6d6b92 [MM-14899] Support sharing of screenshots via the iOS share extension (#2697)
* Handle NSItemProvider item of type UIImage

* Create screenshot temp file with UploadSessionManager
2019-04-08 05:31:11 +08:00
Miguel Alatzar
64337b4851 Remove package name from push notification content (#2700) 2019-04-08 05:25:30 +08:00
Miguel Alatzar
713dd4e578 Avoid force casting items to URL (#2696) 2019-04-05 02:59:45 +08:00
Saturnino Abril
41ddeef2f7 Bump app build number to 184 (#2695) 2019-04-05 00:22:43 +08:00
Saturnino Abril
00e05c5e8f update commit of commonmark.js that fixes "blank spaces break markdown table" (#2694) 2019-04-05 00:14:54 +08:00
Daniel Schalla
a74fabcc98 Add CSRF Header in File Upload and Profile Image Set Operations (#2686) 2019-04-04 10:44:11 -04:00
Miguel Alatzar
bb9f96f409 [MM-14871] Fix extraction of sender name for push notifications (#2691)
* Return empty string for sender name when not found
2019-04-03 18:42:14 -07:00
Elias Nahum
3adec36c95 translations PR 20190401 (#2687) 2019-04-03 18:31:54 -03:00
Miguel Alatzar
4c690b5578 [MM-14866] Fix app crash due to parseInt call on null and display test notification message (#2690)
* Call setNumber on notification only if badge is not null

* Move setNumber call

* Add bundle to empty list
2019-04-03 10:15:34 -07:00
Dan Maas
39129fc6c4 Update NOTICE.txt (#2685)
- Misc homepage and project info updates
2019-04-03 09:47:41 +02:00
Christopher Speller
370fa9b952 MM-13618 Adding bot tags. (#2669)
* Adding bot tags.

* Snapshot update.

* Moving bot tag to own component.

* Snapshots.

* Adding missing bot tags, fixing bot profile, allowing tap of bot username to open profile.

* Snapshots and tests.
2019-03-26 17:01:17 -07:00
Harshil Sharma
52e379ae51 #MI-372 updated mattermost-redux commit ID to use the latest changes (#2670)
* #MI-372 updated mattermost-redux commit ID to use the latest changes

* Updated commit ID in package lock as well
2019-03-26 18:38:56 -03:00
57 changed files with 752 additions and 222 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -38,6 +38,7 @@ describe('ChannelItem', () => {
theme: Preferences.THEMES.default,
unreadMsgs: 1,
isSearchResult: false,
isBot: false,
};
test('should match snapshot', () => {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -87,6 +87,7 @@ function mapStateToProps(state, ownProps) {
canCopyPermalink = false;
canEdit = false;
canPin = false;
canFlag = false;
}
if (ownProps.hasBeenDeleted) {
canDelete = false;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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": "あなたのステータスを \"離席中\" に変更し、自動返信を無効化してもよろしいですか?",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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": "Отмеченные",

View File

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

View File

@@ -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": "Позначено",

View File

@@ -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": "已标记",

View File

@@ -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": "已被標記",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,7 +17,7 @@ class TeamsViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
title = "Teams"
title = "Team"
view.addSubview(tableView)
}

View File

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

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

View File

@@ -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": [