From 3b767537dc95fc86b995912e7980f2f7e90de19a Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 7 Oct 2024 22:19:31 +0200 Subject: [PATCH] Use scopes in workflow page --- .../accounts/constants/GmailSendScope.ts | 1 + .../accounts/types/ConnectedAccount.ts | 1 + .../WorkflowEditActionFormSendEmail.tsx | 50 +++++++++++++------ 3 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 packages/twenty-front/src/modules/accounts/constants/GmailSendScope.ts diff --git a/packages/twenty-front/src/modules/accounts/constants/GmailSendScope.ts b/packages/twenty-front/src/modules/accounts/constants/GmailSendScope.ts new file mode 100644 index 0000000000000..6918d126f2b34 --- /dev/null +++ b/packages/twenty-front/src/modules/accounts/constants/GmailSendScope.ts @@ -0,0 +1 @@ +export const GMAIL_SEND_SCOPE = 'https://www.googleapis.com/auth/gmail.send'; diff --git a/packages/twenty-front/src/modules/accounts/types/ConnectedAccount.ts b/packages/twenty-front/src/modules/accounts/types/ConnectedAccount.ts index d8f42da6d53c1..f0ba4f489296e 100644 --- a/packages/twenty-front/src/modules/accounts/types/ConnectedAccount.ts +++ b/packages/twenty-front/src/modules/accounts/types/ConnectedAccount.ts @@ -13,5 +13,6 @@ export type ConnectedAccount = { authFailedAt: Date | null; messageChannels: MessageChannel[]; calendarChannels: CalendarChannel[]; + scopes: string[] | null; __typename: 'ConnectedAccount'; }; diff --git a/packages/twenty-front/src/modules/workflow/components/WorkflowEditActionFormSendEmail.tsx b/packages/twenty-front/src/modules/workflow/components/WorkflowEditActionFormSendEmail.tsx index 1e5dd31daed51..731c810224147 100644 --- a/packages/twenty-front/src/modules/workflow/components/WorkflowEditActionFormSendEmail.tsx +++ b/packages/twenty-front/src/modules/workflow/components/WorkflowEditActionFormSendEmail.tsx @@ -6,7 +6,7 @@ import { useTheme } from '@emotion/react'; import styled from '@emotion/styled'; import React, { useEffect } from 'react'; import { Controller, useForm } from 'react-hook-form'; -import { IconMail, IconPlus } from 'twenty-ui'; +import { IconMail, IconPlus, isDefined } from 'twenty-ui'; import { useDebouncedCallback } from 'use-debounce'; import { Select, SelectOption } from '@/ui/input/components/Select'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; @@ -15,6 +15,7 @@ import { useRecoilValue } from 'recoil'; import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; import { useTriggerGoogleApisOAuth } from '@/settings/accounts/hooks/useTriggerGoogleApisOAuth'; import { workflowIdState } from '@/workflow/states/workflowIdState'; +import { GMAIL_SEND_SCOPE } from '@/accounts/constants/GmailSendScope'; const StyledTriggerSettings = styled.div` padding: ${({ theme }) => theme.spacing(6)}; @@ -50,6 +51,24 @@ export const WorkflowEditActionFormSendEmail = ({ }, }); + const checkConnectedAccountScopes = async ( + connectedAccountId: string | null, + ) => { + const connectedAccount = accounts.find( + (account) => account.id === connectedAccountId, + ); + if (!isDefined(connectedAccount)) { + return; + } + const scopes = connectedAccount.scopes; + if ( + !isDefined(scopes) || + !isDefined(scopes.find((scope) => scope === GMAIL_SEND_SCOPE)) + ) { + await triggerGoogleApisOAuth(redirectUrl); + } + }; + useEffect(() => { form.setValue( 'connectedAccountId', @@ -64,17 +83,21 @@ export const WorkflowEditActionFormSendEmail = ({ form, ]); - const saveAction = useDebouncedCallback((formData: SendEmailFormData) => { - onActionUpdate({ - ...action, - settings: { - ...action.settings, - connectedAccountId: formData.connectedAccountId, - subject: formData.subject, - body: formData.body, - }, - }); - }, 1_000); + const saveAction = useDebouncedCallback( + async (formData: SendEmailFormData) => { + onActionUpdate({ + ...action, + settings: { + ...action.settings, + connectedAccountId: formData.connectedAccountId, + subject: formData.subject, + body: formData.body, + }, + }); + await checkConnectedAccountScopes(formData.connectedAccountId); + }, + 1_000, + ); useEffect(() => { return () => { @@ -145,7 +168,6 @@ export const WorkflowEditActionFormSendEmail = ({ }} onChange={(connectedAccountId) => { field.onChange(connectedAccountId); - handleSave(); }} /> @@ -161,7 +183,6 @@ export const WorkflowEditActionFormSendEmail = ({ value={field.value} onChange={(email) => { field.onChange(email); - handleSave(); }} /> @@ -179,7 +200,6 @@ export const WorkflowEditActionFormSendEmail = ({ minRows={4} onChange={(email) => { field.onChange(email); - handleSave(); }} />