FunctionProject/website/components/FunctionCard/FunctionCard.jsx

81 lines
2.3 KiB
React
Raw Normal View History

2020-08-03 12:04:07 +02:00
import Link from 'next/link'
import { useState, forwardRef, memo } from 'react'
2020-08-03 12:04:07 +02:00
import date from 'date-and-time'
import Loader from '../Loader'
import { API_URL } from '../../utils/api'
2020-08-03 12:04:07 +02:00
import './FunctionCard.css'
2020-08-03 14:14:45 +02:00
const FunctionCard = memo(
forwardRef((props, ref) => {
const [isLoading, setIsLoading] = useState(true)
2020-08-03 12:04:07 +02:00
2020-08-03 14:14:45 +02:00
const handleLoad = () => {
setIsLoading(false)
}
2020-08-03 12:04:07 +02:00
2020-08-03 14:14:45 +02:00
const handleError = event => {
event.target.src = API_URL + '/images/functions/default.png'
}
2020-08-03 12:04:07 +02:00
2020-08-03 14:14:45 +02:00
const isFormOrArticle = props.type === 'form' || props.type === 'article'
2020-08-03 12:04:07 +02:00
2020-08-03 14:14:45 +02:00
return (
<Link
{...(props.isAdmin
2020-08-03 12:04:07 +02:00
? {
href: '/admin/[slug]',
as: `/admin/${props.slug}`
}
2020-08-03 12:04:07 +02:00
: {
href: isFormOrArticle
? '/functions/[slug]'
: `/functions/${props.slug}`,
as: `/functions/${props.slug}`
})}
2020-08-03 14:14:45 +02:00
>
{/* FunctionCard a une hauteur pendant chargement */}
<a
ref={ref}
style={
isLoading ? { height: '360px', justifyContent: 'center' } : null
2020-08-03 12:04:07 +02:00
}
2020-08-03 14:14:45 +02:00
className='FunctionCard col-sm-24 col-md-10 col-xl-7'
>
{isLoading && <Loader width='125px' height='125px' />}
2020-08-03 14:14:45 +02:00
<div
className={`FunctionCard__container ${isLoading ? 'd-none' : ''}`}
>
<div className='FunctionCard__top'>
<img
onLoad={handleLoad}
onError={handleError}
className='FunctionCard__image'
alt={props.title}
src={API_URL + props.image}
/>
<h2 className='FunctionCard__title'>{props.title}</h2>
<p className='FunctionCard__description text-center'>
{props.description}
</p>
</div>
<div className='FunctionCard__info'>
<p
className='FunctionCard__category'
style={{ backgroundColor: props.categorie.color }}
>
{props.categorie.name}
</p>
<p className='FunctionCard__publication-date'>
2020-08-04 11:42:21 +02:00
{date.format(new Date(props.createdAt), 'DD/MM/YYYY', false)}
2020-08-03 14:14:45 +02:00
</p>
</div>
2020-08-03 12:04:07 +02:00
</div>
2020-08-03 14:14:45 +02:00
</a>
</Link>
)
})
)
2020-08-03 12:04:07 +02:00
export default FunctionCard