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};
 | 
						|
`;
 |