123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- import { ChatContext } from '@/app/chat-context';
- import { apiInterceptors, getAppList, newDialogue, recommendApps } from '@/client/api';
- import { getRecommendQuestions } from '@/client/api/chat';
- import TabContent from '@/new-components/app/TabContent';
- import ChatInput from '@/new-components/chat/input/ChatInput';
- import { STORAGE_INIT_MESSAGE_KET } from '@/utils';
- import { useRequest } from 'ahooks';
- import { ConfigProvider, Segmented, SegmentedProps } from 'antd';
- import { t } from 'i18next';
- import Image from 'next/image';
- import { useRouter } from 'next/router';
- import { useContext, useEffect, useState } from 'react';
- function ChatDefault() {
- const { setCurrentDialogInfo, model } = useContext(ChatContext);
- const router = useRouter();
- const [apps, setApps] = useState<any>({
- app_list: [],
- total_count: 0,
- });
- const [activeKey, setActiveKey] = useState('recommend');
- const getAppListWithParams = (params: Record<string, string>) =>
- apiInterceptors(
- getAppList({
- ...params,
- page_no: '1',
- page_size: '6',
- }),
- );
- const getHotAppList = (params: Record<string, string>) =>
- apiInterceptors(
- recommendApps({
- page_no: '1',
- page_size: '6',
- ...params,
- }),
- );
- // 获取应用列表
- const {
- run: getAppListFn,
- loading,
- refresh,
- } = useRequest(
- async (app_name?: string) => {
- switch (activeKey) {
- case 'recommend':
- return await getHotAppList({});
- case 'used':
- return await getAppListWithParams({
- is_recent_used: 'true',
- need_owner_info: 'true',
- ...(app_name && { app_name }),
- });
- default:
- return [];
- }
- },
- {
- manual: true,
- onSuccess: res => {
- const [_error, data] = res;
- if (activeKey === 'recommend') {
- return setApps({
- app_list: data,
- total_count: data?.length || 0,
- });
- }
- setApps(data || {});
- },
- debounceWait: 500,
- },
- );
- useEffect(() => {
- getAppListFn();
- }, [activeKey, getAppListFn]);
- const items: SegmentedProps['options'] = [
- {
- value: 'recommend',
- label: t('recommend_apps'),
- },
- {
- value: 'used',
- label: t('used_apps'),
- },
- ];
- // 获取推荐问题
- const { data: helps } = useRequest(async () => {
- const [, res] = await apiInterceptors(getRecommendQuestions({ is_hot_question: 'true' }));
- return res ?? [];
- });
- return (
- <ConfigProvider
- theme={{
- components: {
- Button: {
- defaultBorderColor: 'white',
- },
- Segmented: {
- itemSelectedBg: '#2867f5',
- itemSelectedColor: 'white',
- },
- },
- }}
- >
- <div className='px-28 py-10 h-full flex flex-col justify-between'>
- <div>
- <div className='flex justify-between'>
- <Segmented
- className='backdrop-filter h-10 backdrop-blur-lg bg-white bg-opacity-30 border border-white rounded-lg shadow p-1 dark:border-[#6f7f95] dark:bg-[#6f7f95] dark:bg-opacity-60'
- options={items}
- value={activeKey}
- onChange={value => {
- setActiveKey(value as string);
- }}
- />
- <span className='flex items-center text-gray-500 gap-1 dark:text-slate-300'>
- <span>{t('app_in_mind')}</span>
- <span
- className='flex items-center cursor-pointer'
- onClick={() => {
- router.push('/');
- }}
- >
- <Image
- key='image_explore'
- src={'/pictures/explore_active.png'}
- alt='construct_image'
- width={24}
- height={24}
- />
- <span className='text-default'>{t('explore')}</span>
- </span>
- <span>{t('Discover_more')}</span>
- </span>
- </div>
- <TabContent apps={apps?.app_list || []} loading={loading} refresh={refresh} type={activeKey as any} />
- {helps && helps.length > 0 && (
- <div>
- <h2 className='font-medium text-xl my-4'>{t('help')}</h2>
- <div className='flex justify-start gap-4'>
- {helps.map(help => (
- <span
- key={help.id}
- className='flex gap-4 items-center backdrop-filter backdrop-blur-lg cursor-pointer bg-white bg-opacity-70 border-0 rounded-lg shadow p-2 relative dark:bg-[#6f7f95] dark:bg-opacity-60'
- onClick={async () => {
- const [, res] = await apiInterceptors(newDialogue({ chat_mode: 'chat_knowledge', model }));
- if (res) {
- setCurrentDialogInfo?.({
- chat_scene: res.chat_mode,
- app_code: help.app_code,
- });
- localStorage.setItem(
- 'cur_dialog_info',
- JSON.stringify({
- chat_scene: res.chat_mode,
- app_code: help.app_code,
- }),
- );
- localStorage.setItem(
- STORAGE_INIT_MESSAGE_KET,
- JSON.stringify({ id: res.conv_uid, message: help.question }),
- );
- router.push(`/chat/?scene=${res.chat_mode}&id=${res?.conv_uid}`);
- }
- }}
- >
- <span>{help.question}</span>
- <Image key='image_explore' src={'/icons/send.png'} alt='construct_image' width={20} height={20} />
- </span>
- ))}
- </div>
- </div>
- )}
- </div>
- <div>
- <ChatInput />
- </div>
- </div>
- </ConfigProvider>
- );
- }
- export default ChatDefault;
|