From d173fcdfa3ad6f6aee721c8553f25f4db38fa302 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Thu, 5 Oct 2023 16:06:19 +0200 Subject: [chore] Convert some settings / admin panel JS to TypeScript (#2247) * initial conversion of STUFF to typescript * more stuff * update babel deps, include commonjs transform * update bundler & eslint configuration * eslint --fix * upgrade deps * update docs, build stuff, peripheral stuff --------- Co-authored-by: f0x --- web/source/settings/redux/index.js | 71 ------------------------------ web/source/settings/redux/oauth.js | 44 ------------------- web/source/settings/redux/oauth.ts | 89 ++++++++++++++++++++++++++++++++++++++ web/source/settings/redux/store.ts | 83 +++++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 115 deletions(-) delete mode 100644 web/source/settings/redux/index.js delete mode 100644 web/source/settings/redux/oauth.js create mode 100644 web/source/settings/redux/oauth.ts create mode 100644 web/source/settings/redux/store.ts (limited to 'web/source/settings/redux') diff --git a/web/source/settings/redux/index.js b/web/source/settings/redux/index.js deleted file mode 100644 index fe367a672..000000000 --- a/web/source/settings/redux/index.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - GoToSocial - Copyright (C) GoToSocial Authors admin@gotosocial.org - SPDX-License-Identifier: AGPL-3.0-or-later - - 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 { combineReducers } = require("redux"); -const { configureStore } = require("@reduxjs/toolkit"); -const { - persistStore, - persistReducer, - FLUSH, - REHYDRATE, - PAUSE, - PERSIST, - PURGE, - REGISTER, -} = require("redux-persist"); - -const query = require("../lib/query/base"); -const { Promise } = require("bluebird"); - -const combinedReducers = combineReducers({ - 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/autoMergeLevel1").default, - whitelist: ["oauth"], - migrate: (state) => { - return Promise.try(() => { - if (state?.oauth != undefined) { - state.oauth.expectingRedirect = false; - } - return state; - }); - } -}, combinedReducers); - -const store = configureStore({ - reducer: persistedReducer, - middleware: (getDefaultMiddleware) => { - return getDefaultMiddleware({ - serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER] - } - }).concat(query.middleware); - } -}); - -const persistor = persistStore(store); - -module.exports = { store, persistor }; \ No newline at end of file diff --git a/web/source/settings/redux/oauth.js b/web/source/settings/redux/oauth.js deleted file mode 100644 index ca0be15d0..000000000 --- a/web/source/settings/redux/oauth.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - GoToSocial - Copyright (C) GoToSocial Authors admin@gotosocial.org - SPDX-License-Identifier: AGPL-3.0-or-later - - 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', - expectingRedirect: false - }, - reducers: { - authorize: (state, { payload }) => { - return payload; // overrides state - }, - 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/oauth.ts b/web/source/settings/redux/oauth.ts new file mode 100644 index 000000000..1d6bf9bb1 --- /dev/null +++ b/web/source/settings/redux/oauth.ts @@ -0,0 +1,89 @@ +/* + GoToSocial + Copyright (C) GoToSocial Authors admin@gotosocial.org + SPDX-License-Identifier: AGPL-3.0-or-later + + 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 . +*/ + +import { PayloadAction, createSlice } from "@reduxjs/toolkit"; + +/** + * OAuthToken represents a response + * to an OAuth token request. + */ +export interface OAuthToken { + /** + * Most likely to be 'Bearer' + * but may be something else. + */ + token_type: string; + /** + * The actual token. Can be passed in to + * authenticate further requests using the + * Authorization header and the token type. + */ + access_token: string; +} + +export interface OAuthApp { + client_id: string; + client_secret: string; +} + +export interface OAuthState { + instanceUrl?: string; + loginState: "none" | "callback" | "login" | "logout"; + expectingRedirect: boolean; + /** + * Token stored in easy-to-use format. + * Will look something like: + * "Authorization: Bearer BLAHBLAHBLAH" + */ + token?: string; + app?: OAuthApp; +} + +const initialState: OAuthState = { + loginState: 'none', + expectingRedirect: false, +}; + +export const oauthSlice = createSlice({ + name: "oauth", + initialState: initialState, + reducers: { + authorize: (_state, action: PayloadAction) => { + // Overrides state with payload. + return action.payload; + }, + setToken: (state, action: PayloadAction) => { + // Mark us as logged in by storing token. + state.token = `${action.payload.token_type} ${action.payload.access_token}`; + state.loginState = "login"; + }, + remove: (state) => { + // Mark us as logged out by clearing auth. + delete state.token; + delete state.app; + state.loginState = "logout"; + } + } +}); + +export const { + authorize, + setToken, + remove, +} = oauthSlice.actions; diff --git a/web/source/settings/redux/store.ts b/web/source/settings/redux/store.ts new file mode 100644 index 000000000..0c1285187 --- /dev/null +++ b/web/source/settings/redux/store.ts @@ -0,0 +1,83 @@ +/* + GoToSocial + Copyright (C) GoToSocial Authors admin@gotosocial.org + SPDX-License-Identifier: AGPL-3.0-or-later + + 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 . +*/ + +import { combineReducers } from "redux"; +import { configureStore } from "@reduxjs/toolkit"; +import { + persistStore, + persistReducer, + FLUSH, + REHYDRATE, + PAUSE, + PERSIST, + PURGE, + REGISTER, +} from "redux-persist"; + +import { oauthSlice } from "./oauth"; +import { gtsApi } from "../lib/query/gts-api"; + +const combinedReducers = combineReducers({ + [gtsApi.reducerPath]: gtsApi.reducer, + oauth: oauthSlice.reducer, +}); + +const persistedReducer = persistReducer({ + key: "gotosocial-settings", + storage: require("redux-persist/lib/storage").default, + stateReconciler: require("redux-persist/lib/stateReconciler/autoMergeLevel1").default, + whitelist: ["oauth"], + migrate: async (state) => { + if (state == undefined) { + return state; + } + + // This is a cheeky workaround for + // redux-persist being a stickler. + let anyState = state as any; + if (anyState?.oauth != undefined) { + anyState.oauth.expectingRedirect = false; + } + + return anyState; + } +}, combinedReducers); + +export const store = configureStore({ + reducer: persistedReducer, + middleware: (getDefaultMiddleware) => { + return getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [ + FLUSH, + REHYDRATE, + PAUSE, + PERSIST, + PURGE, + REGISTER, + ] + } + }).concat(gtsApi.middleware); + } +}); + +export const persistor = persistStore(store); + +export type AppDispatch = typeof store.dispatch; +export type RootState = ReturnType; -- cgit v1.2.3