diff --git a/app/soapbox/actions/accounts.js b/app/soapbox/actions/accounts.js
index bd2b199ba..5908f01f1 100644
--- a/app/soapbox/actions/accounts.js
+++ b/app/soapbox/actions/accounts.js
@@ -130,7 +130,9 @@ export function fetchAccount(id) {
return (dispatch, getState) => {
dispatch(fetchRelationships([id]));
- if (getState().getIn(['accounts', id], null) !== null) {
+ const account = getState().getIn(['accounts', id]);
+
+ if (account && !account.get('should_refetch')) {
return;
}
@@ -156,7 +158,15 @@ export function fetchAccount(id) {
export function fetchAccountByUsername(username) {
return (dispatch, getState) => {
+ const account = getState().get('accounts').find(account => account.get('acct') === username);
+
+ if (account) {
+ dispatch(fetchAccount(account.get('id')));
+ return;
+ }
+
api(getState).get(`/api/v1/accounts/${username}`).then(response => {
+ dispatch(fetchRelationships([response.data.id]));
dispatch(importFetchedAccount(response.data));
}).then(() => {
dispatch(fetchAccountSuccess());
diff --git a/app/soapbox/actions/admin.js b/app/soapbox/actions/admin.js
index 6a93b1682..43119708d 100644
--- a/app/soapbox/actions/admin.js
+++ b/app/soapbox/actions/admin.js
@@ -1,5 +1,6 @@
import api from '../api';
import { importFetchedAccount, importFetchedStatuses } from 'soapbox/actions/importer';
+import { fetchRelationships } from 'soapbox/actions/accounts';
export const ADMIN_CONFIG_FETCH_REQUEST = 'ADMIN_CONFIG_FETCH_REQUEST';
export const ADMIN_CONFIG_FETCH_SUCCESS = 'ADMIN_CONFIG_FETCH_SUCCESS';
@@ -124,54 +125,61 @@ export function closeReports(ids) {
return patchReports(ids, 'closed');
}
-export function fetchUsers(params) {
+export function fetchUsers(filters = [], page = 1, pageSize = 50) {
return (dispatch, getState) => {
- dispatch({ type: ADMIN_USERS_FETCH_REQUEST, params });
+ const params = { filters: filters.join(), page, page_size: pageSize };
+
+ dispatch({ type: ADMIN_USERS_FETCH_REQUEST, filters, page, pageSize });
return api(getState)
.get('/api/pleroma/admin/users', { params })
- .then(({ data }) => {
- dispatch({ type: ADMIN_USERS_FETCH_SUCCESS, data, params });
+ .then(({ data: { users, count, page_size: pageSize } }) => {
+ dispatch(fetchRelationships(users.map(user => user.id)));
+ dispatch({ type: ADMIN_USERS_FETCH_SUCCESS, users, count, pageSize, filters, page });
+ return { users, count, pageSize };
}).catch(error => {
- dispatch({ type: ADMIN_USERS_FETCH_FAIL, error, params });
+ dispatch({ type: ADMIN_USERS_FETCH_FAIL, error, filters, page, pageSize });
});
};
}
-export function deactivateUsers(nicknames) {
+export function deactivateUsers(accountIds) {
return (dispatch, getState) => {
- dispatch({ type: ADMIN_USERS_DEACTIVATE_REQUEST, nicknames });
+ const nicknames = nicknamesFromIds(getState, accountIds);
+ dispatch({ type: ADMIN_USERS_DEACTIVATE_REQUEST, accountIds });
return api(getState)
.patch('/api/pleroma/admin/users/deactivate', { nicknames })
.then(({ data: { users } }) => {
- dispatch({ type: ADMIN_USERS_DEACTIVATE_SUCCESS, users, nicknames });
+ dispatch({ type: ADMIN_USERS_DEACTIVATE_SUCCESS, users, accountIds });
}).catch(error => {
- dispatch({ type: ADMIN_USERS_DEACTIVATE_FAIL, error, nicknames });
+ dispatch({ type: ADMIN_USERS_DEACTIVATE_FAIL, error, accountIds });
});
};
}
-export function deleteUsers(nicknames) {
+export function deleteUsers(accountIds) {
return (dispatch, getState) => {
- dispatch({ type: ADMIN_USERS_DELETE_REQUEST, nicknames });
+ const nicknames = nicknamesFromIds(getState, accountIds);
+ dispatch({ type: ADMIN_USERS_DELETE_REQUEST, accountIds });
return api(getState)
.delete('/api/pleroma/admin/users', { data: { nicknames } })
.then(({ data: nicknames }) => {
- dispatch({ type: ADMIN_USERS_DELETE_SUCCESS, nicknames });
+ dispatch({ type: ADMIN_USERS_DELETE_SUCCESS, nicknames, accountIds });
}).catch(error => {
- dispatch({ type: ADMIN_USERS_DELETE_FAIL, error, nicknames });
+ dispatch({ type: ADMIN_USERS_DELETE_FAIL, error, accountIds });
});
};
}
-export function approveUsers(nicknames) {
+export function approveUsers(accountIds) {
return (dispatch, getState) => {
- dispatch({ type: ADMIN_USERS_APPROVE_REQUEST, nicknames });
+ const nicknames = nicknamesFromIds(getState, accountIds);
+ dispatch({ type: ADMIN_USERS_APPROVE_REQUEST, accountIds });
return api(getState)
.patch('/api/pleroma/admin/users/approve', { nicknames })
.then(({ data: { users } }) => {
- dispatch({ type: ADMIN_USERS_APPROVE_SUCCESS, users, nicknames });
+ dispatch({ type: ADMIN_USERS_APPROVE_SUCCESS, users, accountIds });
}).catch(error => {
- dispatch({ type: ADMIN_USERS_APPROVE_FAIL, error, nicknames });
+ dispatch({ type: ADMIN_USERS_APPROVE_FAIL, error, accountIds });
});
};
}
diff --git a/app/soapbox/actions/moderation.js b/app/soapbox/actions/moderation.js
index cce860de8..cb84803bd 100644
--- a/app/soapbox/actions/moderation.js
+++ b/app/soapbox/actions/moderation.js
@@ -36,7 +36,7 @@ export function deactivateUserModal(intl, accountId, afterConfirm = () => {}) {
message: intl.formatMessage(messages.deactivateUserPrompt, { acct }),
confirm: intl.formatMessage(messages.deactivateUserConfirm, { name }),
onConfirm: () => {
- dispatch(deactivateUsers([acct])).then(() => {
+ dispatch(deactivateUsers([accountId])).then(() => {
const message = intl.formatMessage(messages.userDeactivated, { acct });
dispatch(snackbar.success(message));
afterConfirm();
@@ -74,7 +74,7 @@ export function deleteUserModal(intl, accountId, afterConfirm = () => {}) {
confirm,
checkbox,
onConfirm: () => {
- dispatch(deleteUsers([acct])).then(() => {
+ dispatch(deleteUsers([accountId])).then(() => {
const message = intl.formatMessage(messages.userDeleted, { acct });
dispatch(fetchAccountByUsername(acct));
dispatch(snackbar.success(message));
diff --git a/app/soapbox/features/admin/awaiting_approval.js b/app/soapbox/features/admin/awaiting_approval.js
index 7706eb4a8..0d95fa685 100644
--- a/app/soapbox/features/admin/awaiting_approval.js
+++ b/app/soapbox/features/admin/awaiting_approval.js
@@ -5,24 +5,18 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import Column from '../ui/components/column';
-import IconButton from 'soapbox/components/icon_button';
import ScrollableList from 'soapbox/components/scrollable_list';
-import { fetchUsers, deleteUsers, approveUsers } from 'soapbox/actions/admin';
-import snackbar from 'soapbox/actions/snackbar';
+import UnapprovedAccount from './components/unapproved_account';
+import { fetchUsers } from 'soapbox/actions/admin';
const messages = defineMessages({
heading: { id: 'column.admin.awaiting_approval', defaultMessage: 'Awaiting Approval' },
emptyMessage: { id: 'admin.awaiting_approval.empty_message', defaultMessage: 'There is nobody waiting for approval. When a new user signs up, you can review them here.' },
- approved: { id: 'admin.awaiting_approval.approved_message', defaultMessage: '{acct} was approved!' },
- rejected: { id: 'admin.awaiting_approval.rejected_message', defaultMessage: '{acct} was rejected.' },
});
-const mapStateToProps = state => {
- const nicknames = state.getIn(['admin', 'awaitingApproval']);
- return {
- users: nicknames.toList().map(nickname => state.getIn(['admin', 'users', nickname])),
- };
-};
+const mapStateToProps = state => ({
+ accountIds: state.getIn(['admin', 'awaitingApproval']),
+});
export default @connect(mapStateToProps)
@injectIntl
@@ -30,7 +24,7 @@ class AwaitingApproval extends ImmutablePureComponent {
static propTypes = {
intl: PropTypes.object.isRequired,
- users: ImmutablePropTypes.list.isRequired,
+ accountIds: ImmutablePropTypes.orderedSet.isRequired,
};
state = {
@@ -39,51 +33,26 @@ class AwaitingApproval extends ImmutablePureComponent {
componentDidMount() {
const { dispatch } = this.props;
- const params = { page: 1, filters: 'local,need_approval' };
- dispatch(fetchUsers(params))
+ dispatch(fetchUsers(['local', 'need_approval']))
.then(() => this.setState({ isLoading: false }))
.catch(() => {});
}
- handleApprove = nickname => {
- const { dispatch, intl } = this.props;
- return e => {
- dispatch(approveUsers([nickname])).then(() => {
- const message = intl.formatMessage(messages.approved, { acct: `@${nickname}` });
- dispatch(snackbar.success(message));
- }).catch(() => {});
- };
- }
-
- handleReject = nickname => {
- const { dispatch, intl } = this.props;
- return e => {
- dispatch(deleteUsers([nickname])).then(() => {
- const message = intl.formatMessage(messages.rejected, { acct: `@${nickname}` });
- dispatch(snackbar.info(message));
- }).catch(() => {});
- };
- }
-
render() {
- const { intl, users } = this.props;
+ const { intl, accountIds } = this.props;
const { isLoading } = this.state;
- const showLoading = isLoading && users.count() === 0;
+ const showLoading = isLoading && accountIds.count() === 0;
return (
{user.get('registration_reason')}
-
{account.getIn(['pleroma', 'admin', 'registration_reason'])}+