You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

agent-templates.tsx 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { PageHeader } from '@/components/page-header';
  2. import {
  3. Breadcrumb,
  4. BreadcrumbItem,
  5. BreadcrumbLink,
  6. BreadcrumbList,
  7. BreadcrumbPage,
  8. BreadcrumbSeparator,
  9. } from '@/components/ui/breadcrumb';
  10. import { useSetModalState } from '@/hooks/common-hooks';
  11. import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
  12. import { useFetchAgentTemplates, useSetAgent } from '@/hooks/use-agent-request';
  13. import { IFlowTemplate } from '@/interfaces/database/flow';
  14. import { useCallback, useEffect, useState } from 'react';
  15. import { useTranslation } from 'react-i18next';
  16. import { CreateAgentDialog } from './create-agent-dialog';
  17. import { TemplateCard } from './template-card';
  18. import { SideBar } from './template-sidebar';
  19. export default function AgentTemplates() {
  20. const { navigateToAgentList } = useNavigatePage();
  21. const { t } = useTranslation();
  22. const list = useFetchAgentTemplates();
  23. const { loading, setAgent } = useSetAgent();
  24. const [templateList, setTemplateList] = useState<IFlowTemplate[]>([]);
  25. useEffect(() => {
  26. setTemplateList(list);
  27. }, [list]);
  28. const {
  29. visible: creatingVisible,
  30. hideModal: hideCreatingModal,
  31. showModal: showCreatingModal,
  32. } = useSetModalState();
  33. const [template, setTemplate] = useState<IFlowTemplate>();
  34. const showModal = useCallback(
  35. (record: IFlowTemplate) => {
  36. setTemplate(record);
  37. showCreatingModal();
  38. },
  39. [showCreatingModal],
  40. );
  41. const { navigateToAgent } = useNavigatePage();
  42. const handleOk = useCallback(
  43. async (payload: any) => {
  44. let dsl = template?.dsl;
  45. const ret = await setAgent({
  46. title: payload.name,
  47. dsl,
  48. avatar: template?.avatar,
  49. });
  50. if (ret?.code === 0) {
  51. hideCreatingModal();
  52. navigateToAgent(ret.data.id)();
  53. }
  54. },
  55. [
  56. hideCreatingModal,
  57. navigateToAgent,
  58. setAgent,
  59. template?.avatar,
  60. template?.dsl,
  61. ],
  62. );
  63. const handleSiderBarChange = (keyword: string) => {
  64. const tempList = list.filter(
  65. (item, index) =>
  66. item.title.toLocaleLowerCase().includes(keyword?.toLocaleLowerCase()) ||
  67. index === 0,
  68. );
  69. setTemplateList(tempList);
  70. };
  71. return (
  72. <section>
  73. <PageHeader>
  74. <Breadcrumb>
  75. <BreadcrumbList>
  76. <BreadcrumbItem>
  77. <BreadcrumbLink onClick={navigateToAgentList}>
  78. Agent
  79. </BreadcrumbLink>
  80. </BreadcrumbItem>
  81. <BreadcrumbSeparator />
  82. <BreadcrumbItem>
  83. <BreadcrumbPage>{t('flow.createGraph')}</BreadcrumbPage>
  84. </BreadcrumbItem>
  85. </BreadcrumbList>
  86. </Breadcrumb>
  87. </PageHeader>
  88. <div className="flex flex-1 h-dvh">
  89. <SideBar change={handleSiderBarChange}></SideBar>
  90. <main className="flex-1 bg-muted/50 h-dvh">
  91. <div className="grid gap-6 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 max-h-[94vh] overflow-auto px-8 pt-8">
  92. {templateList?.map((x, index) => {
  93. return (
  94. <TemplateCard
  95. isCreate={index === 0}
  96. key={x.id}
  97. data={x}
  98. showModal={showModal}
  99. ></TemplateCard>
  100. );
  101. })}
  102. </div>
  103. {creatingVisible && (
  104. <CreateAgentDialog
  105. loading={loading}
  106. visible={creatingVisible}
  107. hideModal={hideCreatingModal}
  108. onOk={handleOk}
  109. ></CreateAgentDialog>
  110. )}
  111. </main>
  112. </div>
  113. </section>
  114. );
  115. }