chatForm.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { Button, Chip, TextField } from "@mui/material";
  2. import { useEffect, useState } from "react";
  3. import { connect } from "react-redux";
  4. import { actionAddChatBack, actionUserSearch } from "../actions"
  5. const UserList = ({ users, onAddMember }) => {
  6. return (
  7. <ul className="user-search-list">
  8. {users.map(user =>
  9. <li key={user._id} >
  10. <Button variant="text" onClick={() => onAddMember(user)}>{user.nick || user.login}</Button>
  11. </li>)}
  12. </ul>
  13. )
  14. }
  15. export const UserSearch = ({ searchState, onUserSearch, onAddMember }) => {
  16. let [searchInput, setSearchInput] = useState("")
  17. let [users, setUsers] = useState([])
  18. useEffect(() => {
  19. searchInput && setUsers(searchState)
  20. }, [searchState, searchInput])
  21. let searchHandler = async (e) => {
  22. setSearchInput(e.target.value)
  23. if (e.target.value) {
  24. onUserSearch(e.target.value)
  25. } else {
  26. setUsers([])
  27. }
  28. }
  29. return (
  30. <div className="user-search-panel">
  31. <TextField
  32. label="Найти юзеров..."
  33. variant="standard"
  34. onInput={e => searchHandler(e)}
  35. value={searchInput}
  36. placeholder="Найти юзеров..." />
  37. {searchInput && users && users.length > 0 && <UserList users={users} onAddMember={onAddMember} />}
  38. {searchState && searchInput && users && !users.length && <span>Пользователей с таким именем не существует</span>}
  39. </div>
  40. )
  41. }
  42. export const MemberList = ({ members, onDeleteMember }) => {
  43. return (
  44. <div className="chat-member-list">
  45. <h4>Пользователи чата</h4>
  46. <ul>
  47. {members.map(m =>
  48. <li key={m._id}>
  49. {onDeleteMember ? <Chip
  50. label={m.nick || m.login}
  51. onDelete={() => onDeleteMember(m)}
  52. /> : <span>{m.nick || m.login}</span>}
  53. </li>
  54. )}
  55. </ul>
  56. </div>
  57. )
  58. }
  59. const ChatForm = ({ searchState, onUserSearch, onNewChat }) => {
  60. let [title, setTitle] = useState("")
  61. let [members, setMembers] = useState([])
  62. let userAddHandler = (user) => {
  63. members.length > 0 ? setMembers([...members, user]) : setMembers([user])
  64. }
  65. let memberDeleteHandler = (user) => {
  66. setMembers(members.filter(member => member._id !== user._id))
  67. }
  68. return (
  69. <div className="new-chat">
  70. <TextField
  71. label="Название чата"
  72. variant="standard"
  73. onInput={e => setTitle(e.target.value)}
  74. value={title}
  75. placeholder="Название чата" />
  76. <UserSearch searchState={searchState} onUserSearch={onUserSearch} onAddMember={userAddHandler} />
  77. {members && members.length > 0 && <MemberList members={members} onDeleteMember={memberDeleteHandler} />}
  78. <Button variant="contained" onClick={() => onNewChat(title, members)} disabled={!title || !members.length}>Создать чат</Button>
  79. </div>
  80. )
  81. }
  82. const ConnectChatForm = connect(state => ({ searchState: state.promise?.userSearch?.payload?.data?.UserFind }),
  83. {
  84. onUserSearch: actionUserSearch,
  85. onNewChat: actionAddChatBack
  86. })(ChatForm)
  87. export default ConnectChatForm