db-selector.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { ChatContext } from '@/app/chat-context';
  2. import { apiInterceptors, postChatModeParamsList } from '@/client/api';
  3. import DBIcon from '@/components/common/db-icon';
  4. import { IDB } from '@/types/chat';
  5. import { dbMapper } from '@/utils';
  6. import { useAsyncEffect } from 'ahooks';
  7. import { Select } from 'antd';
  8. import { useContext, useEffect, useMemo, useState } from 'react';
  9. function DBSelector() {
  10. const { scene, dbParam, setDbParam } = useContext(ChatContext);
  11. const [dbs, setDbs] = useState<IDB[]>([]);
  12. useAsyncEffect(async () => {
  13. const [, res] = await apiInterceptors(postChatModeParamsList(scene as string));
  14. setDbs(res ?? []);
  15. }, [scene]);
  16. const dbOpts = useMemo(
  17. () =>
  18. dbs.map?.((db: IDB) => {
  19. return { name: db.param, ...dbMapper[db.type] };
  20. }),
  21. [dbs],
  22. );
  23. useEffect(() => {
  24. if (dbOpts?.length && !dbParam) {
  25. setDbParam(dbOpts[0].name);
  26. }
  27. }, [dbOpts, setDbParam, dbParam]);
  28. if (!dbOpts?.length) return null;
  29. return (
  30. <Select
  31. value={dbParam}
  32. className='w-36'
  33. onChange={val => {
  34. setDbParam(val);
  35. }}
  36. >
  37. {dbOpts.map(item => (
  38. <Select.Option key={item.name}>
  39. <DBIcon
  40. width={24}
  41. height={24}
  42. src={item.icon}
  43. label={item.label}
  44. className='w-[1.5em] h-[1.5em] mr-1 inline-block mt-[-4px]'
  45. />
  46. {item.name}
  47. </Select.Option>
  48. ))}
  49. </Select>
  50. );
  51. }
  52. export default DBSelector;