index.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import { apiInterceptors, updateApp } from '@/client/api';
  2. import AppDefaultIcon from '@/new-components/common/AppDefaultIcon';
  3. import { CreateAppParams } from '@/types/app';
  4. import { EditOutlined, LeftOutlined } from '@ant-design/icons';
  5. import { useRequest } from 'ahooks';
  6. import { App, Button, Space, Spin } from 'antd';
  7. import classNames from 'classnames';
  8. import { useRouter } from 'next/router';
  9. import React, { useMemo, useRef, useState } from 'react';
  10. import { useTranslation } from 'react-i18next';
  11. import CreateAppModal from '../components/create-app-modal';
  12. import AwelLayout from './components/AwelLayout';
  13. import NativeApp from './components/NativeApp';
  14. import RecommendQuestions from './components/RecommendQuestions';
  15. import AutoPlan from './components/auto-plan';
  16. import styles from './styles.module.css';
  17. const ExtraAppInfo: React.FC = () => {
  18. // 获取当前应用信息
  19. const curApp = JSON.parse(localStorage.getItem('new_app_info') || '{}');
  20. const { t } = useTranslation();
  21. const { message } = App.useApp();
  22. const router = useRouter();
  23. const [loading, setLoading] = useState<boolean>(false);
  24. const [open, setOpen] = useState<boolean>(false);
  25. const appParams = useRef<CreateAppParams>({});
  26. // 更新应用
  27. const { run: update, loading: createLoading } = useRequest(
  28. async (params: CreateAppParams) =>
  29. await apiInterceptors(
  30. updateApp({
  31. app_code: curApp?.app_code,
  32. app_describe: curApp?.app_describe,
  33. team_mode: curApp?.team_mode,
  34. app_name: curApp?.app_name,
  35. language: curApp?.language,
  36. ...params,
  37. }),
  38. ),
  39. {
  40. manual: true,
  41. onSuccess: data => {
  42. const [, res] = data;
  43. if (res) {
  44. message.success(t('update_success'));
  45. router.replace('/construct/app');
  46. } else {
  47. message.error(t('update_failed'));
  48. }
  49. },
  50. },
  51. );
  52. const submit = async () => {
  53. await update({
  54. ...appParams.current,
  55. });
  56. };
  57. const recommendQuestionsStyle = useMemo(() => {
  58. if (curApp?.team_mode === 'awel_layout') {
  59. return 'px-6';
  60. }
  61. if (curApp?.team_mode === 'auto_plan') {
  62. return 'w-3/4 mx-auto';
  63. }
  64. return 'w-3/5 mx-auto';
  65. }, [curApp?.team_mode]);
  66. return (
  67. <App>
  68. <Spin spinning={loading}>
  69. <div
  70. className={classNames(
  71. 'flex flex-col h-screen w-screen dark:bg-gradient-dark bg-gradient-light bg-cover bg-center',
  72. styles['extra-container'],
  73. )}
  74. >
  75. <header className='flex items-center justify-between px-6 py-2 h-14 border-b border-[#edeeef]'>
  76. <Space className='flex items-center'>
  77. <LeftOutlined
  78. className='text-base cursor-pointer hover:text-[#0c75fc]'
  79. onClick={() => {
  80. router.replace('/construct/app');
  81. }}
  82. />
  83. <div className='flex items-center justify-center w-10 h-10 border border-[#d6d8da] rounded-lg'>
  84. <AppDefaultIcon scene={curApp?.team_context?.chat_scene || 'chat_agent'} />
  85. </div>
  86. <span>{curApp?.app_name}</span>
  87. <EditOutlined className='cursor-pointer hover:text-[#0c75fc]' onClick={() => setOpen(true)} />
  88. </Space>
  89. <Button type='primary' onClick={submit} loading={createLoading}>
  90. {curApp?.isEdit ? t('update') : t('save')}
  91. </Button>
  92. </header>
  93. <div className='flex flex-1 flex-col py-12 max-h-full overflow-y-auto'>
  94. {/* auto_plan模式 */}
  95. {['single_agent', 'auto_plan'].includes(curApp?.team_mode) && (
  96. <AutoPlan
  97. classNames='w-3/4 mx-auto'
  98. updateData={data => {
  99. setLoading(data?.[0]);
  100. appParams.current.details = data?.[1];
  101. }}
  102. initValue={curApp?.details}
  103. />
  104. )}
  105. {/* awel_layout模式 */}
  106. {curApp?.team_mode === 'awel_layout' && (
  107. <AwelLayout
  108. initValue={curApp?.team_context}
  109. updateData={data => {
  110. setLoading(data?.[0]);
  111. appParams.current.team_context = data?.[1];
  112. }}
  113. classNames='px-6'
  114. />
  115. )}
  116. {/* native_app模式 */}
  117. {curApp?.team_mode === 'native_app' && (
  118. <NativeApp
  119. initValue={{
  120. team_context: curApp?.team_context,
  121. param_need: curApp?.param_need,
  122. }}
  123. classNames='w-3/5 mx-auto'
  124. updateData={(data: any) => {
  125. setLoading(data?.[0]);
  126. appParams.current.team_context = data?.[1]?.[0];
  127. appParams.current.param_need = data?.[1]?.[1];
  128. }}
  129. />
  130. )}
  131. {/* single_agent模式 */}
  132. {/* {curApp?.team_mode === '' && <></>} */}
  133. <RecommendQuestions
  134. updateData={data => {
  135. appParams.current.recommend_questions = data as any;
  136. }}
  137. classNames={recommendQuestionsStyle}
  138. initValue={curApp?.recommend_questions}
  139. labelCol={curApp?.team_mode !== 'awel_layout'}
  140. />
  141. </div>
  142. </div>
  143. </Spin>
  144. <CreateAppModal type='edit' open={open} onCancel={() => setOpen(false)} />
  145. </App>
  146. );
  147. };
  148. export default ExtraAppInfo;