[IMPROVE] Rewrite create direct modal (#22209)

* improve: UserAutoCompleteMultiple to wide scope

Co-authored-by: gabriellsh <40830821+gabriellsh@users.noreply.github.com>

* improve: replace create direct modal

Co-authored-by: gabriellsh <40830821+gabriellsh@users.noreply.github.com>

* fix: incorrect type

Co-authored-by: gabriellsh <40830821+gabriellsh@users.noreply.github.com>
Co-authored-by: Tasso Evangelista <tasso.evangelista@rocket.chat>
pull/22272/head^2
Douglas Fabris 5 years ago committed by GitHub
parent ce2443f149
commit d01d6c9d59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      app/ui/client/index.js
  2. 31
      app/ui/client/views/app/CreateDirectMessage.html
  3. 98
      app/ui/client/views/app/CreateDirectMessage.js
  4. 2
      client/components/UserAutoCompleteMultiple/Avatar.js
  5. 4
      client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.js
  6. 0
      client/components/UserAutoCompleteMultiple/index.ts
  7. 2
      client/sidebar/header/CreateChannel.js
  8. 70
      client/sidebar/header/CreateDirectMessage.tsx
  9. 5
      client/sidebar/header/actions/CreateRoomList.js
  10. 2
      client/views/room/contextualBar/ExportMessages/MailExportForm.js
  11. 2
      client/views/room/contextualBar/PruneMessages/PruneMessages.js
  12. 2
      client/views/room/contextualBar/RoomMembers/AddUsers/AddUsers.js
  13. 2
      ee/client/audit/Tabs/DirectTab.js
  14. 2
      ee/client/audit/Tabs/UsersTab.js

@ -25,7 +25,6 @@ import './views/app/photoswipe.html';
import './views/cmsPage';
import './views/404/roomNotFound';
import './views/app/burger';
import './views/app/CreateDirectMessage';
import './views/app/editStatus';
import './views/app/home';
import './views/app/roomSearch';

@ -1,31 +0,0 @@
<template name="CreateDirectMessage">
<section class="create-channel">
<div class="create-channel__wrapper">
<form id="create-dm" class="create-channel__content">
<div class="create-channel__inputs">
{{> SearchCreateDiscussion
onClickTag=onClickTagUser
deleteLastItem=deleteLastItemUser
list=selectedUsers
onSelect=onSelectUser
collection='UserAndRoom'
endpoint='users.autocomplete'
field='username'
sort='username'
label="Direct_message_creation_description"
placeholder="Username_Placeholder"
name="directMessageUsers"
icon="at"
noMatchTemplate="userSearchEmpty"
templateItem="popupList_item_default"
modifier=userModifier
}}
</div>
</form>
<div class="rc-input">
<button form="create-dm" class="rc-button rc-button--primary js-save-dm {{createIsDisabled}}" {{createIsDisabled}}>{{_ " Create "}}</button>
</div>
</div>
</section>
</template>

@ -1,98 +0,0 @@
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';
import { roomTypes } from '../../../../utils/client';
import { call } from '../../../../ui-utils/client';
import { waitUntilRoomBeInserted } from '../../../../ui-utils/client/lib/openRoom';
import './CreateDirectMessage.html';
Template.CreateDirectMessage.helpers({
onSelectUser() {
return Template.instance().onSelectUser;
},
createIsDisabled() {
return Template.instance().selectedUsers.get().length === 0 ? 'disabled' : '';
},
parentChannel() {
const instance = Template.instance();
return instance.parentChannel.get();
},
selectedUsers() {
const myUsername = Meteor.user().username;
const { message } = this;
const users = Template.instance().selectedUsers.get().map((e) => e);
if (message) {
users.unshift(message.u);
}
return users.filter(({ username }) => myUsername !== username);
},
onClickTagUser() {
return Template.instance().onClickTagUser;
},
deleteLastItemUser() {
return Template.instance().deleteLastItemUser;
},
onClickTagRoom() {
return Template.instance().onClickTagRoom;
},
selectedRoom() {
return Template.instance().selectedRoom.get();
},
userModifier() {
return (filter, text = '') => {
const f = filter.get();
return `@${ f.length === 0 ? text : text.replace(new RegExp(filter.get(), 'i'), (part) => `<strong>${ part }</strong>`) }`;
};
},
nameSuggestion() {
return Template.instance().discussionName.get();
},
});
Template.CreateDirectMessage.events({
async 'submit #create-dm, click .js-save-dm'(event, instance) {
event.preventDefault();
const users = instance.selectedUsers.get().map(({ username }) => username).filter((value, index, self) => self.indexOf(value) === index);
const result = await call('createDirectMessage', ...users);
if (instance.data.onCreate) {
instance.data.onCreate(result);
}
await waitUntilRoomBeInserted(result.rid);
const user = Meteor.user();
roomTypes.openRouteLink(result.t, { ...result, name: result.usernames.filter((username) => username !== user.username).join(', ') });
},
});
Template.CreateDirectMessage.onRendered(function() {
this.find('#directMessageUsers').focus();
});
Template.CreateDirectMessage.onCreated(function() {
this.selectedUsers = new ReactiveVar([]);
this.onSelectUser = ({ item: user }) => {
if (user.username === Meteor.user().username) {
return;
}
const users = this.selectedUsers.get();
if (!users.find((u) => user.username === u.username)) {
this.selectedUsers.set([...users, user]);
}
};
this.onClickTagUser = ({ username }) => {
this.selectedUsers.set(this.selectedUsers.get().filter((user) => user.username !== username));
};
this.deleteLastItemUser = () => {
const arr = this.selectedUsers.get();
arr.pop();
this.selectedUsers.set(arr);
};
});

@ -1,7 +1,7 @@
import { Options } from '@rocket.chat/fuselage';
import React from 'react';
import UserAvatar from '../../../../client/components/avatar/UserAvatar';
import UserAvatar from '../avatar/UserAvatar';
const Avatar = ({ value, ...props }) => (
<UserAvatar size={Options.AvatarSize} username={value} {...props} />

@ -2,8 +2,8 @@ import { AutoComplete, Box, Option, Chip } from '@rocket.chat/fuselage';
import { useMutableCallback, useDebouncedValue } from '@rocket.chat/fuselage-hooks';
import React, { memo, useMemo, useState } from 'react';
import UserAvatar from '../../../../client/components/avatar/UserAvatar';
import { useEndpointData } from '../../../../client/hooks/useEndpointData';
import { useEndpointData } from '../../hooks/useEndpointData';
import UserAvatar from '../avatar/UserAvatar';
import Avatar from './Avatar';
const query = (term = '') => ({ selector: JSON.stringify({ term }) });

@ -11,7 +11,7 @@ import {
import { useDebouncedCallback } from '@rocket.chat/fuselage-hooks';
import React, { useEffect, useMemo, useState } from 'react';
import UserAutoCompleteMultiple from '../../../ee/client/audit/UserAutoCompleteMultiple';
import UserAutoCompleteMultiple from '../../components/UserAutoCompleteMultiple';
import { useMethod } from '../../contexts/ServerContext';
import { useSetting } from '../../contexts/SettingsContext';
import { useTranslation } from '../../contexts/TranslationContext';

@ -0,0 +1,70 @@
import { Box, Modal, ButtonGroup, Button } from '@rocket.chat/fuselage';
import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import React, { FC, useState, memo } from 'react';
import { IUser } from '../../../definition/IUser';
import UserAutoCompleteMultiple from '../../components/UserAutoCompleteMultiple';
import { useTranslation } from '../../contexts/TranslationContext';
import { useEndpointActionExperimental } from '../../hooks/useEndpointAction';
import { goToRoomById } from '../../lib/goToRoomById';
type Username = IUser['username'];
type CreateDirectMessageProps = {
onClose: () => void;
};
const CreateDirectMessage: FC<CreateDirectMessageProps> = ({ onClose }) => {
const t = useTranslation();
const [users, setUsers] = useState<Array<Username>>([]);
const createDirect = useEndpointActionExperimental('POST', 'dm.create');
const onChangeUsers = useMutableCallback((value: Username, action: string) => {
if (!action) {
if (users.includes(value)) {
return;
}
return setUsers([...users, value]);
}
setUsers(users.filter((current) => current !== value));
});
const onCreate = useMutableCallback(async () => {
try {
const {
room: { rid },
} = await createDirect({ usernames: users.join(',') });
goToRoomById(rid);
onClose();
} catch (error) {
console.warn(error);
}
});
return (
<Modal>
<Modal.Header>
<Modal.Title>{t('Direct_Messages')}</Modal.Title>
<Modal.Close onClick={onClose} />
</Modal.Header>
<Modal.Content>
<Box>{t('Direct_message_creation_description')}</Box>
<Box mbs='x16' display='flex' width='full'>
<UserAutoCompleteMultiple value={users} onChange={onChangeUsers} />
</Box>
</Modal.Content>
<Modal.Footer>
<ButtonGroup align='end'>
<Button onClick={onClose}>{t('Cancel')}</Button>
<Button disabled={users.length < 1} onClick={onCreate} primary>
{t('Create')}
</Button>
</ButtonGroup>
</Modal.Footer>
</Modal>
);
};
export default memo(CreateDirectMessage);

@ -9,12 +9,11 @@ import { useSetting } from '../../../contexts/SettingsContext';
import { useTranslation } from '../../../contexts/TranslationContext';
import CreateTeamModal from '../../../views/teams/CreateTeamModal';
import CreateChannelWithData from '../CreateChannelWithData';
import CreateDirectMessage from '../CreateDirectMessage';
import CreateRoomListItem from './CreateRoomListItem';
const CREATE_CHANNEL_PERMISSIONS = ['create-c', 'create-p'];
const CREATE_TEAM_PERMISSIONS = ['create-team'];
const CREATE_DISCUSSION_PERMISSIONS = ['start-discussion', 'start-discussion-other-user'];
const style = {
@ -66,7 +65,7 @@ function CreateRoomList() {
const createChannel = useReactModal(CreateChannelWithData);
const createTeam = useReactModal(CreateTeamModal);
const createDirectMessage = useAction(t('Direct_Messages'), 'CreateDirectMessage');
const createDirectMessage = useReactModal(CreateDirectMessage);
const createDiscussion = useAction(t('Discussion_title'), 'CreateDiscussion');
const discussionEnabled = useSetting('Discussion_enabled');

@ -13,7 +13,7 @@ import { useMutableCallback } from '@rocket.chat/fuselage-hooks';
import React, { useState, useEffect } from 'react';
import { roomTypes, isEmail } from '../../../../../app/utils/client';
import UserAutoCompleteMultiple from '../../../../../ee/client/audit/UserAutoCompleteMultiple';
import UserAutoCompleteMultiple from '../../../../components/UserAutoCompleteMultiple';
import { useEndpoint } from '../../../../contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../../contexts/TranslationContext';

@ -2,7 +2,7 @@ import { Field, ButtonGroup, Button, CheckBox, Callout } from '@rocket.chat/fuse
import { useUniqueId } from '@rocket.chat/fuselage-hooks';
import React from 'react';
import UserAutoCompleteMultiple from '../../../../../ee/client/audit/UserAutoCompleteMultiple';
import UserAutoCompleteMultiple from '../../../../components/UserAutoCompleteMultiple';
import VerticalBar from '../../../../components/VerticalBar';
import { useTranslation } from '../../../../contexts/TranslationContext';
import DateTimeRow from './DateTimeRow';

@ -1,7 +1,7 @@
import { Field, Button } from '@rocket.chat/fuselage';
import React from 'react';
import UserAutoCompleteMultiple from '../../../../../../ee/client/audit/UserAutoCompleteMultiple';
import UserAutoCompleteMultiple from '../../../../../components/UserAutoCompleteMultiple';
import VerticalBar from '../../../../../components/VerticalBar';
import { useTranslation } from '../../../../../contexts/TranslationContext';

@ -1,8 +1,8 @@
import { Field } from '@rocket.chat/fuselage';
import React from 'react';
import UserAutoCompleteMultiple from '../../../../client/components/UserAutoCompleteMultiple';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
import UserAutoCompleteMultiple from '../UserAutoCompleteMultiple';
const DirectTab = ({ errors, users, onChangeUsers }) => {
const t = useTranslation();

@ -1,8 +1,8 @@
import { Field } from '@rocket.chat/fuselage';
import React from 'react';
import UserAutoCompleteMultiple from '../../../../client/components/UserAutoCompleteMultiple';
import { useTranslation } from '../../../../client/contexts/TranslationContext';
import UserAutoCompleteMultiple from '../UserAutoCompleteMultiple';
const UsersTab = ({ errors, users, onChangeUsers }) => {
const t = useTranslation();

Loading…
Cancel
Save