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

16.66% Statements 3/18
0% Branches 0/5
0% Functions 0/7
16.66% Lines 3/18

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                  1x                                                                             1x   1x                                    
import {useState} from 'react'
 
import cx from 'classnames'
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 = ({
  iconStar = DEFAULTS.IconStarEmpty,
  initialRating = 0,
  onClick,
  size,
  ratingValues = DEFAULTS.ratingValues
}) => {
  const [selectedRating, setSelectedRating] = useState(null)
  const [rating, setRating] = useState(initialRating)
 
  const StarHover = iconStar
 
  const handleClick = (e, {value}) => {
    setRating(value)
    onClick(e, {value})
  }
 
  const renderStars = () =>
    ratingValues.map(value => {
      const isActive = rating >= value || value <= selectedRating
      const className = cx(BASE_CLASS, 'is-hoverable', {
        [`is-active`]: isActive
      })
      return (
        <div
          key={value}
          className={className}
          onClick={e => handleClick(e, {value})}
          onMouseOver={() => setSelectedRating(value)}
          onMouseOut={() => setSelectedRating(null)}
        >
          <StarHover size={size} />
        </div>
      )
    })
 
  return <>{renderStars()}</>
}
 
MoleculeRatingStarHover.displayName = 'MoleculeRatingStarHover'
 
MoleculeRatingStarHover.propTypes = {
  /** current values of the stars */
  ratingValues: PropTypes.array,
 
  /** Icon for star */
  iconStar: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
 
  /** init value assigned to rating */
  initialRating: PropTypes.number,
 
  /** Callback used component hovered */
  onClick: PropTypes.func,
 
  /** size */
  size: PropTypes.oneOf(Object.values(ATOM_ICON_SIZES))
}
 
export default MoleculeRatingStarHover