RocketChat/Rocket.Chat

View on GitHub
apps/meteor/client/views/account/integrations/AccountIntegrationsPage.tsx

Summary

Maintainability
B
4 hrs
Test Coverage
import type { SelectOption } from '@rocket.chat/fuselage';
import { SelectLegacy, Box, Button, Field, FieldLabel, FieldRow } from '@rocket.chat/fuselage';
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
import { useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts';
import React, { useMemo } from 'react';
import { useForm, Controller } from 'react-hook-form';

import { Page, PageHeader, PageScrollableContentWithShadow } from '../../../components/Page';
import { useWebDAVAccountIntegrationsQuery } from '../../../hooks/webdav/useWebDAVAccountIntegrationsQuery';
import { getWebdavServerName } from '../../../lib/getWebdavServerName';
import { useRemoveWebDAVAccountIntegrationMutation } from './hooks/useRemoveWebDAVAccountIntegrationMutation';

const AccountIntegrationsPage = () => {
    const { data: webdavAccountIntegrations } = useWebDAVAccountIntegrationsQuery();

    const { handleSubmit, control } = useForm<{ accountSelected: string }>();

    const options: SelectOption[] = useMemo(
        () => webdavAccountIntegrations?.map(({ _id, ...current }) => [_id, getWebdavServerName(current)]) ?? [],
        [webdavAccountIntegrations],
    );

    const dispatchToastMessage = useToastMessageDispatch();
    const t = useTranslation();

    const removeMutation = useRemoveWebDAVAccountIntegrationMutation({
        onSuccess: () => {
            dispatchToastMessage({ type: 'success', message: t('Webdav_account_removed') });
        },
        onError: (error) => {
            dispatchToastMessage({ type: 'error', message: error });
        },
    });

    const handleSubmitForm = useEffectEvent(({ accountSelected }) => {
        removeMutation.mutate({ accountSelected });
    });

    return (
        <Page>
            <PageHeader title={t('Integrations')} />
            <PageScrollableContentWithShadow>
                <Box is='form' maxWidth='x600' w='full' alignSelf='center' onSubmit={handleSubmit(handleSubmitForm)}>
                    <Field>
                        <FieldLabel>{t('WebDAV_Accounts')}</FieldLabel>
                        <FieldRow>
                            <Controller
                                control={control}
                                name='accountSelected'
                                rules={{ required: true }}
                                render={({ field: { onChange, value, name, ref } }) => (
                                    <SelectLegacy
                                        ref={ref}
                                        name={name}
                                        options={options}
                                        onChange={onChange}
                                        value={value}
                                        placeholder={t('Select_an_option')}
                                    />
                                )}
                            />
                            <Button type='submit' danger>
                                {t('Remove')}
                            </Button>
                        </FieldRow>
                    </Field>
                </Box>
            </PageScrollableContentWithShadow>
        </Page>
    );
};

export default AccountIntegrationsPage;