skillItem.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import React, { ReactNode, useCallback } from 'react';
  2. import cls from 'classnames';
  3. import { cssClasses } from '@douyinfe/semi-foundation/aiChatInput/constants';
  4. import { RenderSkillItemProps, Skill } from './interface';
  5. const prefixCls = cssClasses.PREFIX;
  6. interface SkillItemProps {
  7. skill?: Skill;
  8. renderSkillItem?: (props: RenderSkillItemProps) => ReactNode;
  9. isActive?: boolean;
  10. onClick?: (skill: Skill) => void;
  11. index?: number;
  12. onMouseEnter?: (index: number) => void
  13. }
  14. const SkillItem = React.memo((props: SkillItemProps) => {
  15. const { skill, onClick, isActive, renderSkillItem, onMouseEnter, index } = props;
  16. const className = cls(`${prefixCls}-skill-item`, {
  17. [`${prefixCls}-skill-item-active`]: isActive
  18. });
  19. const handleClick = useCallback(() => {
  20. onClick(skill);
  21. }, [onClick, skill]);
  22. const handleMouseEnter = useCallback(() => {
  23. onMouseEnter?.(index);
  24. }, [index, onMouseEnter]);
  25. if (renderSkillItem) {
  26. return <>{renderSkillItem({
  27. skill: skill,
  28. className,
  29. onClick: handleClick,
  30. onMouseEnter: handleMouseEnter
  31. })}</>;
  32. }
  33. // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
  34. return (<div
  35. className={className}
  36. onClick={handleClick}
  37. onMouseEnter={handleMouseEnter}
  38. >
  39. {skill.icon}
  40. <div className={`${prefixCls}-skill-item-content`}>
  41. {skill.label}
  42. </div>
  43. </div>);
  44. });
  45. export default SkillItem;