remove status from group ui

This commit is contained in:
2458773093 2019-07-17 01:42:26 +03:00
parent caaa9253d6
commit 62b1707a85
5 changed files with 68 additions and 3 deletions

View File

@ -47,6 +47,10 @@ export const GROUP_REMOVED_ACCOUNTS_CREATE_REQUEST = 'GROUP_REMOVED_ACCOUNTS_CRE
export const GROUP_REMOVED_ACCOUNTS_CREATE_SUCCESS = 'GROUP_REMOVED_ACCOUNTS_CREATE_SUCCESS'; export const GROUP_REMOVED_ACCOUNTS_CREATE_SUCCESS = 'GROUP_REMOVED_ACCOUNTS_CREATE_SUCCESS';
export const GROUP_REMOVED_ACCOUNTS_CREATE_FAIL = 'GROUP_REMOVED_ACCOUNTS_CREATE_FAIL'; export const GROUP_REMOVED_ACCOUNTS_CREATE_FAIL = 'GROUP_REMOVED_ACCOUNTS_CREATE_FAIL';
export const GROUP_REMOVE_STATUS_REQUEST = 'GROUP_REMOVE_STATUS_REQUEST';
export const GROUP_REMOVE_STATUS_SUCCESS = 'GROUP_REMOVE_STATUS_SUCCESS';
export const GROUP_REMOVE_STATUS_FAIL = 'GROUP_REMOVE_STATUS_FAIL';
export const fetchGroup = id => (dispatch, getState) => { export const fetchGroup = id => (dispatch, getState) => {
if (!me) return; if (!me) return;
@ -479,3 +483,42 @@ export function createRemovedAccountFail(groupId, id, error) {
error, error,
}; };
}; };
export function groupRemoveStatus(groupId, id) {
return (dispatch, getState) => {
if (!me) return;
dispatch(groupRemoveStatusRequest(groupId, id));
api(getState).delete(`/api/v1/groups/${groupId}/statuses/${id}`).then(response => {
dispatch(groupRemoveStatusSuccess(groupId, id));
}).catch(error => {
dispatch(groupRemoveStatusFail(groupId, id, error));
});
};
};
export function groupRemoveStatusRequest(groupId, id) {
return {
type: GROUP_REMOVE_STATUS_REQUEST,
groupId,
id,
};
};
export function groupRemoveStatusSuccess(groupId, id) {
return {
type: GROUP_REMOVE_STATUS_SUCCESS,
groupId,
id,
};
};
export function groupRemoveStatusFail(groupId, id, error) {
return {
type: GROUP_REMOVE_STATUS_FAIL,
groupId,
id,
error,
};
};

View File

@ -38,6 +38,7 @@ const messages = defineMessages({
admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
group_remove_account: { id: 'status.remove_account_from_group', defaultMessage: 'Remove account from group' }, group_remove_account: { id: 'status.remove_account_from_group', defaultMessage: 'Remove account from group' },
group_remove_post: { id: 'status.remove_post_from_group', defaultMessage: 'Remove status from group' },
}); });
class StatusActionBar extends ImmutablePureComponent { class StatusActionBar extends ImmutablePureComponent {
@ -174,6 +175,12 @@ class StatusActionBar extends ImmutablePureComponent {
this.props.onGroupRemoveAccount(status.get('group_id'), status.getIn(['account', 'id'])); this.props.onGroupRemoveAccount(status.get('group_id'), status.getIn(['account', 'id']));
} }
handleGroupRemovePost = () => {
const { status } = this.props;
this.props.onGroupRemoveStatus(status.get('group_id'), status.get('id'));
}
_makeMenu = (publicStatus) => { _makeMenu = (publicStatus) => {
const { status, intl, withDismiss, withGroupAdmin } = this.props; const { status, intl, withDismiss, withGroupAdmin } = this.props;
const mutingConversation = status.get('muted'); const mutingConversation = status.get('muted');
@ -226,6 +233,7 @@ class StatusActionBar extends ImmutablePureComponent {
if (withGroupAdmin) { if (withGroupAdmin) {
menu.push(null); menu.push(null);
menu.push({ text: intl.formatMessage(messages.group_remove_account), action: this.handleGroupRemoveAccount }); menu.push({ text: intl.formatMessage(messages.group_remove_account), action: this.handleGroupRemoveAccount });
menu.push({ text: intl.formatMessage(messages.group_remove_post), action: this.handleGroupRemovePost });
} }
} }

View File

@ -29,7 +29,10 @@ import { openModal } from '../actions/modal';
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
import { boostModal, deleteModal } from '../initial_state'; import { boostModal, deleteModal } from '../initial_state';
import { showAlertForError } from '../actions/alerts'; import { showAlertForError } from '../actions/alerts';
import { createRemovedAccount } from '../actions/groups'; import {
createRemovedAccount,
groupRemoveStatus
} from '../actions/groups';
const messages = defineMessages({ const messages = defineMessages({
deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' }, deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
@ -178,6 +181,10 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
dispatch(createRemovedAccount(groupId, accountId)); dispatch(createRemovedAccount(groupId, accountId));
}, },
onGroupRemoveStatus(groupId, statusId) {
dispatch(groupRemoveStatus(groupId, statusId));
},
}); });
export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status)); export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Status));

View File

@ -63,7 +63,7 @@ class GroupTimeline extends React.PureComponent {
const { columnId, group, relationships, account } = this.props; const { columnId, group, relationships, account } = this.props;
const { id } = this.props.params; const { id } = this.props.params;
if (typeof group === 'undefined') { if (typeof group === 'undefined' || !relationships) {
return ( return (
<Column> <Column>
<LoadingIndicator /> <LoadingIndicator />
@ -79,7 +79,7 @@ class GroupTimeline extends React.PureComponent {
return ( return (
<div> <div>
{relationships && relationships.get('member') && ( {relationships.get('member') && (
<div className='timeline-compose-block'> <div className='timeline-compose-block'>
<div className='timeline-compose-block__avatar'> <div className='timeline-compose-block__avatar'>
<Avatar account={account} size={46} /> <Avatar account={account} size={46} />

View File

@ -18,6 +18,7 @@ import {
} from '../actions/accounts'; } from '../actions/accounts';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable'; import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
import compareId from '../compare_id'; import compareId from '../compare_id';
import { GROUP_REMOVE_STATUS_SUCCESS } from '../actions/groups';
const initialState = ImmutableMap(); const initialState = ImmutableMap();
@ -143,6 +144,10 @@ const filterTimeline = (timeline, state, relationship, statuses) =>
statuses.getIn([statusId, 'account']) === relationship.id statuses.getIn([statusId, 'account']) === relationship.id
)); ));
const removeStatusFromGroup = (state, groupId, statusId) => {
return state.updateIn([`group:${groupId}`, 'items'], list => list.filterNot(item => item === statusId));
};
export default function timelines(state = initialState, action) { export default function timelines(state = initialState, action) {
switch(action.type) { switch(action.type) {
case TIMELINE_EXPAND_REQUEST: case TIMELINE_EXPAND_REQUEST:
@ -177,6 +182,8 @@ export default function timelines(state = initialState, action) {
initialTimeline, initialTimeline,
map => map.set('online', false).update('items', items => items.first() ? items.unshift(null) : items) map => map.set('online', false).update('items', items => items.first() ? items.unshift(null) : items)
); );
case GROUP_REMOVE_STATUS_SUCCESS:
return removeStatusFromGroup(state, action.groupId, action.id)
default: default:
return state; return state;
} }