Rocket.Chat.ReactNative/app/views/CloseLivechatView.tsx

124 lines
3.7 KiB
TypeScript

import React, { useState, useLayoutEffect } from 'react';
import { StyleSheet, ScrollView, Text } from 'react-native';
import { BlockContext } from '@rocket.chat/ui-kit';
import { IBaseScreen } from '../definitions';
import I18n from '../i18n';
import { ChatsStackParamList } from '../stacks/types';
import { useTheme } from '../theme';
import KeyboardView from '../containers/KeyboardView';
import SafeAreaView from '../containers/SafeAreaView';
import { FormTextInput } from '../containers/TextInput';
import Button from '../containers/Button';
import { useAppSelector } from '../lib/hooks';
import sharedStyles from './Styles';
import scrollPersistTaps from '../lib/methods/helpers/scrollPersistTaps';
import { MultiSelect } from '../containers/UIKit/MultiSelect';
import { closeLivechat } from '../lib/methods/helpers/closeLivechat';
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 16
},
subtitleText: {
marginBottom: 10,
fontSize: 14,
...sharedStyles.textSemibold
},
buttonMarginVertical: { marginVertical: 20 }
});
const CloseLivechatView = ({ navigation, route }: IBaseScreen<ChatsStackParamList, 'CloseLivechatView'>) => {
const rid = route.params?.rid;
const departmentInfo = route.params?.departmentInfo;
const tagsList = route.params?.tagsList;
const requestTags = departmentInfo?.requestTagBeforeClosingChat;
const [inputValue, setInputValue] = useState('');
const [tagParamSelected, setTagParamSelected] = useState<string[]>([]);
const { colors } = useTheme();
const { isMasterDetail, livechatRequestComment } = useAppSelector(state => ({
isMasterDetail: state.app.isMasterDetail,
livechatRequestComment: state.settings.Livechat_request_comment_when_closing_conversation as boolean
}));
useLayoutEffect(() => {
navigation.setOptions({
title: I18n.t('Close_Chat')
});
}, [navigation]);
const canSubmit = () => {
if (!requestTags && !livechatRequestComment) {
return true;
}
if (requestTags && tagParamSelected.length > 0 && !livechatRequestComment) {
return true;
}
if (livechatRequestComment && !!inputValue && !requestTags) {
return true;
}
if (livechatRequestComment && requestTags && tagParamSelected.length > 0 && !!inputValue) {
return true;
}
return false;
};
const submit = () => {
closeLivechat({ rid, isMasterDetail, comment: inputValue, tags: tagParamSelected });
};
return (
<KeyboardView
style={{ backgroundColor: colors.auxiliaryBackground }}
contentContainerStyle={sharedStyles.container}
keyboardVerticalOffset={128}
>
<ScrollView {...scrollPersistTaps} style={styles.container}>
<SafeAreaView>
<FormTextInput
label={I18n.t('Please_add_a_comment')}
defaultValue={''}
onChangeText={text => setInputValue(text)}
onSubmitEditing={() => {
if (canSubmit()) {
submit();
}
}}
/>
{requestTags ? (
<>
<Text style={[styles.subtitleText, { color: colors.titleText }]}>{I18n.t('Tags')}</Text>
<MultiSelect
options={tagsList?.map(({ name }) => ({ text: { text: name }, value: name }))}
onChange={({ value }: { value: string[] }) => {
setTagParamSelected(value);
}}
placeholder={{ text: I18n.t('Select_tags') }}
value={tagParamSelected}
context={BlockContext.FORM}
multiselect
inputStyle={{ borderColor: colors.separatorColor, borderWidth: 2 }}
/>
</>
) : null}
<Button
title={I18n.t('Close')}
onPress={submit}
disabled={!canSubmit()}
backgroundColor={colors.dangerColor}
type='primary'
style={styles.buttonMarginVertical}
/>
</SafeAreaView>
</ScrollView>
</KeyboardView>
);
};
export default CloseLivechatView;