-
diff --git a/app/soapbox/features/soapbox_config/index.js b/app/soapbox/features/soapbox_config/index.js
index 37b3dd1fb..7856a8027 100644
--- a/app/soapbox/features/soapbox_config/index.js
+++ b/app/soapbox/features/soapbox_config/index.js
@@ -14,7 +14,7 @@ import {
FormPropTypes,
} from 'soapbox/features/forms';
import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
-import { updateAdminConfig } from 'soapbox/actions/admin';
+import { updateConfig } from 'soapbox/actions/admin';
import Icon from 'soapbox/components/icon';
import { defaultConfig } from 'soapbox/actions/soapbox';
import { uploadMedia } from 'soapbox/actions/media';
@@ -82,20 +82,18 @@ class SoapboxConfig extends ImmutablePureComponent {
getParams = () => {
const { soapbox } = this.state;
- return {
- configs: [{
- group: ':pleroma',
- key: ':frontend_configurations',
- value: [{
- tuple: [':soapbox_fe', soapbox.toJS()],
- }],
+ return [{
+ group: ':pleroma',
+ key: ':frontend_configurations',
+ value: [{
+ tuple: [':soapbox_fe', soapbox.toJS()],
}],
- };
+ }];
}
handleSubmit = (event) => {
const { dispatch } = this.props;
- dispatch(updateAdminConfig(this.getParams())).then(() => {
+ dispatch(updateConfig(this.getParams())).then(() => {
this.setState({ isLoading: false });
}).catch((error) => {
this.setState({ isLoading: false });
diff --git a/app/soapbox/features/ui/index.js b/app/soapbox/features/ui/index.js
index 313f60607..370400dd1 100644
--- a/app/soapbox/features/ui/index.js
+++ b/app/soapbox/features/ui/index.js
@@ -16,7 +16,7 @@ import { debounce } from 'lodash';
import { uploadCompose, resetCompose } from '../../actions/compose';
import { expandHomeTimeline } from '../../actions/timelines';
import { expandNotifications } from '../../actions/notifications';
-import { fetchReports, fetchUsers } from '../../actions/admin';
+import { fetchReports, fetchUsers, fetchConfig } from '../../actions/admin';
import { fetchFilters } from '../../actions/filters';
import { fetchChats } from 'soapbox/actions/chats';
import { clearHeight } from '../../actions/height_cache';
@@ -465,6 +465,7 @@ class UI extends React.PureComponent {
if (isStaff(account)) {
this.props.dispatch(fetchReports({ state: 'open' }));
this.props.dispatch(fetchUsers({ page: 1, filters: 'local,need_approval' }));
+ this.props.dispatch(fetchConfig());
}
setTimeout(() => this.props.dispatch(fetchFilters()), 500);
diff --git a/app/soapbox/reducers/__tests__/admin-test.js b/app/soapbox/reducers/__tests__/admin-test.js
index 891b8cabe..9f983af0a 100644
--- a/app/soapbox/reducers/__tests__/admin-test.js
+++ b/app/soapbox/reducers/__tests__/admin-test.js
@@ -1,5 +1,10 @@
import reducer from '../admin';
-import { Map as ImmutableMap, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
+import {
+ Map as ImmutableMap,
+ List as ImmutableList,
+ OrderedSet as ImmutableOrderedSet,
+ fromJS,
+} from 'immutable';
describe('admin reducer', () => {
it('should return the initial state', () => {
@@ -8,6 +13,8 @@ describe('admin reducer', () => {
open_report_count: 0,
users: ImmutableMap(),
awaitingApproval: ImmutableOrderedSet(),
+ configs: ImmutableList(),
+ needsReboot: false,
}));
});
});
diff --git a/app/soapbox/reducers/__tests__/soapbox-test.js b/app/soapbox/reducers/__tests__/soapbox-test.js
index 25106faac..ff06e7c69 100644
--- a/app/soapbox/reducers/__tests__/soapbox-test.js
+++ b/app/soapbox/reducers/__tests__/soapbox-test.js
@@ -37,7 +37,7 @@ describe('soapbox reducer', () => {
const state = ImmutableMap({ brandColor: '#354e91' });
const action = {
type: ADMIN_CONFIG_UPDATE_SUCCESS,
- config: soapboxConfig,
+ configs: soapboxConfig.configs,
};
expect(reducer(state, action).toJS()).toMatchObject({
brandColor: '#254f92',
diff --git a/app/soapbox/reducers/admin.js b/app/soapbox/reducers/admin.js
index c7c6be507..eaacf7323 100644
--- a/app/soapbox/reducers/admin.js
+++ b/app/soapbox/reducers/admin.js
@@ -1,4 +1,5 @@
import {
+ ADMIN_CONFIG_FETCH_SUCCESS,
ADMIN_REPORTS_FETCH_SUCCESS,
ADMIN_USERS_FETCH_SUCCESS,
ADMIN_USERS_DELETE_REQUEST,
@@ -18,6 +19,8 @@ const initialState = ImmutableMap({
users: ImmutableMap(),
open_report_count: 0,
awaitingApproval: ImmutableOrderedSet(),
+ configs: ImmutableList(),
+ needsReboot: false,
});
function importUsers(state, users) {
@@ -51,6 +54,8 @@ function approveUsers(state, users) {
export default function admin(state = initialState, action) {
switch(action.type) {
+ case ADMIN_CONFIG_FETCH_SUCCESS:
+ return state.set('configs', fromJS(action.configs));
case ADMIN_REPORTS_FETCH_SUCCESS:
if (action.params && action.params.state === 'open') {
return state
diff --git a/app/soapbox/reducers/instance.js b/app/soapbox/reducers/instance.js
index 3bcd1c4ba..72105279e 100644
--- a/app/soapbox/reducers/instance.js
+++ b/app/soapbox/reducers/instance.js
@@ -3,7 +3,9 @@ import {
NODEINFO_FETCH_SUCCESS,
} from '../actions/instance';
import { PRELOAD_IMPORT } from 'soapbox/actions/preload';
-import { Map as ImmutableMap, fromJS } from 'immutable';
+import { ADMIN_CONFIG_UPDATE_REQUEST, ADMIN_CONFIG_UPDATE_SUCCESS } from 'soapbox/actions/admin';
+import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+import { ConfigDB } from 'soapbox/utils/config_db';
const nodeinfoToInstance = nodeinfo => {
// Match Pleroma's develop branch
@@ -37,6 +39,28 @@ const preloadImport = (state, action, path) => {
return data ? initialState.mergeDeep(fromJS(data)) : state;
};
+const getConfigValue = (instanceConfig, key) => {
+ const v = instanceConfig
+ .find(value => value.getIn(['tuple', 0]) === key);
+
+ return v ? v.getIn(['tuple', 1]) : undefined;
+};
+
+const importConfigs = (state, configs) => {
+ // FIXME: This is pretty hacked together. Need to make a cleaner map.
+ const config = ConfigDB.find(configs, ':pleroma', ':instance');
+ if (!config) return state;
+ const value = config.get('value', ImmutableList());
+
+ return state.withMutations(state => {
+ const registrationsOpen = getConfigValue(value, ':registrations_open');
+ const approvalRequired = getConfigValue(value, ':account_approval_required');
+
+ state.update('registrations', c => typeof registrationsOpen === 'boolean' ? registrationsOpen : c);
+ state.update('approval_required', c => typeof approvalRequired === 'boolean' ? approvalRequired : c);
+ });
+};
+
export default function instance(state = initialState, action) {
switch(action.type) {
case PRELOAD_IMPORT:
@@ -45,6 +69,9 @@ export default function instance(state = initialState, action) {
return initialState.mergeDeep(fromJS(action.instance));
case NODEINFO_FETCH_SUCCESS:
return nodeinfoToInstance(fromJS(action.nodeinfo)).mergeDeep(state);
+ case ADMIN_CONFIG_UPDATE_REQUEST:
+ case ADMIN_CONFIG_UPDATE_SUCCESS:
+ return importConfigs(state, fromJS(action.configs));
default:
return state;
}
diff --git a/app/soapbox/reducers/soapbox.js b/app/soapbox/reducers/soapbox.js
index 40e65c608..5b7db02a8 100644
--- a/app/soapbox/reducers/soapbox.js
+++ b/app/soapbox/reducers/soapbox.js
@@ -4,7 +4,7 @@ import {
SOAPBOX_CONFIG_REQUEST_FAIL,
} from '../actions/soapbox';
import { PRELOAD_IMPORT } from 'soapbox/actions/preload';
-import { Map as ImmutableMap, List as ImmutableList, fromJS } from 'immutable';
+import { Map as ImmutableMap, fromJS } from 'immutable';
import { ConfigDB } from 'soapbox/utils/config_db';
const initialState = ImmutableMap();
@@ -13,9 +13,7 @@ const fallbackState = ImmutableMap({
brandColor: '#0482d8', // Azure
});
-const updateFromAdmin = (state, config) => {
- const configs = config.get('configs', ImmutableList());
-
+const updateFromAdmin = (state, configs) => {
try {
return ConfigDB.find(configs, ':pleroma', ':frontend_configurations')
.get('value')
@@ -47,7 +45,7 @@ export default function soapbox(state = initialState, action) {
case SOAPBOX_CONFIG_REQUEST_FAIL:
return fallbackState.mergeDeep(state);
case ADMIN_CONFIG_UPDATE_SUCCESS:
- return updateFromAdmin(state, fromJS(action.config));
+ return updateFromAdmin(state, fromJS(action.configs));
default:
return state;
}