diff --git a/client/packages/lowcoder/src/app.tsx b/client/packages/lowcoder/src/app.tsx index 12d30f54b..44d65c50a 100644 --- a/client/packages/lowcoder/src/app.tsx +++ b/client/packages/lowcoder/src/app.tsx @@ -39,14 +39,13 @@ import { CodeEditorTooltipContainer } from "base/codeEditor/codeEditor"; import { ProductLoading } from "components/ProductLoading"; import { language, trans } from "i18n"; import { loadComps } from "comps"; -import { fetchHomeData } from "redux/reduxActions/applicationActions"; import { initApp } from "util/commonUtils"; import ApplicationHome from "./pages/ApplicationV2"; import { favicon } from "@lowcoder-ee/assets/images"; import { hasQueryParam } from "util/urlUtils"; import { isFetchUserFinished } from "redux/selectors/usersSelectors"; import { SystemWarning } from "./components/SystemWarning"; -import { getBrandingConfig, getSystemConfigFetching } from "./redux/selectors/configSelectors"; +import { getBrandingConfig } from "./redux/selectors/configSelectors"; import { buildMaterialPreviewURL } from "./util/materialUtils"; import GlobalInstances from 'components/GlobalInstances'; @@ -71,14 +70,11 @@ const Wrapper = (props: { children: React.ReactNode }) => ( type AppIndexProps = { isFetchUserFinished: boolean; - isFetchHomeFinished: boolean; - // isFetchingConfig: boolean; currentOrgId?: string; orgDev: boolean; defaultHomePage: string | null | undefined; fetchConfig: (orgId?: string) => void; getCurrentUser: () => void; - fetchHome: () => void; favicon: string; brandName: string; }; @@ -86,20 +82,10 @@ type AppIndexProps = { class AppIndex extends React.Component { componentDidMount() { this.props.getCurrentUser(); - const { pathname } = history.location; - - this.props.fetchConfig(this.props.currentOrgId); - - if (pathname === BASE_URL) { - this.props.fetchHome(); - } } componentDidUpdate(prevProps: AppIndexProps) { - if (history.location.pathname === BASE_URL) { - this.props.fetchHome(); - } - if(prevProps.currentOrgId !== this.props.currentOrgId) { + if(prevProps.currentOrgId !== this.props.currentOrgId && this.props.currentOrgId !== '') { this.props.fetchConfig(this.props.currentOrgId); } } @@ -108,11 +94,7 @@ class AppIndex extends React.Component { const isTemplate = hasQueryParam("template"); const pathname = history.location.pathname; // make sure all users in this app have checked login info - if ( - !this.props.isFetchUserFinished || - // this.props.isFetchingConfig || - (pathname === BASE_URL && !this.props.isFetchHomeFinished) - ) { + if (!this.props.isFetchUserFinished) { const hideLoadingHeader = isTemplate || isAuthUnRequired(pathname); return ; } @@ -185,11 +167,9 @@ class AppIndex extends React.Component { const mapStateToProps = (state: AppState) => ({ isFetchUserFinished: isFetchUserFinished(state), - // isFetchingConfig: getSystemConfigFetching(state), orgDev: state.ui.users.user.orgDev, currentOrgId: state.ui.users.user.currentOrgId, defaultHomePage: state.ui.application.homeOrg?.commonSettings.defaultHomePage, - isFetchHomeFinished: state.ui.application.loadingStatus.fetchHomeDataFinished, favicon: getBrandingConfig(state)?.favicon ? buildMaterialPreviewURL(getBrandingConfig(state)?.favicon!) : favicon, @@ -201,7 +181,6 @@ const mapDispatchToProps = (dispatch: any) => ({ dispatch(fetchUserAction()); }, fetchConfig: (orgId?: string) => dispatch(fetchConfigAction(orgId)), - fetchHome: () => dispatch(fetchHomeData({})), }); const AppIndexWithProps = connect(mapStateToProps, mapDispatchToProps)(AppIndex); diff --git a/client/packages/lowcoder/src/pages/ApplicationV2/HomeView.tsx b/client/packages/lowcoder/src/pages/ApplicationV2/HomeView.tsx index 1249038db..0251da3f6 100644 --- a/client/packages/lowcoder/src/pages/ApplicationV2/HomeView.tsx +++ b/client/packages/lowcoder/src/pages/ApplicationV2/HomeView.tsx @@ -1,20 +1,12 @@ -import { useDispatch, useSelector } from "react-redux"; +import { useSelector } from "react-redux"; import { HomeLayout } from "./HomeLayout"; -import { useEffect } from "react"; -import { fetchFolderElements } from "../../redux/reduxActions/folderActions"; import { getUser } from "../../redux/selectors/usersSelectors"; import { folderElementsSelector } from "../../redux/selectors/folderSelector"; export function HomeView() { - const dispatch = useDispatch(); - const elements = useSelector(folderElementsSelector)[""]; const user = useSelector(getUser); - useEffect(() => { - dispatch(fetchFolderElements({})); - }, []); - if (!user.currentOrgId) { return null; } diff --git a/client/packages/lowcoder/src/pages/userAuth/authUtils.ts b/client/packages/lowcoder/src/pages/userAuth/authUtils.ts index cff083fdf..9a05802df 100644 --- a/client/packages/lowcoder/src/pages/userAuth/authUtils.ts +++ b/client/packages/lowcoder/src/pages/userAuth/authUtils.ts @@ -21,11 +21,13 @@ import { ThirdPartyAuthType, ThirdPartyConfigType, } from "constants/authConstants"; +import history from "util/history"; export const AuthContext = createContext<{ systemConfig?: SystemConfig; inviteInfo?: AuthInviteInfo; thirdPartyAuthError?: boolean; + fetchUserAfterAuthSuccess?: () => void; }>(undefined as any); export const getSafeAuthRedirectURL = (redirectUrl: string | null) => { @@ -39,7 +41,8 @@ export const getSafeAuthRedirectURL = (redirectUrl: string | null) => { export function useAuthSubmit( requestFunc: () => AxiosPromise, infoCompleteCheck: boolean, - redirectUrl: string | null + redirectUrl: string | null, + onAuthSuccess?: () => void, ) { const [loading, setLoading] = useState(false); return { @@ -47,7 +50,12 @@ export function useAuthSubmit( onSubmit: () => { setLoading(true); requestFunc() - .then((resp) => authRespValidate(resp, infoCompleteCheck, redirectUrl)) + .then((resp) => authRespValidate( + resp, + infoCompleteCheck, + redirectUrl, + onAuthSuccess, + )) .catch((e) => { messageInstance.error(e.message); }) @@ -66,7 +74,8 @@ export function useAuthSubmit( export function authRespValidate( resp: AxiosResponse, infoCompleteCheck: boolean, - redirectUrl: string | null + redirectUrl: string | null, + onAuthSuccess?: () => void ) { let replaceUrl = redirectUrl || BASE_URL; if (infoCompleteCheck) { @@ -76,7 +85,8 @@ export function authRespValidate( : USER_INFO_COMPLETION; } if (doValidResponse(resp)) { - window.location.replace(replaceUrl); + onAuthSuccess?.(); + history.replace(replaceUrl); } else if ( resp.data.code === SERVER_ERROR_CODES.EXCEED_MAX_USER_ORG_COUNT || resp.data.code === SERVER_ERROR_CODES.ALREADY_IN_ORGANIZATION diff --git a/client/packages/lowcoder/src/pages/userAuth/formLogin.tsx b/client/packages/lowcoder/src/pages/userAuth/formLogin.tsx index 186c62c7c..d13a7c295 100644 --- a/client/packages/lowcoder/src/pages/userAuth/formLogin.tsx +++ b/client/packages/lowcoder/src/pages/userAuth/formLogin.tsx @@ -32,7 +32,7 @@ export default function FormLogin(props: FormLoginProps) { const [account, setAccount] = useState(""); const [password, setPassword] = useState(""); const redirectUrl = useRedirectUrl(); - const { systemConfig, inviteInfo } = useContext(AuthContext); + const { systemConfig, inviteInfo, fetchUserAfterAuthSuccess } = useContext(AuthContext); const invitationId = inviteInfo?.invitationId; const authId = systemConfig?.form.id; const location = useLocation(); @@ -49,7 +49,8 @@ export default function FormLogin(props: FormLoginProps) { authId, }), false, - redirectUrl + redirectUrl, + fetchUserAfterAuthSuccess, ); return ( diff --git a/client/packages/lowcoder/src/pages/userAuth/index.tsx b/client/packages/lowcoder/src/pages/userAuth/index.tsx index 6d5e322ae..78f5a95d6 100644 --- a/client/packages/lowcoder/src/pages/userAuth/index.tsx +++ b/client/packages/lowcoder/src/pages/userAuth/index.tsx @@ -8,6 +8,7 @@ import { AuthRoutes } from "@lowcoder-ee/constants/authConstants"; import { AuthLocationState } from "constants/authConstants"; import { ProductLoading } from "components/ProductLoading"; import { fetchConfigAction } from "redux/reduxActions/configActions"; +import { fetchUserAction } from "redux/reduxActions/userActions"; import _ from "lodash"; export default function UserAuth() { @@ -34,12 +35,17 @@ export default function UserAuth() { return ; } + const fetchUserAfterAuthSuccess = () => { + dispatch(fetchUserAction()); + } + return ( diff --git a/client/packages/lowcoder/src/pages/userAuth/login.tsx b/client/packages/lowcoder/src/pages/userAuth/login.tsx index 8717b4962..8d6c8cd1b 100644 --- a/client/packages/lowcoder/src/pages/userAuth/login.tsx +++ b/client/packages/lowcoder/src/pages/userAuth/login.tsx @@ -144,7 +144,7 @@ function Login() { heading={loginHeading} subHeading={loginSubHeading} > - {loginCardView} + ); } diff --git a/client/packages/lowcoder/src/pages/userAuth/register.tsx b/client/packages/lowcoder/src/pages/userAuth/register.tsx index 3c53e3eb9..29190c84c 100644 --- a/client/packages/lowcoder/src/pages/userAuth/register.tsx +++ b/client/packages/lowcoder/src/pages/userAuth/register.tsx @@ -41,9 +41,9 @@ function UserRegister() { const [password, setPassword] = useState(""); const redirectUrl = useRedirectUrl(); const location = useLocation(); - const { systemConfig, inviteInfo } = useContext(AuthContext); + const { systemConfig, inviteInfo, fetchUserAfterAuthSuccess } = useContext(AuthContext); const invitationId = inviteInfo?.invitationId; - // const invitedOrganizationId = inviteInfo?.invitedOrganizationId; + const orgId = useParams().orgId; const organizationId = useMemo(() => { if(inviteInfo?.invitedOrganizationId) { @@ -53,6 +53,7 @@ function UserRegister() { }, [ inviteInfo, orgId ]) const authId = systemConfig?.form.id; + const { loading, onSubmit } = useAuthSubmit( () => UserApi.formLogin({ @@ -64,13 +65,10 @@ function UserRegister() { authId, }), false, - redirectUrl + redirectUrl, + fetchUserAfterAuthSuccess, ); - if (!systemConfig || !systemConfig?.form.enableRegister) { - return null; - } - const registerHeading = REACT_APP_LOWCODER_CUSTOM_AUTH_WELCOME_TEXT !== "" ? REACT_APP_LOWCODER_CUSTOM_AUTH_WELCOME_TEXT : trans("userAuth.register") diff --git a/client/packages/lowcoder/src/pages/userAuth/thirdParty/authRedirect.tsx b/client/packages/lowcoder/src/pages/userAuth/thirdParty/authRedirect.tsx index 686532fe2..1c12fe7a1 100644 --- a/client/packages/lowcoder/src/pages/userAuth/thirdParty/authRedirect.tsx +++ b/client/packages/lowcoder/src/pages/userAuth/thirdParty/authRedirect.tsx @@ -6,10 +6,10 @@ import { AUTH_LOGIN_URL, AUTH_REGISTER_URL, BASE_URL } from "constants/routesURL import history from "util/history"; import PageSkeleton from "components/PageSkeleton"; import { trans } from "i18n"; -import { useEffect, useState } from "react"; +import { useContext, useEffect, useState } from "react"; import { getAuthenticator } from "@lowcoder-ee/pages/userAuth/thirdParty/authenticator"; import { AuthRedirectUrlParams } from "pages/userAuth/thirdParty/authenticator"; -import { loadAuthParams } from "pages/userAuth/authUtils"; +import { AuthContext, loadAuthParams } from "pages/userAuth/authUtils"; function getUrlParams(queryParams: URLSearchParams): AuthRedirectUrlParams { const ticket = queryParams.get("ticket"); @@ -53,6 +53,8 @@ export function AuthRedirect() { const queryParams = new URLSearchParams(location.search); const urlParam = getUrlParams(queryParams); const [authParams, setAuthParam] = useState(); + const { fetchUserAfterAuthSuccess } = useContext(AuthContext); + useEffect(() => { const localAuthParams = loadAuthParams(); if (!localAuthParams) { @@ -61,8 +63,9 @@ export function AuthRedirect() { setAuthParam(localAuthParams); } }, []); + if (authParams && validateParam(authParams, urlParam)) { - getAuthenticator(authParams, urlParam).doAuth(); + getAuthenticator(authParams, urlParam).doAuth(fetchUserAfterAuthSuccess); } return ; } diff --git a/client/packages/lowcoder/src/pages/userAuth/thirdParty/authenticator/abstractAuthenticator.ts b/client/packages/lowcoder/src/pages/userAuth/thirdParty/authenticator/abstractAuthenticator.ts index 6d1ecea9c..99682e777 100644 --- a/client/packages/lowcoder/src/pages/userAuth/thirdParty/authenticator/abstractAuthenticator.ts +++ b/client/packages/lowcoder/src/pages/userAuth/thirdParty/authenticator/abstractAuthenticator.ts @@ -26,20 +26,21 @@ export abstract class AbstractAuthenticator { this.redirectUrl = decodeURIComponent(getRedirectUrl(authParams.authType)); } - doAuth() { + doAuth(onAuthSuccess?: () => void) { const { authParams } = this; (authParams.authGoal === "login" || authParams.authGoal === "register") - ? this.doLogin() + ? this.doLogin(onAuthSuccess) : this.doBind(); } - protected doLogin() { + protected doLogin(onAuthSuccess?: () => void) { this.login() .then((resp) => { authRespValidate( resp, this.needInfoCheck(this.authParams.sourceType), - this.authParams.afterLoginRedirect + this.authParams.afterLoginRedirect, + onAuthSuccess, ); }) .catch((e) => {