MessageMediaModal.jsx 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { Button, TextField } from "@mui/material"
  2. import { useEffect, useRef, useState } from "react";
  3. import { useDropzone } from "react-dropzone";
  4. import { connect } from "react-redux";
  5. import { actionAddDraftMessage, actionDeleteDraftMessageId, actionDeleteDropMedia, actionSetDropMedia, actionSetInputMessageValue, actionSetMessageEditor } from "../../reducers/chatReducer";
  6. import {DropMediaItem, MemoizedDropMediaItem} from "../DropMediaItem/DropMediaItem";
  7. import { addUploadDate } from "../utils/addUploadDate";
  8. import SimpleBar from 'simplebar-react';
  9. import 'simplebar/dist/simplebar.min.css';
  10. import { DropMediaList, MediaBox, MediaModalHeader, MessageMediaFooter, MessageMediaModalWrapper } from "./MessageMediaModal.style"
  11. import { actionUploadFiles } from "../../actions/actionsMedia";
  12. import { actionSendMessage } from "../../actions/actionsMessages";
  13. const MessageMediaModal = ({chatId, handleClose, deleteMedia, deleteDraftMessage, chats, open, onload, sendMessage, setInputValue}) => {
  14. const media = chats[chatId].draft?.media || [];
  15. const inputValue = chats[chatId].draft?.mainInputValue?.value || '';
  16. const message = chats[chatId]?.draft?.mainInputValue?.message;
  17. let replyMessageId = (message && typeof message !== 'object') ? message : null;
  18. let forwardedMessageId = (message && typeof message === 'object') ? message._id : null;
  19. //remove media array
  20. useEffect(() => {
  21. open || deleteMedia(chatId);
  22. }, [open])
  23. const {acceptedFiles, getRootProps, getInputProps} = useDropzone({
  24. noDrag: true,
  25. multiple: true
  26. });
  27. useEffect(()=>{
  28. let files = addUploadDate(acceptedFiles)
  29. console.log(files)
  30. acceptedFiles[0] && onload(chatId, files)
  31. }, [acceptedFiles]);
  32. useEffect(() => {
  33. media.length == 0 && handleClose();
  34. }, [media])
  35. return(
  36. <MessageMediaModalWrapper>
  37. <MediaModalHeader>{media.length} {media.length === 1 ? "file" : "files"} selected</MediaModalHeader>
  38. <MediaBox>
  39. <SimpleBar style={{ maxHeight: '400px'}}>
  40. <DropMediaList>
  41. {media.map((item) => <MemoizedDropMediaItem key={item.uploadDate} chatId={chatId} mediaItem={item}/>)}
  42. </DropMediaList>
  43. </SimpleBar>
  44. </MediaBox>
  45. <TextField
  46. maxRows={7}
  47. multiline
  48. sx={{width: "100%", mt: "30px"}}
  49. variant="standard"
  50. label="Caption"
  51. onChange = {(e) => setInputValue(chatId, e.target.value, 'mainInputValue')}
  52. value={inputValue}
  53. />
  54. <MessageMediaFooter>
  55. <div
  56. {...getRootProps({className: 'dropzone'})}>
  57. <input {...getInputProps()} />
  58. <Button variant="text">Add</Button>
  59. </div>
  60. <div>
  61. <Button variant="text" onClick={handleClose}>Cancel</Button>
  62. <Button
  63. variant="text"
  64. onClick={
  65. async () => {
  66. let val = await sendMessage(null, chatId, inputValue.replace(/^\s+|\s+$/g, ''), media, replyMessageId, forwardedMessageId);
  67. (val?.replyTo?._id || val?.forwarded?._id) && deleteDraftMessage(chatId, null)
  68. val && setInputValue(chatId, "", 'mainInputValue'); handleClose();
  69. }
  70. }
  71. >Send</Button>
  72. </div>
  73. </MessageMediaFooter>
  74. </MessageMediaModalWrapper>
  75. )
  76. }
  77. export default connect(state => ({
  78. chats: state.chats
  79. }),
  80. {
  81. deleteMedia: actionDeleteDropMedia,
  82. onload: actionSetDropMedia,
  83. sendMessage: actionSendMessage,
  84. setInputValue: actionSetInputMessageValue,
  85. deleteDraftMessage: actionAddDraftMessage,
  86. })(MessageMediaModal);