ModelSelector.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { ChatContext } from '@/app/chat-context';
  2. import ModelIcon from '@/new-components/chat/content/ModelIcon';
  3. import { SwapOutlined } from '@ant-design/icons';
  4. import type { MenuProps } from 'antd';
  5. import { Dropdown, Popover } from 'antd';
  6. import React, { useContext, useMemo } from 'react';
  7. import { MobileChatContext } from '../';
  8. const ModelSelector: React.FC = () => {
  9. const { modelList } = useContext(ChatContext);
  10. const { model, setModel } = useContext(MobileChatContext);
  11. const items: MenuProps['items'] = useMemo(() => {
  12. if (modelList.length > 0) {
  13. return modelList.map(item => {
  14. return {
  15. label: (
  16. <div
  17. className='flex items-center gap-2'
  18. onClick={() => {
  19. setModel(item);
  20. }}
  21. >
  22. <ModelIcon width={14} height={14} model={item} />
  23. <span className='text-xs'>{item}</span>
  24. </div>
  25. ),
  26. key: item,
  27. };
  28. });
  29. }
  30. return [];
  31. }, [modelList, setModel]);
  32. return (
  33. <Dropdown
  34. menu={{
  35. items,
  36. }}
  37. placement='top'
  38. trigger={['click']}
  39. >
  40. <Popover content={model}>
  41. <div className='flex items-center gap-1 border rounded-xl bg-white dark:bg-black p-2 flex-shrink-0'>
  42. <ModelIcon width={16} height={16} model={model} />
  43. <span
  44. className='text-xs font-medium line-clamp-1'
  45. style={{
  46. maxWidth: 96,
  47. }}
  48. >
  49. {model}
  50. </span>
  51. <SwapOutlined rotate={90} />
  52. </div>
  53. </Popover>
  54. </Dropdown>
  55. );
  56. };
  57. export default ModelSelector;