Commit a0b0cd76 authored by tom's avatar tom

add link to start over button

parent 8f8a54be
...@@ -3,7 +3,6 @@ import React from 'react'; ...@@ -3,7 +3,6 @@ import React from 'react';
import type { FormSubmitResult } from 'ui/publicTags/submit/types'; import type { FormSubmitResult } from 'ui/publicTags/submit/types';
import useApiQuery from 'lib/api/useApiQuery'; import useApiQuery from 'lib/api/useApiQuery';
import * as mocks from 'ui/publicTags/submit/mocks';
import PublicTagsSubmitForm from 'ui/publicTags/submit/PublicTagsSubmitForm'; import PublicTagsSubmitForm from 'ui/publicTags/submit/PublicTagsSubmitForm';
import PublicTagsSubmitResult from 'ui/publicTags/submit/PublicTagsSubmitResult'; import PublicTagsSubmitResult from 'ui/publicTags/submit/PublicTagsSubmitResult';
import ContentLoader from 'ui/shared/ContentLoader'; import ContentLoader from 'ui/shared/ContentLoader';
...@@ -14,14 +13,14 @@ type Screen = 'form' | 'result' | 'initializing' | 'error'; ...@@ -14,14 +13,14 @@ type Screen = 'form' | 'result' | 'initializing' | 'error';
const PublicTagsSubmit = () => { const PublicTagsSubmit = () => {
const [ screen, setScreen ] = React.useState<Screen>('result'); const [ screen, setScreen ] = React.useState<Screen>('initializing');
const [ submitResult, setSubmitResult ] = React.useState<FormSubmitResult>(mocks.mixedResponses); const [ submitResult, setSubmitResult ] = React.useState<FormSubmitResult>();
const configQuery = useApiQuery('address_metadata_tag_types'); const configQuery = useApiQuery('address_metadata_tag_types');
React.useEffect(() => { React.useEffect(() => {
if (!configQuery.isPending) { if (!configQuery.isPending) {
setScreen(configQuery.isError ? 'error' : 'result'); setScreen(configQuery.isError ? 'error' : 'form');
} }
}, [ configQuery.isError, configQuery.isPending ]); }, [ configQuery.isError, configQuery.isPending ]);
......
import { Button, chakra, Grid, GridItem } from '@chakra-ui/react'; import { Button, chakra, Grid, GridItem } from '@chakra-ui/react';
import { useRouter } from 'next/router';
import React from 'react'; import React from 'react';
import type { SubmitHandler } from 'react-hook-form'; import type { SubmitHandler } from 'react-hook-form';
import { useForm, FormProvider } from 'react-hook-form'; import { useForm, FormProvider } from 'react-hook-form';
...@@ -18,6 +19,8 @@ import PublicTagsSubmitFieldDescription from './fields/PublicTagsSubmitFieldDesc ...@@ -18,6 +19,8 @@ import PublicTagsSubmitFieldDescription from './fields/PublicTagsSubmitFieldDesc
import PublicTagsSubmitFieldRequesterEmail from './fields/PublicTagsSubmitFieldRequesterEmail'; import PublicTagsSubmitFieldRequesterEmail from './fields/PublicTagsSubmitFieldRequesterEmail';
import PublicTagsSubmitFieldRequesterName from './fields/PublicTagsSubmitFieldRequesterName'; import PublicTagsSubmitFieldRequesterName from './fields/PublicTagsSubmitFieldRequesterName';
import PublicTagsSubmitFieldTags from './fields/PublicTagsSubmitFieldTags'; import PublicTagsSubmitFieldTags from './fields/PublicTagsSubmitFieldTags';
import * as mocks from './mocks';
import { getDefaultValuesFromQuery } from './utils';
interface Props { interface Props {
config: PublicTagTypesResponse | undefined; config: PublicTagTypesResponse | undefined;
...@@ -26,15 +29,29 @@ interface Props { ...@@ -26,15 +29,29 @@ interface Props {
const PublicTagsSubmitForm = ({ config, onSubmitResult }: Props) => { const PublicTagsSubmitForm = ({ config, onSubmitResult }: Props) => {
const isMobile = useIsMobile(); const isMobile = useIsMobile();
const router = useRouter();
const formApi = useForm<FormFields>({ const formApi = useForm<FormFields>({
mode: 'onBlur', mode: 'onBlur',
defaultValues: { defaultValues: getDefaultValuesFromQuery(router.query),
addresses: [ { hash: '' } ],
tags: [ { name: '', type: { label: 'name', value: 'name' } } ],
},
}); });
React.useEffect(() => {
if (
router.query.addresses ||
router.query.requesterName ||
router.query.requesterEmail ||
router.query.companyName ||
router.query.companyWebsite
) {
router.push({ pathname: '/public-tags/submit' }, undefined, { shallow: true });
}
}, [ router.query.addresses, router ]);
const handleMockClick = React.useCallback(async() => {
return onSubmitResult(mocks.mixedResponses);
}, [ onSubmitResult ]);
const onFormSubmit: SubmitHandler<FormFields> = React.useCallback(async(data) => { const onFormSubmit: SubmitHandler<FormFields> = React.useCallback(async(data) => {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log('__>__', data, config); console.log('__>__', data, config);
...@@ -92,6 +109,15 @@ const PublicTagsSubmitForm = ({ config, onSubmitResult }: Props) => { ...@@ -92,6 +109,15 @@ const PublicTagsSubmitForm = ({ config, onSubmitResult }: Props) => {
> >
Send request Send request
</Button> </Button>
<Button
onClick={ handleMockClick }
size="lg"
mt={ 3 }
colorScheme="gray"
w="min-content"
>
Mock
</Button>
</Grid> </Grid>
</chakra.form> </chakra.form>
</FormProvider> </FormProvider>
......
...@@ -13,11 +13,16 @@ import PublicTagsSubmitResultWithErrors from './result/PublicTagsSubmitResultWit ...@@ -13,11 +13,16 @@ import PublicTagsSubmitResultWithErrors from './result/PublicTagsSubmitResultWit
import { groupSubmitResult } from './utils'; import { groupSubmitResult } from './utils';
interface Props { interface Props {
data: FormSubmitResult; data: FormSubmitResult | undefined;
} }
const PublicTagsSubmitResult = ({ data }: Props) => { const PublicTagsSubmitResult = ({ data }: Props) => {
const groupedData = React.useMemo(() => groupSubmitResult(data), [ data ]); const groupedData = React.useMemo(() => groupSubmitResult(data), [ data ]);
if (!groupedData) {
return null;
}
const hasErrors = groupedData.items.some((item) => item.error !== null); const hasErrors = groupedData.items.some((item) => item.error !== null);
const companyWebsite = makePrettyLink(groupedData.companyWebsite); const companyWebsite = makePrettyLink(groupedData.companyWebsite);
......
import { Box, Button, Flex, Grid, GridItem, useColorModeValue } from '@chakra-ui/react'; import { Box, Button, Flex, Grid, GridItem, useColorModeValue } from '@chakra-ui/react';
import _pickBy from 'lodash/pickBy';
import React from 'react'; import React from 'react';
import type { FormSubmitResultGrouped } from '../types'; import type { FormSubmitResultGrouped } from '../types';
import { route } from 'nextjs-routes';
import useIsMobile from 'lib/hooks/useIsMobile'; import useIsMobile from 'lib/hooks/useIsMobile';
import AddressEntity from 'ui/shared/entities/address/AddressEntity'; import AddressEntity from 'ui/shared/entities/address/AddressEntity';
import EntityTag from 'ui/shared/EntityTags/EntityTag'; import EntityTag from 'ui/shared/EntityTags/EntityTag';
...@@ -20,6 +23,14 @@ const PublicTagsSubmitResultWithErrors = ({ data }: Props) => { ...@@ -20,6 +23,14 @@ const PublicTagsSubmitResultWithErrors = ({ data }: Props) => {
<Flex flexDir="column" rowGap={ 3 }> <Flex flexDir="column" rowGap={ 3 }>
{ data.items.map((item, index) => { { data.items.map((item, index) => {
const startOverButtonQuery = _pickBy({
addresses: item.addresses,
requesterName: data.requesterName,
requesterEmail: data.requesterEmail,
companyName: data.companyName,
companyWebsite: data.companyWebsite,
}, Boolean);
return ( return (
<Flex key={ index } flexDir={{ base: 'column', lg: 'row' }}> <Flex key={ index } flexDir={{ base: 'column', lg: 'row' }}>
<Box flexGrow={ 1 }> <Box flexGrow={ 1 }>
...@@ -65,6 +76,8 @@ const PublicTagsSubmitResultWithErrors = ({ data }: Props) => { ...@@ -65,6 +76,8 @@ const PublicTagsSubmitResultWithErrors = ({ data }: Props) => {
mt={{ base: 1, lg: 6 }} mt={{ base: 1, lg: 6 }}
ml={{ base: 0, lg: 6 }} ml={{ base: 0, lg: 6 }}
w="min-content" w="min-content"
as="a"
href={ route({ pathname: '/public-tags/submit', query: startOverButtonQuery }) }
> >
Start over Start over
</Button> </Button>
......
...@@ -2,7 +2,15 @@ import _isEqual from 'lodash/isEqual'; ...@@ -2,7 +2,15 @@ import _isEqual from 'lodash/isEqual';
import type { FormSubmitResult, FormSubmitResultGrouped, FormSubmitResultItemGrouped } from './types'; import type { FormSubmitResult, FormSubmitResultGrouped, FormSubmitResultItemGrouped } from './types';
export function groupSubmitResult(data: FormSubmitResult): FormSubmitResultGrouped { import type { Route } from 'nextjs-routes';
import getQueryParamString from 'lib/router/getQueryParamString';
export function groupSubmitResult(data: FormSubmitResult | undefined): FormSubmitResultGrouped | undefined {
if (!data) {
return;
}
const _items: Array<FormSubmitResultItemGrouped> = []; const _items: Array<FormSubmitResultItemGrouped> = [];
// group by error and address // group by error and address
...@@ -49,3 +57,26 @@ export function groupSubmitResult(data: FormSubmitResult): FormSubmitResultGroup ...@@ -49,3 +57,26 @@ export function groupSubmitResult(data: FormSubmitResult): FormSubmitResultGroup
}), }),
}; };
} }
export function getDefaultValuesFromQuery(query: Route['query']) {
return {
addresses: getAddressesFromQuery(query),
requesterName: getQueryParamString(query?.requesterName),
requesterEmail: getQueryParamString(query?.requesterEmail),
companyName: getQueryParamString(query?.companyName),
companyWebsite: getQueryParamString(query?.companyWebsite),
tags: [ { name: '', type: { label: 'name', value: 'name' as const } } ],
};
}
function getAddressesFromQuery(query: Route['query']) {
if (!query?.addresses) {
return [ { hash: '' } ];
}
if (Array.isArray(query.addresses)) {
return query.addresses.map((hash) => ({ hash }));
}
return [ { hash: query.addresses } ];
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment