172 lines
4.5 KiB
JavaScript
172 lines
4.5 KiB
JavaScript
|
import React, { useEffect } from 'react';
|
||
|
import PropTypes from 'prop-types';
|
||
|
import { StyleSheet, Text, View, ScrollView } from 'react-native';
|
||
|
import { useSelector } from 'react-redux';
|
||
|
|
||
|
import I18n from '../i18n';
|
||
|
import SafeAreaView from '../containers/SafeAreaView';
|
||
|
import StatusBar from '../containers/StatusBar';
|
||
|
import Button from '../containers/Button';
|
||
|
import { useTheme } from '../theme';
|
||
|
import RocketChat from '../lib/rocketchat';
|
||
|
import Navigation from '../lib/Navigation';
|
||
|
import { goRoom } from '../utils/goRoom';
|
||
|
import { themes } from '../constants/colors';
|
||
|
import Markdown from '../containers/markdown';
|
||
|
import sharedStyles from './Styles';
|
||
|
|
||
|
const styles = StyleSheet.create({
|
||
|
scroll: {
|
||
|
flex: 1
|
||
|
},
|
||
|
container: {
|
||
|
flex: 1,
|
||
|
marginTop: 12,
|
||
|
marginHorizontal: 15
|
||
|
},
|
||
|
cannedText: {
|
||
|
marginTop: 8,
|
||
|
marginBottom: 16,
|
||
|
fontSize: 14,
|
||
|
paddingTop: 0,
|
||
|
paddingBottom: 0,
|
||
|
...sharedStyles.textRegular
|
||
|
},
|
||
|
cannedTagWrap: {
|
||
|
borderRadius: 4,
|
||
|
marginRight: 4,
|
||
|
marginTop: 8,
|
||
|
height: 16
|
||
|
},
|
||
|
cannedTagContainer: {
|
||
|
flexDirection: 'row',
|
||
|
flexWrap: 'wrap'
|
||
|
},
|
||
|
cannedTag: {
|
||
|
fontSize: 12,
|
||
|
paddingTop: 0,
|
||
|
paddingBottom: 0,
|
||
|
paddingHorizontal: 4,
|
||
|
...sharedStyles.textRegular
|
||
|
},
|
||
|
button: {
|
||
|
margin: 24,
|
||
|
marginBottom: 24
|
||
|
},
|
||
|
item: {
|
||
|
paddingVertical: 10,
|
||
|
justifyContent: 'center'
|
||
|
},
|
||
|
itemLabel: {
|
||
|
marginBottom: 10,
|
||
|
fontSize: 14,
|
||
|
...sharedStyles.textMedium
|
||
|
},
|
||
|
itemContent: {
|
||
|
fontSize: 14,
|
||
|
...sharedStyles.textRegular
|
||
|
}
|
||
|
});
|
||
|
|
||
|
const Item = ({ label, content, theme, testID }) =>
|
||
|
content ? (
|
||
|
<View style={styles.item} testID={testID}>
|
||
|
<Text accessibilityLabel={label} style={[styles.itemLabel, { color: themes[theme].titleText }]}>
|
||
|
{label}
|
||
|
</Text>
|
||
|
<Markdown style={[styles.itemContent, { color: themes[theme].auxiliaryText }]} msg={content} theme={theme} />
|
||
|
</View>
|
||
|
) : null;
|
||
|
Item.propTypes = {
|
||
|
label: PropTypes.string,
|
||
|
content: PropTypes.string,
|
||
|
theme: PropTypes.string,
|
||
|
testID: PropTypes.string
|
||
|
};
|
||
|
|
||
|
const CannedResponseDetail = ({ navigation, route }) => {
|
||
|
const { cannedResponse } = route?.params;
|
||
|
const { theme } = useTheme();
|
||
|
const { isMasterDetail } = useSelector(state => state.app);
|
||
|
const { rooms } = useSelector(state => state.room);
|
||
|
|
||
|
useEffect(() => {
|
||
|
navigation.setOptions({
|
||
|
title: `!${cannedResponse?.shortcut}`
|
||
|
});
|
||
|
}, []);
|
||
|
|
||
|
const navigateToRoom = item => {
|
||
|
const { room } = route.params;
|
||
|
const { name, username } = room;
|
||
|
const params = {
|
||
|
rid: room.rid,
|
||
|
name: RocketChat.getRoomTitle({
|
||
|
t: room.t,
|
||
|
fname: name,
|
||
|
name: username
|
||
|
}),
|
||
|
t: room.t,
|
||
|
roomUserId: RocketChat.getUidDirectMessage(room),
|
||
|
usedCannedResponse: item.text
|
||
|
};
|
||
|
|
||
|
if (room.rid) {
|
||
|
// if it's on master detail layout, we close the modal and replace RoomView
|
||
|
if (isMasterDetail) {
|
||
|
Navigation.navigate('DrawerNavigator');
|
||
|
goRoom({ item: params, isMasterDetail, usedCannedResponse: item.text });
|
||
|
} else {
|
||
|
let navigate = navigation.push;
|
||
|
// if this is a room focused
|
||
|
if (rooms.includes(room.rid)) {
|
||
|
({ navigate } = navigation);
|
||
|
}
|
||
|
navigate('RoomView', params);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
return (
|
||
|
<SafeAreaView>
|
||
|
<ScrollView contentContainerStyle={[styles.scroll, { backgroundColor: themes[theme].messageboxBackground }]}>
|
||
|
<StatusBar />
|
||
|
<View style={styles.container}>
|
||
|
<Item label={I18n.t('Shortcut')} content={`!${cannedResponse?.shortcut}`} theme={theme} />
|
||
|
<Item label={I18n.t('Content')} content={cannedResponse?.text} theme={theme} />
|
||
|
<Item label={I18n.t('Sharing')} content={cannedResponse?.scopeName} theme={theme} />
|
||
|
|
||
|
<View style={styles.item}>
|
||
|
<Text style={[styles.itemLabel, { color: themes[theme].titleText }]}>{I18n.t('Tags')}</Text>
|
||
|
<View style={styles.cannedTagContainer}>
|
||
|
{cannedResponse?.tags?.length > 0 ? (
|
||
|
cannedResponse.tags.map(t => (
|
||
|
<View style={[styles.cannedTagWrap, { backgroundColor: themes[theme].searchboxBackground }]}>
|
||
|
<Text style={[styles.cannedTag, { color: themes[theme].auxiliaryTintColor }]}>{t}</Text>
|
||
|
</View>
|
||
|
))
|
||
|
) : (
|
||
|
<Text style={[styles.cannedText, { color: themes[theme].auxiliaryTintColor }]}>-</Text>
|
||
|
)}
|
||
|
</View>
|
||
|
</View>
|
||
|
</View>
|
||
|
<Button
|
||
|
title={I18n.t('Use')}
|
||
|
theme={theme}
|
||
|
style={styles.button}
|
||
|
type='primary'
|
||
|
onPress={() => navigateToRoom(cannedResponse)}
|
||
|
/>
|
||
|
</ScrollView>
|
||
|
</SafeAreaView>
|
||
|
);
|
||
|
};
|
||
|
|
||
|
CannedResponseDetail.propTypes = {
|
||
|
navigation: PropTypes.object,
|
||
|
route: PropTypes.object
|
||
|
};
|
||
|
|
||
|
export default CannedResponseDetail;
|