diff --git a/src/pages/common/components/ChatComponent/ChatComponent.tsx b/src/pages/common/components/ChatComponent/ChatComponent.tsx index 89cec35481..4a57238d09 100644 --- a/src/pages/common/components/ChatComponent/ChatComponent.tsx +++ b/src/pages/common/components/ChatComponent/ChatComponent.tsx @@ -688,6 +688,7 @@ export default function ChatComponent({ shouldReinitializeEditor={shouldReinitializeEditor} onClearFinished={onClearFinished} scrollSelectionIntoView={emptyFunction} + groupChat={chatChannel && chatChannel?.participants.length > 2} /> - )); - - return ( - <> - {buttonEl} - - - ); -}; - -export default DirectMessageButton; diff --git a/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.module.scss b/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.module.scss index 43be3e5158..9b167783f2 100644 --- a/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.module.scss +++ b/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.module.scss @@ -7,6 +7,7 @@ max-height: 29.25rem; border-radius: 0; box-shadow: 0 0.25rem 0.9375rem var(--drop-shadow); + height: 37rem; :global(.modal__header-wrapper--with-modal-padding) { .modalHeader { @@ -19,10 +20,6 @@ padding: 0 1.5rem; } - .modalContent { - padding: 0; - } - .modalCloseWrapper { top: 0.5rem; margin: 0; @@ -31,6 +28,7 @@ @include tablet { max-width: unset; max-height: unset; + height: 100%; } } @@ -82,3 +80,22 @@ .userItem { padding: 0.375rem 1.75rem; } + +.optionWrapper { + display: flex; + align-items: center; +} + +.userAvatar { + margin-right: 0.75rem; +} + +.searchIcon { + margin-right: 0.5rem; +} + +.createGroupChatButton { + margin-left: auto; + margin-top: 1rem; + width: 10rem; +} diff --git a/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.tsx b/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.tsx index 9222d8c96f..8aee666fce 100644 --- a/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.tsx +++ b/src/pages/inbox/components/DirectMessageButton/components/DirectMessageModal/DirectMessageModal.tsx @@ -1,36 +1,42 @@ -import React, { - FC, - ReactElement, - useCallback, - useEffect, - useMemo, - useRef, - useState, -} from "react"; +import React, { FC, ReactElement, useEffect, useState } from "react"; import { useDispatch } from "react-redux"; -import { Modal } from "@/shared/components"; -import { KeyboardKeys } from "@/shared/constants"; +import Select, { components } from "react-select"; +import { Modal, UserAvatar } from "@/shared/components"; import { useDMUserChatChannel } from "@/shared/hooks/useCases"; -import { DMUser } from "@/shared/interfaces"; -import { Loader, SearchInput } from "@/shared/ui-kit"; +import useThemeColor from "@/shared/hooks/useThemeColor"; +import { useIsTabletView } from "@/shared/hooks/viewport"; +import { SearchIcon } from "@/shared/icons"; +import { Button, ButtonVariant, Loader } from "@/shared/ui-kit"; import { emptyFunction } from "@/shared/utils"; import { inboxActions } from "@/store/states"; -import { DirectMessageUserItem } from "./components"; import { useDMUsers } from "./hooks"; +import { selectorStyles } from "./selectorStyles"; import styles from "./DirectMessageModal.module.scss"; interface DirectMessageModalProps { isOpen: boolean; onClose: () => void; isMobileVersion?: boolean; + isGroupMessage?: boolean; +} + +interface SelectOption { + value: string; + label: JSX.Element; + shortLabel: string; + uid: string; } const DirectMessageModal: FC = (props) => { - const { isOpen, onClose, isMobileVersion = false } = props; + const { + isOpen, + onClose, + isMobileVersion = false, + isGroupMessage = false, + } = props; const dispatch = useDispatch(); - const listRef = useRef(null); - const [searchText, setSearchText] = useState(""); - const [activeItemIndex, setActiveItemIndex] = useState(null); + const { getThemeColor } = useThemeColor(); + const isTabletView = useIsTabletView(); const { loading: areDMUsersLoading, dmUsers, @@ -44,51 +50,10 @@ const DirectMessageModal: FC = (props) => { resetDMUserChatChannel, error: isChannelLoadedWithError, } = useDMUserChatChannel(); - const filteredDMUsers = useMemo(() => { - if (!searchText) { - return dmUsers; - } - - const lowerCasedSearchText = searchText.toLowerCase(); - - return dmUsers.filter((item) => - item.userName.toLowerCase().startsWith(lowerCasedSearchText), - ); - }, [dmUsers, searchText]); - const totalUsersAmount = filteredDMUsers.length; + const [groupUids, setGroupUids] = useState([]); - const handleArrowUp = useCallback(() => { - setActiveItemIndex((currentIndex) => { - if (totalUsersAmount === 0) { - return null; - } - if (currentIndex === null) { - return totalUsersAmount - 1; - } - - const nextIndex = currentIndex - 1; - - return nextIndex < 0 ? totalUsersAmount - 1 : nextIndex; - }); - }, [totalUsersAmount]); - - const handleArrowDown = useCallback(() => { - setActiveItemIndex((currentIndex) => { - if (totalUsersAmount === 0) { - return null; - } - if (currentIndex === null) { - return 0; - } - - const nextIndex = currentIndex + 1; - - return nextIndex >= totalUsersAmount ? 0 : nextIndex; - }); - }, [totalUsersAmount]); - - const handleUserItemClick = (item: DMUser) => { - fetchDMUserChatChannel(item.uid); + const handleChatCreate = (uids: string[]) => { + fetchDMUserChatChannel(uids); }; useEffect(() => { @@ -97,77 +62,9 @@ const DirectMessageModal: FC = (props) => { return; } - setActiveItemIndex(null); - setSearchText(""); resetDMUserChatChannel(); }, [isOpen]); - useEffect(() => { - setActiveItemIndex(null); - }, [searchText]); - - useEffect(() => { - if (activeItemIndex !== null) { - const listElement = listRef.current?.children.item(activeItemIndex); - listElement?.scrollIntoView(false); - } - }, [activeItemIndex]); - - useEffect(() => { - if (!isOpen) { - return; - } - - const handler = (event: KeyboardEvent) => { - const key = event.key as KeyboardKeys; - - switch (key) { - case KeyboardKeys.ArrowUp: - handleArrowUp(); - break; - case KeyboardKeys.ArrowDown: - handleArrowDown(); - break; - default: - break; - } - }; - - window.addEventListener("keyup", handler); - - return () => { - window.removeEventListener("keyup", handler); - }; - }, [isOpen, handleArrowUp, handleArrowDown]); - - useEffect(() => { - if (!isOpen) { - return; - } - - const handler = (event: KeyboardEvent) => { - const key = event.key as KeyboardKeys; - - if (key !== KeyboardKeys.Enter) { - return; - } - - const item = filteredDMUsers.find( - (dmUser, index) => index === activeItemIndex, - ); - - if (item) { - handleUserItemClick(item); - } - }; - - window.addEventListener("keyup", handler); - - return () => { - window.removeEventListener("keyup", handler); - }; - }, [isOpen, activeItemIndex, filteredDMUsers]); - useEffect(() => { if (dmUserChatChannel) { dispatch(inboxActions.addChatChannelItem(dmUserChatChannel)); @@ -189,36 +86,70 @@ const DirectMessageModal: FC = (props) => { ); } - if (totalUsersAmount === 0) { + if (dmUsers.length === 0) { return

No users found

; } - return ( -
    - {filteredDMUsers.map((item, index) => { - const isActive = index === activeItemIndex; + const options: SelectOption[] = dmUsers.map((user) => ({ + value: user.userName, + label: ( +
    + + {user.userName} +
    + ), + shortLabel: user.userName, + uid: user.uid, + })); + + const handleItemClick = (selectedItems) => { + if (!isGroupMessage) { + handleChatCreate([selectedItems.uid]); + } else { + const uids = selectedItems.map((item) => item.uid); + setGroupUids(uids); + } + }; - return ( -
  • setActiveItemIndex(index)} - onMouseDown={(event) => event.preventDefault()} - onClick={() => handleUserItemClick(item)} - > - -
  • - ); - })} -
+ return ( + <> +