randytarampi/me

View on GitHub
packages/jsx/src/lib/components/linkPost.jsx

Summary

Maintainability
D
1 day
Test Coverage
A
100%
import {LinkPost} from "@randy.tarampi/js";
import SchemaJsonLdComponent from "@randy.tarampi/schema-dot-org-json-ld-components";
import isHtml from "is-html";
import PropTypes from "prop-types";
import React, {Fragment} from "react";
import {Col, Row} from "react-materialize";
import {CampaignLink} from "./link";
import {
    PostBodyAsArrayComponent,
    PostBodyAsStringComponent,
    PostComponent,
    PostDateCreatedComponent,
    PostDatePublishedComponent,
    PostLocationComponent,
    PostTagsComponent,
    PostTitleComponent
} from "./post";

export class LinkPostComponent extends PostComponent {
    get title() {
        return this.props.post.title || "🔗";
    }

    render() {
        const {post} = this.props;

        return <Row
            className="post post--link"
            id={post.uid}
        >
            <SchemaJsonLdComponent markup={post.toSchema()}/>
            <Col
                className="post-metadata"
                s={12}
                l={4}
            >
                <PostTitleComponent post={post} title={this.title}/>
                <PostDatePublishedComponent post={post} label={"Shared:"}/>
                <PostDateCreatedComponent post={post}/>
                <PostLocationComponent post={post}/>
                <PostTagsComponent post={post}/>
            </Col>
            <Col
                className="post-content"
                s={12}
                l={8}
            >
                <LinkPostTitleComponent post={post}/>
                <LinkPostBodyAsStringComponent post={post}/>
                <LinkPostBodyAsArrayComponent post={post}/>
                <PostBodyAsStringComponent post={post}/>
                <PostBodyAsArrayComponent post={post}/>
            </Col>
        </Row>;
    }
}

LinkPostComponent.propTypes = {
    post: PropTypes.oneOfType([LinkPost].map(PropTypes.instanceOf)).isRequired
};

export const LinkPostTitleComponent = ({post}) =>
    <h3 className="post-link-title">
        <CampaignLink className="post-link-title__link" href={post.linkSourceUrl} text={post.linkTitle}/>
    </h3>;

LinkPostTitleComponent.propTypes = {
    post: PropTypes.oneOfType([LinkPost].map(PropTypes.instanceOf)).isRequired
};

export const LinkPostBodyAsStringComponent = ({post}) => {
    return typeof post.linkBody === "string" && post.linkBody !== ""
        ? <div className="post-link-body">
            {
                isHtml(post.linkBody)
                    ? <div className="post-link-body__html">
                        <div dangerouslySetInnerHTML={{__html: post.linkBody}}/>
                    </div>
                    : <p>
                        <span className="post-link-body__text" dangerouslySetInnerHTML={{__html: post.linkBody}}/>
                    </p>
            }
        </div>
        : null;
};

LinkPostBodyAsStringComponent.propTypes = {
    post: PropTypes.oneOfType([LinkPost].map(PropTypes.instanceOf)).isRequired
};

export const LinkPostBodyAsArrayComponent = ({post}) => {
    return Array.isArray(post.linkBody)
        ? <Fragment>
            {
                post.linkBody.map((htmlString, index) => {
                    return <div className="post-link-body"
                                key={`${post.id}:${post.type}:body:${index}`}>
                        {
                            isHtml(htmlString)
                                ? <div className="post-link-body__html">
                                    <div dangerouslySetInnerHTML={{__html: htmlString}}/>
                                </div>
                                : <p>
                                    <span className="post-link-body__text" dangerouslySetInnerHTML={{__html: htmlString}}/>
                                </p>
                        }
                    </div>;
                })
            }
        </Fragment>
        : null;
};

LinkPostBodyAsArrayComponent.propTypes = {
    post: PropTypes.oneOfType([LinkPost].map(PropTypes.instanceOf)).isRequired
};

export default LinkPostComponent;