'use client' import type { FC } from 'react' import React, { useEffect } from 'react' import { useRouter } from 'next/navigation' import { useTranslation } from 'react-i18next' import { useContext } from 'use-context-selector' import Toast from '../../base/toast' import s from './style.module.css' import ExploreContext from '@/context/explore-context' import type { App, AppCategory } from '@/models/explore' import Category from '@/app/components/explore/category' import AppCard from '@/app/components/explore/app-card' import { fetchAppDetail, fetchAppList } from '@/service/explore' import { createApp } from '@/service/apps' import CreateAppModal from '@/app/components/explore/create-app-modal' import type { CreateAppModalProps } from '@/app/components/explore/create-app-modal' import Loading from '@/app/components/base/loading' import { NEED_REFRESH_APP_LIST_KEY } from '@/config' import { type AppMode } from '@/types/app' import { useAppContext } from '@/context/app-context' const Apps: FC = () => { const { t } = useTranslation() const { isCurrentWorkspaceManager } = useAppContext() const router = useRouter() const { hasEditPermission } = useContext(ExploreContext) const [currCategory, setCurrCategory] = React.useState('') const [allList, setAllList] = React.useState([]) const [isLoaded, setIsLoaded] = React.useState(false) const currList = (() => { if (currCategory === '') return allList return allList.filter(item => item.category === currCategory) })() const [categories, setCategories] = React.useState([]) useEffect(() => { (async () => { const { categories, recommended_apps }: any = await fetchAppList() setCategories(categories) setAllList(recommended_apps) setIsLoaded(true) })() }, []) const [currApp, setCurrApp] = React.useState(null) const [isShowCreateModal, setIsShowCreateModal] = React.useState(false) const onCreate: CreateAppModalProps['onConfirm'] = async ({ name, icon, icon_background }) => { const { app_model_config: model_config } = await fetchAppDetail(currApp?.app.id as string) try { const app = await createApp({ name, icon, icon_background, mode: currApp?.app.mode as AppMode, config: model_config, }) setIsShowCreateModal(false) Toast.notify({ type: 'success', message: t('app.newApp.appCreated'), }) localStorage.setItem(NEED_REFRESH_APP_LIST_KEY, '1') router.push(`/app/${app.id}/${isCurrentWorkspaceManager ? 'configuration' : 'overview'}`) } catch (e) { Toast.notify({ type: 'error', message: t('app.newApp.appCreateFailed') }) } } if (!isLoaded) { return (
) } return (
{t('explore.apps.title')}
{t('explore.apps.description')}
{isShowCreateModal && ( setIsShowCreateModal(false)} /> )}
) } export default React.memo(Apps)