0

I have multiple Icons, each with a unique tooltip advice. These Icons change over time, and so the resulting tooltip needs to be updated. However, when the Icon changes, it is almost as if the tooltip cannot find the icon, and so latches on to the nearest Icon so it can exist somewhere. The result is 1 icon has 2 tooltips and the other Icon has no tooltips. Here is my react code

AnswerStatusIcon.js

import React, { useEffect, useState } from 'react'
import * as Icon from 'react-feather'
import ReactTooltip from 'react-tooltip'

function answered(){
  return(
    <div className="mx-auto">
      <Icon.Check
        className="w-5 h-5 text-theme-9 mx-auto"
        data-for="1"
        data-tip=""
      />
      <ReactTooltip place="left" id="1">
        Question is answered
      </ReactTooltip>
    </div>
  )
}
function notAnswered(){
  return(
    <div className="mx-auto">
      <Icon.AlertTriangle
        className="w-5 h-5 text-theme-12 mx-auto"
        data-for="2"
        data-tip=""
      />
      <ReactTooltip place="left" id="2">
        Question was skipped
      </ReactTooltip>
    </div>
  )
}
function marked() {
  return(
    <div className="mx-auto">
      <Icon.Crosshair
        className="w-5 h-5 text-theme-11 mx-auto"
        data-for="3"
        data-tip=""
      />
      <ReactTooltip place="left" id="3">
        Question was NOT answered and marked for review
      </ReactTooltip>
    </div>
  )
}
function answeredAndMarked() {
  return(
    <div className="mx-auto">
      <Icon.UserCheck
        className="w-5 h-5 text-theme-9 mx-auto"
        data-for="4"
        data-tip=""
      />
      <ReactTooltip place="left" id="4">
        Question was answered AND marked for review
      </ReactTooltip>
    </div>
  )
}
function notVisited() {
  return( 
    <div className="mx-auto">
      <Icon.AlertCircle
        className="w-5 h-5 text-gray-600 mx-auto"
        data-for="5"
        data-tip=""
      />
      <ReactTooltip place="left" id="5">
        Haven't visited question yet
      </ReactTooltip>
    </div>
  )
}
function defaultStatus() {
  return(
    <div className="mx-auto">
      <Icon.AlertCircle
        className="w-5 h-5 text-gray-600 mx-auto"
        data-for="6"
        data-tip=""
      />
      <ReactTooltip place="left" id="6">
        Haven't visited question yet
      </ReactTooltip>
    </div>
  )
}

function AnswerStatusIcon(props) {

  if (props.answer && props.marked.includes(props.questionId)) {
    return answeredAndMarked()
  } else if (props.answer) {
    return answered()
  } else if (props.visited && props.marked.includes(props.questionId)) {
    return marked()
  } else if (props.visited && props.currentQuestion === props.questionId) {
    return notVisited()
  }
  return defaultStatus
}
  
export { AnswerStatusIcon }

QuestionButton.js

import React, { useState, useEffect, useRef } from 'react'

import { AnswerStatusIcon } from './AnswerStatusIcons'

function QuestionButton(props) {
  const didMountRef = useRef(false);
  const [visited, setVisited] = useState(false)

  useEffect(() => {
    if (didMountRef.current) {
      if (props.currentQuestion === props.questionId) {
        setVisited(true)
      }
    } else didMountRef.current = true;
  }, [props.currentQuestion, props.questionId, visited])

  return (
    <div
      style={{ cursor: 'pointer' }}
      onClick={() => props.onClickQuestion(props.questionId)}
      className={
        'border text-gray-700 py-1 p-3 rounded relative font-medium mx-2' +
        (props.currentQuestion === props.questionId
          ? ' border-gray-700 bg-gray-200 text-gray-600'
          : ' border-gray-400')
      }
    >
      {props.questionId + 1}
      <AnswerStatusIcon
        answer={props.answer}
        marked={props.markedQuestions}
        questionId={props.questionId}
        visited={visited}
      />
    </div>
  )
}

export { QuestionButton }
wuiiz93
  • 119
  • 1
  • 10

1 Answers1

0

The real answer here is using @reach/tooltip library instead, I got it working in 2 minutes...

wuiiz93
  • 119
  • 1
  • 10