Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.73 KB | None | 0 0
  1. import { AsidePanelInform } from "../../../../../../../../../../ui/molecules";
  2. import { Avatar } from "../../../../../../../../../../ui/atoms";
  3. import {
  4. ColumnView,
  5. SearchBlack
  6. } from "../../../../../../../../../../ui/icons";
  7. import { oc } from "ts-optchain";
  8. import {
  9. selectHistorySelectedChannelChanged,
  10. selectHistorySelectedUserIdChanged
  11. } from "../../../../../../../../redux/selectors";
  12. import {
  13. useHistoryMessagesGetUserInformQuery,
  14. GetUsersForHistoryChannelPreviewDocument
  15. } from "./index.generated";
  16. import { useSelector } from "react-redux";
  17. import React, { useEffect, useState } from "react";
  18. import UserDetails from "../UserDetails";
  19. import css from "./index.module.css";
  20. import gql from "graphql-tag";
  21. import { ChannelKindEnum } from "../Messages/index.generated";
  22.  
  23. const UserPreview = () => {
  24. const [informPanelOpened, setInformPanel] = useState<boolean>(false);
  25. const [users, setUsers] = useState();
  26. const selectedUserId = useSelector(selectHistorySelectedUserIdChanged);
  27. const { data, client } = useHistoryMessagesGetUserInformQuery({
  28. variables: {
  29. userID: selectedUserId
  30. }
  31. });
  32. const selectedChannel = useSelector(selectHistorySelectedChannelChanged);
  33. const userIDs = oc(selectedChannel).userIDs();
  34. const chnlKind = oc(selectedChannel).kind();
  35. const chnlName = oc(selectedChannel).name();
  36.  
  37. useEffect(() => {
  38. if (data && !Array.isArray(users) && Array.isArray(userIDs)) {
  39. client
  40. .query({
  41. query: GetUsersForHistoryChannelPreviewDocument,
  42. variables: userIDs
  43. })
  44. .then(data => {
  45. const usersInfo = oc(data).data.user.list();
  46.  
  47. if (usersInfo) {
  48. setUsers(usersInfo);
  49. }
  50. });
  51. }
  52. }, [data, client, users, setUsers, userIDs]);
  53. /**TODO вынести определение имени в отдельную проверку */
  54. const user = oc(data).user.get();
  55. let userName =
  56. user &&
  57. (user.firstName && user.lastName
  58. ? `${user.firstName} ${user.lastName}`
  59. : user.username);
  60.  
  61. let channelName: string = "";
  62. let avatarName: string = "";
  63.  
  64. if (
  65. chnlKind === ChannelKindEnum.ChannelKindUser &&
  66. Array.isArray(users) &&
  67. users.length
  68. ) {
  69. const names = users.reduce(
  70. (acc, item) => {
  71. const avatarName = item.firstName || item.username;
  72. const channelName =
  73. [item.firstName, item.lastName].filter(Boolean).join(" ") ||
  74. item.username;
  75.  
  76. return {
  77. avatarName:
  78. acc.avatarName.length > 0
  79. ? [acc.avatarName, avatarName].join(" ")
  80. : avatarName,
  81. channelName:
  82. acc.channelName.length > 0
  83. ? [acc.channelName, channelName].join(" - ")
  84. : channelName
  85. };
  86. },
  87. { avatarName: "", channelName: "" }
  88. );
  89.  
  90. channelName = names.channelName;
  91. avatarName = names.avatarName;
  92. } else if (
  93. chnlKind === ChannelKindEnum.ChannelKindUserGroup &&
  94. !selectedUserId
  95. ) {
  96. userName = chnlName as string;
  97. }
  98.  
  99. return (
  100. <>
  101. {informPanelOpened && (
  102. <AsidePanelInform closePanel={() => setInformPanel(false)}>
  103. <UserDetails onClose={setInformPanel} />
  104. </AsidePanelInform>
  105. )}
  106. <div className={css.container}>
  107. <div className={css.avatar}>
  108. <Avatar
  109. height={40}
  110. id={
  111. selectedUserId
  112. ? selectedUserId
  113. : selectedChannel
  114. ? selectedChannel.channelID
  115. : ""
  116. }
  117. image={user ? user.avatar : ""}
  118. name={userName || avatarName}
  119. width={40}
  120. />
  121. </div>
  122.  
  123. <div className={css.userName}>{userName || channelName}</div>
  124. <div className={css.buttonsGroup}>
  125. <button className={css.button} type="button">
  126. <SearchBlack />
  127. </button>
  128. {selectedUserId && (
  129. <button
  130. className={css.button}
  131. onClick={() => setInformPanel(true)}
  132. type="button"
  133. >
  134. <ColumnView />
  135. </button>
  136. )}
  137. </div>
  138. </div>
  139. </>
  140. );
  141. };
  142.  
  143. gql`
  144. query HistoryMessagesGetUserInform($userID: ID) {
  145. user {
  146. get(userID: $userID) {
  147. avatar
  148. id
  149. userID
  150. firstName
  151. lastName
  152. username
  153. }
  154. }
  155. }
  156. `;
  157.  
  158. gql`
  159. query GetUsersForHistoryChannelPreview($userIDs: [String!]!) {
  160. user {
  161. list(userIDs: $userIDs) {
  162. avatar
  163. firstName
  164. lastName
  165. id
  166. username
  167. }
  168. }
  169. }
  170. `;
  171.  
  172. export default UserPreview;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement