From 8f17abdbf09cb1f63f0cc60ef7d34a8aa8d6917b Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 21 Sep 2023 08:46:48 +0800 Subject: [PATCH] feat: use get workspace profile in frontend --- api/v2/acl_config.go | 8 +++---- frontend/web/src/App.tsx | 4 ++-- frontend/web/src/components/DemoBanner.tsx | 8 +++---- frontend/web/src/helpers/api.ts | 4 ---- frontend/web/src/pages/SignIn.tsx | 7 ++----- frontend/web/src/pages/SignUp.tsx | 8 +++---- frontend/web/src/services/globalService.ts | 20 ------------------ frontend/web/src/services/index.ts | 4 ++-- frontend/web/src/services/workspaceService.ts | 21 +++++++++++++++++++ frontend/web/src/stores/index.ts | 2 +- frontend/web/src/stores/modules/global.ts | 19 ----------------- frontend/web/src/stores/modules/workspace.ts | 20 ++++++++++++++++++ frontend/web/src/types/modules/system.d.ts | 9 -------- 13 files changed, 59 insertions(+), 75 deletions(-) delete mode 100644 frontend/web/src/services/globalService.ts create mode 100644 frontend/web/src/services/workspaceService.ts delete mode 100644 frontend/web/src/stores/modules/global.ts create mode 100644 frontend/web/src/stores/modules/workspace.ts delete mode 100644 frontend/web/src/types/modules/system.d.ts diff --git a/api/v2/acl_config.go b/api/v2/acl_config.go index 2db9e5e..4c0d210 100644 --- a/api/v2/acl_config.go +++ b/api/v2/acl_config.go @@ -3,7 +3,7 @@ package v2 import "strings" var allowedMethodsWhenUnauthorized = map[string]bool{ - "/slash.api.v2.WorkspaceSettingService/GetWorkspaceSetting": true, + "/slash.api.v2.WorkspaceService/GetWorkspaceProfile": true, } // isUnauthorizeAllowedMethod returns true if the method is allowed to be called when the user is not authorized. @@ -15,9 +15,9 @@ func isUnauthorizeAllowedMethod(methodName string) bool { } var allowedMethodsOnlyForAdmin = map[string]bool{ - "/slash.api.v2.UserService/CreateUser": true, - "/slash.api.v2.UserService/DeleteUser": true, - "/slash.api.v2.WorkspaceSettingService/UpdateWorkspaceSetting": true, + "/slash.api.v2.UserService/CreateUser": true, + "/slash.api.v2.UserService/DeleteUser": true, + "/slash.api.v2.WorkspaceService/UpdateWorkspaceSetting": true, } // isOnlyForAdminAllowedMethod returns true if the method is allowed to be called only by admin. diff --git a/frontend/web/src/App.tsx b/frontend/web/src/App.tsx index 40edbb7..d7b9f70 100644 --- a/frontend/web/src/App.tsx +++ b/frontend/web/src/App.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from "react"; import { Outlet } from "react-router-dom"; import DemoBanner from "./components/DemoBanner"; import { workspaceServiceClient } from "./grpcweb"; -import { globalService } from "./services"; +import { workspaceService } from "./services"; import useUserStore from "./stores/v1/user"; import { WorkspaceSetting } from "./types/proto/api/v2/workspace_service"; @@ -14,7 +14,7 @@ function App() { useEffect(() => { const initialState = async () => { try { - await globalService.initialState(); + await workspaceService.initialState(); } catch (error) { // do nothing } diff --git a/frontend/web/src/components/DemoBanner.tsx b/frontend/web/src/components/DemoBanner.tsx index 1b517f3..7e3da47 100644 --- a/frontend/web/src/components/DemoBanner.tsx +++ b/frontend/web/src/components/DemoBanner.tsx @@ -1,12 +1,10 @@ -import { globalService } from "../services"; +import { workspaceService } from "../services"; import Icon from "./Icon"; const DemoBanner: React.FC = () => { const { - workspaceProfile: { - profile: { mode }, - }, - } = globalService.getState(); + workspaceProfile: { mode }, + } = workspaceService.getState(); const shouldShow = mode === "demo"; if (!shouldShow) return null; diff --git a/frontend/web/src/helpers/api.ts b/frontend/web/src/helpers/api.ts index 3d21769..36fe658 100644 --- a/frontend/web/src/helpers/api.ts +++ b/frontend/web/src/helpers/api.ts @@ -1,10 +1,6 @@ import axios from "axios"; import { userServiceClient } from "@/grpcweb"; -export function getWorkspaceProfile() { - return axios.get("/api/v1/workspace/profile"); -} - export function signin(email: string, password: string) { return axios.post("/api/v1/auth/signin", { email, diff --git a/frontend/web/src/pages/SignIn.tsx b/frontend/web/src/pages/SignIn.tsx index 0892ae5..9be86bb 100644 --- a/frontend/web/src/pages/SignIn.tsx +++ b/frontend/web/src/pages/SignIn.tsx @@ -13,10 +13,7 @@ const SignIn: React.FC = () => { const navigate = useNavigate(); const userStore = useUserStore(); const { - workspaceProfile: { - disallowSignUp, - profile: { mode }, - }, + workspaceProfile: { enableSignup, mode }, } = useAppSelector((state) => state.global); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); @@ -108,7 +105,7 @@ const SignIn: React.FC = () => { - {!disallowSignUp && ( + {enableSignup && (

{"Don't have an account yet?"} diff --git a/frontend/web/src/pages/SignUp.tsx b/frontend/web/src/pages/SignUp.tsx index 449cad6..fc8a28b 100644 --- a/frontend/web/src/pages/SignUp.tsx +++ b/frontend/web/src/pages/SignUp.tsx @@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import * as api from "../helpers/api"; import useLoading from "../hooks/useLoading"; -import { globalService } from "../services"; +import { workspaceService } from "../services"; import useUserStore from "../stores/v1/user"; const SignUp: React.FC = () => { @@ -13,8 +13,8 @@ const SignUp: React.FC = () => { const navigate = useNavigate(); const userStore = useUserStore(); const { - workspaceProfile: { disallowSignUp }, - } = globalService.getState(); + workspaceProfile: { enableSignup }, + } = workspaceService.getState(); const [email, setEmail] = useState(""); const [nickname, setNickname] = useState(""); const [password, setPassword] = useState(""); @@ -28,7 +28,7 @@ const SignUp: React.FC = () => { }); } - if (disallowSignUp) { + if (!enableSignup) { return navigate("/auth", { replace: true, }); diff --git a/frontend/web/src/services/globalService.ts b/frontend/web/src/services/globalService.ts deleted file mode 100644 index 3e30407..0000000 --- a/frontend/web/src/services/globalService.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as api from "../helpers/api"; -import store from "../stores"; -import { setGlobalState } from "../stores/modules/global"; - -const globalService = { - getState: () => { - return store.getState().global; - }, - - initialState: async () => { - try { - const workspaceProfile = (await api.getWorkspaceProfile()).data; - store.dispatch(setGlobalState({ workspaceProfile })); - } catch (error) { - // do nth - } - }, -}; - -export default globalService; diff --git a/frontend/web/src/services/index.ts b/frontend/web/src/services/index.ts index c69b14e..b81e872 100644 --- a/frontend/web/src/services/index.ts +++ b/frontend/web/src/services/index.ts @@ -1,4 +1,4 @@ -import globalService from "./globalService"; import shortcutService from "./shortcutService"; +import workspaceService from "./workspaceService"; -export { globalService, shortcutService }; +export { workspaceService, shortcutService }; diff --git a/frontend/web/src/services/workspaceService.ts b/frontend/web/src/services/workspaceService.ts new file mode 100644 index 0000000..dcad7a9 --- /dev/null +++ b/frontend/web/src/services/workspaceService.ts @@ -0,0 +1,21 @@ +import { workspaceServiceClient } from "@/grpcweb"; +import { WorkspaceProfile } from "@/types/proto/api/v2/workspace_service"; +import store from "../stores"; +import { setWorkspaceState } from "../stores/modules/workspace"; + +const workspaceService = { + getState: () => { + return store.getState().global; + }, + + initialState: async () => { + try { + const workspaceProfile = (await workspaceServiceClient.getWorkspaceProfile({})).profile as WorkspaceProfile; + store.dispatch(setWorkspaceState({ workspaceProfile })); + } catch (error) { + // do nth + } + }, +}; + +export default workspaceService; diff --git a/frontend/web/src/stores/index.ts b/frontend/web/src/stores/index.ts index 19e8125..d956e7d 100644 --- a/frontend/web/src/stores/index.ts +++ b/frontend/web/src/stores/index.ts @@ -1,7 +1,7 @@ import { configureStore } from "@reduxjs/toolkit"; import { TypedUseSelectorHook, useSelector } from "react-redux"; -import globalReducer from "./modules/global"; import shortcutReducer from "./modules/shortcut"; +import globalReducer from "./modules/workspace"; const store = configureStore({ reducer: { diff --git a/frontend/web/src/stores/modules/global.ts b/frontend/web/src/stores/modules/global.ts deleted file mode 100644 index 2b889b6..0000000 --- a/frontend/web/src/stores/modules/global.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { createSlice, PayloadAction } from "@reduxjs/toolkit"; - -type State = { - workspaceProfile: WorkspaceProfile; -}; - -const globalSlice = createSlice({ - name: "global", - initialState: {} as State, - reducers: { - setGlobalState: (_, action: PayloadAction) => { - return action.payload; - }, - }, -}); - -export const { setGlobalState } = globalSlice.actions; - -export default globalSlice.reducer; diff --git a/frontend/web/src/stores/modules/workspace.ts b/frontend/web/src/stores/modules/workspace.ts new file mode 100644 index 0000000..8a97380 --- /dev/null +++ b/frontend/web/src/stores/modules/workspace.ts @@ -0,0 +1,20 @@ +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; +import { WorkspaceProfile } from "@/types/proto/api/v2/workspace_service"; + +type State = { + workspaceProfile: WorkspaceProfile; +}; + +const workspaceSlice = createSlice({ + name: "workspace", + initialState: {} as State, + reducers: { + setWorkspaceState: (_, action: PayloadAction) => { + return action.payload; + }, + }, +}); + +export const { setWorkspaceState } = workspaceSlice.actions; + +export default workspaceSlice.reducer; diff --git a/frontend/web/src/types/modules/system.d.ts b/frontend/web/src/types/modules/system.d.ts deleted file mode 100644 index cf87fdb..0000000 --- a/frontend/web/src/types/modules/system.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -interface Profile { - mode: string; - version: string; -} - -interface WorkspaceProfile { - profile: Profile; - disallowSignUp: boolean; -}