Skip to content

Commit a43628b

Browse files
update login flow for enterprise mode
1 parent 4b58461 commit a43628b

File tree

3 files changed

+85
-22
lines changed

3 files changed

+85
-22
lines changed

client/packages/lowcoder/src/pages/userAuth/formLoginSteps.tsx

+64-18
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
ConfirmButton,
55
StyledRouteLink,
66
} from "pages/userAuth/authComponents";
7-
import React, { useContext, useEffect, useState } from "react";
7+
import React, { useContext, useEffect, useMemo, useState } from "react";
88
import styled from "styled-components";
99
import UserApi from "api/userApi";
1010
import { useRedirectUrl } from "util/hooks";
@@ -19,7 +19,7 @@ import { Divider } from "antd";
1919
import Flex from "antd/es/flex";
2020
import { validateResponse } from "@lowcoder-ee/api/apiUtils";
2121
import OrgApi from "@lowcoder-ee/api/orgApi";
22-
import { AccountLoginWrapper } from "./formLoginAdmin";
22+
import FormLogin, { AccountLoginWrapper } from "./formLoginAdmin";
2323
import { default as Button } from "antd/es/button";
2424
import LeftOutlined from "@ant-design/icons/LeftOutlined";
2525
import { fetchConfigAction } from "@lowcoder-ee/redux/reduxActions/configActions";
@@ -28,6 +28,9 @@ import history from "util/history";
2828
import { getServerSettings } from "@lowcoder-ee/redux/selectors/applicationSelector";
2929
import {fetchOrgPaginationByEmail} from "@lowcoder-ee/util/pagination/axios";
3030
import PaginationComp from "@lowcoder-ee/util/pagination/Pagination";
31+
import { getSystemConfigFetching } from "@lowcoder-ee/redux/selectors/configSelectors";
32+
import Spin from "antd/es/spin";
33+
import LoadingOutlined from "@ant-design/icons/LoadingOutlined";
3134

3235
const StyledCard = styled.div<{$selected: boolean}>`
3336
display: flex;
@@ -107,18 +110,28 @@ export default function FormLoginSteps(props: FormLoginProps) {
107110
const { systemConfig, inviteInfo, fetchUserAfterAuthSuccess } = useContext(AuthContext);
108111
const invitationId = inviteInfo?.invitationId;
109112
const authId = systemConfig?.form.id;
110-
const isFormLoginEnabled = systemConfig?.form.enableLogin;
113+
const isFormLoginEnabled = systemConfig?.form.enableLogin; // check from configs
111114
const [orgLoading, setOrgLoading] = useState(false);
112115
const [orgList, setOrgList] = useState<OrgItem[]>([]);
113116
const [currentStep, setCurrentStep] = useState<CurrentStepEnum>(CurrentStepEnum.EMAIL);
114117
const [organizationId, setOrganizationId] = useState<string|undefined>(props.organizationId);
115118
const [skipWorkspaceStep, setSkipWorkspaceStep] = useState<boolean>(false);
116119
const [signupEnabled, setSignupEnabled] = useState<boolean>(true);
120+
const [signinEnabled, setSigninEnabled] = useState<boolean>(true); // check from server settings
117121
const serverSettings = useSelector(getServerSettings);
122+
const isFetchingConfig = useSelector(getSystemConfigFetching);
118123
const [elements, setElements] = useState<ElementsState>({ elements: [], total: 0 });
119124
const [currentPage, setCurrentPage] = useState(1);
120125
const [pageSize, setPageSize] = useState(10);
121126

127+
const isEmailLoginEnabled = useMemo(() => {
128+
return isFormLoginEnabled && signinEnabled;
129+
}, [isFormLoginEnabled, signinEnabled]);
130+
131+
const isEnterpriseMode = useMemo(() => {
132+
return serverSettings?.LOWCODER_WORKSPACE_MODE === "ENTERPRISE" || serverSettings?.LOWCODER_WORKSPACE_MODE === "SINGLEWORKSPACE";
133+
}, [serverSettings]);
134+
122135
useEffect(() => {
123136
if (account)
124137
fetchOrgPaginationByEmail({
@@ -133,11 +146,13 @@ export default function FormLoginSteps(props: FormLoginProps) {
133146
}, [pageSize, currentPage])
134147

135148
useEffect(() => {
136-
const { LOWCODER_EMAIL_SIGNUP_ENABLED } = serverSettings;
137-
if (!LOWCODER_EMAIL_SIGNUP_ENABLED) {
138-
return setSignupEnabled(true);
139-
}
149+
const {
150+
LOWCODER_EMAIL_SIGNUP_ENABLED,
151+
LOWCODER_EMAIL_AUTH_ENABLED,
152+
} = serverSettings;
153+
140154
setSignupEnabled(LOWCODER_EMAIL_SIGNUP_ENABLED === 'true');
155+
setSigninEnabled(LOWCODER_EMAIL_AUTH_ENABLED === 'true');
141156
}, [serverSettings]);
142157

143158
const { onSubmit, loading } = useAuthSubmit(
@@ -167,8 +182,9 @@ export default function FormLoginSteps(props: FormLoginProps) {
167182
}
168183

169184
setOrgLoading(true);
185+
// for enterprise mode, we will not ask for email in first step
170186
fetchOrgPaginationByEmail({
171-
email: account,
187+
email: isEnterpriseMode ? ' ' : account,
172188
pageNum: currentPage,
173189
pageSize: pageSize
174190
})
@@ -177,16 +193,13 @@ export default function FormLoginSteps(props: FormLoginProps) {
177193
setElements({elements: resp.data || [], total: resp.total || 1})
178194
setOrgList(resp.data);
179195
if (!resp.data.length) {
180-
// history.push(
181-
// AUTH_REGISTER_URL,
182-
// {...location.state || {}, email: account},
183-
// )
184-
// return;
185196
throw new Error(trans("userAuth.userNotFound"));
186197
}
187198
if (resp.data.length === 1) {
188-
setOrganizationId(resp.data[0].orgId);
189-
dispatch(fetchConfigAction(resp.data[0].orgId));
199+
// in Enterprise mode, we will get org data in different format
200+
const selectedOrgId = isEnterpriseMode ? resp.data[0].id : resp.data[0].orgId;
201+
setOrganizationId(selectedOrgId);
202+
dispatch(fetchConfigAction(selectedOrgId));
190203
setCurrentStep(CurrentStepEnum.AUTH_PROVIDERS);
191204
return;
192205
}
@@ -203,6 +216,39 @@ export default function FormLoginSteps(props: FormLoginProps) {
203216
});
204217
}
205218

219+
useEffect(() => {
220+
if (isEnterpriseMode) {
221+
// dispatch(fetchConfigAction());
222+
fetchOrgsByEmail();
223+
}
224+
}, [isEnterpriseMode]);
225+
226+
if (isEnterpriseMode) {
227+
return (
228+
<Spin indicator={<LoadingOutlined style={{ fontSize: 30 }} />} spinning={isFetchingConfig}>
229+
{ isEmailLoginEnabled && <FormLogin /> }
230+
<ThirdPartyAuth
231+
invitationId={invitationId}
232+
invitedOrganizationId={organizationId}
233+
authGoal="login"
234+
/>
235+
{signupEnabled && (
236+
<>
237+
<Divider/>
238+
<AuthBottomView>
239+
<StyledRouteLink to={{
240+
pathname: AUTH_REGISTER_URL,
241+
state: {...location.state || {}, email: account}
242+
}}>
243+
{trans("userAuth.register")}
244+
</StyledRouteLink>
245+
</AuthBottomView>
246+
</>
247+
)}
248+
</Spin>
249+
);
250+
}
251+
206252
if(currentStep === CurrentStepEnum.EMAIL) {
207253
return (
208254
<>
@@ -281,10 +327,10 @@ export default function FormLoginSteps(props: FormLoginProps) {
281327
}} />
282328
<StepHeader
283329
title={
284-
isFormLoginEnabled ? trans("userAuth.enterPassword") : trans("userAuth.selectAuthProvider")
330+
isEmailLoginEnabled ? trans("userAuth.enterPassword") : trans("userAuth.selectAuthProvider")
285331
}
286332
/>
287-
{isFormLoginEnabled && (
333+
{isEmailLoginEnabled && (
288334
<>
289335
<PasswordInput
290336
className="form-input password-input"
@@ -316,7 +362,7 @@ export default function FormLoginSteps(props: FormLoginProps) {
316362
/>
317363
)}
318364
</AccountLoginWrapper>
319-
{isFormLoginEnabled && signupEnabled && (
365+
{isEmailLoginEnabled && signupEnabled && (
320366
<>
321367
<Divider/>
322368
<AuthBottomView>

client/packages/lowcoder/src/pages/userAuth/register.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,16 @@ function UserRegister() {
6363
return inviteInfo?.invitedOrganizationId;
6464
}
6565
return orgId;
66-
}, [ inviteInfo, orgId ])
66+
}, [ inviteInfo, orgId ]);
6767

6868
const authId = systemConfig?.form.id;
6969

7070
const serverSettings = useSelector(getServerSettings);
7171

72+
const isEnterpriseMode = useMemo(() => {
73+
return serverSettings?.LOWCODER_WORKSPACE_MODE === "ENTERPRISE" || serverSettings?.LOWCODER_WORKSPACE_MODE === "SINGLEWORKSPACE";
74+
}, [serverSettings]);
75+
7276
useEffect(() => {
7377
const { LOWCODER_EMAIL_SIGNUP_ENABLED } = serverSettings;
7478
if(
@@ -160,7 +164,7 @@ function UserRegister() {
160164
{trans("userAuth.register")}
161165
</ConfirmButton>
162166
<TermsAndPrivacyInfo onCheckChange={(e) => setSubmitBtnDisable(!e.target.checked)} />
163-
{organizationId && (
167+
{(organizationId || isEnterpriseMode) && (
164168
<ThirdPartyAuth
165169
invitationId={invitationId}
166170
invitedOrganizationId={organizationId}

client/packages/lowcoder/src/pages/userAuth/thirdParty/thirdPartyAuth.tsx

+15-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import history from "util/history";
88
import { LoginLogoStyle, LoginLabelStyle, StyledLoginButton } from "pages/userAuth/authComponents";
99
import { useSelector } from "react-redux";
1010
import { getSystemConfigFetching, selectSystemConfig } from "redux/selectors/configSelectors";
11-
import React from "react";
11+
import React, { useMemo } from "react";
1212
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances";
1313
import styled from "styled-components";
1414
import { trans } from "i18n";
@@ -19,6 +19,7 @@ import { useRedirectUrl } from "util/hooks";
1919
import { MultiIconDisplay } from "../../../comps/comps/multiIconDisplay";
2020
import Spin from "antd/es/spin";
2121
import { LoadingOutlined } from "@ant-design/icons";
22+
import { getServerSettings } from "@lowcoder-ee/redux/selectors/applicationSelector";
2223

2324
const { Text } = Typography;
2425

@@ -111,7 +112,16 @@ export function ThirdPartyAuth(props: {
111112
}) {
112113
const systemConfigFetching = useSelector(getSystemConfigFetching);
113114
const systemConfig = useSelector(selectSystemConfig);
115+
const serverSettings = useSelector(getServerSettings);
114116
const isFormLoginEnabled = systemConfig?.form.enableLogin;
117+
118+
const isEmailLoginEnabled = useMemo(() => {
119+
return isFormLoginEnabled && serverSettings.LOWCODER_EMAIL_AUTH_ENABLED === 'true';
120+
}, [isFormLoginEnabled, serverSettings]);
121+
122+
const isEmailSignupEnabled = useMemo(() => {
123+
return serverSettings.LOWCODER_EMAIL_SIGNUP_ENABLED === 'true';
124+
}, [serverSettings]);
115125

116126
if (systemConfigFetching) {
117127
return <Spin indicator={<LoadingOutlined style={{ fontSize: 15, marginTop: '16px' }} spin />} />;
@@ -140,7 +150,10 @@ export function ThirdPartyAuth(props: {
140150
});
141151
return (
142152
<ThirdPartyLoginButtonWrapper>
143-
{ isFormLoginEnabled && Boolean(socialLoginButtons.length) && (
153+
{ (
154+
(isEmailLoginEnabled && props.authGoal === 'login')
155+
|| (isEmailSignupEnabled && props.authGoal === 'register')
156+
) && Boolean(socialLoginButtons.length) && (
144157
<Divider plain>
145158
<Text type="secondary">or</Text>
146159
</Divider>

0 commit comments

Comments
 (0)