Skip to content

Commit 63f7e10

Browse files
tung2744louischan-oursky
authored andcommitted
Use index to reference existing sso provider because alias can be changed
1 parent cb60419 commit 63f7e10

File tree

3 files changed

+38
-33
lines changed

3 files changed

+38
-33
lines changed

portal/src/graphql/portal/AddSingleSignOnConfigurationScreen.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,16 @@ function generateNewAlias(
8585
}
8686

8787
interface OAuthClientFormProps {
88-
alias: string;
88+
initialAlias: string;
8989
providerItemKey: OAuthSSOProviderItemKey;
9090
form: OAuthProviderFormModel;
9191
}
9292

9393
const OAuthClientForm: React.VFC<OAuthClientFormProps> =
9494
function OAuthClientForm(props) {
95-
const { alias, providerItemKey, form } = props;
95+
const { initialAlias, providerItemKey, form } = props;
9696
const widgetProps = useSingleSignOnConfigurationWidget(
97-
alias,
97+
initialAlias,
9898
providerItemKey,
9999
form
100100
);
@@ -174,7 +174,7 @@ const AddSingleSignOnConfigurationContent: React.VFC =
174174
<ShowOnlyIfSIWEIsDisabled>
175175
{newAlias != null && selectedProviderKey != null ? (
176176
<OAuthClientForm
177-
alias={newAlias}
177+
initialAlias={newAlias}
178178
form={form}
179179
providerItemKey={selectedProviderKey}
180180
/>

portal/src/graphql/portal/EditSingleSignOnConfigurationScreen.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,18 @@ function isLocationState(raw: unknown): raw is LocationState {
4141
}
4242

4343
interface OAuthClientItemProps {
44-
alias: string;
44+
initialAlias: string;
4545
providerItemKey: OAuthSSOProviderItemKey;
4646
form: OAuthProviderFormModel;
4747
oauthSSOFeatureConfig?: OAuthSSOFeatureConfig;
4848
}
4949

5050
const OAuthClientItem: React.VFC<OAuthClientItemProps> =
5151
function OAuthClientItem(props) {
52-
const { alias, providerItemKey, form, oauthSSOFeatureConfig } = props;
52+
const { initialAlias, providerItemKey, form, oauthSSOFeatureConfig } =
53+
props;
5354
const widgetProps = useSingleSignOnConfigurationWidget(
54-
alias,
55+
initialAlias,
5556
providerItemKey,
5657
form,
5758
oauthSSOFeatureConfig
@@ -107,7 +108,7 @@ const EditSingleSignOnConfigurationContent: React.VFC<EditSingleSignOnConfigurat
107108
>
108109
<ShowOnlyIfSIWEIsDisabled>
109110
<OAuthClientItem
110-
alias={alias}
111+
initialAlias={alias}
111112
providerItemKey={providerItemKey}
112113
form={form}
113114
oauthSSOFeatureConfig={oauthSSOFeatureConfig}

portal/src/graphql/portal/SingleSignOnConfigurationWidget.tsx

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Checkbox, DirectionalHint, Label, Text } from "@fluentui/react";
22
import { Context, FormattedMessage } from "@oursky/react-messageformat";
33
import cn from "classnames";
44
import { produce } from "immer";
5-
import React, { useCallback, useContext, useMemo } from "react";
5+
import React, { useCallback, useContext, useMemo, useState } from "react";
66
import FormTextField from "../../FormTextField";
77
import {
88
createOAuthSSOProviderItemKey,
@@ -251,7 +251,7 @@ const OAuthClientIcon: React.VFC<OAuthClientIconProps> =
251251
};
252252

253253
export function useSingleSignOnConfigurationWidget(
254-
alias: string,
254+
initialAlias: string,
255255
providerItemKey: OAuthSSOProviderItemKey,
256256
form: OAuthProviderFormModel,
257257
oauthSSOFeatureConfig?: OAuthSSOFeatureConfig
@@ -263,6 +263,19 @@ export function useSingleSignOnConfigurationWidget(
263263

264264
const [providerType, appType] = parseOAuthSSOProviderItemKey(providerItemKey);
265265

266+
const [providerIndex] = useState<number>(() => {
267+
const existingIndex = providers.findIndex((p) =>
268+
isOAuthSSOProvider(p.config, providerType, initialAlias, appType)
269+
);
270+
if (existingIndex !== -1) {
271+
return existingIndex;
272+
}
273+
// Insert at the end if it does not exist
274+
return providers.length;
275+
});
276+
277+
console.log("providerIndex", providerIndex);
278+
266279
const disabled = useMemo(() => {
267280
const providersConfig = oauthSSOFeatureConfig?.providers ?? {};
268281
const providerConfig = providersConfig[
@@ -275,41 +288,32 @@ export function useSingleSignOnConfigurationWidget(
275288
const newConfig = {
276289
config: {
277290
type: providerType,
278-
alias: alias,
291+
alias: initialAlias,
279292
...(appType && { app_type: appType }),
280293
},
281294
secret: {
282295
originalAlias: null,
283-
newAlias: alias,
296+
newAlias: initialAlias,
284297
newClientSecret: "",
285298
},
286299
} satisfies SSOProviderFormState;
287-
return (
288-
providers.find((p) =>
289-
isOAuthSSOProvider(p.config, providerType, alias, appType)
290-
) ?? newConfig
291-
);
292-
}, [providers, providerType, alias, appType]);
300+
return providers.length > providerIndex
301+
? providers[providerIndex]
302+
: newConfig;
303+
}, [providerType, initialAlias, appType, providers, providerIndex]);
293304

294-
const index = providers.findIndex((p) =>
295-
isOAuthSSOProvider(p.config, providerType, alias, appType)
296-
);
297305
const jsonPointer = useMemo(() => {
298-
return index >= 0 ? `/identity/oauth/providers/${index}` : "";
299-
}, [index]);
300-
const clientSecretParentJsonPointer =
301-
index >= 0
302-
? new RegExp(`/secrets/\\d+/data/items/${index}`)
303-
: /placeholder/;
306+
return `/identity/oauth/providers/${providerIndex}`;
307+
}, [providerIndex]);
308+
const clientSecretParentJsonPointer = new RegExp(
309+
`/secrets/\\d+/data/items/${providerIndex}`
310+
);
304311

305312
const onChange = useCallback(
306313
(config: OAuthSSOProviderConfig, secret: SSOProviderFormSecretViewModel) =>
307314
setState((state) =>
308315
produce(state, (state) => {
309-
const existingIdx = state.providers.findIndex((p) =>
310-
isOAuthSSOProvider(p.config, providerType, alias, appType)
311-
);
312-
if (existingIdx === -1) {
316+
if (providerIndex === -1) {
313317
state.providers.push({
314318
config,
315319
secret: {
@@ -319,7 +323,7 @@ export function useSingleSignOnConfigurationWidget(
319323
},
320324
});
321325
} else {
322-
state.providers[existingIdx] = {
326+
state.providers[providerIndex] = {
323327
config,
324328
secret: {
325329
originalAlias: secret.originalAlias,
@@ -330,7 +334,7 @@ export function useSingleSignOnConfigurationWidget(
330334
}
331335
})
332336
),
333-
[setState, providerType, alias, appType]
337+
[setState, providerIndex]
334338
);
335339

336340
return {

0 commit comments

Comments
 (0)