docbrown/app/javascript/listings/singleListing.jsx
Hoang Vo 293ba5231b Fix eslint issues in app/javascript/listings (#4253)
* Fix some eslint and a11y issues

* Add a11y fixed to snapshot

* Fix missing whitespace that cause test fail

* Fix code duplicate

* Config eslint to allows the label as a sibling

* Use 'error' instead of 2 in eslintrc

* Correct propTypes in SingleListing

* Add missing id prop for select

* Add space between two functions

* onKeyPress only register Enter

* Allow space key also to activate action

* Use a common function for three event handlers
2019-10-14 14:23:20 -04:00

116 lines
3 KiB
JavaScript

import PropTypes from 'prop-types';
import { h } from 'preact';
export const SingleListing = ({
listing,
onAddTag,
currentUserId,
onChangeCategory,
onOpenModal,
isOpen,
}) => {
const tagLinks = listing.tag_list.map(tag => (
<a
href={`/listings?t=${tag}`}
onClick={e => onAddTag(e, tag)}
data-no-instant
>
{tag}
</a>
));
const editButton =
currentUserId === listing.user_id ? (
<a
href={`/listings/${listing.id}/edit`}
className="classified-listing-edit-button"
>
edit
</a>
) : (
<a
href={`/report-abuse?url=https://dev.to/listings/${listing.category}/${listing.slug}`}
>
report abuse
</a>
);
const locationText = listing.location ? (
<a href={`/listings/?q=${listing.location}`}>
{listing.location}
</a>
) : (
''
);
const definedClass = isOpen
? 'single-classified-listing single-classified-listing--opened'
: 'single-classified-listing';
const listingCard = () => {
return (
<div
className={definedClass}
id={`single-classified-listing-${listing.id}`}
>
<div className="listing-content">
<h3>
<a
href={`/listings/${listing.category}/${listing.slug}`}
data-no-instant
onClick={e => onOpenModal(e, listing)}
data-listing-id={listing.id}
>
{listing.title}
</a>
</h3>
<div
className="single-classified-listing-body"
dangerouslySetInnerHTML={{ __html: listing.processed_html }}
/>
<div className="single-classified-listing-tags">{tagLinks}</div>
<div className="single-classified-listing-author-info">
<a
href={`/listings/${listing.category}`}
onClick={e => onChangeCategory(e, listing.category)}
data-no-instant
>
{listing.category}
</a>
{locationText}
<a href={`/${listing.author.username}`}>{listing.author.name}</a>
{editButton}
</div>
</div>
</div>
);
};
return listingCard();
};
SingleListing.propTypes = {
listing: PropTypes.shape({
id: PropTypes.number,
category: PropTypes.string,
contact_via_connect: PropTypes.bool,
location: PropTypes.string,
processed_html: PropTypes.string,
slug: PropTypes.string,
title: PropTypes.string,
user_id: PropTypes.number,
tag_list: PropTypes.arrayOf(PropTypes.string),
author: PropTypes.shape({
name: PropTypes.string.isRequired,
username: PropTypes.string.isRequired,
profile_image_90: PropTypes.string.isRequired,
}),
}).isRequired,
onAddTag: PropTypes.func.isRequired,
onOpenModal: PropTypes.func.isRequired,
onChangeCategory: PropTypes.func.isRequired,
isOpen: PropTypes.bool.isRequired,
currentUserId: PropTypes.number,
};