* set up refactored onboarding * create onboarding page * add in first slide and change slide functionality * fix test suite * profile refactor * profile refactor * refactor to api * add checkbox fields * add checkbox fields * remove puts * add basic css * add styling * add redirect * hide back and next at first and last slides * test refactored onboarding * test refactored onboarding * remove article edits * Fix schema * Add deleted file back in * Add default value for checked_t&c column * Adjust HTML structure to keep nav buttons in place * Fix ESLint issues on Onboarding.jsx file * Handling for undefined or empty followedTags on getUserTags * Fix codeclimate issues * Fix codeclimate issues * Fix more codeclimate issues * Fix more codeclimate issues * Update Onboarding snapshots * Uncheck the CoC and T&C checkboxes on render * Update snapshots * Return false instead of raising error * Update spec to use new onboarding * Redirect to onboarding if haven't seen it yet * Prevent redirect to onboarding from /signout_confirm * Use assign_attributes instead of saving twice * Move COC and T&C checkbox page to second slide * Add 'go back to original page' functionality * Reuse ready prototype logic * Keep track of the last visited onboarding page * Fix email subscription bug * Fix overflow issue for tags page * Remove height to prevent page container scrolling * Check for CoC and T&C for displaying onboarding * Add InstantClick redirect and preserve referrer in client * Fix async update + check by using localStorage * Turn off onboarding for tests * Finalize design for onboarding * Finalize design for onboarding * Make bulk follows during onboarding * Fix bulk follow test
90 lines
2.4 KiB
JavaScript
90 lines
2.4 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.object.isRequired,
|
|
onAddTag: PropTypes.func.isRequired,
|
|
onOpenModal: PropTypes.func.isRequired,
|
|
onChangeCategory: PropTypes.func.isRequired,
|
|
isOpen: PropTypes.bool.isRequired,
|
|
currentUserId: PropTypes.number,
|
|
};
|