Files
explore/ui/csvExport/CsvExportForm.tsx
T
tom ffa333c3c9 csv export with old api
form fields

recaptcha v2

api integration

recaptcha reset

remove recaptcha key from git
2023-02-13 17:19:07 -05:00

97 lines
2.7 KiB
TypeScript

import { Button, chakra, Flex } from '@chakra-ui/react';
import React from 'react';
import type { SubmitHandler } from 'react-hook-form';
import { useForm, FormProvider } from 'react-hook-form';
import type { FormFields } from './types';
import buildUrl from 'lib/api/buildUrl';
import type { ResourceName } from 'lib/api/resources';
import dayjs from 'lib/date/dayjs';
import downloadBlob from 'lib/downloadBlob';
import useToast from 'lib/hooks/useToast';
import CsvExportFormField from './CsvExportFormField';
import CsvExportFormReCaptcha from './CsvExportFormReCaptcha';
interface Props {
hash: string;
resource: ResourceName;
fileNameTemplate: string;
}
const CsvExportForm = ({ hash, resource, fileNameTemplate }: Props) => {
const formApi = useForm<FormFields>({
mode: 'onBlur',
defaultValues: {
from: dayjs().subtract(1, 'day').format('YYYY-MM-DD'),
to: dayjs().format('YYYY-MM-DD'),
},
});
const { handleSubmit, formState } = formApi;
const toast = useToast();
const onFormSubmit: SubmitHandler<FormFields> = React.useCallback(async(data) => {
try {
const url = buildUrl(resource, undefined, {
address_id: hash,
from_period: data.from,
to_period: data.to,
recaptcha_response: data.reCaptcha,
});
const response = await fetch(url, {
headers: {
'content-type': 'application/octet-stream',
},
});
if (!response.ok) {
throw new Error();
}
const blob = await response.blob();
downloadBlob(blob, `${ fileNameTemplate }_${ hash }_${ data.from }_${ data.to }.csv`);
} catch (error) {
toast({
position: 'top-right',
title: 'Error',
description: (error as Error)?.message || 'Something went wrong. Try again later.',
status: 'error',
variant: 'subtle',
isClosable: true,
});
}
}, [ fileNameTemplate, hash, resource, toast ]);
return (
<FormProvider { ...formApi }>
<chakra.form
noValidate
onSubmit={ handleSubmit(onFormSubmit) }
>
<Flex columnGap={ 5 } rowGap={ 3 } flexDir={{ base: 'column', lg: 'row' }} alignItems={{ base: 'flex-start', lg: 'center' }}>
<CsvExportFormField name="from" formApi={ formApi }/>
<CsvExportFormField name="to" formApi={ formApi }/>
<CsvExportFormReCaptcha formApi={ formApi }/>
</Flex>
<Button
variant="solid"
size="lg"
type="submit"
mt={ 8 }
isLoading={ formState.isSubmitting }
loadingText="Download"
isDisabled={ !formState.isValid }
>
Download
</Button>
</chakra.form>
</FormProvider>
);
};
export default React.memo(CsvExportForm);