85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { History, Location } from 'history';
 | |
| import * as React from 'react';
 | |
| import { match, withRouter } from 'react-router-dom';
 | |
| import styled from 'styled-components';
 | |
| 
 | |
| import { Button } from 'ts/components/button';
 | |
| import { Icon } from 'ts/components/icon';
 | |
| 
 | |
| interface BaseComponentProps {
 | |
|     icon?: string;
 | |
|     iconComponent?: React.ReactNode;
 | |
|     title: string;
 | |
|     linkLabel: string;
 | |
|     linkUrl?: string;
 | |
|     linkAction?: () => void;
 | |
|     history: History;
 | |
|     location: Location;
 | |
|     match: match<any>;
 | |
| }
 | |
| 
 | |
| class BaseComponent extends React.PureComponent<BaseComponentProps> {
 | |
|     public onClick = (): void => {
 | |
|         const { linkAction, linkUrl } = this.props;
 | |
| 
 | |
|         if (linkAction) {
 | |
|             linkAction();
 | |
|         } else {
 | |
|             this.props.history.push(linkUrl);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     public render(): React.ReactNode {
 | |
|         const { icon, iconComponent, linkUrl, linkAction, title, linkLabel } = this.props;
 | |
| 
 | |
|         return (
 | |
|             <Wrap onClick={this.onClick}>
 | |
|                 <div>
 | |
|                     <Icon name={icon} component={iconComponent} size="large" margin={[0, 0, 'default', 0]} />
 | |
| 
 | |
|                     <Title>{title}</Title>
 | |
| 
 | |
|                     <Button isWithArrow={true} isTransparent={true} href={linkUrl} onClick={linkAction}>
 | |
|                         {linkLabel}
 | |
|                     </Button>
 | |
|                 </div>
 | |
|             </Wrap>
 | |
|         );
 | |
|     }
 | |
| }
 | |
| 
 | |
| export const BlockIconLink = withRouter<BaseComponentProps>(BaseComponent);
 | |
| 
 | |
| const Wrap = styled.div`
 | |
|     width: calc(50% - 15px);
 | |
|     height: 400px;
 | |
|     padding: 40px;
 | |
|     display: flex;
 | |
|     justify-content: center;
 | |
|     align-items: center;
 | |
|     text-align: center;
 | |
|     transition: background-color 0.25s;
 | |
|     background-color: ${props => props.theme.lightBgColor};
 | |
|     cursor: pointer;
 | |
| 
 | |
|     a,
 | |
|     button {
 | |
|         pointer-events: none;
 | |
|     }
 | |
| 
 | |
|     @media (max-width: 900px) {
 | |
|         width: 100%;
 | |
|         margin-top: 30px;
 | |
|     }
 | |
| 
 | |
|     &:hover {
 | |
|         background-color: #002d28;
 | |
|     }
 | |
| `;
 | |
| 
 | |
| const Title = styled.h2`
 | |
|     font-size: 20px;
 | |
|     margin-bottom: 30px;
 | |
|     color: ${props => props.theme.linkColor};
 | |
| `;
 |