chatForm.js 3.2 KB

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