151 lines
3.5 KiB
JavaScript
151 lines
3.5 KiB
JavaScript
|
import React, { useEffect, useState } from 'react';
|
||
|
import PropTypes from 'prop-types';
|
||
|
import { View, StyleSheet } from 'react-native';
|
||
|
import { connect } from 'react-redux';
|
||
|
|
||
|
import I18n from '../i18n';
|
||
|
import { withTheme } from '../theme';
|
||
|
import { themes } from '../constants/colors';
|
||
|
import RocketChat from '../lib/rocketchat';
|
||
|
import OrSeparator from '../containers/OrSeparator';
|
||
|
import Input from '../containers/UIKit/MultiSelect/Input';
|
||
|
import { forwardRoom as forwardRoomAction } from '../actions/room';
|
||
|
|
||
|
const styles = StyleSheet.create({
|
||
|
container: {
|
||
|
flex: 1,
|
||
|
padding: 16
|
||
|
}
|
||
|
});
|
||
|
|
||
|
const ForwardLivechatView = ({ forwardRoom, navigation, theme }) => {
|
||
|
const [departments, setDepartments] = useState([]);
|
||
|
const [departmentId, setDepartment] = useState();
|
||
|
const [users, setUsers] = useState([]);
|
||
|
const [userId, setUser] = useState();
|
||
|
const [room, setRoom] = useState();
|
||
|
|
||
|
const rid = navigation.getParam('rid');
|
||
|
|
||
|
const getDepartments = async() => {
|
||
|
try {
|
||
|
const result = await RocketChat.getDepartments();
|
||
|
if (result.success) {
|
||
|
setDepartments(result.departments.map(department => ({ label: department.name, value: department._id })));
|
||
|
}
|
||
|
} catch {
|
||
|
// do nothing
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const getUsers = async(term = '') => {
|
||
|
try {
|
||
|
const { servedBy: { _id: agentId } = {} } = room;
|
||
|
const _id = agentId && { $ne: agentId };
|
||
|
const result = await RocketChat.usersAutoComplete({ conditions: { _id, status: { $ne: 'offline' }, statusLivechat: 'available' }, term });
|
||
|
if (result.success) {
|
||
|
const parsedUsers = result.items.map(user => ({ label: user.username, value: user._id }));
|
||
|
setUsers(parsedUsers);
|
||
|
return parsedUsers;
|
||
|
}
|
||
|
} catch {
|
||
|
// do nothing
|
||
|
}
|
||
|
return [];
|
||
|
};
|
||
|
|
||
|
const getRoom = async() => {
|
||
|
try {
|
||
|
const result = await RocketChat.getRoomInfo(rid);
|
||
|
if (result.success) {
|
||
|
setRoom(result.room);
|
||
|
}
|
||
|
} catch {
|
||
|
// do nothing
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const submit = () => {
|
||
|
const transferData = { roomId: rid };
|
||
|
|
||
|
if (!departmentId && !userId) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (userId) {
|
||
|
transferData.userId = userId;
|
||
|
} else {
|
||
|
transferData.departmentId = departmentId;
|
||
|
}
|
||
|
|
||
|
forwardRoom(rid, transferData);
|
||
|
};
|
||
|
|
||
|
useEffect(() => {
|
||
|
getRoom();
|
||
|
}, []);
|
||
|
|
||
|
useEffect(() => {
|
||
|
if (room) {
|
||
|
getUsers();
|
||
|
getDepartments();
|
||
|
}
|
||
|
}, [room]);
|
||
|
|
||
|
useEffect(() => {
|
||
|
if (departmentId || userId) {
|
||
|
submit();
|
||
|
}
|
||
|
}, [departmentId, userId]);
|
||
|
|
||
|
const onPressDepartment = () => {
|
||
|
navigation.navigate('PickerView', {
|
||
|
title: I18n.t('Forward_to_department'),
|
||
|
value: room?.departmentId,
|
||
|
data: departments,
|
||
|
onChangeValue: setDepartment,
|
||
|
goBack: false
|
||
|
});
|
||
|
};
|
||
|
|
||
|
const onPressUser = () => {
|
||
|
navigation.navigate('PickerView', {
|
||
|
title: I18n.t('Forward_to_user'),
|
||
|
data: users,
|
||
|
onChangeValue: setUser,
|
||
|
onChangeText: getUsers,
|
||
|
goBack: false
|
||
|
});
|
||
|
};
|
||
|
|
||
|
return (
|
||
|
<View style={[styles.container, { backgroundColor: themes[theme].auxiliaryBackground }]}>
|
||
|
<Input
|
||
|
onPress={onPressDepartment}
|
||
|
placeholder={I18n.t('Select_a_Department')}
|
||
|
theme={theme}
|
||
|
/>
|
||
|
<OrSeparator theme={theme} />
|
||
|
<Input
|
||
|
onPress={onPressUser}
|
||
|
placeholder={I18n.t('Select_a_User')}
|
||
|
theme={theme}
|
||
|
/>
|
||
|
</View>
|
||
|
);
|
||
|
};
|
||
|
ForwardLivechatView.propTypes = {
|
||
|
forwardRoom: PropTypes.func,
|
||
|
navigation: PropTypes.object,
|
||
|
theme: PropTypes.string
|
||
|
};
|
||
|
ForwardLivechatView.navigationOptions = {
|
||
|
title: I18n.t('Forward_Chat')
|
||
|
};
|
||
|
|
||
|
const mapDispatchToProps = dispatch => ({
|
||
|
forwardRoom: (rid, transferData) => dispatch(forwardRoomAction(rid, transferData))
|
||
|
});
|
||
|
|
||
|
export default connect(null, mapDispatchToProps)(withTheme(ForwardLivechatView));
|