suggestionItem.tsx 1.6 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 { Suggestion, RenderSuggestionItemProps } from './interface';
  5. const prefixCls = cssClasses.PREFIX;
  6. interface SuggestionItemProps {
  7. suggestion: Suggestion;
  8. isActive?: boolean;
  9. renderSuggestionItem?: (props: RenderSuggestionItemProps) => ReactNode;
  10. onClick?: (suggestion: Suggestion) => void;
  11. index?: number;
  12. onMouseEnter?: (index: number) => void
  13. }
  14. const SuggestionItem = React.memo((props: SuggestionItemProps) => {
  15. const { suggestion, onClick, isActive, renderSuggestionItem, onMouseEnter, index } = props;
  16. const content = typeof suggestion === 'string' ? suggestion : (suggestion as any)?.content;
  17. const className = cls(`${prefixCls}-suggestion-item`, {
  18. [`${prefixCls}-suggestion-item-active`]: isActive
  19. });
  20. const handleClick = useCallback(() => {
  21. onClick?.(suggestion);
  22. }, [onClick, suggestion]);
  23. const handleMouseEnter = useCallback(() => {
  24. onMouseEnter?.(index);
  25. }, [index, onMouseEnter]);
  26. if (renderSuggestionItem) {
  27. return <>{renderSuggestionItem({
  28. suggestion,
  29. className,
  30. onClick: handleClick,
  31. onMouseEnter: handleMouseEnter
  32. })}</>;
  33. }
  34. // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
  35. return (<div
  36. className={className}
  37. onClick={handleClick}
  38. onMouseEnter={handleMouseEnter}
  39. >
  40. {content}
  41. </div>
  42. );
  43. });
  44. export default SuggestionItem;