mcp.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import React, { MouseEvent, useCallback } from 'react';
  2. import { Dropdown, Button } from '../../index';
  3. import cls from 'classnames';
  4. import { cssClasses } from '@douyinfe/semi-foundation/aiChatInput/constants';
  5. import { Locale } from '../../locale/interface';
  6. import LocaleConsumer from '../../locale/localeConsumer';
  7. import { DropdownProps } from '../../dropdown';
  8. export interface McpOption {
  9. value: string;
  10. label: string;
  11. icon?: React.ReactNode;
  12. [key: string]: any
  13. }
  14. export interface McpProps extends DropdownProps {
  15. options: McpOption[];
  16. num?: number;
  17. onConfigureButtonClick: () => void
  18. }
  19. // because there may be grouping or nested dropdown forms.
  20. const Mcp = React.memo((props: McpProps) => {
  21. const { className, style, options = [], num = 0, children, onConfigureButtonClick, ...rest } = props;
  22. const onClick = useCallback((e: MouseEvent) => {
  23. // Prevent accidental closing of dropdown when clicking Button
  24. e.stopPropagation();
  25. }, []);
  26. return (<Dropdown
  27. style={style}
  28. className={cls({
  29. [className]: className,
  30. [`${cssClasses.PREFIX}-footer-configure-mcp`]: true,
  31. })}
  32. {...rest}
  33. render={<LocaleConsumer componentName="AIChatInput">
  34. {(locale: Locale['AIChatInput']) => (<>
  35. <div className={`${cssClasses.PREFIX}-footer-configure-mcp-header`}>
  36. <span className={`${cssClasses.PREFIX}-footer-configure-mcp-header-title`} >
  37. {locale.selected.replace('${count}', String(options.length ?? num))}
  38. </span>
  39. <Button
  40. theme='outline'
  41. className={`${cssClasses.PREFIX}-footer-configure-mcp-header-config`}
  42. onClick={onConfigureButtonClick}
  43. >
  44. {locale.configure}
  45. </Button>
  46. </div>
  47. {children ? children : <>
  48. <Dropdown.Menu>
  49. {options.map((item: any) => (
  50. <Dropdown.Item key={item.value} icon={item.icon}>{item.label}</Dropdown.Item>
  51. ))}
  52. </Dropdown.Menu>
  53. </>}
  54. </>)}
  55. </LocaleConsumer>}
  56. >
  57. <Button
  58. theme='outline'
  59. type='tertiary'
  60. className={`${cssClasses.PREFIX}-footer-configure-mcp-trigger`}
  61. onClick={onClick}
  62. >
  63. MCP · {options.length ?? num}
  64. </Button>
  65. </Dropdown>);
  66. });
  67. export default Mcp;