diff --git a/src/assets/image/icons/connections/AzureBot.svg b/src/assets/image/icons/connections/AzureBot.svg new file mode 100644 index 0000000000..986e6d2651 --- /dev/null +++ b/src/assets/image/icons/connections/AzureBot.svg @@ -0,0 +1 @@ +Icon-machinelearning-165 \ No newline at end of file diff --git a/src/assets/image/icons/connections/index.ts b/src/assets/image/icons/connections/index.ts index 34f9193a3e..103fa960a5 100644 --- a/src/assets/image/icons/connections/index.ts +++ b/src/assets/image/icons/connections/index.ts @@ -37,3 +37,4 @@ export { default as LinearIcon } from "@assets/image/icons/connections/linear.sv export { default as SalesforceIcon } from "@assets/image/icons/connections/Salesforce.svg?react"; // Taken from: https://www.svgrepo.com/svg/452111/teams export { default as MicrosoftTeamsIcon } from "@assets/image/icons/connections/MicrosoftTeams.svg?react"; +export { default as AzureBotIcon } from "@assets/image/icons/connections/AzureBot.svg?react"; diff --git a/src/autokitteh b/src/autokitteh index a3da264cb5..8f2dc44fd3 160000 --- a/src/autokitteh +++ b/src/autokitteh @@ -1 +1 @@ -Subproject commit a3da264cb509bb86b3453f489635f2ddb8edc6d2 +Subproject commit 8f2dc44fd3bcebc095aeccffb28d294bef49a678 diff --git a/src/components/organisms/connections/integrations/azurebot/add.tsx b/src/components/organisms/connections/integrations/azurebot/add.tsx new file mode 100644 index 0000000000..85179cc39e --- /dev/null +++ b/src/components/organisms/connections/integrations/azurebot/add.tsx @@ -0,0 +1,110 @@ +import React, { useEffect, useState } from "react"; + +import { useTranslation } from "react-i18next"; + +import { ConnectionAuthType } from "@enums"; +import { Integrations } from "@src/enums/components"; +import { useConnectionForm } from "@src/hooks"; +import { azureBotIntegrationSchema } from "@validations"; + +import { Button, ErrorMessage, Input, SecretInput, Spinner } from "@components/atoms"; + +export const AzureBotIntegrationAddForm = ({ + connectionId, + triggerParentFormSubmit, + type, +}: { + connectionId?: string; + triggerParentFormSubmit: () => void; + type: string; +}) => { + const { createConnection, errors, handleSubmit, isLoading, register, setValue } = useConnectionForm( + azureBotIntegrationSchema, + "create" + ); + + const [lockState, setLockState] = useState({ + app_password: true, + tenant_id: true, + }); + + const handleLockAction = (fieldName: string, newLockState: boolean) => { + setLockState((prev) => ({ ...prev, [fieldName]: newLockState })); + }; + + const configureConnection = async (connectionId: string) => { + await createConnection(connectionId, ConnectionAuthType.Initialized, Integrations.azurebot); + }; + + useEffect(() => { + setValue("auth_scopes", type); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [type]); + + useEffect(() => { + if (connectionId) { + configureConnection(connectionId); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [connectionId]); + + const { t } = useTranslation("integrations"); + + return ( +
+
+ + {errors.app_id?.message as string} +
+ +
+ setValue("app_password", newValue)} + handleLockAction={(newLockState) => handleLockAction("app_password", newLockState)} + isError={!!errors.app_password} + isLocked={lockState.app_password} + isRequired + label={t("azurebot.placeholders.appPassword")} + type="password" + /> + {errors.app_password?.message as string} +
+ +
+ setValue("tenant_id", newValue)} + handleLockAction={(newLockState) => handleLockAction("tenant_id", newLockState)} + isError={!!errors.tenant_id} + isLocked={lockState.tenant_id} + isRequired + label={t("azurebot.placeholders.tenantId")} + /> + {errors.tenant_id?.message as string} +
+ + +
+ ); +}; diff --git a/src/components/organisms/connections/integrations/azurebot/edit.tsx b/src/components/organisms/connections/integrations/azurebot/edit.tsx new file mode 100644 index 0000000000..7b5e9e591d --- /dev/null +++ b/src/components/organisms/connections/integrations/azurebot/edit.tsx @@ -0,0 +1,90 @@ +import React, { useState } from "react"; + +import { useTranslation } from "react-i18next"; + +import { useConnectionForm } from "@src/hooks"; +import { azureBotIntegrationSchema } from "@validations"; + +import { Button, ErrorMessage, Input, SecretInput, Spinner } from "@components/atoms"; + +import { FloppyDiskIcon } from "@assets/image/icons"; + +const initialLockState: Record = { + app_password: true, + tenant_id: true, +}; + +export const AzureBotIntegrationEditForm = () => { + const { t } = useTranslation("integrations"); + const [lockState, setLockState] = useState(initialLockState); + + const { errors, handleSubmit, isLoading, onSubmitEdit, register, setValue } = useConnectionForm( + azureBotIntegrationSchema, + "edit" + ); + + const handleLockAction = (fieldName: string, newLockState: boolean) => { + setLockState((prev) => ({ ...prev, [fieldName]: newLockState })); + }; + + // Removed useEffect to not pre-populate values - just show clean form with labels + + return ( +
+
+ + {errors.app_id?.message as string} +
+ +
+ setValue("app_password", newValue)} + handleLockAction={(newLockState) => handleLockAction("app_password", newLockState)} + isError={!!errors.app_password} + isLocked={lockState.app_password} + isRequired + label={t("azurebot.placeholders.appPassword")} + /> + {errors.app_password?.message as string} +
+ +
+ setValue("tenant_id", newValue)} + handleLockAction={(newLockState) => handleLockAction("tenant_id", newLockState)} + isError={!!errors.tenant_id} + isLocked={lockState.tenant_id} + isRequired + label={t("azurebot.placeholders.tenantId")} + /> + {errors.tenant_id?.message as string} +
+ + +
+ ); +}; diff --git a/src/components/organisms/connections/integrations/azurebot/index.ts b/src/components/organisms/connections/integrations/azurebot/index.ts new file mode 100644 index 0000000000..84a8d43df1 --- /dev/null +++ b/src/components/organisms/connections/integrations/azurebot/index.ts @@ -0,0 +1,2 @@ +export { AzureBotIntegrationAddForm } from "@components/organisms/connections/integrations/azurebot/add"; +export { AzureBotIntegrationEditForm } from "@components/organisms/connections/integrations/azurebot/edit"; diff --git a/src/components/organisms/connections/integrations/index.ts b/src/components/organisms/connections/integrations/index.ts index c1e5a8f447..6287f60af2 100644 --- a/src/components/organisms/connections/integrations/index.ts +++ b/src/components/organisms/connections/integrations/index.ts @@ -58,3 +58,7 @@ export { SalesforceIntegrationAddForm, SalesforceIntegrationEditForm, } from "@components/organisms/connections/integrations/salesforce"; +export { + AzureBotIntegrationAddForm, + AzureBotIntegrationEditForm, +} from "@components/organisms/connections/integrations/azurebot"; diff --git a/src/constants/connections/addComponentsMapping.constants.ts b/src/constants/connections/addComponentsMapping.constants.ts index bdbab5d38a..a75701e6c2 100644 --- a/src/constants/connections/addComponentsMapping.constants.ts +++ b/src/constants/connections/addComponentsMapping.constants.ts @@ -22,6 +22,7 @@ import { HeightIntegrationAddForm, ZoomIntegrationAddForm, SalesforceIntegrationAddForm, + AzureBotIntegrationAddForm, } from "@components/organisms/connections/integrations"; import { MicrosoftTeamsIntegrationAddForm } from "@components/organisms/connections/integrations/microsoft/teams"; @@ -49,5 +50,6 @@ export const integrationAddFormComponents: Partial = { label: "Microsoft Teams", value: Integrations.microsoft_teams, }, + azurebot: { + icon: AzureBotIcon, + label: "Azure Bot", + value: Integrations.azurebot, + }, }; const shouldHideIntegration: Partial> = { diff --git a/src/hooks/useConnectionForm.ts b/src/hooks/useConnectionForm.ts index a5a6ceb7e4..5743b7a75a 100644 --- a/src/hooks/useConnectionForm.ts +++ b/src/hooks/useConnectionForm.ts @@ -90,6 +90,7 @@ export const useConnectionForm = (validationSchema: ZodObject, mode [Integrations.chatgpt]: ConnectionAuthType.Initialized, [Integrations.googlegemini]: ConnectionAuthType.Key, [Integrations.hubspot]: ConnectionAuthType.OauthDefault, + [Integrations.azurebot]: ConnectionAuthType.Initialized, }; const defaultAuthType = integrationAuthDefaults[integrationName as string]; diff --git a/src/locales/en/dashboard/translation.json b/src/locales/en/dashboard/translation.json index 333e54f0af..a1a8821f0e 100644 --- a/src/locales/en/dashboard/translation.json +++ b/src/locales/en/dashboard/translation.json @@ -157,5 +157,18 @@ "aiPage": { "requiredMessage": "Please enter a message" } + }, + "welcomeLanding": { + "createNew": "Start", + "creating": "Creating...", + "createFromScratch": "Create from Scratch", + "createFromScratchDesc": "Build a new automation project from the ground up", + "createFromScratchButton": "Create New", + "learnMore": "Learn More", + "newProject": "Quick Tutorial", + "newProjectDesc": "Deploy, execute, and review the output of a simple Python project", + "title": "Welcome to AutoKitteh", + "useTemplate": "Start From Template", + "useTemplateDesc": "Select from a collection of out of the box templates" } } diff --git a/src/locales/en/integrations/translation.json b/src/locales/en/integrations/translation.json index 00910ab3cb..639b953898 100644 --- a/src/locales/en/integrations/translation.json +++ b/src/locales/en/integrations/translation.json @@ -240,5 +240,12 @@ "clientSecret": "Client Secret", "tenantId": "Tenant ID (multi-tenant = 'common')" } + }, + "azurebot": { + "placeholders": { + "appId": "App ID", + "appPassword": "App Password", + "tenantId": "Tenant ID" + } } } diff --git a/src/validations/connection.schema.ts b/src/validations/connection.schema.ts index 94b2b3bdda..231eed3cbf 100644 --- a/src/validations/connection.schema.ts +++ b/src/validations/connection.schema.ts @@ -169,4 +169,10 @@ export const microsoftTeamsIntegrationSchema = z.object({ tenant_id: z.string().min(1, "Tenant ID is required"), }); +export const azureBotIntegrationSchema = z.object({ + app_id: z.string().min(1, "App ID is required"), + app_password: z.string().min(1, "App Password is required"), + tenant_id: z.string().min(1, "Tenant ID is required"), +}); + export const oauthSchema = z.object({}); diff --git a/src/validations/index.ts b/src/validations/index.ts index 727ab08228..71e836555c 100644 --- a/src/validations/index.ts +++ b/src/validations/index.ts @@ -29,6 +29,7 @@ export { zoomServerToServerIntegrationSchema, salesforcePrivateAuthIntegrationSchema, microsoftTeamsIntegrationSchema, + azureBotIntegrationSchema, linearOauthIntegrationSchema, } from "@validations/connection.schema"; export { codeAssetsSchema } from "@validations/coseAndAssets.schema";