Compare commits

...

21 Commits

Author SHA1 Message Date
Elias Nahum
9aa3de53a2 Version 1.15.2 and Build number 170 (#2513)
* Bump app version number to  1.15.2

* Bump app build number to 170
2019-01-18 14:27:17 -04:00
Elias Nahum
4d604c670a Bump app build number to 169 (#2510) 2019-01-18 00:42:33 -04:00
Martin Kraft
dac5be0eaa MM-13751: Fix for incorrect access to delete button. 2019-01-18 00:42:18 -04:00
Elias Nahum
2402fd1681 Bump app build number to 168 (#2505) 2019-01-18 00:41:51 -04:00
Elias Nahum
377e12b53c translations PR 20190110 (#2504) 2019-01-18 00:41:39 -04:00
Martin Kraft
1ff4c6ce83 MM-13654: Removes pin and delete longpress options from posts in arch… (#2495)
* MM-13654: Removes pin and delete longpress options from posts in archived channels.

* MM-13654: Maintains existing option order. Updates others' posts options.
2019-01-18 00:41:19 -04:00
Elias Nahum
1a8be5444c MM-13666 Detect post as emoji only if not a codeblock (#2497)
* Detect post as emoji only if not a codeblock

* Feedback review

Co-Authored-By: enahum <nahumhbl@gmail.com>

* Feedback review

Co-Authored-By: enahum <nahumhbl@gmail.com>
2019-01-18 00:41:05 -04:00
Elias Nahum
54c3ee97c4 Update fastlane (#2494) 2019-01-18 00:40:46 -04:00
Elias Nahum
9a20a45eee Fix other users status changes (#2491) 2019-01-18 00:40:27 -04:00
Elias Nahum
adab0b31ac Fix visibility of retry failed message option (#2492)
* Fix visibility of retry failed message option

* Feedback review
2019-01-18 00:40:10 -04:00
Elias Nahum
72b6270f8e translations PR 20181231 (#2485) 2019-01-18 00:39:47 -04:00
Elias Nahum
61d340d97d Bump version to 1.16.0 and Build number to 167 (#2481)
* Fix fastlane platform thumbnail

* Bump app version number to 1.16.0

* Bump app build number to 167
2019-01-18 00:39:12 -04:00
Elias Nahum
52179a557c translations PR 20181224 (#2479) 2019-01-18 00:39:03 -04:00
Elias Nahum
b8766bbbf2 Fix post menu rounded corners (#2472) 2019-01-18 00:38:50 -04:00
Elias Nahum
776a9d8fad LHS use getSortedFavoriteChannelIds instead of getFavoriteChannelIds (#2471) 2019-01-18 00:38:33 -04:00
Chris Duarte
fa10680ef3 Fixes for duplicate text on message attachments, empty space when attachment has no title (#2460) 2019-01-18 00:38:15 -04:00
Elias Nahum
341d773e8a Show an alert box when the team could not be joined (#2462) 2019-01-18 00:35:27 -04:00
Sudheer
f2fc1db00c MM-13333 Fix minor alignment issue with reply thread indicator (#2456)
* Add a pixel to margin right for profile_picture container
    to compensate status icon platform styles
2019-01-18 00:35:01 -04:00
Elias Nahum
4c606ed752 prevent double tap on Channel Info options (#2455) 2019-01-18 00:34:14 -04:00
Elias Nahum
1ab2925ac1 Remove extra divider below Edit Channel in Channel info (#2454)
* Remove extra divider below Edit Channel in Channel info

* Fix indentation
2019-01-18 00:33:57 -04:00
Elias Nahum
7e7b382207 Update date separators when timezone changes (#2443)
* Update date separators when timezone changes

* Fix typo
2019-01-18 00:33:39 -04:00
33 changed files with 420 additions and 240 deletions

View File

@@ -113,8 +113,8 @@ android {
applicationId "com.mattermost.rnbeta"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 166
versionName "1.15.1"
versionCode 170
versionName "1.15.2"
multiDexEnabled = true
ndk {
abiFilters "armeabi-v7a", "x86"

View File

@@ -2,7 +2,7 @@
// See LICENSE.txt for license information.
import {UserTypes} from 'mattermost-redux/action_types';
import {getStatus} from 'mattermost-redux/actions/users';
import {getStatus, getStatusesByIds, startPeriodicStatusUpdates} from 'mattermost-redux/actions/users';
import {General} from 'mattermost-redux/constants';
import {getCurrentUserId} from 'mattermost-redux/selectors/entities/users';
@@ -23,3 +23,16 @@ export function setCurrentUserStatus(isOnline) {
});
};
}
export function initUserStatuses() {
return (dispatch, getState) => {
const {statuses} = getState().entities.users || {};
const userIds = Object.keys(statuses);
if (userIds.length) {
dispatch(getStatusesByIds(userIds));
}
dispatch(startPeriodicStatusUpdates());
};
}

View File

@@ -7,12 +7,14 @@ import thunk from 'redux-thunk';
import {UserTypes} from 'mattermost-redux/action_types';
import {General} from 'mattermost-redux/constants';
import {setCurrentUserStatus} from 'app/actions/views/user';
import {initUserStatuses, setCurrentUserStatus} from 'app/actions/views/user';
const mockStore = configureStore([thunk]);
jest.mock('mattermost-redux/actions/users', () => ({
getStatus: (...args) => ({type: 'MOCK_GET_STATUS', args}),
getStatusesByIds: (...args) => ({type: 'MOCK_GET_STATUS_BY_IDS', args}),
startPeriodicStatusUpdates: () => ({type: 'MOCK_PERIODIC_STATUS_UPDATES'}),
}));
describe('Actions.Views.User', () => {
@@ -23,6 +25,11 @@ describe('Actions.Views.User', () => {
entities: {
users: {
currentUserId: 'current-user-id',
statuses: {
'current-user-id': 'online',
'another-user-id1': 'away',
'another-user-id2': 'dnd',
},
},
},
});
@@ -50,4 +57,15 @@ describe('Actions.Views.User', () => {
await store.dispatch(setCurrentUserStatus(true));
expect(store.getActions()).toEqual([action]);
});
test('should initialize the periodic status updates and get the current user statuses', () => {
const actionStatusByIds = {
type: 'MOCK_GET_STATUS_BY_IDS',
args: [['current-user-id', 'another-user-id1', 'another-user-id2']],
};
const actionPeriodicUpdates = {type: 'MOCK_PERIODIC_STATUS_UPDATES'};
store.dispatch(initUserStatuses());
expect(store.getActions()).toEqual([actionStatusByIds, actionPeriodicUpdates]);
});
});

View File

@@ -66,16 +66,18 @@ export default class AttachmentFields extends PureComponent {
style={style.flex}
key={`attachment__field-${i}__${nrTables}`}
>
<View
style={style.headingContainer}
key={`attachment__field-caption-${i}__${nrTables}`}
>
<View>
<Text style={style.heading}>
{field.title}
</Text>
{Boolean(field.title) && (
<View
style={style.headingContainer}
key={`attachment__field-caption-${i}__${nrTables}`}
>
<View>
<Text style={style.heading}>
{field.title}
</Text>
</View>
</View>
</View>
)}
<View
style={style.flex}
key={`attachment__field-${i}__${nrTables}`}

View File

@@ -97,7 +97,7 @@ export default class MessageAttachment extends PureComponent {
navigator={navigator}
onPermalinkPress={onPermalinkPress}
textStyles={textStyles}
value={attachment.text || attachment.fallback}
value={attachment.text}
/>
<AttachmentFields
baseTextStyle={baseTextStyle}

View File

@@ -4,12 +4,15 @@
import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import {startPeriodicStatusUpdates, stopPeriodicStatusUpdates, logout} from 'mattermost-redux/actions/users';
import {stopPeriodicStatusUpdates, logout} from 'mattermost-redux/actions/users';
import {init as initWebSocket, close as closeWebSocket} from 'mattermost-redux/actions/websocket';
import {getCurrentChannelId} from 'mattermost-redux/selectors/entities/channels';
import {connection} from 'app/actions/device';
import {setCurrentUserStatus} from 'app/actions/views/user';
import {
initUserStatuses as startPeriodicStatusUpdates,
setCurrentUserStatus,
} from 'app/actions/views/user';
import {getConnection, isLandscape} from 'app/selectors/device';
import NetworkIndicator from './network_indicator';

View File

@@ -228,12 +228,13 @@ export default class NetworkIndicator extends PureComponent {
};
handleConnectionChange = ({hasInternet, serverReachable}) => {
const {connection} = this.props.actions;
const {connection, startPeriodicStatusUpdates} = this.props.actions;
// On first run always initialize the WebSocket
// if we have internet connection
if (hasInternet && this.firstRun) {
this.initializeWebSocket();
startPeriodicStatusUpdates();
this.firstRun = false;
return;
}

View File

@@ -383,9 +383,18 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => {
},
profilePictureContainer: {
marginBottom: 5,
marginRight: 10,
marginLeft: 12,
marginTop: 10,
// to compensate STATUS_BUFFER in profile_picture component
...Platform.select({
android: {
marginRight: 11,
},
ios: {
marginRight: 10,
},
}),
},
replyBar: {
backgroundColor: theme.centerChannelColor,

View File

@@ -407,21 +407,19 @@ export default class PostBody extends PureComponent {
return (
<View style={style.messageContainerWithReplyBar}>
<View style={replyBarStyle}/>
<View style={[style.row]}>
{body}
{isFailed &&
<TouchableOpacity
onPress={onFailedPostPress}
style={style.retry}
>
<Icon
name='ios-information-circle-outline'
size={26}
color={theme.errorTextColor}
/>
</TouchableOpacity>
}
</View>
{body}
{isFailed &&
<TouchableOpacity
onPress={onFailedPostPress}
style={style.retry}
>
<Icon
name='ios-information-circle-outline'
size={26}
color={theme.errorTextColor}
/>
</TouchableOpacity>
}
</View>
);
}
@@ -429,13 +427,10 @@ export default class PostBody extends PureComponent {
const getStyleSheet = makeStyleSheetFromTheme((theme) => {
return {
row: {
flexDirection: 'row',
},
messageBody: {
paddingBottom: 2,
paddingTop: 2,
width: '100%',
flex: 1,
},
messageContainer: {
width: '100%',
@@ -445,7 +440,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => {
},
retry: {
justifyContent: 'center',
marginLeft: 12,
marginLeft: 10,
},
message: {
color: theme.centerChannelColor,
@@ -454,6 +449,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme) => {
},
messageContainerWithReplyBar: {
flexDirection: 'row',
width: '100%',
},
pendingPost: {
opacity: 0.5,

View File

@@ -1,5 +1,65 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`DateHeader component should match snapshot when timezone is set 1`] = `
<View
style={
Array [
Object {
"alignItems": "center",
"flexDirection": "row",
"height": 28,
"marginTop": 8,
},
undefined,
]
}
>
<View
style={
Object {
"backgroundColor": "#3d3c40",
"flex": 1,
"height": 1,
"opacity": 0.2,
}
}
/>
<View
style={
Object {
"marginHorizontal": 15,
}
}
>
<InjectIntl(FormattedDate)
day="2-digit"
month="short"
style={
Object {
"color": "#3d3c40",
"fontSize": 14,
"fontWeight": "600",
}
}
timeZone="America/New_York"
value={1970-01-18T17:19:12.392Z}
weekday="short"
year="numeric"
/>
</View>
<View
style={
Object {
"backgroundColor": "#3d3c40",
"flex": 1,
"height": 1,
"opacity": 0.2,
}
}
/>
</View>
`;
exports[`DateHeader component should match snapshot with suffix 1`] = `
<View
style={

View File

@@ -17,11 +17,12 @@ export default class DateHeader extends PureComponent {
static propTypes = {
dateLineString: PropTypes.string.isRequired,
theme: PropTypes.object.isRequired,
timeZone: PropTypes.string,
style: ViewPropTypes.style,
};
render() {
const {theme, dateLineString} = this.props;
const {theme, timeZone, dateLineString} = this.props;
const style = getStyleSheet(theme);
const indexSuffix = dateLineString.indexOf(DATE_LINE_SUFFIX);
@@ -31,6 +32,17 @@ export default class DateHeader extends PureComponent {
} else {
date = new Date(parseInt(dateLineString.substring(DATE_LINE.length), 10));
}
const dateFormatProps = {
weekday: 'short',
day: '2-digit',
month: 'short',
year: 'numeric',
value: date,
};
if (timeZone) {
dateFormatProps.timeZone = timeZone;
}
return (
<View style={[style.container, this.props.style]}>
@@ -38,11 +50,7 @@ export default class DateHeader extends PureComponent {
<View style={style.dateContainer}>
<FormattedDate
style={style.date}
value={date}
weekday='short'
day='2-digit'
month='short'
year='numeric'
{...dateFormatProps}
/>
</View>
<View style={style.line}/>

View File

@@ -13,6 +13,7 @@ import DateHeader from './date_header.js';
describe('DateHeader', () => {
const baseProps = {
theme: Preferences.THEMES.default,
timeZone: null,
};
describe('component should match snapshot', () => {
@@ -43,5 +44,20 @@ describe('DateHeader', () => {
expect(wrapper.getElement()).toMatchSnapshot();
});
it('when timezone is set', () => {
const props = {
...baseProps,
dateLineString: 'date-1531152392-index-2',
timeZone: 'America/New_York',
index: 2,
};
const wrapper = shallow(
<DateHeader {...props}/>,
{context: {intl: {formatMessage: jest.fn()}}},
);
expect(wrapper.getElement()).toMatchSnapshot();
});
});
});

View File

@@ -3,13 +3,26 @@
import {connect} from 'react-redux';
import {getCurrentUser} from 'mattermost-redux/selectors/entities/users';
import {getTheme} from 'mattermost-redux/selectors/entities/preferences';
import {getUserCurrentTimezone} from 'mattermost-redux/utils/timezone_utils';
import {isTimezoneEnabled} from 'app/utils/timezone';
import DateHeader from './date_header';
function mapStateToProps(state) {
const enableTimezone = isTimezoneEnabled(state);
const currentUser = getCurrentUser(state);
let timeZone = null;
if (enableTimezone) {
timeZone = getUserCurrentTimezone(currentUser.timezone);
}
return {
theme: getTheme(state),
timeZone,
};
}

View File

@@ -5,7 +5,7 @@ import {connect} from 'react-redux';
import {General} from 'mattermost-redux/constants';
import {
getFavoriteChannelIds,
getSortedFavoriteChannelIds,
getSortedUnreadChannelIds,
getOrderedChannelIds,
} from 'mattermost-redux/selectors/entities/channels';
@@ -39,7 +39,7 @@ function mapStateToProps(state) {
const isSystemAdmin = checkIsSystemAdmin(roles);
const sidebarPrefs = getSidebarPreferences(state);
const unreadChannelIds = getSortedUnreadChannelIds(state, null);
const favoriteChannelIds = getFavoriteChannelIds(state);
const favoriteChannelIds = getSortedFavoriteChannelIds(state);
const orderedChannelIds = filterZeroUnreads(getOrderedChannelIds(
state,
null,

View File

@@ -227,6 +227,8 @@ export default class SlideUpPanel extends PureComponent {
transform: [{translateY: this.translateY}],
};
const headerComponent = header(this.headerRef);
return (
<TapGestureHandler
maxDurationMs={100000}
@@ -268,7 +270,7 @@ export default class SlideUpPanel extends PureComponent {
>
<Animated.View>
<SlideUpPanelIndicator/>
{header(this.headerRef)}
{headerComponent}
</Animated.View>
</PanGestureHandler>
<PanGestureHandler
@@ -279,7 +281,7 @@ export default class SlideUpPanel extends PureComponent {
onGestureEvent={this.onGestureEvent}
onHandlerStateChange={this.onHandlerStateChange}
>
<Animated.View style={[styles.container, !header && styles.border]}>
<Animated.View style={[styles.container, !headerComponent && styles.border]}>
<NativeViewGestureHandler
ref={this.scrollRef}
waitFor={this.masterRef}

View File

@@ -285,13 +285,13 @@ export default class ChannelInfo extends PureComponent {
}
});
handleFavorite = () => {
handleFavorite = preventDoubleTap(() => {
const {isFavorite, actions, currentChannel} = this.props;
const {favoriteChannel, unfavoriteChannel} = actions;
const toggleFavorite = isFavorite ? unfavoriteChannel : favoriteChannel;
this.setState({isFavorite: !isFavorite});
toggleFavorite(currentChannel.id);
};
});
handleClosePermalink = () => {
const {actions} = this.props;
@@ -304,7 +304,7 @@ export default class ChannelInfo extends PureComponent {
this.showPermalinkView(postId);
};
handleMuteChannel = () => {
handleMuteChannel = preventDoubleTap(() => {
const {actions, currentChannel, currentUserId, isChannelMuted} = this.props;
const {updateChannelNotifyProps} = actions;
const opts = {
@@ -313,7 +313,7 @@ export default class ChannelInfo extends PureComponent {
this.setState({isMuted: !isChannelMuted});
updateChannelNotifyProps(currentUserId, currentChannel.id, opts);
};
});
showPermalinkView = (postId) => {
const {actions, navigator} = this.props;
@@ -468,7 +468,6 @@ export default class ChannelInfo extends PureComponent {
/>
</React.Fragment>
)}
<View style={style.separator}/>
</React.Fragment>
);
};
@@ -507,60 +506,61 @@ export default class ChannelInfo extends PureComponent {
style={style.scrollView}
>
{currentChannel.hasOwnProperty('id') &&
<ChannelInfoHeader
createAt={currentChannel.create_at}
creator={currentChannelCreatorName}
displayName={currentChannel.display_name}
header={currentChannel.header}
memberCount={currentChannelMemberCount}
navigator={navigator}
onPermalinkPress={this.handlePermalinkPress}
purpose={currentChannel.purpose}
status={status}
theme={theme}
type={currentChannel.type}
isArchived={currentChannel.delete_at !== 0}
/>
<ChannelInfoHeader
createAt={currentChannel.create_at}
creator={currentChannelCreatorName}
displayName={currentChannel.display_name}
header={currentChannel.header}
memberCount={currentChannelMemberCount}
navigator={navigator}
onPermalinkPress={this.handlePermalinkPress}
purpose={currentChannel.purpose}
status={status}
theme={theme}
type={currentChannel.type}
isArchived={currentChannel.delete_at !== 0}
/>
}
<View style={style.rowsContainer}>
{this.actionsRows(style, channelIsArchived)}
{this.renderLeaveOrDeleteChannelRow() &&
<View>
<ChannelInfoRow
action={this.handleLeave}
defaultMessage='Leave Channel'
icon='sign-out'
textId={t('navbar.leave')}
theme={theme}
/>
</View>
<React.Fragment>
<View style={style.separator}/>
<ChannelInfoRow
action={this.handleLeave}
defaultMessage='Leave Channel'
icon='sign-out'
textId={t('navbar.leave')}
theme={theme}
/>
</React.Fragment>
}
</View>
{this.renderLeaveOrDeleteChannelRow() && canDeleteChannel && !channelIsArchived &&
<View style={style.footer}>
<ChannelInfoRow
action={this.handleDelete}
defaultMessage='Archive Channel'
iconColor='#CA3B27'
icon='archive'
textId={t('mobile.routes.channelInfo.delete_channel')}
textColor='#CA3B27'
theme={theme}
/>
</View>
<View style={style.footer}>
<ChannelInfoRow
action={this.handleDelete}
defaultMessage='Archive Channel'
iconColor='#CA3B27'
icon='archive'
textId={t('mobile.routes.channelInfo.delete_channel')}
textColor='#CA3B27'
theme={theme}
/>
</View>
}
{this.renderCloseDirect() &&
<View style={style.footer}>
<ChannelInfoRow
action={this.handleClose}
defaultMessage={defaultMessage}
icon='times'
iconColor='#CA3B27'
textId={i18nId}
textColor='#CA3B27'
theme={theme}
/>
</View>
<View style={style.footer}>
<ChannelInfoRow
action={this.handleClose}
defaultMessage={defaultMessage}
icon='times'
iconColor='#CA3B27'
textId={i18nId}
textColor='#CA3B27'
theme={theme}
/>
</View>
}
</ScrollView>
</View>

View File

@@ -41,6 +41,8 @@ function mapStateToProps(state, ownProps) {
let canAddReaction = true;
let canEdit = false;
let canEditUntil = -1;
let {canDelete} = ownProps;
let canPin = true;
if (hasNewPermissions(state)) {
canAddReaction = haveIChannelPermission(state, {
@@ -52,6 +54,8 @@ function mapStateToProps(state, ownProps) {
if (channelIsArchived) {
canAddReaction = false;
canDelete = false;
canPin = false;
} else {
canEdit = canEditPost(state, config, license, currentTeamId, currentChannelId, currentUserId, post);
if (canEdit && license.IsLicensed === 'true' &&
@@ -66,6 +70,8 @@ function mapStateToProps(state, ownProps) {
canAddReaction,
canEdit,
canEditUntil,
canDelete,
canPin,
currentTeamUrl: getCurrentTeamUrl(state),
isMyPost: currentUserId === post.user_id,
post,

View File

@@ -29,6 +29,7 @@ export default class PostOptions extends PureComponent {
additionalOption: PropTypes.object,
canAddReaction: PropTypes.bool,
canDelete: PropTypes.bool,
canPin: PropTypes.bool,
canEdit: PropTypes.bool,
canEditUntil: PropTypes.number.isRequired,
channelIsReadOnly: PropTypes.bool,
@@ -210,13 +211,19 @@ export default class PostOptions extends PureComponent {
const actions = [
this.getEditOption(),
this.getFlagOption(),
this.getPinOption(),
this.getAddReactionOption(),
this.getCopyPermalink(),
this.getCopyText(),
this.getDeleteOption(),
];
const {canDelete, canPin} = this.props;
if (canPin) {
actions.splice(2, 0, this.getPinOption());
}
if (canDelete) {
actions.push(this.getDeleteOption());
}
return actions.filter((a) => a !== null);
};
@@ -224,13 +231,19 @@ export default class PostOptions extends PureComponent {
const actions = [
this.getFlagOption(),
this.getAddReactionOption(),
this.getPinOption(),
this.getCopyPermalink(),
this.getCopyText(),
this.getEditOption(),
this.getDeleteOption(),
];
const {canDelete, canPin} = this.props;
if (canPin) {
actions.splice(2, 0, this.getPinOption());
}
if (canDelete) {
actions.push(this.getDeleteOption());
}
return actions.filter((a) => a !== null);
};

View File

@@ -31,7 +31,6 @@ function mapStateToProps(state) {
teamsRequest: state.requests.teams.getTeams,
teams: Object.values(getJoinableTeams(state)).sort(sortTeams),
currentChannelId: getCurrentChannelId(state),
joinTeamRequest: state.requests.teams.joinTeam,
};
}

View File

@@ -51,7 +51,6 @@ export default class SelectTeam extends PureComponent {
}).isRequired,
currentChannelId: PropTypes.string,
currentUrl: PropTypes.string.isRequired,
joinTeamRequest: PropTypes.object.isRequired,
navigator: PropTypes.object,
userWithoutTeams: PropTypes.bool,
teams: PropTypes.array.isRequired,
@@ -81,11 +80,6 @@ export default class SelectTeam extends PureComponent {
if (this.props.teams !== nextProps.teams) {
this.buildData(nextProps);
}
if (this.props.joinTeamRequest.status !== RequestStatus.FAILURE &&
nextProps.joinTeamRequest.status === RequestStatus.FAILURE) {
Alert.alert('', nextProps.joinTeamRequest.error.message);
}
}
getTeams = () => {
@@ -160,8 +154,9 @@ export default class SelectTeam extends PureComponent {
markChannelAsRead(currentChannelId);
}
const success = await joinTeam(team.invite_id, team.id);
if (!success) {
const {error} = await joinTeam(team.invite_id, team.id);
if (error) {
Alert.alert(error.message);
this.setState({joining: false});
return;
}

View File

@@ -36,7 +36,6 @@ describe('SelectTeam', () => {
actions,
currentChannelId: 'someId',
currentUrl: 'test',
joinTeamRequest: {},
navigator: {
setOnNavigatorEvent: jest.fn(),
},

View File

@@ -46,7 +46,7 @@ function isEmoticon(text) {
}
export function hasEmojisOnly(message, customEmojis) {
if (!message || message.length === 0) {
if (!message || message.length === 0 || (/^\s{4}/).test(message)) {
return {isEmojiOnly: false, shouldRenderJumboEmoji: false};
}

View File

@@ -60,6 +60,10 @@ describe('hasEmojisOnly with named emojis', () => {
name: 'Mixed valid and invalid named emojis',
message: ' :smile: invalid :heart: ',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}, {
name: 'This should render a codeblock instead',
message: ' :D',
expected: {isEmojiOnly: false, shouldRenderJumboEmoji: false},
}];
const customEmojis = new Map([['valid_custom', 0]]);

View File

@@ -487,7 +487,7 @@
"sidebar_right_menu.logout": "로그아웃",
"sidebar_right_menu.report": "문제 보고",
"sidebar.direct": "개인 메시지",
"sidebar.unreads": "More unreads",
"sidebar.unreads": "읽지 않은 글 더보기",
"signup.email": "이메일과 패스워드",
"status_dropdown.set_away": "다른 용무 중",
"status_dropdown.set_dnd": "방해 금지",

View File

@@ -1,13 +1,13 @@
{
"about.date": "Data kompilacji:",
"about.date": "Data Kompilacji:",
"about.enterpriseEditione1": "Wersja Enterprise",
"about.enterpriseEditionLearn": "Dowiedz się więcej na temat wydania Enteprise na stronie",
"about.enterpriseEditionSt": "Współczesna komunikacja dla przedsiębiorstw zza Twojego firewalla.",
"about.hash": "Wartość skrótu kompilacji",
"about.hashee": "Build Hash wersji enterprise:",
"about.hash": "Wartość Skrótu Kompilacji:",
"about.hashee": "Build Hash Wersji Enterprise:",
"about.teamEditionLearn": "Dołącz do społeczności Mattermost na stronie ",
"about.teamEditionSt": "Cała komunikacja Twojego zespołu w jednym miejscu, z natychmiastowym przeszukiwaniem i dostępna z każdego miejsca.",
"about.teamEditiont0": "Wydanie zespołowe",
"about.teamEditiont0": "Wydanie Zespołowe",
"about.teamEditiont1": "Wydanie Enterprise",
"about.title": "O Mattermost",
"announcment_banner.dont_show_again": "Don't show again",
@@ -18,7 +18,7 @@
"channel_header.directchannel.you": "{displayname} (Ty) ",
"channel_header.manageMembers": "Zarządzaj użytkownikami",
"channel_header.pinnedPosts": "Przypięte posty",
"channel_header.viewMembers": "Wyświetl użytkowników",
"channel_header.viewMembers": "Wyświetl Użytkowników",
"channel_info.header": "Nagłówek:",
"channel_info.purpose": "Cel:",
"channel_loader.someone": "Ktoś",
@@ -33,7 +33,7 @@
"channel_modal.optional": "(opcjonalne)",
"channel_modal.purpose": "Cel",
"channel_modal.purposeEx": "Np. \"Kanał do zgłaszania bugów i usprawnień\"",
"channel_notifications.muteChannel.settings": "kanał",
"channel_notifications.muteChannel.settings": "Wycisz kanał",
"combined_system_message.added_to_channel.many_expanded": "{users} and {lastUser} were **added to the channel** by {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} **added to the channel** by {actor}.",
"combined_system_message.added_to_channel.one_you": "You were **added to the channel** by {actor}.",
@@ -112,13 +112,13 @@
"login.signIn": "Zaloguj się",
"login.username": "Nazwa użytkownika",
"login.userNotFound": "Nie mogliśmy znaleźć konta pasującego do danych logowania.",
"mobile.about.appVersion": "Wersja aplikacji: {version} (Build {number})",
"mobile.about.appVersion": "Wersja Aplikacji: {version} (Build {number})",
"mobile.about.copyright": "Copyright 2015-{currentYear} Mattermost, Inc. Wszelkie prawa zastrzeżone.",
"mobile.about.database": "Baza danych: {type}",
"mobile.about.licensed": "Licensed to: {company}",
"mobile.about.powered_by": "{site} is powered by Mattermost",
"mobile.about.serverVersion": "Wersja serwera: {version} (Build {number})",
"mobile.about.serverVersionNoBuild": "Wersja serwera: {version}",
"mobile.about.serverVersion": "Wersja Serwera: {version} (Build {number})",
"mobile.about.serverVersionNoBuild": "Wersja Serwera: {version}",
"mobile.account_notifications.reply.header": "WYSYŁAJ POWIADOMIENIA DLA",
"mobile.account_notifications.threads_mentions": "Wzmianki w wątkach",
"mobile.account_notifications.threads_start": "Wątki, które rozpocząłem",
@@ -133,10 +133,10 @@
"mobile.advanced_settings.reset_message": "\nThis will reset all offline data and restart the app. You will be automatically logged back in once the app restarts.\n",
"mobile.advanced_settings.reset_title": "Reset Cache",
"mobile.advanced_settings.timezone": "Strefa Czasowa",
"mobile.advanced_settings.title": "Zaawansowane ustawienia",
"mobile.advanced_settings.title": "Zaawansowane Ustawienia",
"mobile.android.camera_permission_denied_description": "Aby zapisać obrazy i filmy do biblioteki, proszę zmień swoje ustawienia uprawnień.",
"mobile.android.camera_permission_denied_title": "Camera access is required",
"mobile.android.permission_denied_dismiss": "Dismiss",
"mobile.android.permission_denied_dismiss": "Odrzuć",
"mobile.android.permission_denied_retry": "Set permission",
"mobile.android.photos_permission_denied_description": "Aby zapisać obrazy i filmy do biblioteki, proszę zmień swoje ustawienia uprawnień.",
"mobile.android.photos_permission_denied_title": "Photo library access is required",
@@ -149,38 +149,38 @@
"mobile.authentication_error.title": "Błąd Autoryzacji",
"mobile.calendar.dayNames": "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday",
"mobile.calendar.dayNamesShort": "Sun,Mon,Tue,Wed,Thu,Fri,Sat",
"mobile.calendar.monthNames": "January,February,March,April,May,June,July,August,September,October,November,December",
"mobile.calendar.monthNamesShort": "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
"mobile.calendar.monthNames": "Styczeń,Luty,Marzec,Kwiecień,Maj,Czerwiec,Lipiec,Sierpień,Wrzesień,Październik,Listopad,Grudzień",
"mobile.calendar.monthNamesShort": "Sty,Lut,Mar,Kwi,Lip,Sie,Wrz,Paź,Lis,Gru",
"mobile.channel_drawer.search": "Jump to...",
"mobile.channel_info.alertMessageDeleteChannel": "Jesteś pewien, że chcesz opuścić {term} {name}?",
"mobile.channel_info.alertMessageLeaveChannel": "Jesteś pewien, że chcesz opuścić {term} {name}?",
"mobile.channel_info.alertNo": "Nie",
"mobile.channel_info.alertTitleDeleteChannel": "Archive {term}",
"mobile.channel_info.alertTitleDeleteChannel": "Archiwizuj {term}",
"mobile.channel_info.alertTitleLeaveChannel": "{term} - Opuść",
"mobile.channel_info.alertYes": "Tak",
"mobile.channel_info.delete_failed": "Nie można dołączyć do kanału {displayName}. Sprawdź swoje połączenie i spróbuj ponownie.",
"mobile.channel_info.edit": "Edit Channel",
"mobile.channel_info.edit": "Edytuj Kanał",
"mobile.channel_info.privateChannel": "Prywatny kanał",
"mobile.channel_info.publicChannel": "Kanał publiczny",
"mobile.channel_list.alertNo": "Nie",
"mobile.channel_list.alertYes": "Tak",
"mobile.channel_list.channels": "CHANNELS",
"mobile.channel_list.closeDM": "Zamknij wiadomość bezpośrednią",
"mobile.channel_list.closeGM": "Zamknij wiadomość grupową",
"mobile.channel_list.members": "MEMBERS",
"mobile.channel_list.channels": "KANAŁY",
"mobile.channel_list.closeDM": "Zamknij Wiadomość Bezpośrednią",
"mobile.channel_list.closeGM": "Zamknij Wiadomość Grupową",
"mobile.channel_list.members": "CZŁONKOWIE",
"mobile.channel_list.not_member": "NIE JEST UŻYTKOWNIKIEM",
"mobile.channel_list.unreads": "NIEPRZECZYTANE",
"mobile.channel_members.add_members_alert": "Musisz wybrać co najmniej jednego użytkownika, który ma zostać usunięty z kanału.",
"mobile.channel.markAsRead": "Mark As Read",
"mobile.client_upgrade": "Update App",
"mobile.client_upgrade.can_upgrade_subtitle": "A new version is available for download.",
"mobile.client_upgrade.can_upgrade_title": "Update Available",
"mobile.client_upgrade.close": "Update Later",
"mobile.client_upgrade.current_version": "Wersja serwera: {version}",
"mobile.client_upgrade.download_error.message": "An error occurred downloading the new version.",
"mobile.client_upgrade.download_error.title": "Unable to Install Update",
"mobile.client_upgrade.latest_version": "Wersja serwera: {version}",
"mobile.client_upgrade.listener.dismiss_button": "Dismiss",
"mobile.channel.markAsRead": "Oznacz Jako Przeczytane",
"mobile.client_upgrade": "Zaktualizuj Aplikacje",
"mobile.client_upgrade.can_upgrade_subtitle": "Nowa wersja jest dostępna do pobrania.",
"mobile.client_upgrade.can_upgrade_title": "Dostępna Aktualizacja",
"mobile.client_upgrade.close": "Zaktualizuj Później",
"mobile.client_upgrade.current_version": "Wersja Serwera: {version}",
"mobile.client_upgrade.download_error.message": "Wystąpił błąd podczas pobierania nowej wersji.",
"mobile.client_upgrade.download_error.title": "Nie można Zainstalować Aktualizacji",
"mobile.client_upgrade.latest_version": "Wersja Serwera: {version}",
"mobile.client_upgrade.listener.dismiss_button": "Odrzuć",
"mobile.client_upgrade.listener.learn_more_button": "Learn More",
"mobile.client_upgrade.listener.message": "A client upgrade is available!",
"mobile.client_upgrade.listener.upgrade_button": "Upgrade",
@@ -221,7 +221,7 @@
"mobile.edit_channel": "Zapisz",
"mobile.edit_post.title": "Edycja Wiadomości",
"mobile.emoji_picker.activity": "AKTYWNOŚCI",
"mobile.emoji_picker.custom": "CUSTOM",
"mobile.emoji_picker.custom": "NIESTANDARDOWE",
"mobile.emoji_picker.flags": "FLAGS",
"mobile.emoji_picker.foods": "JEDZENIE",
"mobile.emoji_picker.nature": "NATURE",
@@ -286,7 +286,7 @@
"mobile.notice_platform_link": "serwer",
"mobile.notice_text": "Mattermost is made possible by the open source software used in our {platform} and {mobile}.",
"mobile.notification_settings_mentions.keywords": "Słowa kluczowe:",
"mobile.notification_settings_mentions.keywordsDescription": "Other words that trigger a mention",
"mobile.notification_settings_mentions.keywordsDescription": "Inne słowa, które uruchamiają wzmianki",
"mobile.notification_settings_mentions.keywordsHelp": "Keywords are non-case sensitive and should be separated by a comma.",
"mobile.notification_settings_mentions.wordsTrigger": "SŁOWA, KTÓRE URUCHAMIAJĄ WZMIANKI",
"mobile.notification_settings_mobile.default_sound": "Domyślny ({sound})",
@@ -302,7 +302,7 @@
"mobile.notification_settings_mobile.test_push": "To jest powiadomienie testowe push",
"mobile.notification_settings_mobile.vibrate": "Wibracje",
"mobile.notification_settings.auto_responder_short": "Automatyczne Odpowiedzi",
"mobile.notification_settings.auto_responder.default_message": "Witaj, jestem nieobecny i nie mogę odpowiadać na wiadomości.",
"mobile.notification_settings.auto_responder.default_message": "Witaj, jestem niedostępny i nie mogę obecnie odpowiadać na wiadomości.",
"mobile.notification_settings.auto_responder.enabled": "Włączony",
"mobile.notification_settings.auto_responder.footer_message": "Ustaw niestandardową wiadomość, która zostanie automatycznie wysłana w odpowiedzi na Wiadomości Bezpośrednie. Wzmianki na Kanałach Publicznych i Prywatnych nie uruchamiają automatycznej odpowiedzi. Włączenie Automatycznych Odpowiedzi ustawia twój status na Nieobecny i wyłącza powiadomienia email i push.",
"mobile.notification_settings.auto_responder.message_placeholder": "Wiadomość",
@@ -311,10 +311,10 @@
"mobile.notification_settings.email_title": "Powiadomienia Email",
"mobile.notification_settings.email.send": "WYŚLIJ POWIADOMIENIA EMAIL",
"mobile.notification_settings.mentions_replies": "Wzmianki i Odpowiedzi",
"mobile.notification_settings.mentions.channelWide": "Channel-wide mentions",
"mobile.notification_settings.mentions.channelWide": "Wzmianki na kanale",
"mobile.notification_settings.mentions.reply_title": "Wyślij powiadomienia o odpowiedzi do",
"mobile.notification_settings.mentions.sensitiveName": "Twoje imię z rozróżnianiem wielkich i małych liter",
"mobile.notification_settings.mentions.sensitiveUsername": "Your non-case sensitive username",
"mobile.notification_settings.mentions.sensitiveUsername": "Twoja nazwa użytkownika bez rozróżniania wielkości liter",
"mobile.notification_settings.mobile": "Mobile",
"mobile.notification_settings.mobile_title": "Powiadomienia mobilne push",
"mobile.notification_settings.modal_cancel": "ANULUJ",
@@ -354,7 +354,7 @@
"mobile.post.retry": "Odśwież",
"mobile.posts_view.moreMsg": "Więcej Nowych Wiadomości Powyżej",
"mobile.recent_mentions.empty_description": "W tym miejscu pojawią się wiadomości zawierające Twoją nazwę użytkownika i inne słowa, które będą wyzwalać wzmianki.",
"mobile.recent_mentions.empty_title": "Ostatnie wzmianki",
"mobile.recent_mentions.empty_title": "Brak Ostatnich Wzmianek",
"mobile.rename_channel.display_name_maxLength": "Nazwa kanału musi posiadać mniej niż {maxLength, number} znaków",
"mobile.rename_channel.display_name_minLength": "Channel name must be {minLength, number} or more characters",
"mobile.rename_channel.display_name_required": "Channel name is required",
@@ -409,10 +409,10 @@
"mobile.server_upgrade.title": "Wymagane uaktualnienie serwera",
"mobile.server_url.invalid_format": "Adres musi zaczynać się od http:// lub https://",
"mobile.session_expired": "Sesja wygasła: zaloguj się, aby kontynuować otrzymywanie powiadomień.",
"mobile.set_status.away": "Zaraz wracam",
"mobile.set_status.away": "Nieobecny",
"mobile.set_status.dnd": "Nie przeszkadzać",
"mobile.set_status.offline": "Offline",
"mobile.set_status.online": "Online",
"mobile.set_status.online": "Dostępny",
"mobile.settings.modal.check_for_upgrade": "Sprawdź Aktualizacje",
"mobile.share_extension.cancel": "Anuluj",
"mobile.share_extension.channel": "Kanał",
@@ -429,8 +429,8 @@
"mobile.terms_of_service.get_terms_error_description": "Make sure you have an active internet connection and try again. If this issue persists, contact your System Administrator.",
"mobile.terms_of_service.get_terms_error_title": "Unable to load terms of service.",
"mobile.terms_of_service.terms_rejected": "You must agree to the terms of service before accessing {siteName}. Please contact your System Administrator for more details.",
"mobile.timezone_settings.automatically": "Set automatically",
"mobile.timezone_settings.manual": "Change timezone",
"mobile.timezone_settings.automatically": "Ustaw automatycznie",
"mobile.timezone_settings.manual": "Zmień strefę czasową",
"mobile.timezone_settings.select": "Select Timezone",
"mobile.user_list.deactivated": "Dezaktywuj",
"mobile.user.settings.notifications.email.fifteenMinutes": "Every 15 minutes",
@@ -441,7 +441,7 @@
"mobile.youtube_playback_error.description": "An error occurred while trying to play the YouTube video.\nDetails: {details}",
"mobile.youtube_playback_error.title": "YouTube playback error",
"modal.manual_status.auto_responder.message_": "Would you like to switch your status to \"{status}\" and disable Automatic Replies?",
"modal.manual_status.auto_responder.message_away": "Would you like to switch your status to \"Away\" and disable Automatic Replies?",
"modal.manual_status.auto_responder.message_away": "Czy chcesz zmienić swój status na \"Zaraz Wracam\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_dnd": "Would you like to switch your status to \"Do Not Disturb\" and disable Automatic Replies?",
"modal.manual_status.auto_responder.message_offline": "Would you like to switch your status to \"Offline\" and disable Automatic Replies?",
"modal.manual_status.auto_responder.message_online": "Would you like to switch your status to \"Online\" and disable Automatic Replies?",
@@ -470,30 +470,30 @@
"post_info.bot": "BOT",
"post_info.del": "Usuń",
"post_info.edit": "Edytuj",
"post_info.message.show_less": "Show Less",
"post_info.message.show_more": "Show More",
"post_info.message.show_less": "Pokaż Mniej",
"post_info.message.show_more": "Pokaż Więcej",
"post_info.system": "System",
"post_message_view.edited": "(edytowany)",
"posts_view.newMsg": "Nowe wiadomości",
"posts_view.newMsg": "Nowe Wiadomości",
"quick_switch_modal.teams": "Warunki",
"rename_channel.handleHolder": "alfanumeryczne znaki z małej litery",
"rename_channel.url": "Adres URL:",
"rhs_thread.rootPostDeletedMessage.body": "Part of this thread has been deleted due to a data retention policy. You can no longer reply to this thread.",
"search_bar.search": "Szukaj",
"search_header.results": "Wyniki wyszukiwania",
"search_header.title2": "Ostatnie wzmianki",
"search_header.title2": "Ostatnie Wzmianki",
"search_header.title3": "Oznaczone posty",
"search_item.channelArchived": "Archived",
"sidebar_right_menu.logout": "Wyloguj",
"sidebar_right_menu.report": "Zgłoś problem",
"sidebar.direct": "DIRECT MESSAGES",
"sidebar.unreads": "More unreads",
"sidebar_right_menu.report": "Zgłoś Problem",
"sidebar.direct": "WIADOMOŚCI BEZPOŚREDNIE",
"sidebar.unreads": "Więcej nieprzeczytanych",
"signup.email": "E-mail i hasło",
"status_dropdown.set_away": "Zaraz wracam",
"status_dropdown.set_dnd": "Nie przeszkadzać",
"status_dropdown.set_offline": "Offline",
"status_dropdown.set_online": "Online",
"status_dropdown.set_ooo": "Out of Office",
"status_dropdown.set_online": "Dostępny",
"status_dropdown.set_ooo": "Poza Biurem",
"suggestion.mention.all": "OSTRZEŻENIE: wspomina wszystkich na kanale",
"suggestion.mention.channel": "Powiadamia wszystkich na kanale",
"suggestion.mention.channels": "Moje kanały",

View File

@@ -26,13 +26,13 @@
"channel_modal.cancel": "Anulare",
"channel_modal.descriptionHelp": "Descrieți cum trebuie folosit acest canal.",
"channel_modal.header": "Antet",
"channel_modal.headerEx": "De exemplu: &quot;[Link Title] (http://example.com)&quot;",
"channel_modal.headerEx": "De exemplu: \"[Adresa Titlu] (http://example.com)\"",
"channel_modal.headerHelp": "Setați textul care va apărea în antetul canalului de lângă numele canalului. De exemplu, includeți linkurile frecvent utilizate prin tastarea [Link Title] (http://example.com).",
"channel_modal.name": "Nume",
"channel_modal.nameEx": "De exemplu: &quot;Bugs&quot;, &quot;Marketing&quot;, &quot;客户 支持&quot;",
"channel_modal.nameEx": "De exemplu: \"Bugs\", \"Marketing\", \"客户 支持\"",
"channel_modal.optional": "(opțional)",
"channel_modal.purpose": "Scop",
"channel_modal.purposeEx": "De exemplu: &quot;Un canal pentru a trimite bug-uri și îmbunătățiri&quot;",
"channel_modal.purposeEx": "De exemplu: \"Un canal pentru a trimite bug-uri și îmbunătățiri\"",
"channel_notifications.muteChannel.settings": "Dezactivați canalul",
"combined_system_message.added_to_channel.many_expanded": "{users} și {lastUser} au fost ** adăugați la canalul ** de către {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} ** a fost adăugat la canalul ** de către {actor}.",
@@ -366,7 +366,7 @@
"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.title_ooo": "Dezactivați &quot;Out of Office&quot;?",
"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.",
@@ -440,11 +440,11 @@
"mobile.video.save_error_title": "Salvați eroarea video",
"mobile.youtube_playback_error.description": "A apărut o eroare în timp ce încerca pentru a rula video de pe YouTube.\nDetalii: {details}",
"mobile.youtube_playback_error.title": "YouTube eroare de redare",
"modal.manual_status.auto_responder.message_": "Doriți să treceți statutul dvs. la &quot;{status}&quot; și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_away": "Doriți să vă schimbați statutul în &quot;Away&quot; și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_dnd": "Doriți să vă schimbați statutul în &quot;Nu deranjați&quot; și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_offline": "Doriți să vă schimbați statutul în &quot;Offline&quot; și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_online": "Doriți să vă schimbați statusul la &quot;Online&quot; și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_": "Doriți să treceți statutul dvs. la \"{status}\" și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_away": "Doriți să vă schimbați statutul în \"Plecat\" și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_dnd": "Doriți să vă schimbați statutul în \"Nu deranjați\" și să dezactivați răspunsurile automate?",
"modal.manual_status.auto_responder.message_offline": "Doriți să vă schimbați statutul în \"Offline\" și să dezactivați răspunsurile automate?",
"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 ...",
@@ -474,7 +474,7 @@
"post_info.message.show_more": "Detalii",
"post_info.system": "Sistem",
"post_message_view.edited": "(editat)",
"posts_view.newMsg": "Mesaje noi% 1: number of unread messages% 2: total number of messages",
"posts_view.newMsg": "Mesaje noi",
"quick_switch_modal.teams": "Echipe",
"rename_channel.handleHolder": "caractere alfanumerice minuscule",
"rename_channel.url": "URL",

View File

@@ -409,7 +409,7 @@
"mobile.server_upgrade.title": "Потрібно оновлення сервера",
"mobile.server_url.invalid_format": "Адреса повинен починатися з http:// або https://",
"mobile.session_expired": "Сесія закінчилася. Увійдіть, щоб продовжувати отримувати сповіщення.",
"mobile.set_status.away": "Далеко",
"mobile.set_status.away": "Не на місці",
"mobile.set_status.dnd": "Не турбувати ",
"mobile.set_status.offline": "Offline",
"mobile.set_status.online": "Online",
@@ -489,7 +489,7 @@
"sidebar.direct": "ОСОБИСТІ ПОВІДОМЛЕННЯ",
"sidebar.unreads": "НОВІ ПОВІДОМЛЕННЯ ",
"signup.email": "Email і пароль ",
"status_dropdown.set_away": "Далеко ",
"status_dropdown.set_away": "Не на місці ",
"status_dropdown.set_dnd": "Не турбувати ",
"status_dropdown.set_offline": "Offline ",
"status_dropdown.set_online": "Online ",
@@ -537,7 +537,7 @@
"user.settings.notifications.emailInfo": "Поштові повідомлення при згадках і особистих повідомленнях починають відправлятися якщо ви не в мережі або відійшли з {siteName} більше ніж на 5 хвилин.",
"user.settings.notifications.never": "Ніколи ",
"user.settings.notifications.onlyMentions": "Тільки для згадування та прямих повідомлень",
"user.settings.push_notification.away": "Відсутня або не в мережі",
"user.settings.push_notification.away": "Не на місці або не в мережі",
"user.settings.push_notification.disabled": "Email повідомлення відключені ",
"user.settings.push_notification.disabled_long": "Системний адміністратор не активував сповіщення електронною поштою. ",
"user.settings.push_notification.offline": "Не в мережі",

View File

@@ -309,15 +309,16 @@ platform :ios do
error do |lane, exception|
version = get_version_number(xcodeproj: './ios/Mattermost.xcodeproj', target: 'Mattermost')
build_number = get_build_number(xcodeproj: './ios/Mattermost.xcodeproj')
send_message_to_mattermost(
version,
build_number,
'',
'Unsuccessful Build',
exception.message,
[:lane],
false
)
send_message_to_mattermost({
:version_number => version,
:build_number => build_number,
:pretext => '',
:title => 'Unsuccessful Build',
:thumb_url => 'https://support.apple.com/library/content/dam/edam/applecare/images/en_US/iOS/move-to-ios-icon.png',
:msg => exception.message,
:default_payloads => [:lane],
:success => false
})
end
def build_ios()
@@ -438,7 +439,16 @@ platform :android do
gradle_file: './android/app/build.gradle'
)
send_message_to_mattermost(version_number, build_number, '', 'Unsuccessful Build', exception.message, [:lane], false)
send_message_to_mattermost({
:version_number => version_number,
:build_number => build_number,
:pretext => '',
:title => 'Unsuccessful Build',
:thumb_url => 'https://lh3.ggpht.com/XL0CrI8skkxnboGct-duyg-bZ_MxJDTrjczyjdU8OP2PM1dmj7SP4jL1K8JQeMIB3AM=w300',
:msg => exception.message,
:default_payloads => [:lane],
:success => false,
})
end
def build_android()
@@ -482,26 +492,26 @@ def save_config_json(json)
end
end
def send_message_to_mattermost(version_number, build_number, pretext, title, msg, default_payloads, success)
def send_message_to_mattermost(options)
unless ENV['MATTERMOST_WEBHOOK_URL'].nil? || ENV['MATTERMOST_WEBHOOK_URL'].empty?
mattermost(
pretext: pretext,
message: msg,
default_payloads: default_payloads,
pretext: options[:pretext],
message: options[:msg],
default_payloads: options[:default_payloads],
username: 'Fastlane',
icon_url: 'https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane.png',
payload: {},
attachment_properties: {
title: title,
thumb_url: 'https://lh3.ggpht.com/XL0CrI8skkxnboGct-duyg-bZ_MxJDTrjczyjdU8OP2PM1dmj7SP4jL1K8JQeMIB3AM=w300',
title: options[:title],
thumb_url: options[:thumb_url],
fields: [{
title: 'Version',
value: version_number,
value: options[:version_number],
short: true
},
{
title: 'Build Number',
value: build_number,
value: options[:build_number],
short: true
},
{
@@ -510,7 +520,7 @@ def send_message_to_mattermost(version_number, build_number, pretext, title, msg
short: true
}]
},
success: success
success: options[:success]
)
end
end
@@ -545,15 +555,16 @@ def submit_to_store
msg = 'Sign up as a beta tester [here](https://play.google.com/apps/testing/com.mattermost.rnbeta)'
end
send_message_to_mattermost(
version_number,
build_number,
pretext,
'',
msg,
[],
true
)
send_message_to_mattermost({
:version_number => version_number,
:build_number => build_number,
:pretext => pretext,
:title => '',
:thumb_url => 'https://lh3.ggpht.com/XL0CrI8skkxnboGct-duyg-bZ_MxJDTrjczyjdU8OP2PM1dmj7SP4jL1K8JQeMIB3AM=w300',
:msg => msg,
:default_payloads => [],
:success => true,
})
end
# Submit to TestFlight if required
@@ -574,15 +585,16 @@ def submit_to_store
version = get_version_number(xcodeproj: './ios/Mattermost.xcodeproj', target: 'Mattermost')
build_number = get_build_number(xcodeproj: './ios/Mattermost.xcodeproj')
send_message_to_mattermost(
version,
build_number,
pretext,
'',
msg,
[],
true
)
send_message_to_mattermost({
:version_number => version_number,
:build_number => build_number,
:pretext => pretext,
:title => '',
:thumb_url => 'https://support.apple.com/library/content/dam/edam/applecare/images/en_US/iOS/move-to-ios-icon.png',
:msg => msg,
:default_payloads => [],
:success => true,
})
end
unless apk_path.nil?

View File

@@ -6,17 +6,17 @@ GEM
public_suffix (>= 2.0.2, < 4.0)
atomos (0.1.3)
aws-eventstream (1.0.1)
aws-partitions (1.114.0)
aws-sdk-core (3.38.0)
aws-partitions (1.129.0)
aws-sdk-core (3.44.2)
aws-eventstream (~> 1.0)
aws-partitions (~> 1.0)
aws-sigv4 (~> 1.0)
jmespath (~> 1.0)
aws-sdk-kms (1.11.0)
aws-sdk-core (~> 3, >= 3.26.0)
aws-sdk-kms (1.13.0)
aws-sdk-core (~> 3, >= 3.39.0)
aws-sigv4 (~> 1.0)
aws-sdk-s3 (1.24.1)
aws-sdk-core (~> 3, >= 3.37.0)
aws-sdk-s3 (1.30.0)
aws-sdk-core (~> 3, >= 3.39.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.0)
aws-sigv4 (1.0.3)
@@ -28,24 +28,25 @@ GEM
highline (~> 1.7.2)
declarative (0.0.10)
declarative-option (0.1.0)
digest-crc (0.4.1)
domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.5.0)
dotenv (2.6.0)
emoji_regex (0.1.1)
excon (0.62.0)
faraday (0.15.3)
faraday (0.15.4)
multipart-post (>= 1.2, < 3)
faraday-cookie_jar (0.0.6)
faraday (>= 0.7.4)
http-cookie (~> 1.0.0)
faraday_middleware (0.12.2)
faraday (>= 0.7.4, < 1.0)
fastimage (2.1.4)
fastlane (2.108.0)
fastimage (2.1.5)
fastlane (2.113.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.3, < 3.0.0)
babosa (>= 1.0.2, < 2.0.0)
bundler (>= 1.12.0, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored
commander-fastlane (>= 4.4.6, < 5.0.0)
dotenv (>= 2.1.1, < 3.0.0)
@@ -57,6 +58,7 @@ GEM
fastimage (>= 2.1.0, < 3.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-api-client (>= 0.21.2, < 0.24.0)
google-cloud-storage (>= 1.15.0, < 2.0.0)
highline (>= 1.7.2, < 2.0.0)
json (< 3.0.0)
mini_magick (~> 4.5.1)
@@ -91,6 +93,15 @@ GEM
representable (~> 3.0)
retriable (>= 2.0, < 4.0)
signet (~> 0.9)
google-cloud-core (1.2.7)
google-cloud-env (~> 1.0)
google-cloud-env (1.0.5)
faraday (~> 0.11)
google-cloud-storage (1.15.0)
digest-crc (~> 0.4)
google-api-client (~> 0.23)
google-cloud-core (~> 1.2)
googleauth (~> 0.6.2)
googleauth (0.6.7)
faraday (~> 0.12)
jwt (>= 1.4, < 3.0)
@@ -110,16 +121,16 @@ GEM
mime-types-data (~> 3.2015)
mime-types-data (3.2018.0812)
mini_magick (4.5.1)
mini_portile2 (2.3.0)
mini_portile2 (2.4.0)
multi_json (1.13.1)
multi_xml (0.6.0)
multipart-post (2.0.0)
nanaimo (0.2.6)
naturally (2.2.0)
nokogiri (1.8.5)
mini_portile2 (~> 2.3.0)
nokogiri (1.10.0)
mini_portile2 (~> 2.4.0)
os (1.0.0)
plist (3.4.0)
plist (3.5.0)
public_suffix (2.0.5)
representable (3.0.4)
declarative (< 0.1.0)
@@ -143,13 +154,13 @@ GEM
unicode-display_width (~> 1.1, >= 1.1.1)
tty-cursor (0.6.0)
tty-screen (0.6.5)
tty-spinner (0.8.0)
tty-cursor (>= 0.5.0)
tty-spinner (0.9.0)
tty-cursor (~> 0.6.0)
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.5)
unicode-display_width (1.4.0)
unicode-display_width (1.4.1)
word_wrap (1.0.0)
xcodeproj (1.7.0)
CFPropertyList (>= 2.3.3, < 4.0)
@@ -175,4 +186,4 @@ DEPENDENCIES
nokogiri
BUNDLED WITH
1.16.1
1.17.3

View File

@@ -2527,7 +2527,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 166;
CURRENT_PROJECT_VERSION = 170;
DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;
@@ -2579,7 +2579,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 166;
CURRENT_PROJECT_VERSION = 170;
DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;

View File

@@ -19,7 +19,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.15.1</string>
<string>1.15.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -34,7 +34,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>166</string>
<string>170</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>

View File

@@ -21,9 +21,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.15.1</string>
<string>1.15.2</string>
<key>CFBundleVersion</key>
<string>166</string>
<string>170</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>

View File

@@ -15,10 +15,10 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.15.1</string>
<string>1.15.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>166</string>
<string>170</string>
</dict>
</plist>