import { Box, Button, ButtonGroup, Collapse, Flex, FormLabel, HStack, Icon, Input, Select, Skeleton, Spinner, Stack, Switch, Tooltip, useToast, } from '@chakra-ui/react'; import { useMutation, useQuery } from '@tanstack/react-query'; import { __ } from '@wordpress/i18n'; import React, { useEffect, useState } from 'react'; import { Controller, useFormContext, useWatch } from 'react-hook-form'; import { BiHide, BiShow, BiSync } from 'react-icons/bi'; import FormControlTwoCol from '../../../../../../assets/js/back-end/components/common/FormControlTwoCol'; import urls from '../../../../../../assets/js/back-end/constants/urls'; import SingleComponentsWrapper from '../../../../../../assets/js/back-end/screens/settings/components/SingleComponentsWrapper'; import ToolTip from '../../../../../../assets/js/back-end/screens/settings/components/ToolTip'; import { IntegrationsSettingsMap } from '../../../../../../assets/js/back-end/types'; import API from '../../../../../../assets/js/back-end/utils/api'; import { isEmpty } from '../../../../../../assets/js/back-end/utils/utils'; import BrevoAlertMessage from './BrevoAlertMessage'; interface Props { brevoIntegration?: IntegrationsSettingsMap['brevo_integration']; } type BrevoList = { id: string; name: string; }; const defaultConsentMessage = __( 'I would like to receive the newsletters.', 'learning-management-system', ); const BrevoIntegrationSetting: React.FC = ({ brevoIntegration }) => { const [showApiKey, setShowApiKey] = useState(false); const { register, control, setValue } = useFormContext(); const toast = useToast(); const brevoIntegrationAPI = new API(urls.brevoIntegrationLists); const brevoIntegrationConnectAPI = new API(urls.brevoIntegrationConnect); const brevoIntegrationDisconnectAPI = new API( urls.brevoIntegrationDisconnect, ); const [isSyncing, setIsSyncing] = useState(false); const [isAPIKeyConnected, setIsAPIKeyConnected] = useState( Boolean(brevoIntegration?.is_connected), ); const apiKeyWatchValue = useWatch({ name: 'integrations.brevo_integration.api_key', defaultValue: brevoIntegration?.api_key, control, }); const brevoListQuery = useQuery({ queryKey: ['brevoLists'], queryFn: () => brevoIntegrationAPI.list({ force: isSyncing }), ...{ enabled: isAPIKeyConnected, }, }); const connectMutation = useMutation({ mutationFn: (verifyAgain?: boolean) => brevoIntegrationConnectAPI.store({ api_key: verifyAgain ? '' : apiKeyWatchValue, verify_again: verifyAgain, }), ...{ onSuccess(response: any) { setIsAPIKeyConnected(true); toast({ title: response.message, status: 'success', isClosable: true, }); setValue('integrations.brevo_integration.api_key', ''); }, onError: (err: any) => { toast({ title: err.data.message || __( 'Unable to connect API key. Please check your key and try again.', 'learning-management-system', ), status: 'error', isClosable: true, }); setIsAPIKeyConnected(false); }, }, }); const disConnectMutation = useMutation({ mutationFn: () => brevoIntegrationDisconnectAPI.deleteResource(), ...{ onSuccess(response: any) { setIsAPIKeyConnected(false); toast({ title: response.message, status: 'success', isClosable: true, }); setValue( 'integrations.brevo_integration.enable_forced_email_subscription', false, ); setValue('integrations.brevo_integration.list', ''); setValue( 'integrations.brevo_integration.subscriber_consent_message', defaultConsentMessage, ); }, onError: (err: any) => { toast({ title: err.data.message || __( 'Failed to disconnect API key. Please try again later.', 'learning-management-system', ), status: 'error', isClosable: true, }); }, }, }); useEffect(() => { if (isSyncing) { brevoListQuery?.refetch()?.then(() => { setIsSyncing(false); toast({ title: __('Lists Synced Successfully.', 'learning-management-system'), status: 'success', isClosable: true, }); }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isSyncing]); return ( {__('Brevo V3 API Key', 'learning-management-system')} setShowApiKey(!showApiKey)} /> {__('Forced Subscription', 'learning-management-system')} ( onChange(e.target.checked)} /> )} /> {__('Consent Message', 'learning-management-system')} {brevoListQuery.isLoading ? ( ) : ( isAPIKeyConnected && ( {__('Lists', 'learning-management-system')} ( setIsSyncing(true)} > {brevoListQuery.isFetching ? ( ) : ( )} )} /> ) )} {isAPIKeyConnected && brevoIntegration?.is_connected && !connectMutation?.isSuccess && ( )} ); }; export default BrevoIntegrationSetting;