Commit 1abfc6b4 authored by tom goriunov's avatar tom goriunov Committed by GitHub

Merge pull request #12 from tom2drum/validation

fields limits and validation
parents e68aa5d2 10b29dab
...@@ -22,6 +22,7 @@ import { ...@@ -22,6 +22,7 @@ import {
import type { TWatchlistItem } from '../../data/watchlist'; import type { TWatchlistItem } from '../../data/watchlist';
const NOTIFICATIONS = [ 'xDAI', 'ERC-20', 'ERC-721, ERC-1155 (NFT)' ]; const NOTIFICATIONS = [ 'xDAI', 'ERC-20', 'ERC-721, ERC-1155 (NFT)' ];
const ADDRESS_LENGTH = 42;
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;
...@@ -36,15 +37,34 @@ const AddressModal: React.FC<Props> = ({ isOpen, onClose, data }) => { ...@@ -36,15 +37,34 @@ const AddressModal: React.FC<Props> = ({ isOpen, onClose, data }) => {
const [ address, setAddress ] = useState<string>(); const [ address, setAddress ] = useState<string>();
const [ tag, setTag ] = useState<string>(); const [ tag, setTag ] = useState<string>();
const [ notification, setNotification ] = useState<boolean>(); const [ notification, setNotification ] = useState<boolean>();
const [ addressError, setAddressError ] = useState<boolean>(false);
const isValidAddress = (address: string) => address.length === ADDRESS_LENGTH;
useEffect(() => { useEffect(() => {
setAddress(data?.address); setAddress(data?.address);
setAddressError(false);
setTag(data?.tag); setTag(data?.tag);
setNotification(data?.notification); setNotification(data?.notification);
}, [ data ]); }, [ data ]);
const onAddressChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => setAddress(event.target.value), [ setAddress ]); const onAddressChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
const onTagChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => setTag(event.target.value), [ setTag ]); if (addressError && isValidAddress(event.target.value)) {
setAddressError(false);
}
setAddress(event.target.value);
}, [ addressError ]);
const validateAddress = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
if (!isValidAddress(event.target.value)) {
setAddressError(true);
}
}, [ ]);
const onTagChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {
setTag(event.target.value)
}, [ ]);
const onNotificationChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => setNotification(event.target.checked), [ setNotification ]); const onNotificationChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => setNotification(event.target.checked), [ setNotification ]);
const onButtonClick = useCallback(() => { const onButtonClick = useCallback(() => {
...@@ -53,22 +73,33 @@ const AddressModal: React.FC<Props> = ({ isOpen, onClose, data }) => { ...@@ -53,22 +73,33 @@ const AddressModal: React.FC<Props> = ({ isOpen, onClose, data }) => {
onClose() onClose()
}, [ address, tag, notification, onClose ]); }, [ address, tag, notification, onClose ]);
const title = data ? 'Edit watchlist address' : 'New Address to Watchlist';
return ( return (
<Modal isOpen={ isOpen } onClose={ onClose } size="md"> <Modal isOpen={ isOpen } onClose={ onClose } size="md">
<ModalOverlay/> <ModalOverlay/>
<ModalContent> <ModalContent>
<ModalHeader fontWeight="500">New Address to Watchlist</ModalHeader> <ModalHeader fontWeight="500">{ title }</ModalHeader>
<ModalCloseButton/> <ModalCloseButton/>
<ModalBody> <ModalBody>
{ !data && (
<Text lineHeight="30px" marginBottom="40px"> <Text lineHeight="30px" marginBottom="40px">
An Email notification can be sent to you when an address on your watch list sends or receives any transactions. An Email notification can be sent to you when an address on your watch list sends or receives any transactions.
</Text> </Text>
) }
<FormControl variant="floating" id="address" marginBottom="20px" isRequired> <FormControl variant="floating" id="address" marginBottom="20px" isRequired>
<Input placeholder=" " onChange={ onAddressChange } value={ address || '' }/> <Input
placeholder=" "
onChange={ onAddressChange }
value={ address || '' }
isInvalid={ addressError }
onBlur={ validateAddress }
maxLength={ ADDRESS_LENGTH }
/>
<FormLabel>Address (0x...)</FormLabel> <FormLabel>Address (0x...)</FormLabel>
</FormControl> </FormControl>
<FormControl variant="floating" id="tag" marginBottom="30px" isRequired> <FormControl variant="floating" id="tag" marginBottom="30px" isRequired>
<Input placeholder=" " onChange={ onTagChange } value={ tag || '' }/> <Input placeholder=" " onChange={ onTagChange } value={ tag || '' } maxLength={ 35 }/>
<FormLabel>Private tag (max 35 characters)</FormLabel> <FormLabel>Private tag (max 35 characters)</FormLabel>
</FormControl> </FormControl>
<Text color="gray.600" fontSize="14px" marginBottom="32px"> <Text color="gray.600" fontSize="14px" marginBottom="32px">
...@@ -98,8 +129,8 @@ const AddressModal: React.FC<Props> = ({ isOpen, onClose, data }) => { ...@@ -98,8 +129,8 @@ const AddressModal: React.FC<Props> = ({ isOpen, onClose, data }) => {
</ModalBody> </ModalBody>
<ModalFooter justifyContent="flex-start"> <ModalFooter justifyContent="flex-start">
<Button colorScheme="blue" onClick={ onButtonClick }> <Button colorScheme="blue" onClick={ onButtonClick } disabled={ addressError }>
Add address { data ? 'Save changes' : 'Add address' }
</Button> </Button>
</ModalFooter> </ModalFooter>
</ModalContent> </ModalContent>
......
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