// 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 { Image, InteractionManager, 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 EventEmitter from 'mattermost-redux/utils/event_emitter'; 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} = this.props; EventEmitter.emit('close_channel_drawer'); InteractionManager.runAfterInteractions(() => { navigator.dismissInAppNotification(); if (!notification.localNotification) { actions.loadFromPushNotification(notification); if (Platform.OS === 'android') { navigator.dismissModal({animation: 'none'}); } navigator.popToRoot({ animated: false, }); } }); }; getNotificationIcon = () => { const {config, notification, user} = this.props; const {data} = notification; let icon = ( ); if (data.from_webhook && config.EnablePostIconOverride === 'true' && data.use_user_icon !== 'true') { const wsIcon = data.override_icon_url ? {uri: data.override_icon_url} : webhookIcon; icon = ( ); } else if (user) { icon = ( ); } return icon; }; getNotificationTitle = (notification) => { const {channel} = this.props; const {message, data} = notification; if (data.version === 'v2') { if (data.channel_name) { return ( {data.channel_name} ); } return null; } const msg = message.split(':'); const titleText = msg.shift(); 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 {data, message} = notification; if (message) { let messageText; if (data.version !== 'v2') { const msg = message.split(':'); messageText = msg.join('').trim(); } else if (Platform.OS === 'ios') { messageText = message.body || message; } else { messageText = message; } const title = this.getNotificationTitle(notification); 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, }, });