import React, { useEffect, useState } from 'react'; import './DialogInfo.scss'; import { toast } from 'react-toastify'; import cn from 'classnames'; import ColumnContainer from '../../components/containers/ColumnContainer/ColumnContainer'; import { DialogEntity } from '../../../Domain/entity/DialogEntity'; import GroupChat from '../../components/UI/svgs/Icons/Contents/GroupChat'; import UsersList from './UsersList/UsersList'; import { EditDialogParams, FunctionTypeBooleanToVoid, FunctionTypeVoidToVoid, } from '../../../CommonTypes/BaseViewModel'; import { DialogType } from '../../../Domain/entity/DialogTypes'; import PublicChannel from '../../components/UI/svgs/Icons/Contents/PublicChannel'; import User from '../../components/UI/svgs/Icons/Contents/User'; import EditDialog, { TypeOpenDialog } from '../EditDialog/EditDialog'; import { PublicDialogEntity } from '../../../Domain/entity/PublicDialogEntity'; import { DialogListViewModel } from '../DialogList/DialogListViewModel'; import { GroupDialogEntity } from '../../../Domain/entity/GroupDialogEntity'; import { FileEntity } from '../../../Domain/entity/FileEntity'; import UserAvatar from '../EditDialog/UserAvatar/UserAvatar'; import useQbInitializedDataContext from '../../providers/QuickBloxUIKitProvider/useQbInitializedDataContext'; import UiKitTheme from '../../themes/UiKitTheme'; import { UserEntity } from '../../../Domain/entity/UserEntity'; import useUsersListViewModel from './UsersList/useUsersListViewModel'; import { PrivateDialogEntity } from '../../../Domain/entity/PrivateDialogEntity'; import { CloseSvg, GroupChatSvg, LeaveSvg } from '../../icons'; import { Badge, Button, DialogWindow, SettingsItem } from '../../ui-components'; import useModal from '../../../hooks/useModal'; import Header from '../../ui-components/Header/Header'; import InviteMembers from '../InviteMembers/InviteMembers'; type HeaderDialogsProps = { dialog: DialogEntity; dialogViewModel: DialogListViewModel; onCloseDialogInformationHandler: FunctionTypeVoidToVoid; onShowAllMemberClick: FunctionTypeBooleanToVoid; users: UserEntity[]; theme?: UiKitTheme; subHeaderContent?: React.ReactNode; upHeaderContent?: React.ReactNode; rootStyles?: React.CSSProperties; disableAction?: boolean; }; // eslint-disable-next-line react/function-component-definition const DialogInfo = ({ dialog, dialogViewModel, onCloseDialogInformationHandler, onShowAllMemberClick, users, // eslint-disable-next-line @typescript-eslint/no-unused-vars theme = undefined, subHeaderContent = undefined, upHeaderContent = undefined, rootStyles = {}, disableAction = false, }: HeaderDialogsProps) => { const [dialogAvatarUrl, setDialogAvatarUrl] = useState(''); // eslint-disable-next-line @typescript-eslint/no-unused-vars const [themeName, setThemeName] = React.useState( document.documentElement.getAttribute('data-theme'), ); const userViewModel = useUsersListViewModel(dialog); const editModal = useModal(); const inviteMembersModal = useModal(); const leaveModal = useModal(); const currentContext = useQbInitializedDataContext(); const currentUserId = // eslint-disable-next-line @typescript-eslint/no-unsafe-call currentContext.storage.REMOTE_DATA_SOURCE.authInformation?.userId.toString(); const useSubContent = subHeaderContent || false; const useUpContent = upHeaderContent || false; const [isLeaving, setIsLeaving] = useState(false); const toastLeavingId = React.useRef(null); const leaveDialogHandler = () => { if (!disableAction) { setIsLeaving(true); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore toastLeavingId.current = toast('leaving dialog', { autoClose: false, isLoading: true, }); // eslint-disable-next-line promise/catch-or-return dialogViewModel .deleteDialog((dialogViewModel?.entity || dialog) as GroupDialogEntity) .then((result) => { // eslint-disable-next-line promise/always-return if (!result) { toast('Dialog have not been left'); } leaveModal.toggleModal(); }) .catch((e) => { console.log(e); toast("Can't leave dialog"); }) .finally(() => { setIsLeaving(false); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore toast.dismiss(toastLeavingId.current); }); } }; const getUserAvatarByUid = async () => { let result = ''; const participants: Array = dialogViewModel?.entity && dialogViewModel?.entity.type === DialogType.private ? [ (dialogViewModel?.entity as unknown as PrivateDialogEntity) .participantId, ] : []; const senderUser = await userViewModel.getUserById(participants[0]); result = senderUser?.photo || ''; return result; }; async function getDialogPhotoFileForPreview() { const tmpFileUrl: string = await getUserAvatarByUid(); if (tmpFileUrl && tmpFileUrl.length > 0) { setDialogAvatarUrl(tmpFileUrl); } } // eslint-disable-next-line consistent-return const renderIconForTypeDialog = (dialogEntity: DialogEntity) => { console.log(JSON.stringify(dialogEntity)); if (dialogEntity.type === DialogType.group) { const groupDialogEntity = dialogEntity as GroupDialogEntity; if (groupDialogEntity.photo) { return ( ); } return (
); } if (dialogEntity.type === DialogType.private) { return dialogAvatarUrl ? ( ) : (
); } if (dialogEntity.type === DialogType.public) { const publicDialogEntity = dialogEntity as PublicDialogEntity; if (publicDialogEntity.photo) { return ( ); } return (
); } }; async function executeUpdateActions(params: EditDialogParams) { let newUidAvatar: string | undefined | null = null; console.log('before urlPhoto: ', newUidAvatar); if (params.dialogAvatar) { if (params.dialogAvatar !== 'null') { const uploadedFile: FileEntity = await dialogViewModel.uploadFile( params.dialogAvatar as File, ); newUidAvatar = uploadedFile.uid; } else { newUidAvatar = 'null'; } } console.log('after urlPhoto: ', newUidAvatar); if ( // newUidAvatar || (dialog as GroupDialogEntity).photo !== newUidAvatar || (params.dialogTitle.length > 0 && params.dialogTitle !== dialog.name) ) { const dialogForUpdate: GroupDialogEntity = { ...(dialog as GroupDialogEntity), name: params.dialogTitle, photo: newUidAvatar, // || '', newParticipantIds: [], }; dialogViewModel .updateDialog(dialogForUpdate) // eslint-disable-next-line promise/always-return .then((data) => { console.log('result update title dialog: ', JSON.stringify(data)); }) .catch((e) => { console.log('Exception: ', e); }); } } const getDialogUpdatedInfoHandler = (params: EditDialogParams) => { console.log( 'call getDialogUpdatedInfoHandler, params: ', JSON.stringify(params), ); // eslint-disable-next-line promise/catch-or-return,promise/always-return executeUpdateActions(params).then(() => { editModal.toggleModal(); }); }; // eslint-disable-next-line @typescript-eslint/no-unused-vars const changeThemeActions = () => { setThemeName(document.documentElement.getAttribute('data-theme')); }; const getUrlAvatar = (dialogEntity: DialogEntity) => { switch (dialogEntity.type) { case DialogType.group: return (dialogEntity as GroupDialogEntity).photo || undefined; case DialogType.public: return (dialogEntity as PublicDialogEntity).photo || undefined; case DialogType.private: return undefined; default: return undefined; } }; const applyInviteUsersHandler = ( usersForInvite: number[], usersForRemove: number[], ) => { const alreadyPresents = PublicDialogEntity.getParticipants( dialogViewModel?.entity || dialog, ); const newParticipants = usersForInvite.filter( (item) => alreadyPresents.indexOf(item) < 0, ); if (newParticipants.length > 0) { const dialogForUpdate: GroupDialogEntity = { ...(dialogViewModel?.entity || (dialog as GroupDialogEntity)), participantIds: ( (dialogViewModel?.entity || dialog) as GroupDialogEntity ).participantIds, newParticipantIds: newParticipants, photo: '', name: '', }; dialogViewModel .updateDialog(dialogForUpdate) // eslint-disable-next-line promise/always-return,@typescript-eslint/no-unused-vars .then((data) => { if (editModal.isOpen) { editModal.toggleModal(); } if (inviteMembersModal.isOpen) { inviteMembersModal.toggleModal(); } return data; }) .catch((e) => { console.log('Exception: ', e); }); } if (usersForRemove.length > 0) { const dialogForUpdate: GroupDialogEntity = { ...((dialogViewModel?.entity || dialog) as GroupDialogEntity), photo: '', name: '', participantsToRemoveIds: usersForRemove, }; dialogViewModel .removeMembers(dialogForUpdate) // eslint-disable-next-line promise/always-return,@typescript-eslint/no-unused-vars .then((data) => { inviteMembersModal.toggleModal(); }) .catch((e) => { console.log('Exception: ', e); }); } }; useEffect(() => { getDialogPhotoFileForPreview(); return () => { if (dialogAvatarUrl) { URL.revokeObjectURL(dialogAvatarUrl); } }; }, []); return (
{useUpContent && upHeaderContent}
{useSubContent && subHeaderContent}
{renderIconForTypeDialog(dialogViewModel?.entity || dialog)}
{dialogViewModel?.entity?.name || dialog?.name}
{dialog.type !== DialogType.private && dialog.ownerId === currentUserId ? (
) : null}
{dialog.type !== DialogType.private ? ( } title="Members" rightSection={} className="dialog-info-members" > {users && users.length > 0 && (
)}
) : null} } title="Leave dialog" onClick={!disableAction ? leaveModal.toggleModal : undefined} className={cn('dialog-info-leave', { 'dialog-info-leave--disable': disableAction, })} />
); }; export default DialogInfo;