docbrown/app/javascript/chat/RequestManager/RequestManager.jsx
Sarthak Sharma 11820aa29b
[deploy] 🐞Fixes #9503 When joining a new room, user is not taken to the new room (#9564)
* Feature 🚀 : Ability to delete messages in chat channels

- Sending message ID to frontend
- Deleting Message
- Use pusher to delete message realtime

* Minor Bug 🐞: Show message action only for current user

- User can delete or edit their own messages

* Test cases added

* Bug 🐞: Update message id for receiver

Message id was not sent to receiver by pusher

* Refactoring🛠: Message controller refactoring

* Test Cases📝 : Specs for Delete message added

* Feature 🚀 : Ability to edit messages

* Test Cases📝 : Specs for Edit message added

* Merge conflict resolved

* 🐞 Fixes bug #9503 When joining a new room, user is not taken to the new room

Co-authored-by: Narender Singh <narender2031@gmail.com>
2020-07-30 16:21:55 -04:00

152 lines
4.5 KiB
JavaScript

import { h, Component } from 'preact';
import PropTypes from 'prop-types';
import { addSnackbarItem } from '../../Snackbar';
import {
getChannelRequestInfo,
updateMembership,
acceptJoiningRequest,
rejectJoiningRequest,
} from '../actions/requestActions';
import HeaderSection from './HeaderSection';
import ChannelRequestSection from './ChannelRequestSection';
import PersonalInvitations from './PersonalInvitationSection';
export default class RequestManager extends Component {
static propTypes = {
resource: PropTypes.shape({
data: PropTypes.object,
}).isRequired,
updateRequestCount: PropTypes.func.isRequired,
};
constructor(props) {
super(props);
this.state = {
updateRequestCount: props.updateRequestCount,
channelJoiningRequests: [],
userInvitations: [],
};
}
componentWillReceiveProps() {
this.setState({
updateRequestCount: this.props.updateRequestCount,
});
}
componentDidMount() {
getChannelRequestInfo().then((response) => {
const { result } = response;
const { user_joining_requests, channel_joining_memberships } = result;
this.setState({
channelJoiningRequests: channel_joining_memberships,
userInvitations: user_joining_requests,
});
});
}
handleIUpdateMembership = async (e) => {
const {
membershipId,
userAction,
channelSlug,
channelId,
} = e.target.dataset;
const response = await updateMembership(membershipId, userAction);
const { success, membership, message } = response;
const { updateRequestCount } = this.state;
if (success) {
this.setState((prevState) => {
const filteredUserInvitations = prevState.userInvitations.filter(
(userInvitation) =>
userInvitation.membership_id !== membership.membership_id,
);
return {
userInvitations: filteredUserInvitations,
};
});
if (userAction === 'accept') {
updateRequestCount(true, { channelSlug, channelId });
}
updateRequestCount();
addSnackbarItem({ message });
} else {
addSnackbarItem({ message });
}
};
handleAcceptJoingRequest = async (e) => {
const { membershipId, channelId } = e.target.dataset;
const response = await acceptJoiningRequest(channelId, membershipId);
const { success, message, membership } = response;
const { updateRequestCount } = this.state;
if (success) {
this.setState((prevState) => {
const formattedChannelJoiningRequests = prevState.channelJoiningRequests.filter(
(channelJoiningRequest) =>
channelJoiningRequest.membership_id !== membership.membership_id,
);
return {
channelJoiningRequests: formattedChannelJoiningRequests,
};
});
updateRequestCount();
addSnackbarItem({ message });
} else {
addSnackbarItem({ message });
}
};
handleRejectJoingRequest = async (e) => {
const { membershipId, channelId } = e.target.dataset;
const response = await rejectJoiningRequest(channelId, membershipId);
const { success, message } = response;
const { updateRequestCount } = this.state;
if (success) {
this.setState((prevState) => {
const formattedChannelJoiningRequests = prevState.channelJoiningRequests.filter(
(channelJoiningRequest) =>
channelJoiningRequest.membership_id !== Number(membershipId),
);
return {
channelJoiningRequests: formattedChannelJoiningRequests,
};
});
updateRequestCount();
addSnackbarItem({ message });
} else {
addSnackbarItem({ message });
}
};
render() {
const { channelJoiningRequests, userInvitations } = this.state;
return (
<div className="activechatchannel__activeArticle activesendrequest">
<div className="p-4">
<HeaderSection />
{channelJoiningRequests.length <= 0 && userInvitations.length <= 0 ? (
<p>You have no pending invitations/Joining Requests.</p>
) : null}
<ChannelRequestSection
channelRequests={channelJoiningRequests}
handleRequestRejection={this.handleRejectJoingRequest}
handleRequestApproval={this.handleAcceptJoingRequest}
/>
<PersonalInvitations
userInvitations={userInvitations}
updateMembership={this.handleIUpdateMembership}
/>
</div>
</div>
);
}
}