import React, {useEffect, useState} from 'react'; import { SafeAreaView, ScrollView, TouchableOpacity, Image, View, TextInput, Modal, Dimensions, StyleSheet, KeyboardAvoidingView, } from 'react-native'; import colors from '../../../values/colors'; import {IMAGES} from '../../../values/images'; import DateTimePickerModal from 'react-native-modal-datetime-picker'; import CheckBox from '@react-native-community/checkbox'; import {Toast} from 'react-native-toast-message/lib/src/Toast'; import Moment from 'moment'; import Alert from 'react-native-awesome-alerts'; import TextInputComponent from '../../../components/TextInputComponent'; import ButtonComponent from '../../../components/ButtonComponent'; import {useDispatch, useSelector} from 'react-redux'; import { getImageByCode, getConfirmDayHistories, getCommentByCode, postRejectConfirmDate, postApproveConfirmDate, postComment, deleteApproveConfirmDay, } from '../../../store/actions/UserAction'; import AppText from '../../../components/AppText'; import Utils from '../../../utils'; const windowWidth = Dimensions.get('window').width; const windowHeight = Dimensions.get('window').height; const ConfirmModalAddNew = ({ userDetails, onClose, alertMessage, detailItem, setApproveReqPayload, }) => { const dispatch = useDispatch(); const userDirectManagersList = useSelector( state => state.MyDirectManagers.myDirectManagers, ); const confirmDay = useSelector(state => state.ConfirmDay.confirmDay); // init state const initComment = { code: '', content: '', }; // state const [userManagerList, setUserManagerList] = useState([]); const [isNextApprover, setIsNextApprover] = useState(false); const [nextApproverId, setNextApproverId] = useState(''); const [commentApprove, setCommentApprove] = useState(); const [confirmDateComment, setConfirmDateComment] = useState([]); const [confirmDateDetail, setConfirmDateDetail] = useState(null); const [confirmDateHistory, setConfirmDateHistory] = useState([]); const [detailImage, setDetailImage] = useState([]); const [comment, setComment] = useState(initComment); //console.log('confirmDateDetail', confirmDateDetail); const onSelectManager = async (value, index, item) => { let userManagerListClone = [...userManagerList]; if (item !== undefined) { let elementFound = userManagerListClone.find( element => element.id == item.id, ); let indexElementFound = userManagerListClone.findIndex( element => element.id == item.id, ); userManagerListClone.splice(indexElementFound, 1, { ...elementFound, checked: value, }); setUserManagerList(userManagerListClone); if (isNextApprover) { setNextApproverId(item.id); } else { setNextApproverId(''); } } }; const onSubmitComment = async () => { if (comment.content) { const res = await dispatch(postComment(comment)); if (res) { setComment(initComment); const responseComment = await dispatch(getCommentByCode(comment.code)); Toast.show({ type: 'success', text1: 'Hệ thống', text2: 'Bình luận thành công👍', style: {zIndex: 1001}, }); setConfirmDateComment(responseComment.reverse()); return; } } }; const onOpenDetail = async item => { setConfirmDateDetail(item); const responseImage = await dispatch(getImageByCode(item.id)); //console.log(responseImage) setDetailImage(responseImage); const responseHistories = await dispatch(getConfirmDayHistories(item.id)); setConfirmDateHistory(responseHistories); const responseComment = await dispatch(getCommentByCode(item.id)); setConfirmDateComment(responseComment.reverse()); const objectClone = JSON.parse(JSON.stringify(userDirectManagersList)); let obj = []; objectClone.forEach(element => { element.checked = false; obj.push(element); }); setUserManagerList(obj); }; const onRejectRequest = async id => { const res = await dispatch(postRejectConfirmDate(id, commentApprove)); if (res) { alertMessage('Thành công👍'); setApproveReqPayload(prev => ({...prev, isRefresh: true})); } else { alertMessage('Thất bại👎'); } onClose(null); }; const onApproveRequest = async id => { const res = await dispatch( postApproveConfirmDate(id, commentApprove, nextApproverId), ); if (res) { alertMessage('Thành công👍'); setApproveReqPayload(prev => ({...prev, isRefresh: true})); } else { alertMessage('Thất bại👎'); } onClose(null); }; const downloadImage = item => { console.log('confirmDateDetail', confirmDateDetail); console.log( 'aa', Moment(confirmDateDetail.finish).diff(confirmDateDetail.start, 'hour'), ); }; const deleteItem = async () => { const res = await dispatch(deleteApproveConfirmDay(detailItem.id)); if (res.success) { onClose(null); Toast.show({ type: 'success', text1: `Hệ thống`, text2: `Hủy yêu cầu thành công 💓`, style: {zIndex: 1001}, visibilityTime: 2000, }); } else { onClose(null); Toast.show({ type: 'error', text1: `Hệ thống`, text2: `Hủy yêu cầu thất bại 💔`, style: {zIndex: 1001}, visibilityTime: 2000, }); } //console.log('deleteItem', detailItem); }; useEffect(() => { onOpenDetail(detailItem); }, []); return ( <Modal animationType="slide" transparent={true} visible={true} onRequestClose={() => { onClose(null); }}> <SafeAreaView> <ScrollView showsVerticalScrollIndicator={false}> <View style={styles.modalViewEdit}> <View style={styles.headerModalBottom}> <AppText style={styles.titleModalBottom}> Chi tiết ngày công </AppText> <TouchableOpacity onPress={() => { onClose(null); }}> <Image style={{height: 20, width: 20}} source={IMAGES.IcClose} /> </TouchableOpacity> </View> <View style={styles.bodyHeight}> <ScrollView> <View style={styles.bodyModal}> <View style={{flex: 1, flexDirection: 'row'}}> <Image source={{ uri: 'https://meu.anawork.com' + confirmDateDetail?.extend_creator_avatar, }} style={{width: 40, height: 40, borderRadius: 2}} /> <View style={{ flex: 1, justifyContent: 'space-around', marginLeft: 16, }}> <AppText style={{fontSize: 14, fontWeight: '600'}}> {confirmDateDetail?.extend_creator_full_name} -{' '} {confirmDateDetail?.extend_creator_employee_code} </AppText> <AppText> {confirmDateDetail?.extend_creator_position} </AppText> </View> </View> {confirmDateDetail && ( <View style={{flex: 1, marginTop: 16}}> <AppText style={{ fontWeight: '500', fontSize: 14, marginBottom: 12, }}> Thông tin chung </AppText> <View style={styles.commonDetail}> <AppText style={styles.textMediumGrey}>Từ ngày</AppText> <AppText> {`${Moment(confirmDateDetail.start).format( 'DD/MM/YYYY HH:mm', )} `} </AppText> </View> <View style={styles.commonDetail}> <AppText style={styles.textMediumGrey}> Đến ngày </AppText> <AppText> {`${Moment(confirmDateDetail.finish).format( 'DD/MM/YYYY HH:mm', )}`} </AppText> </View> <View style={styles.commonDetail}> <AppText style={styles.textMediumGrey}> Thời gian nghỉ </AppText> <AppText> {Utils.minutesToHours( confirmDateDetail.start, confirmDateDetail.finish, )} </AppText> </View> <View style={styles.commonDetail}> <AppText style={[styles.textMediumGrey, {flex: 1}]}> Lý do </AppText> <AppText style={{ flex: 1, textAlign: 'right', }}> {confirmDateDetail.reason} </AppText> </View> <View style={styles.commonDetail}> <AppText style={[styles.textMediumGrey, {fontSize: 12}]}> Tệp đính kèm </AppText> { <View style={styles.attachment}> { //physical_path.slice(30) detailImage.length > 0 && detailImage.map((item, index) => ( <ButtonComponent key={index} text={item.file_name} textStyle={{fontSize: 13, color: '#5d78ff'}} onPress={() => downloadImage(item)} /> )) } {detailImage.length == 0 && ( <AppText style={{fontSize: 13, color: '#757575'}}> Không có tệp đính kèm </AppText> )} </View> } </View> </View> )} <View style={{flex: 1, marginTop: 16}}> <AppText style={{ fontWeight: '500', fontSize: 14, marginBottom: 12, }}> Lịch sử duyệt </AppText> {confirmDateHistory && confirmDateHistory?.map((item, index) => ( <View key={index} style={{flexDirection: 'row'}}> <Image source={{ uri: 'https://meu.anawork.com' + item.extend_approver_avatar, }} style={styles.avatarApprove} /> <View> <View style={{ flexDirection: 'row', justifyContent: 'space-between', width: '83%', }}> <View style={{ justifyContent: 'space-between', marginLeft: 8, }}> <AppText> {item.extend_approver_full_name} </AppText> <View style={{flexDirection: 'row'}}> {item.extend_approved_status_name == 'APPROVED' && ( <Image style={{height: 16, width: 16}} source={IMAGES.uCheck} /> )} {item.extend_approved_status_name == 'PENDING' && ( <Image source={IMAGES.uMinus} /> )} {item.extend_approved_status_name == 'REJECTED' && ( <Image source={IMAGES.IcReject} style={{ height: 12, width: 12, alignSelf: 'center', }} /> )} <AppText style={{ color: item.extend_approved_status_color, fontStyle: 'italic', fontSize: 12, }}> {item.extend_approved_status_name == 'APPROVED' && 'Đã duyệt'} {item.extend_approved_status_name == 'PENDING' && 'Đang chờ'} {item.extend_approved_status_name == 'REJECTED' && 'Đã từ chối'} </AppText> </View> </View> <AppText style={{fontSize: 12, color: '#959595'}}> {Moment(item.created_at).format('DD/MM/YYYY')} </AppText> </View> <View style={{marginLeft: 8}}> {/* {item.comment && ( <AppText style={{fontSize: 13, color: '#757575'}}> {item.comment} </AppText> )} */} </View> </View> </View> ))} {confirmDateDetail?.extend_approved_status_name == 'PENDING' && confirmDateDetail?.approver_id == userDetails.id && ( <View style={{flexDirection: 'row'}}> <Image source={{ uri: 'https://meu.anawork.com' + userDetails.avatar, }} style={styles.avatarApprove} /> <View> <View style={{ flexDirection: 'row', justifyContent: 'space-between', width: '83%', }}> <View style={{ justifyContent: 'space-between', marginLeft: 8, }}> <AppText> {confirmDateDetail.extend_approver_full_name} </AppText> <View style={{flexDirection: 'row'}}> {confirmDateDetail.extend_approved_status_name == 'APPROVED' ? ( <Image style={{height: 16, width: 16}} source={IMAGES.uCheck} /> ) : ( <Image source={IMAGES.uMinus} /> )} <AppText style={{ color: confirmDateDetail.extend_approved_status_color, fontStyle: 'italic', fontSize: 12, }}> {confirmDateDetail.extend_approved_status_name == 'APPROVED' && 'Đã duyệt'} {confirmDateDetail.extend_approved_status_name == 'PENDING' && 'Đang chờ'} {confirmDateDetail.extend_approved_status_name == 'REJECTED' && 'Đã từ chối'} </AppText> </View> </View> <AppText style={{fontSize: 12, color: '#959595'}}> {Moment().format('DD/MM/YYYY')} </AppText> </View> <View style={{marginLeft: 8}}> <View style={styles.wrapperComment}> <TextInput placeholder="Nhập lý do tại đây" style={styles.commentInput} multiline value={commentApprove} onChangeText={text => { setCommentApprove(text); }} /> </View> </View> </View> </View> )} </View> {confirmDateDetail?.approver_id == userDetails.id && ( <View style={{ marginTop: 12, flexDirection: 'row', alignItems: 'center', }}> <CheckBox boxType="square" animationDuration={0.3} value={isNextApprover} onValueChange={value => setIsNextApprover(value)} lineWidth={2} /> <AppText style={{ fontSize: 13, color: '#434349', marginLeft: 10, }}> Chọn người duyệt tiếp theo </AppText> </View> )} {isNextApprover && userManagerList.map((item, index) => ( <View key={index} style={{ flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', marginTop: 12, }}> <Image source={{ uri: 'https://meu.anawork.com' + item.avatar, }} style={styles.avatarApprove} /> <AppText style={{ fontSize: 16, fontWeight: '500', marginLeft: 10, }}>{`${item.extend_user_full_name}`}</AppText> <CheckBox disabled={false} value={item.checked} onValueChange={newValue => onSelectManager(newValue, index, item) } boxType="square" animationDuration={0.3} lineWidth={1} key={index} /> </View> ))} <View style={{marginTop: 16}}> <AppText style={{ fontWeight: '500', fontSize: 14, marginBottom: 12, }}> Bình luận </AppText> {/*others comment*/} {confirmDateComment.length > 0 && confirmDateComment.map((item, index) => { return ( <View style={styles.commentHistories} key={index}> <Image source={{ uri: 'https://meu.anawork.com' + item.extend_staff_avatar, }} style={styles.avatarComment} /> <View style={styles.commentBox}> <View style={{ flexDirection: 'row', justifyContent: 'space-between', }}> <AppText style={{ color: '#434349', fontSize: 12, fontWeight: '500', }}> {item.extend_staff_full_name} </AppText> <AppText style={{color: '#959595', fontSize: 10}}> {Moment(item.created_at).format( 'DD/MM/YYYY hh:mm', )} </AppText> </View> <AppText style={{ color: '#666666', fontSize: 13, marginTop: 8, }}> {item.content} </AppText> </View> </View> ); })} {/*my comment*/} <View style={[ styles.commentHistories, {marginTop: 16, marginBottom: 20}, ]}> <Image source={{ uri: 'https://meu.anawork.com' + userDetails.avatar, }} style={styles.avatarComment} /> <View style={{width: '88%', position: 'relative'}}> <KeyboardAvoidingView behavior={ Platform.OS === 'ios' ? 'padding' : 'height' }> <TextInputComponent style={styles.commentText} styleAreaInput={{backgroundColor: 'white'}} multiline placeholder="Nhập bình luận ở đây" onChangeText={text => { setComment({ content: text, code: confirmDateDetail.id, }); }} noBorder value={comment.content} autoCapitalize="none" /> </KeyboardAvoidingView> <View style={{position: 'absolute', right: 0, top: 10}}> <TouchableOpacity onPress={onSubmitComment}> <Image style={{height: 16, width: 16, marginRight: 4}} source={IMAGES.IcSend} /> </TouchableOpacity> </View> </View> </View> </View> </View> </ScrollView> </View> {/* bottom modal */} <View style={styles.bottomModal}> <TouchableOpacity style={styles.btnCancel} onPress={() => onClose(null)}> <AppText style={{color: '#5d78ff', fontSize: 14, fontWeight: '500'}}> Hủy </AppText> </TouchableOpacity> {confirmDateDetail?.approver_id !== userDetails.id && detailItem.extend_approved_status_name === 'PENDING' && ( <ButtonComponent style={{flexDirection: 'row', alignItems: 'center'}} text={'Xóa yêu cầu'} textStyle={{ color: '#ff0a3a', fontSize: 14, fontWeight: '500', }} leftIcon={IMAGES.IcReject} styleIcon={{height: 15, width: 15, marginRight: 4}} onPress={deleteItem} /> )} {confirmDateDetail?.approver_id == userDetails.id && confirmDateDetail?.extend_approved_status_name === 'PENDING' && ( <View style={{flexDirection: 'row'}}> <TouchableOpacity style={styles.btnReject} onPress={() => { onRejectRequest(confirmDateDetail.id); }}> <Image style={{height: 16, width: 16, marginRight: 4}} source={IMAGES.IcReject} /> <AppText style={{ color: '#ff0a3a', fontSize: 14, fontWeight: '500', }}> Từ chối </AppText> </TouchableOpacity> <TouchableOpacity style={styles.btnAccept} onPress={() => { onApproveRequest(confirmDateDetail.id); }}> <Image style={{height: 16, width: 16, marginRight: 4}} source={IMAGES.IcAccept} /> <AppText style={{ color: 'white', fontSize: 14, fontWeight: '500', }}> Duyệt yêu cầu </AppText> </TouchableOpacity> </View> )} </View> </View> </ScrollView> </SafeAreaView> </Modal> ); }; const styles = StyleSheet.create({ //modal detail modalViewEdit: { backgroundColor: 'white', borderRadius: 20, padding: 16, height: windowHeight, shadowColor: '#000', shadowOffset: { width: 0, height: 2, }, shadowOpacity: 0.25, shadowRadius: 4, elevation: 5, marginTop: 20, }, headerModalBottom: { paddingRight: 10, paddingLeft: 10, flexDirection: 'row', justifyContent: 'space-between', }, titleModalBottom: { fontSize: 16, fontWeight: '500', }, bodyHeightCreate: { height: '75%', }, bodyModal: { flex: 1, paddingHorizontal: 10, marginTop: 16, }, commonDetail: { flexDirection: 'row', justifyContent: 'space-between', fontSize: 14, marginBottom: 12, fontFamily: 'Roboto', marginTop: 10, }, attachment: { // borderColor: '#c4c4c4', // borderStyle: 'dashed', // borderWidth: 0.5, // borderRadius: 4, // height: 60, width: '50%', justifyContent: 'center', alignItems: 'center', }, checkbox: { alignSelf: 'center', height: 16, width: 16, marginRight: 4, }, commentHistories: { flexDirection: 'row', marginBottom: 10, }, textMediumGrey: { color: '#757575', }, avatarApprove: { width: 32, height: 32, borderRadius: 4, }, avatarComment: { width: 32, height: 32, borderRadius: 32, }, commentBox: { backgroundColor: '#e5eaf0', width: '88%', marginLeft: 8, paddingHorizontal: 12, paddingVertical: 8, borderTopRightRadius: 4, borderBottomRightRadius: 4, borderBottomLeftRadius: 4, }, commentText: { marginLeft: 8, width: '100%', color: '#959595', fontSize: 12, borderBottomColor: '#5c65dc', borderBottomWidth: 1, paddingLeft: 8, paddingRight: 28, paddingVertical: 10, }, bottomModal: { height: 50, width: '100%', flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', paddingHorizontal: 8, }, wrapperComment: { borderColor: '#5d78ff', borderStyle: 'dashed', borderWidth: 0.5, borderRadius: 4, height: 60, width: '81%', padding: 8, }, commentInput: { fontSize: 13, }, btnAccept: { flexDirection: 'row', paddingHorizontal: 8, paddingVertical: 12, backgroundColor: '#5d78ff', borderRadius: 4, }, btnReject: { flexDirection: 'row', paddingHorizontal: 8, paddingVertical: 12, marginRight: 8, }, btnClose: { width: 20, height: 20, position: 'absolute', top: -10, right: 0, }, }); export default ConfirmModalAddNew;