import { Button, DialogActions, DialogContent, DialogTitle, Divider, Drawer, Input, ModalClose } from "@mui/joy"; import { isUndefined } from "lodash-es"; import { useState } from "react"; import { toast } from "react-hot-toast"; import { useTranslation } from "react-i18next"; import { v4 as uuidv4 } from "uuid"; import { workspaceServiceClient } from "@/grpcweb"; import { absolutifyLink } from "@/helpers/utils"; import useLoading from "@/hooks/useLoading"; import { useWorkspaceStore } from "@/stores"; import { IdentityProvider, IdentityProvider_Type, IdentityProviderConfig_OAuth2Config } from "@/types/proto/api/v1/workspace_service"; interface Props { identityProvider?: IdentityProvider; onClose: () => void; onConfirm?: () => void; } interface State { identityProviderCreate: IdentityProvider; } const CreateIdentityProviderDrawer: React.FC = (props: Props) => { const { onClose, onConfirm, identityProvider } = props; const { t } = useTranslation(); const workspaceStore = useWorkspaceStore(); const [state, setState] = useState({ identityProviderCreate: IdentityProvider.fromPartial( identityProvider || { id: uuidv4(), type: IdentityProvider_Type.OAUTH2, config: { oauth2: IdentityProviderConfig_OAuth2Config.fromPartial({ scopes: [], fieldMapping: {}, }), }, }, ), }); const isCreating = isUndefined(identityProvider); const requestState = useLoading(false); const setPartialState = (partialState: Partial) => { setState({ ...state, ...partialState, }); }; const handleTitleInputChange = (e: React.ChangeEvent) => { setPartialState({ identityProviderCreate: Object.assign(state.identityProviderCreate, { title: e.target.value, }), }); }; const handleOAuth2ConfigChange = (e: React.ChangeEvent, field: string) => { if (!state.identityProviderCreate.config || !state.identityProviderCreate.config.oauth2) { return; } const value = field === "scopes" ? e.target.value.split(" ") : e.target.value; setPartialState({ identityProviderCreate: Object.assign(state.identityProviderCreate, { config: Object.assign(state.identityProviderCreate.config, { oauth2: Object.assign(state.identityProviderCreate.config.oauth2, { [field]: value, }), }), }), }); }; const handleFieldMappingChange = (e: React.ChangeEvent, field: string) => { if ( !state.identityProviderCreate.config || !state.identityProviderCreate.config.oauth2 || !state.identityProviderCreate.config.oauth2.fieldMapping ) { return; } setPartialState({ identityProviderCreate: Object.assign(state.identityProviderCreate, { config: Object.assign(state.identityProviderCreate.config, { oauth2: Object.assign(state.identityProviderCreate.config.oauth2, { fieldMapping: Object.assign(state.identityProviderCreate.config.oauth2.fieldMapping, { [field]: e.target.value, }), }), }), }), }); }; const onSave = async () => { if (!state.identityProviderCreate.id || !state.identityProviderCreate.title) { toast.error("Please fill in required fields."); return; } try { if (!isCreating) { await workspaceServiceClient.updateWorkspaceSetting({ setting: { identityProviders: workspaceStore.setting.identityProviders.map((idp) => idp.id === state.identityProviderCreate.id ? state.identityProviderCreate : idp, ), }, updateMask: ["identity_providers"], }); } else { await workspaceServiceClient.updateWorkspaceSetting({ setting: { identityProviders: [...workspaceStore.setting.identityProviders, state.identityProviderCreate], }, updateMask: ["identity_providers"], }); } if (onConfirm) { onConfirm(); } else { onClose(); } } catch (error: any) { console.error(error); toast.error(error.details); } }; return ( {isCreating ? "Create Identity Provider" : "Edit Identity Provider"}
Title *
{isCreating && (

Redirect URL
{absolutifyLink("/auth/callback")}

)}
Client ID *
handleOAuth2ConfigChange(e, "clientId")} />
Client Secret *
handleOAuth2ConfigChange(e, "clientSecret")} />
Authorization endpoint *
handleOAuth2ConfigChange(e, "authUrl")} />
Token endpoint *
handleOAuth2ConfigChange(e, "tokenUrl")} />
User endpoint *
handleOAuth2ConfigChange(e, "userInfoUrl")} />
Scopes *
handleOAuth2ConfigChange(e, "scopes")} />
Identifier *
handleFieldMappingChange(e, "identifier")} />
Display name
handleFieldMappingChange(e, "displayName")} />
); }; export default CreateIdentityProviderDrawer;