@knapsack/app
Version:
Build Design Systems on top of knapsack, by Basalt
199 lines (190 loc) • 6.46 kB
JSX
/**
* Copyright (C) 2018 Basalt
This file is part of Knapsack.
Knapsack is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
Knapsack is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along
with Knapsack; if not, see <https://www.gnu.org/licenses>.
*/
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import PropTypes from 'prop-types';
import { KsSelect, KsButton } from '@knapsack/design-system';
import { FaExternalLinkAlt } from 'react-icons/fa';
import { PageBuilderContext } from './page-builder-context';
import './page-builder-pattern-list-item.scss';
// @todo Get pattern icons working for this again
// class PlaygroundSidebarPatternListItem extends Component {
// constructor(props) {
// super(props);
// this.state = {
// imgSrc: urlJoin(
// props.context.settings.patternIconBasePath,
// `${props.pattern.id}.svg`,
// ),
// };
// this.handleMissingImg = this.handleMissingImg.bind(this);
// this.defaultImgPath = urlJoin(
// this.props.context.settings.patternIconBasePath,
// 'default.svg',
// );
// }
//
// handleMissingImg() {
// console.info(
// `Could not find image for ${this.props.pattern.id} at "${
// this.state.imgSrc
// }", using default image instead.`,
// );
// this.setState({
// imgSrc: this.defaultImgPath,
// });
// }
//
// render() {
// const { enablePatternIcons = false } = this.props.context.features || {};
// return (
// <li
// className={`page-builder-pattern-list-item__item-wrapper
// ${enablePatternIcons ? 'page-builder-pattern-list-item__item-wrapper--thumb' : ''}`}
// key={this.props.pattern.id}
// thumb={enablePatternIcons}
// type="button"
// >
// <div
// role="button"
// tabIndex={0}
// onKeyPress={() => this.props.handleAddSlice(this.props.pattern.id)}
// onClick={() => this.props.handleAddSlice(this.props.pattern.id)}
// >
// <h5>{this.props.pattern.meta.title}</h5>
// {enablePatternIcons ? (
// <>
// <span>
// Pattern Icons is not a currently supported feature. Please
// toggle feature flag enablePatternIcons to false.
// </span>
// <img
// className="page-builder-pattern-list-item__thumb"
// src={
// this.props.pattern.meta.hasIcon
// ? this.state.imgSrc
// : this.defaultImgPath
// }
// onError={this.handleMissingImg}
// alt={this.props.pattern.meta.title}
// />
// </>
// ) : (
// <div className="page-builder-pattern-list-item__description">
// {this.props.pattern.meta.description}
// </div>
// )}
// </div>
// <Link
// target="_blank"
// to={`/patterns/${this.props.pattern.id}`}
// title="Open component details in new window"
// >
// Details <FaExternalLinkAlt size={8} />
// </Link>
// </li>
// );
// }
// }
class PlaygroundSidebarPatternListItem extends Component {
static contextType = PageBuilderContext;
constructor(props) {
super(props);
this.state = {
selectedTemplate: {
label: props.pattern.templates[0].title,
value: props.pattern.templates[0].id,
},
};
}
render() {
const { enablePatternIcons = false } = this.props.context.features || {};
const { pattern } = this.props;
return (
<li
className={`page-builder-pattern-list-item__item-wrapper
${
enablePatternIcons
? 'page-builder-pattern-list-item__item-wrapper--thumb'
: ''
}`}
key={this.props.pattern.id}
thumb={enablePatternIcons}
>
<div>
<h5>{pattern.meta.title}</h5>
{enablePatternIcons ? (
<>
<span>
Pattern Icons is not a currently supported feature. Please
toggle feature flag enablePatternIcons to false.
</span>
<img
className="page-builder-pattern-list-item__thumb"
src={
/* this.props.pattern.meta.hasIcon ? this.state.imgSrc : this.defaultImgPath */ null
}
onError={/* this.handleMissingImg */ null}
// alt={this.props.pattern.meta.title}
alt=""
/>
</>
) : (
<div className="page-builder-pattern-list-item__description">
{pattern.meta.description}
</div>
)}
</div>
<KsSelect
value={this.state.selectedTemplate}
handleChange={selectedTemplate => this.setState({ selectedTemplate })}
options={pattern.templates.map(template => ({
value: template.id,
label: template.title,
}))}
/>
<br />
<KsButton
onKeyPress={() =>
this.context.handleAddSlice(
this.props.pattern.id,
this.state.selectedTemplate.value,
)
}
onClick={() =>
this.context.handleAddSlice(
this.props.pattern.id,
this.state.selectedTemplate.value,
)
}
>
Add
</KsButton>
<br />
<Link
target="_blank"
to={`/patterns/${this.props.pattern.id}`}
title="Open component details in new window"
>
Details <FaExternalLinkAlt size={8} />
</Link>
</li>
);
}
}
PlaygroundSidebarPatternListItem.propTypes = {
pattern: PropTypes.object.isRequired,
};
export default PlaygroundSidebarPatternListItem;