Add antenna exclusion adder dialog

This commit is contained in:
KMY 2023-08-22 20:06:00 +09:00
parent 1461ab0a2f
commit 4fbebebcb3
12 changed files with 143 additions and 28 deletions

View file

@ -0,0 +1,18 @@
# frozen_string_literal: true
class Api::V1::Accounts::ExcludeAntennasController < Api::BaseController
before_action -> { doorkeeper_authorize! :read, :'read:lists' }
before_action :require_user!
before_action :set_account
def index
@antennas = @account.suspended? ? [] : current_account.antennas.where('exclude_accounts @> \'[?]\'', @account.id)
render json: @antennas, each_serializer: REST::AntennaSerializer
end
private
def set_account
@account = Account.find(params[:account_id])
end
end

View file

@ -122,6 +122,10 @@ export const ANTENNA_ADDER_ANTENNAS_FETCH_REQUEST = 'ANTENNA_ADDER_ANTENNAS_FETC
export const ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS = 'ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS'; export const ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS = 'ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS';
export const ANTENNA_ADDER_ANTENNAS_FETCH_FAIL = 'ANTENNA_ADDER_ANTENNAS_FETCH_FAIL'; export const ANTENNA_ADDER_ANTENNAS_FETCH_FAIL = 'ANTENNA_ADDER_ANTENNAS_FETCH_FAIL';
export const ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_REQUEST = 'ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_REQUEST';
export const ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_SUCCESS = 'ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_SUCCESS';
export const ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_FAIL = 'ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_FAIL';
export const fetchAntenna = id => (dispatch, getState) => { export const fetchAntenna = id => (dispatch, getState) => {
if (getState().getIn(['antennas', id])) { if (getState().getIn(['antennas', id])) {
return; return;
@ -905,6 +909,15 @@ export const setupAntennaAdder = accountId => (dispatch, getState) => {
dispatch(fetchAccountAntennas(accountId)); dispatch(fetchAccountAntennas(accountId));
}; };
export const setupExcludeAntennaAdder = accountId => (dispatch, getState) => {
dispatch({
type: ANTENNA_ADDER_SETUP,
account: getState().getIn(['accounts', accountId]),
});
dispatch(fetchAntennas());
dispatch(fetchExcludeAccountAntennas(accountId));
};
export const fetchAccountAntennas = accountId => (dispatch, getState) => { export const fetchAccountAntennas = accountId => (dispatch, getState) => {
dispatch(fetchAccountAntennasRequest(accountId)); dispatch(fetchAccountAntennasRequest(accountId));
@ -930,6 +943,31 @@ export const fetchAccountAntennasFail = (id, err) => ({
err, err,
}); });
export const fetchExcludeAccountAntennas = accountId => (dispatch, getState) => {
dispatch(fetchExcludeAccountAntennasRequest(accountId));
api(getState).get(`/api/v1/accounts/${accountId}/exclude_antennas`)
.then(({ data }) => dispatch(fetchExcludeAccountAntennasSuccess(accountId, data)))
.catch(err => dispatch(fetchExcludeAccountAntennasFail(accountId, err)));
};
export const fetchExcludeAccountAntennasRequest = id => ({
type:ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_REQUEST,
id,
});
export const fetchExcludeAccountAntennasSuccess = (id, antennas) => ({
type: ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_SUCCESS,
id,
antennas,
});
export const fetchExcludeAccountAntennasFail = (id, err) => ({
type: ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_FAIL,
id,
err,
});
export const addToAntennaAdder = antennaId => (dispatch, getState) => { export const addToAntennaAdder = antennaId => (dispatch, getState) => {
dispatch(addToAntenna(antennaId, getState().getIn(['antennaAdder', 'accountId']))); dispatch(addToAntenna(antennaId, getState().getIn(['antennaAdder', 'accountId'])));
}; };
@ -938,3 +976,11 @@ export const removeFromAntennaAdder = antennaId => (dispatch, getState) => {
dispatch(removeFromAntenna(antennaId, getState().getIn(['antennaAdder', 'accountId']))); dispatch(removeFromAntenna(antennaId, getState().getIn(['antennaAdder', 'accountId'])));
}; };
export const addExcludeToAntennaAdder = antennaId => (dispatch, getState) => {
dispatch(addExcludeToAntenna(antennaId, getState().getIn(['antennaAdder', 'accountId'])));
};
export const removeExcludeFromAntennaAdder = antennaId => (dispatch, getState) => {
dispatch(removeExcludeFromAntenna(antennaId, getState().getIn(['antennaAdder', 'accountId'])));
};

View file

@ -59,6 +59,7 @@ const messages = defineMessages({
unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' }, unendorse: { id: 'account.unendorse', defaultMessage: 'Don\'t feature on profile' },
add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' }, add_or_remove_from_list: { id: 'account.add_or_remove_from_list', defaultMessage: 'Add or Remove from lists' },
add_or_remove_from_antenna: { id: 'account.add_or_remove_from_antenna', defaultMessage: 'Add or Remove from antennas' }, add_or_remove_from_antenna: { id: 'account.add_or_remove_from_antenna', defaultMessage: 'Add or Remove from antennas' },
add_or_remove_from_exclude_antenna: { id: 'account.add_or_remove_from_exclude_antenna', defaultMessage: 'Add or Remove from antennas as exclusion' },
add_or_remove_from_circle: { id: 'account.add_or_remove_from_circle', defaultMessage: 'Add or Remove from circles' }, add_or_remove_from_circle: { id: 'account.add_or_remove_from_circle', defaultMessage: 'Add or Remove from circles' },
admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' }, admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' }, admin_domain: { id: 'status.admin_domain', defaultMessage: 'Open moderation interface for {domain}' },
@ -106,6 +107,7 @@ class Header extends ImmutablePureComponent {
onEndorseToggle: PropTypes.func.isRequired, onEndorseToggle: PropTypes.func.isRequired,
onAddToList: PropTypes.func.isRequired, onAddToList: PropTypes.func.isRequired,
onAddToAntenna: PropTypes.func.isRequired, onAddToAntenna: PropTypes.func.isRequired,
onAddToExcludeAntenna: PropTypes.func.isRequired,
onAddToCircle: PropTypes.func.isRequired, onAddToCircle: PropTypes.func.isRequired,
onEditAccountNote: PropTypes.func.isRequired, onEditAccountNote: PropTypes.func.isRequired,
onChangeLanguages: PropTypes.func.isRequired, onChangeLanguages: PropTypes.func.isRequired,
@ -332,6 +334,7 @@ class Header extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList }); menu.push({ text: intl.formatMessage(messages.add_or_remove_from_list), action: this.props.onAddToList });
} }
menu.push({ text: intl.formatMessage(messages.add_or_remove_from_antenna), action: this.props.onAddToAntenna }); menu.push({ text: intl.formatMessage(messages.add_or_remove_from_antenna), action: this.props.onAddToAntenna });
menu.push({ text: intl.formatMessage(messages.add_or_remove_from_exclude_antenna), action: this.props.onAddToExcludeAntenna });
if (account.getIn(['relationship', 'followed_by'])) { if (account.getIn(['relationship', 'followed_by'])) {
menu.push({ text: intl.formatMessage(messages.add_or_remove_from_circle), action: this.props.onAddToCircle }); menu.push({ text: intl.formatMessage(messages.add_or_remove_from_circle), action: this.props.onAddToCircle });
} }

View file

@ -28,6 +28,7 @@ export default class Header extends ImmutablePureComponent {
onEndorseToggle: PropTypes.func.isRequired, onEndorseToggle: PropTypes.func.isRequired,
onAddToList: PropTypes.func.isRequired, onAddToList: PropTypes.func.isRequired,
onAddToAntenna: PropTypes.func.isRequired, onAddToAntenna: PropTypes.func.isRequired,
onAddToExcludeAntenna: PropTypes.func.isRequired,
onAddToCircle: PropTypes.func.isRequired, onAddToCircle: PropTypes.func.isRequired,
onChangeLanguages: PropTypes.func.isRequired, onChangeLanguages: PropTypes.func.isRequired,
onInteractionModal: PropTypes.func.isRequired, onInteractionModal: PropTypes.func.isRequired,
@ -102,6 +103,10 @@ export default class Header extends ImmutablePureComponent {
this.props.onAddToAntenna(this.props.account); this.props.onAddToAntenna(this.props.account);
}; };
handleAddToExcludeAntenna = () => {
this.props.onAddToExcludeAntenna(this.props.account);
};
handleAddToCircle = () => { handleAddToCircle = () => {
this.props.onAddToCircle(this.props.account); this.props.onAddToCircle(this.props.account);
}; };
@ -149,6 +154,7 @@ export default class Header extends ImmutablePureComponent {
onEndorseToggle={this.handleEndorseToggle} onEndorseToggle={this.handleEndorseToggle}
onAddToList={this.handleAddToList} onAddToList={this.handleAddToList}
onAddToAntenna={this.handleAddToAntenna} onAddToAntenna={this.handleAddToAntenna}
onAddToExcludeAntenna={this.handleAddToExcludeAntenna}
onAddToCircle={this.handleAddToCircle} onAddToCircle={this.handleAddToCircle}
onEditAccountNote={this.handleEditAccountNote} onEditAccountNote={this.handleEditAccountNote}
onChangeLanguages={this.handleChangeLanguages} onChangeLanguages={this.handleChangeLanguages}

View file

@ -169,6 +169,17 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
modalType: 'ANTENNA_ADDER', modalType: 'ANTENNA_ADDER',
modalProps: { modalProps: {
accountId: account.get('id'), accountId: account.get('id'),
isExclude: false,
},
}));
},
onAddToExcludeAntenna (account) {
dispatch(openModal({
modalType: 'ANTENNA_ADDER',
modalProps: {
accountId: account.get('id'),
isExclude: true,
}, },
})); }));
}, },

View file

@ -8,7 +8,7 @@ import { connect } from 'react-redux';
import { Icon } from 'mastodon/components/icon'; import { Icon } from 'mastodon/components/icon';
import { removeFromAntennaAdder, addToAntennaAdder } from '../../../actions/antennas'; import { removeFromAntennaAdder, addToAntennaAdder, removeExcludeFromAntennaAdder, addExcludeToAntennaAdder } from '../../../actions/antennas';
import { IconButton } from '../../../components/icon_button'; import { IconButton } from '../../../components/icon_button';
const messages = defineMessages({ const messages = defineMessages({
@ -24,15 +24,20 @@ const MapStateToProps = (state, { antennaId, added }) => ({
const mapDispatchToProps = (dispatch, { antennaId }) => ({ const mapDispatchToProps = (dispatch, { antennaId }) => ({
onRemove: () => dispatch(removeFromAntennaAdder(antennaId)), onRemove: () => dispatch(removeFromAntennaAdder(antennaId)),
onAdd: () => dispatch(addToAntennaAdder(antennaId)), onAdd: () => dispatch(addToAntennaAdder(antennaId)),
onExcludeRemove: () => dispatch(removeExcludeFromAntennaAdder(antennaId)),
onExcludeAdd: () => dispatch(addExcludeToAntennaAdder(antennaId)),
}); });
class Antenna extends ImmutablePureComponent { class Antenna extends ImmutablePureComponent {
static propTypes = { static propTypes = {
antenna: ImmutablePropTypes.map.isRequired, antenna: ImmutablePropTypes.map.isRequired,
isExclude: PropTypes.bool.isRequired,
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
onRemove: PropTypes.func.isRequired, onRemove: PropTypes.func.isRequired,
onAdd: PropTypes.func.isRequired, onAdd: PropTypes.func.isRequired,
onExcludeRemove: PropTypes.func.isRequired,
onExcludeAdd: PropTypes.func.isRequired,
added: PropTypes.bool, added: PropTypes.bool,
}; };
@ -40,15 +45,31 @@ class Antenna extends ImmutablePureComponent {
added: false, added: false,
}; };
handleRemove = () => {
if (this.props.isExclude) {
this.props.onExcludeRemove();
} else {
this.props.onRemove();
}
};
handleAdd = () => {
if (this.props.isExclude) {
this.props.onExcludeAdd();
} else {
this.props.onAdd();
}
};
render () { render () {
const { antenna, intl, onRemove, onAdd, added } = this.props; const { antenna, intl, added } = this.props;
let button; let button;
if (added) { if (added) {
button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={onRemove} />; button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={this.handleRemove} />;
} else { } else {
button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={onAdd} />; button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={this.handleAdd} />;
} }
return ( return (

View file

@ -7,7 +7,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { createSelector } from 'reselect'; import { createSelector } from 'reselect';
import { setupAntennaAdder, resetAntennaAdder } from '../../actions/antennas'; import { setupAntennaAdder, resetAntennaAdder, setupExcludeAntennaAdder } from '../../actions/antennas';
import NewAntennaForm from '../antennas/components/new_antenna_form'; import NewAntennaForm from '../antennas/components/new_antenna_form';
import Account from '../list_adder/components/account'; import Account from '../list_adder/components/account';
@ -28,6 +28,7 @@ const mapStateToProps = state => ({
const mapDispatchToProps = dispatch => ({ const mapDispatchToProps = dispatch => ({
onInitialize: accountId => dispatch(setupAntennaAdder(accountId)), onInitialize: accountId => dispatch(setupAntennaAdder(accountId)),
onExcludeInitialize: accountId => dispatch(setupExcludeAntennaAdder(accountId)),
onReset: () => dispatch(resetAntennaAdder()), onReset: () => dispatch(resetAntennaAdder()),
}); });
@ -35,16 +36,22 @@ class AntennaAdder extends ImmutablePureComponent {
static propTypes = { static propTypes = {
accountId: PropTypes.string.isRequired, accountId: PropTypes.string.isRequired,
isExclude: PropTypes.bool.isRequired,
onClose: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired,
intl: PropTypes.object.isRequired, intl: PropTypes.object.isRequired,
onInitialize: PropTypes.func.isRequired, onInitialize: PropTypes.func.isRequired,
onExcludeInitialize: PropTypes.func.isRequired,
onReset: PropTypes.func.isRequired, onReset: PropTypes.func.isRequired,
antennaIds: ImmutablePropTypes.list.isRequired, antennaIds: ImmutablePropTypes.list.isRequired,
}; };
componentDidMount () { componentDidMount () {
const { onInitialize, accountId } = this.props; const { isExclude, onInitialize, onExcludeInitialize, accountId } = this.props;
onInitialize(accountId); if (isExclude) {
onExcludeInitialize(accountId);
} else {
onInitialize(accountId);
}
} }
componentWillUnmount () { componentWillUnmount () {
@ -53,7 +60,7 @@ class AntennaAdder extends ImmutablePureComponent {
} }
render () { render () {
const { accountId, antennaIds } = this.props; const { accountId, antennaIds, isExclude } = this.props;
return ( return (
<div className='modal-root__modal list-adder'> <div className='modal-root__modal list-adder'>
@ -65,7 +72,7 @@ class AntennaAdder extends ImmutablePureComponent {
<div className='list-adder__lists'> <div className='list-adder__lists'>
{antennaIds.map(antennaId => <Antenna key={antennaId} antennaId={antennaId} />)} {antennaIds.map(antennaId => <Antenna key={antennaId} antennaId={antennaId} isExclude={isExclude} />)}
</div> </div>
</div> </div>
); );

View file

@ -20,9 +20,9 @@ const messages = defineMessages({
const makeMapStateToProps = () => { const makeMapStateToProps = () => {
const getAccount = makeGetAccount(); const getAccount = makeGetAccount();
const mapStateToProps = (state, { accountId, added, isExclude }) => ({ const mapStateToProps = (state, { accountId, added }) => ({
account: getAccount(state, accountId), account: getAccount(state, accountId),
added: typeof added === 'undefined' ? state.getIn(['antennaEditor', isExclude ? 'excludeAccounts' : 'accounts', 'items']).includes(accountId) : added, added: typeof added === 'undefined' ? state.getIn(['antennaEditor', 'accounts', 'items']).includes(accountId) : added,
}); });
return mapStateToProps; return mapStateToProps;

View file

@ -15,8 +15,8 @@ import Account from './components/account';
import EditAntennaForm from './components/edit_antenna_form'; import EditAntennaForm from './components/edit_antenna_form';
import Search from './components/search'; import Search from './components/search';
const mapStateToProps = (state, { isExclude }) => ({ const mapStateToProps = (state) => ({
accountIds: state.getIn(['antennaEditor', isExclude ? 'excludeAccounts' : 'accounts', 'items']), accountIds: state.getIn(['antennaEditor', 'accounts', 'items']),
searchAccountIds: state.getIn(['antennaEditor', 'suggestions', 'items']), searchAccountIds: state.getIn(['antennaEditor', 'suggestions', 'items']),
}); });

View file

@ -6,8 +6,13 @@ import {
ANTENNA_ADDER_ANTENNAS_FETCH_REQUEST, ANTENNA_ADDER_ANTENNAS_FETCH_REQUEST,
ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS, ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS,
ANTENNA_ADDER_ANTENNAS_FETCH_FAIL, ANTENNA_ADDER_ANTENNAS_FETCH_FAIL,
ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_REQUEST,
ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_SUCCESS,
ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_FAIL,
ANTENNA_EDITOR_ADD_SUCCESS, ANTENNA_EDITOR_ADD_SUCCESS,
ANTENNA_EDITOR_REMOVE_SUCCESS, ANTENNA_EDITOR_REMOVE_SUCCESS,
ANTENNA_EDITOR_ADD_EXCLUDE_SUCCESS,
ANTENNA_EDITOR_REMOVE_EXCLUDE_SUCCESS,
} from '../actions/antennas'; } from '../actions/antennas';
const initialState = ImmutableMap({ const initialState = ImmutableMap({
@ -29,18 +34,23 @@ export default function antennaAdderReducer(state = initialState, action) {
map.set('accountId', action.account.get('id')); map.set('accountId', action.account.get('id'));
}); });
case ANTENNA_ADDER_ANTENNAS_FETCH_REQUEST: case ANTENNA_ADDER_ANTENNAS_FETCH_REQUEST:
case ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_REQUEST:
return state.setIn(['antennas', 'isLoading'], true); return state.setIn(['antennas', 'isLoading'], true);
case ANTENNA_ADDER_ANTENNAS_FETCH_FAIL: case ANTENNA_ADDER_ANTENNAS_FETCH_FAIL:
return state.setIn(['antennas', 'isLoading'], false); case ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_FAIL:
return state.setIn(['antennas', 'isLoading'], false);
case ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS: case ANTENNA_ADDER_ANTENNAS_FETCH_SUCCESS:
return state.update('antennas', antennas => antennas.withMutations(map => { case ANTENNA_ADDER_EXCLUDE_ANTENNAS_FETCH_SUCCESS:
return state.update('antennas', antennas => antennas.withMutations(map => {
map.set('isLoading', false); map.set('isLoading', false);
map.set('loaded', true); map.set('loaded', true);
map.set('items', ImmutableList(action.antennas.map(item => item.id))); map.set('items', ImmutableList(action.antennas.map(item => item.id)));
})); }));
case ANTENNA_EDITOR_ADD_SUCCESS: case ANTENNA_EDITOR_ADD_SUCCESS:
case ANTENNA_EDITOR_ADD_EXCLUDE_SUCCESS:
return state.updateIn(['antennas', 'items'], antenna => antenna.unshift(action.antennaId)); return state.updateIn(['antennas', 'items'], antenna => antenna.unshift(action.antennaId));
case ANTENNA_EDITOR_REMOVE_SUCCESS: case ANTENNA_EDITOR_REMOVE_SUCCESS:
case ANTENNA_EDITOR_REMOVE_EXCLUDE_SUCCESS:
return state.updateIn(['antennas', 'items'], antenna => antenna.filterNot(item => item === action.antennaId)); return state.updateIn(['antennas', 'items'], antenna => antenna.filterNot(item => item === action.antennaId));
default: default:
return state; return state;

View file

@ -38,12 +38,6 @@ const initialState = ImmutableMap({
isLoading: false, isLoading: false,
}), }),
excludeAccounts: ImmutableMap({
items: ImmutableList(),
loaded: false,
isLoading: false,
}),
suggestions: ImmutableMap({ suggestions: ImmutableMap({
value: '', value: '',
items: ImmutableList(), items: ImmutableList(),
@ -92,11 +86,11 @@ export default function antennaEditorReducer(state = initialState, action) {
map.set('items', ImmutableList(action.accounts.map(item => item.id))); map.set('items', ImmutableList(action.accounts.map(item => item.id)));
})); }));
case ANTENNA_EXCLUDE_ACCOUNTS_FETCH_REQUEST: case ANTENNA_EXCLUDE_ACCOUNTS_FETCH_REQUEST:
return state.setIn(['excludeAccounts', 'isLoading'], true); return state.setIn(['accounts', 'isLoading'], true);
case ANTENNA_EXCLUDE_ACCOUNTS_FETCH_FAIL: case ANTENNA_EXCLUDE_ACCOUNTS_FETCH_FAIL:
return state.setIn(['excludeAccounts', 'isLoading'], false); return state.setIn(['accounts', 'isLoading'], false);
case ANTENNA_EXCLUDE_ACCOUNTS_FETCH_SUCCESS: case ANTENNA_EXCLUDE_ACCOUNTS_FETCH_SUCCESS:
return state.update('excludeAccounts', accounts => accounts.withMutations(map => { return state.update('accounts', accounts => accounts.withMutations(map => {
map.set('isLoading', false); map.set('isLoading', false);
map.set('loaded', true); map.set('loaded', true);
map.set('items', ImmutableList(action.accounts.map(item => item.id))); map.set('items', ImmutableList(action.accounts.map(item => item.id)));
@ -111,13 +105,11 @@ export default function antennaEditorReducer(state = initialState, action) {
map.set('value', ''); map.set('value', '');
})); }));
case ANTENNA_EDITOR_ADD_SUCCESS: case ANTENNA_EDITOR_ADD_SUCCESS:
case ANTENNA_EDITOR_ADD_EXCLUDE_SUCCESS:
return state.updateIn(['accounts', 'items'], antenna => antenna.unshift(action.accountId)); return state.updateIn(['accounts', 'items'], antenna => antenna.unshift(action.accountId));
case ANTENNA_EDITOR_REMOVE_SUCCESS: case ANTENNA_EDITOR_REMOVE_SUCCESS:
return state.updateIn(['accounts', 'items'], antenna => antenna.filterNot(item => item === action.accountId));
case ANTENNA_EDITOR_ADD_EXCLUDE_SUCCESS:
return state.updateIn(['excludeAccounts', 'items'], antenna => antenna.unshift(action.accountId));
case ANTENNA_EDITOR_REMOVE_EXCLUDE_SUCCESS: case ANTENNA_EDITOR_REMOVE_EXCLUDE_SUCCESS:
return state.updateIn(['excludeAccounts', 'items'], antenna => antenna.filterNot(item => item === action.accountId)); return state.updateIn(['accounts', 'items'], antenna => antenna.filterNot(item => item === action.accountId));
default: default:
return state; return state;
} }

View file

@ -180,6 +180,7 @@ namespace :api, format: false do
resources :following, only: :index, controller: 'accounts/following_accounts' resources :following, only: :index, controller: 'accounts/following_accounts'
resources :lists, only: :index, controller: 'accounts/lists' resources :lists, only: :index, controller: 'accounts/lists'
resources :antennas, only: :index, controller: 'accounts/antennas' resources :antennas, only: :index, controller: 'accounts/antennas'
resources :exclude_antennas, only: :index, controller: 'accounts/exclude_antennas'
resources :circles, only: :index, controller: 'accounts/circles' resources :circles, only: :index, controller: 'accounts/circles'
resources :identity_proofs, only: :index, controller: 'accounts/identity_proofs' resources :identity_proofs, only: :index, controller: 'accounts/identity_proofs'
resources :featured_tags, only: :index, controller: 'accounts/featured_tags' resources :featured_tags, only: :index, controller: 'accounts/featured_tags'