All files / molecule/rating/src/components StarHover.js

17.64% Statements 3/17
0% Branches 0/9
0% Functions 0/7
17.64% Lines 3/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73                1x                                                                           1x   1x                                                
import {useState} from 'react'
 
import PropTypes from 'prop-types'
 
import {ATOM_ICON_SIZES} from '@s-ui/react-atom-icon'
 
import {BASE_CLASS, DEFAULTS_STAR_HOVER as DEFAULTS} from './settings.js'
 
const MoleculeRatingStarHover = ({
  initialRating = 0,
  onClick,
  size,
  ratingValues = DEFAULTS.ratingValues,
  IconStarEmpty = DEFAULTS.IconStarEmpty,
  IconStarFilled = DEFAULTS.IconStarFilled,
  IconStarHalfFilled = DEFAULTS.IconStarHalfFilled
}) => {
  const [selectedRating, setSelectedRating] = useState(null)
  const [rating, setRating] = useState(initialRating)
 
  const handleClick = (e, {value}) => {
    setRating(value)
    onClick(e, {value})
  }
 
  const renderStars = () =>
    ratingValues.map(value => {
      const isActive = rating >= value || value <= selectedRating
      const StarHover = isActive ? IconStarFilled : IconStarEmpty
 
      return (
        <div
          key={value}
          className={BASE_CLASS}
          onClick={e => handleClick(e, {value})}
          onMouseOver={() => setSelectedRating(value)}
          onMouseOut={() => setSelectedRating(null)}
        >
          <StarHover size={size} />
        </div>
      )
    })
 
  return <>{renderStars()}</>
}
 
MoleculeRatingStarHover.displayName = 'MoleculeRatingStarHover'
 
MoleculeRatingStarHover.propTypes = {
  /** Icon for star filled */
  IconStarFilled: PropTypes.node,
 
  /** Icon for star half filled */
  IconStarHalfFilled: PropTypes.node,
 
  /** Icon for star empty */
  IconStarEmpty: PropTypes.node,
 
  /** init value assigned to rating */
  initialRating: PropTypes.number,
 
  /** Callback used component hovered */
  onClick: PropTypes.func,
 
  /** current values of the stars */
  ratingValues: PropTypes.array,
 
  /** size */
  size: PropTypes.oneOf(Object.values(ATOM_ICON_SIZES))
}
 
export default MoleculeRatingStarHover