diff options
Diffstat (limited to 'web/source/settings/redux')
-rw-r--r-- | web/source/settings/redux/oauth.js | 44 | ||||
-rw-r--r-- | web/source/settings/redux/oauth.ts | 89 | ||||
-rw-r--r-- | web/source/settings/redux/store.ts (renamed from web/source/settings/redux/index.js) | 54 |
3 files changed, 122 insertions, 65 deletions
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 <http://www.gnu.org/licenses/>. -*/ - -"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 <http://www.gnu.org/licenses/>. +*/ + +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<OAuthState>) => { + // Overrides state with payload. + return action.payload; + }, + setToken: (state, action: PayloadAction<OAuthToken>) => { + // 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/index.js b/web/source/settings/redux/store.ts index fe367a672..0c1285187 100644 --- a/web/source/settings/redux/index.js +++ b/web/source/settings/redux/store.ts @@ -17,11 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -"use strict"; - -const { combineReducers } = require("redux"); -const { configureStore } = require("@reduxjs/toolkit"); -const { +import { combineReducers } from "redux"; +import { configureStore } from "@reduxjs/toolkit"; +import { persistStore, persistReducer, FLUSH, @@ -30,14 +28,14 @@ const { PERSIST, PURGE, REGISTER, -} = require("redux-persist"); +} from "redux-persist"; -const query = require("../lib/query/base"); -const { Promise } = require("bluebird"); +import { oauthSlice } from "./oauth"; +import { gtsApi } from "../lib/query/gts-api"; const combinedReducers = combineReducers({ - oauth: require("./oauth").reducer, - [query.reducerPath]: query.reducer + [gtsApi.reducerPath]: gtsApi.reducer, + oauth: oauthSlice.reducer, }); const persistedReducer = persistReducer({ @@ -45,27 +43,41 @@ const persistedReducer = persistReducer({ 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; - } + 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); -const store = configureStore({ +export const store = configureStore({ reducer: persistedReducer, middleware: (getDefaultMiddleware) => { return getDefaultMiddleware({ serializableCheck: { - ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER] + ignoredActions: [ + FLUSH, + REHYDRATE, + PAUSE, + PERSIST, + PURGE, + REGISTER, + ] } - }).concat(query.middleware); + }).concat(gtsApi.middleware); } }); -const persistor = persistStore(store); +export const persistor = persistStore(store); -module.exports = { store, persistor };
\ No newline at end of file +export type AppDispatch = typeof store.dispatch; +export type RootState = ReturnType<typeof store.getState>; |