From 9b139b632098e6741b10fa87ff6224dcb5045947 Mon Sep 17 00:00:00 2001 From: f0x52 Date: Wed, 18 Jan 2023 14:45:14 +0100 Subject: [frogend] Settings refactor (#1318) * yakshave new form field structure * fully refactor user profile settings form * use rtk query api for profile settings * refactor user post settings * refactor password change form * refactor admin settings * FormWithData structure for user forms * admin actions refactor * whitespace * fix user settings data prop * remove superfluous logging * cleanup old code * refactor federation/suspend (overview, detail) * mostly abstracted (emoji) checkbox list * refactor parse-from-toot * refactor custom-emoji, progress on federation bulk * loading icon styling to prevent big spinny * refactor federation import-export interface * cleanup old files * [chore] Update/add license headers for 2023 * redux fixes * text-field exports * appease the linter * refactor authentication with RTK Query * fix login/logout state transition weirdness * fixes/cleanup * small linter-related fixes * add eslint license header check, fix existing files * remove old code, clarify comment * clarify suspend on subdomains * collapse if/else * fa-fw width info comment --- web/source/settings/redux/index.js | 34 ++++----- web/source/settings/redux/oauth.js | 48 ++++++++++++ web/source/settings/redux/reducers/admin.js | 99 ------------------------- web/source/settings/redux/reducers/instances.js | 42 ----------- web/source/settings/redux/reducers/oauth.js | 52 ------------- web/source/settings/redux/reducers/temporary.js | 32 -------- web/source/settings/redux/reducers/user.js | 50 ------------- 7 files changed, 63 insertions(+), 294 deletions(-) create mode 100644 web/source/settings/redux/oauth.js delete mode 100644 web/source/settings/redux/reducers/admin.js delete mode 100644 web/source/settings/redux/reducers/instances.js delete mode 100644 web/source/settings/redux/reducers/oauth.js delete mode 100644 web/source/settings/redux/reducers/temporary.js delete mode 100644 web/source/settings/redux/reducers/user.js (limited to 'web/source/settings/redux') diff --git a/web/source/settings/redux/index.js b/web/source/settings/redux/index.js index d7a2e6449..12b3db743 100644 --- a/web/source/settings/redux/index.js +++ b/web/source/settings/redux/index.js @@ -1,19 +1,19 @@ /* - GoToSocial - Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org + GoToSocial + Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . */ "use strict"; @@ -34,18 +34,14 @@ const { const query = require("../lib/query/base"); const combinedReducers = combineReducers({ - oauth: require("./reducers/oauth").reducer, - instances: require("./reducers/instances").reducer, - temporary: require("./reducers/temporary").reducer, - user: require("./reducers/user").reducer, - admin: require("./reducers/admin").reducer, + oauth: require("./oauth").reducer, [query.reducerPath]: query.reducer }); const persistedReducer = persistReducer({ key: "gotosocial-settings", storage: require("redux-persist/lib/storage").default, - stateReconciler: require("redux-persist/lib/stateReconciler/autoMergeLevel2").default, + stateReconciler: require("redux-persist/lib/stateReconciler/autoMergeLevel1").default, whitelist: ["oauth"], }, combinedReducers); @@ -54,7 +50,7 @@ const store = configureStore({ middleware: (getDefaultMiddleware) => { return getDefaultMiddleware({ serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, "temporary/setScrollElement"] + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER] } }).concat(query.middleware); } diff --git a/web/source/settings/redux/oauth.js b/web/source/settings/redux/oauth.js new file mode 100644 index 000000000..081d4e508 --- /dev/null +++ b/web/source/settings/redux/oauth.js @@ -0,0 +1,48 @@ +/* + GoToSocial + Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +"use strict"; + +const { createSlice } = require("@reduxjs/toolkit"); + +module.exports = createSlice({ + name: "oauth", + initialState: { + loginState: 'none' + }, + reducers: { + setInstance: (state, { payload }) => { + return { + ...state, + ...payload /* overrides instance, registration keys */ + }; + }, + authorize: (state) => { + state.loginState = "callback"; + }, + setToken: (state, { payload }) => { + state.token = `${payload.token_type} ${payload.access_token}`; + state.loginState = "login"; + }, + remove: (state, { _payload }) => { + delete state.token; + delete state.registration; + state.loginState = "logout"; + } + } +}); \ No newline at end of file diff --git a/web/source/settings/redux/reducers/admin.js b/web/source/settings/redux/reducers/admin.js deleted file mode 100644 index 52fbe65e5..000000000 --- a/web/source/settings/redux/reducers/admin.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -"use strict"; - -const { createSlice } = require("@reduxjs/toolkit"); - -function sortBlocks(blocks) { - return blocks.sort((a, b) => { // alphabetical sort - return a.domain.localeCompare(b.domain); - }); -} - -function emptyBlock() { - return { - public_comment: "", - private_comment: "", - obfuscate: false - }; -} - -module.exports = createSlice({ - name: "admin", - initialState: { - loadedBlockedInstances: false, - blockedInstances: undefined, - bulkBlock: { - list: "", - exportType: "plain", - ...emptyBlock() - }, - newInstanceBlocks: {} - }, - reducers: { - setBlockedInstances: (state, { payload }) => { - state.blockedInstances = {}; - sortBlocks(payload).forEach((entry) => { - state.blockedInstances[entry.domain] = entry; - }); - state.loadedBlockedInstances = true; - }, - - newDomainBlock: (state, { payload: [domain, data] }) => { - if (data == undefined) { - data = { - new: true, - domain, - ...emptyBlock() - }; - } - state.newInstanceBlocks[domain] = data; - }, - - setDomainBlock: (state, { payload: [domain, data = {}] }) => { - state.blockedInstances[domain] = data; - }, - - removeDomainBlock: (state, {payload: domain}) => { - delete state.blockedInstances[domain]; - }, - - updateDomainBlockVal: (state, { payload: [domain, key, val] }) => { - state.newInstanceBlocks[domain][key] = val; - }, - - updateBulkBlockVal: (state, { payload: [key, val] }) => { - state.bulkBlock[key] = val; - }, - - resetBulkBlockVal: (state, { _payload }) => { - state.bulkBlock = { - list: "", - exportType: "plain", - ...emptyBlock() - }; - }, - - exportToField: (state, { _payload }) => { - state.bulkBlock.list = Object.values(state.blockedInstances).map((entry) => { - return entry.domain; - }).join("\n"); - } - } -}); \ No newline at end of file diff --git a/web/source/settings/redux/reducers/instances.js b/web/source/settings/redux/reducers/instances.js deleted file mode 100644 index c58f068ca..000000000 --- a/web/source/settings/redux/reducers/instances.js +++ /dev/null @@ -1,42 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -"use strict"; - -const {createSlice} = require("@reduxjs/toolkit"); -const d = require("dotty"); - -module.exports = createSlice({ - name: "instances", - initialState: { - info: {}, - }, - reducers: { - setNamedInstanceInfo: (state, {payload}) => { - let [key, info] = payload; - state.info[key] = info; - }, - setInstanceInfo: (state, {payload}) => { - state.current = payload; - state.adminSettings = payload; - }, - setAdminSettingsVal: (state, {payload: [key, val]}) => { - d.put(state.adminSettings, key, val); - } - } -}); \ No newline at end of file diff --git a/web/source/settings/redux/reducers/oauth.js b/web/source/settings/redux/reducers/oauth.js deleted file mode 100644 index 129115c9e..000000000 --- a/web/source/settings/redux/reducers/oauth.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -"use strict"; - -const {createSlice} = require("@reduxjs/toolkit"); - -module.exports = createSlice({ - name: "oauth", - initialState: { - loginState: 'none', - }, - reducers: { - setInstance: (state, {payload}) => { - state.instance = payload; - }, - setRegistration: (state, {payload}) => { - state.registration = payload; - }, - setLoginState: (state, {payload}) => { - state.loginState = payload; - }, - login: (state, {payload}) => { - state.token = `${payload.token_type} ${payload.access_token}`; - state.loginState = "login"; - }, - remove: (state, {_payload}) => { - delete state.token; - delete state.registration; - delete state.isAdmin; - state.loginState = "none"; - }, - setAdmin: (state, {payload}) => { - state.isAdmin = payload; - } - } -}); \ No newline at end of file diff --git a/web/source/settings/redux/reducers/temporary.js b/web/source/settings/redux/reducers/temporary.js deleted file mode 100644 index 0155f097a..000000000 --- a/web/source/settings/redux/reducers/temporary.js +++ /dev/null @@ -1,32 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -"use strict"; - -const {createSlice} = require("@reduxjs/toolkit"); - -module.exports = createSlice({ - name: "temporary", - initialState: { - }, - reducers: { - setStatus: function(state, {payload}) { - state.status = payload; - } - } -}); \ No newline at end of file diff --git a/web/source/settings/redux/reducers/user.js b/web/source/settings/redux/reducers/user.js deleted file mode 100644 index 21177ebdc..000000000 --- a/web/source/settings/redux/reducers/user.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - GoToSocial - Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -"use strict"; - -const { createSlice } = require("@reduxjs/toolkit"); -const d = require("dotty"); - -module.exports = createSlice({ - name: "user", - initialState: { - profile: {}, - settings: {} - }, - reducers: { - setAccount: (state, { payload }) => { - payload.source = payload.source ?? {}; - payload.source.language = payload.source.language.toUpperCase() ?? "EN"; - payload.source.status_format = payload.source.status_format ?? "plain"; - payload.source.sensitive = payload.source.sensitive ?? false; - - state.profile = payload; - // /user/settings only needs a copy of the 'source' obj - state.settings = { - source: payload.source - }; - }, - setProfileVal: (state, { payload: [key, val] }) => { - d.put(state.profile, key, val); - }, - setSettingsVal: (state, { payload: [key, val] }) => { - d.put(state.settings, key, val); - } - } -}); \ No newline at end of file -- cgit v1.2.3