// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {
Image,
Platform,
StyleSheet,
Text,
TouchableOpacity,
View
} from 'react-native';
import FormattedText from 'app/components/formatted_text';
import ProfilePicture from 'app/components/profile_picture';
import {changeOpacity} from 'app/utils/theme';
import {isDirectChannel} from 'mattermost-redux/utils/channel_utils';
import {displayUsername} from 'mattermost-redux/utils/user_utils';
import logo from 'assets/images/icon.png';
import webhookIcon from 'assets/images/icons/webhook.jpg';
const IMAGE_SIZE = 33;
export default class Notification extends PureComponent {
static propTypes = {
actions: PropTypes.shape({
loadFromPushNotification: PropTypes.func.isRequired
}).isRequired,
channel: PropTypes.object,
config: PropTypes.object,
deviceWidth: PropTypes.number.isRequired,
notification: PropTypes.object.isRequired,
teammateNameDisplay: PropTypes.string,
navigator: PropTypes.object,
theme: PropTypes.object.isRequired,
user: PropTypes.object
};
notificationTapped = () => {
const {actions, navigator, notification, theme} = this.props;
navigator.dismissInAppNotification();
if (!notification.localNotification) {
actions.loadFromPushNotification(notification);
navigator.resetTo({
screen: 'Channel',
animated: false,
navigatorStyle: {
navBarHidden: true,
statusBarHidden: false,
statusBarHideWithNavBar: false,
screenBackgroundColor: theme.centerChannelBg
}
});
}
};
getNotificationIcon = () => {
const {config, notification, user} = this.props;
const {data} = notification;
let icon = (
);
if (data.from_webhook && config.EnablePostIconOverride === 'true') {
const wsIcon = data.override_icon_url ? {uri: data.override_icon_url} : webhookIcon;
icon = (
);
} else if (user) {
icon = (
);
}
return icon;
};
getNotificationTitle = (titleText) => {
const {channel} = this.props;
let title = (
{titleText}
);
const userName = this.getNotificationUserName();
if (userName && channel) {
let channelName;
let inText;
if (!isDirectChannel(channel)) {
inText = (
);
channelName = (
{channel.display_name}
);
}
title = (
{userName}
{inText}
{channelName}
);
}
return title;
};
getNotificationUserName = () => {
const {config, notification, teammateNameDisplay, user} = this.props;
const {data} = notification;
let userName;
if (data.override_username && config.EnablePostUsernameOverride === 'true') {
userName = (
{data.override_username}
);
} else if (user) {
userName = (
{displayUsername(user, teammateNameDisplay)}
);
}
return userName;
};
render() {
const {deviceWidth, notification} = this.props;
const {message} = notification;
if (message) {
const msg = message.split(':');
const titleText = msg.shift();
const messageText = msg.join('').trim();
const title = this.getNotificationTitle(titleText);
const icon = this.getNotificationIcon();
return (
{icon}
{title}
{messageText}
);
}
return null;
}
}
const style = StyleSheet.create({
container: {
alignItems: 'flex-start',
backgroundColor: changeOpacity('#000', 0.9),
flexDirection: 'row',
justifyContent: 'flex-start',
paddingHorizontal: 10,
...Platform.select({
android: {
height: 68
},
ios: {
height: 88
}
})
},
iconContainer: {
...Platform.select({
android: {
paddingTop: 17
},
ios: {
paddingTop: 37
}
})
},
icon: {
borderRadius: (IMAGE_SIZE / 2),
height: IMAGE_SIZE,
width: IMAGE_SIZE
},
textContainer: {
flex: 1,
flexDirection: 'column',
alignSelf: 'stretch',
alignItems: 'flex-start',
marginLeft: 10,
...Platform.select({
android: {
marginTop: 17,
height: 50
},
ios: {
paddingTop: 37
}
})
},
title: {
color: '#FFFFFF',
fontSize: 14,
fontWeight: '600'
},
channelName: {
alignSelf: 'stretch',
alignItems: 'flex-start',
flex: 1
},
message: {
color: '#FFFFFF',
fontSize: 14
}
});