ChatInfoModal.jsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { Avatar, Button, IconButton } from "@mui/material";
  2. import { connect } from "react-redux";
  3. import { history } from "../../App";
  4. import { backendURL } from "../../helpers/gql";
  5. import { MemberList } from "../MemberList/MemberList";
  6. import { ChatInfoModalHeader, ChatInfoModalWrapper, ChatInfoModalName, ChatInfoTitle, ChatInfoModalMain, Divider, MemberListHeader, MemberAmount, ChatInfoModalAvatar, Drop } from "./ChatInfoModal.style";
  7. import CloseIcon from "./icons8-close.svg";
  8. import MembersIcon from "./user.png";
  9. import AddUserIcon from "./add-user.png";
  10. import { useEffect, useState } from "react";
  11. import { SearchUserForChat } from "../SearchUserForChat/SearchUserForChat";
  12. import {actionUpsertChat } from "../../actions/actionsForChats";
  13. import DropZoneAvatar from "../DropZone/DropZoneAvatar";
  14. import { actionSetChatAvatar } from "../../actions/actionsMedia";
  15. import ChatInfoOptions from "../ChatInfoOptions/ChatInfoOptions";
  16. import { ChatMembersAmount } from "../ChatPageHeader/ChatPageHeader.style";
  17. export const CDropZoneAvatarForChat = connect(null, {onLoad: actionSetChatAvatar})(DropZoneAvatar);
  18. const ChatInfoModal = ({handleClose, chats, userId, updateChat}) => {
  19. const [,route, histId] = history.location.pathname.split('/');
  20. useEffect(() => {
  21. chats[histId] || handleClose()
  22. }, [chats[histId]])
  23. const [isOpenSearch, setIsOpenSearch] = useState();
  24. // old members + new
  25. const [users, setUsers] = useState();
  26. const amount = chats[histId]?.members?.length;
  27. const isOwner = userId === chats[histId]?.owner?._id;
  28. //current memberd (old)
  29. const currMembers = chats[histId]?.members?.map(item => {
  30. let {_id} = item;
  31. return {_id}
  32. });
  33. return(!isOpenSearch) ?
  34. <ChatInfoModalWrapper>
  35. <ChatInfoModalHeader>
  36. <ChatInfoModalName>Chat Info</ChatInfoModalName>
  37. <div style={{paddingLeft: "150px"}}>
  38. <ChatInfoOptions setIsOpenSearch={setIsOpenSearch} isOwner={isOwner} chatId={histId}/>
  39. </div>
  40. <IconButton onClick={handleClose}>
  41. <img style={{cursor: 'pointer'}} src={CloseIcon}/>
  42. </IconButton>
  43. </ChatInfoModalHeader>
  44. <ChatInfoModalMain>
  45. <ChatInfoModalAvatar>
  46. <Avatar
  47. src={`${backendURL}/${chats[histId]?.avatar?.url || ''}`}
  48. alt={chats[histId]?.title || "chat"}
  49. sx={{ width: 75, height: 75}}
  50. />
  51. {isOwner && <CDropZoneAvatarForChat component={"dropAvatarPopupComponent"}/>}
  52. </ChatInfoModalAvatar>
  53. <div>
  54. <ChatInfoTitle>{chats[histId]?.title}</ChatInfoTitle>
  55. <ChatMembersAmount>{amount} {amount === 1 ? 'member' : 'members'}</ChatMembersAmount>
  56. </div>
  57. </ChatInfoModalMain>
  58. <Divider/>
  59. <MemberListHeader>
  60. <div style={{display: 'flex', justifyContent: 'left'}}>
  61. <img src={MembersIcon} style={{height: "20px", marginRight: "30px"}}/>
  62. <MemberAmount>{amount} {amount === 1 ? 'member' : 'members'}</MemberAmount>
  63. </div>
  64. {isOwner && <img src={AddUserIcon} style={{height: "20px", cursor: "pointer"}} onClick={() => setIsOpenSearch(true)}/>}
  65. </MemberListHeader>
  66. <MemberList members={chats[histId]?.members}/>
  67. </ChatInfoModalWrapper>
  68. :
  69. <>
  70. <SearchUserForChat getUsers={setUsers} members={currMembers}/>
  71. <div style={{display: "flex",
  72. padding: "10px 15px",
  73. justifyContent: "right",
  74. alignItems: "center"}}>
  75. <Button variant="text" onClick={handleClose} >Cancel</Button>
  76. <Button variant="text" onClick={() => {updateChat(histId, null, users); handleClose()}}>Add</Button>
  77. </div>
  78. </>
  79. }
  80. export default connect(state => ({
  81. chats: state?.chats || [],
  82. userId: state?.auth?.payload?.sub?.id
  83. }), {updateChat: actionUpsertChat})(ChatInfoModal);