fix: Support passing the default app mode when creating an app (#25142)

Co-authored-by: 王博 <wangbo@localhost.com>
This commit is contained in:
Kurumi1997
2025-09-12 10:06:07 +08:00
committed by GitHub
parent 33afa7c84a
commit 8ffb9b6aed
3 changed files with 16 additions and 7 deletions

View File

@@ -1,6 +1,6 @@
'use client' 'use client'
import { useCallback, useRef, useState } from 'react' import { useCallback, useEffect, useRef, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
@@ -35,14 +35,15 @@ type CreateAppProps = {
onSuccess: () => void onSuccess: () => void
onClose: () => void onClose: () => void
onCreateFromTemplate?: () => void onCreateFromTemplate?: () => void
defaultAppMode?: AppMode
} }
function CreateApp({ onClose, onSuccess, onCreateFromTemplate }: CreateAppProps) { function CreateApp({ onClose, onSuccess, onCreateFromTemplate, defaultAppMode }: CreateAppProps) {
const { t } = useTranslation() const { t } = useTranslation()
const { push } = useRouter() const { push } = useRouter()
const { notify } = useContext(ToastContext) const { notify } = useContext(ToastContext)
const [appMode, setAppMode] = useState<AppMode>('advanced-chat') const [appMode, setAppMode] = useState<AppMode>(defaultAppMode || 'advanced-chat')
const [appIcon, setAppIcon] = useState<AppIconSelection>({ type: 'emoji', icon: '🤖', background: '#FFEAD5' }) const [appIcon, setAppIcon] = useState<AppIconSelection>({ type: 'emoji', icon: '🤖', background: '#FFEAD5' })
const [showAppIconPicker, setShowAppIconPicker] = useState(false) const [showAppIconPicker, setShowAppIconPicker] = useState(false)
const [name, setName] = useState('') const [name, setName] = useState('')
@@ -55,6 +56,11 @@ function CreateApp({ onClose, onSuccess, onCreateFromTemplate }: CreateAppProps)
const isCreatingRef = useRef(false) const isCreatingRef = useRef(false)
useEffect(() => {
if (appMode === 'chat' || appMode === 'agent-chat' || appMode === 'completion')
setIsAppTypeExpanded(true)
}, [appMode])
const onCreate = useCallback(async () => { const onCreate = useCallback(async () => {
if (!appMode) { if (!appMode) {
notify({ type: 'error', message: t('app.newApp.appTypeRequired') }) notify({ type: 'error', message: t('app.newApp.appTypeRequired') })
@@ -264,7 +270,7 @@ function CreateApp({ onClose, onSuccess, onCreateFromTemplate }: CreateAppProps)
type CreateAppDialogProps = CreateAppProps & { type CreateAppDialogProps = CreateAppProps & {
show: boolean show: boolean
} }
const CreateAppModal = ({ show, onClose, onSuccess, onCreateFromTemplate }: CreateAppDialogProps) => { const CreateAppModal = ({ show, onClose, onSuccess, onCreateFromTemplate, defaultAppMode }: CreateAppDialogProps) => {
return ( return (
<FullScreenModal <FullScreenModal
overflowVisible overflowVisible
@@ -272,7 +278,7 @@ const CreateAppModal = ({ show, onClose, onSuccess, onCreateFromTemplate }: Crea
open={show} open={show}
onClose={onClose} onClose={onClose}
> >
<CreateApp onClose={onClose} onSuccess={onSuccess} onCreateFromTemplate={onCreateFromTemplate} /> <CreateApp onClose={onClose} onSuccess={onSuccess} onCreateFromTemplate={onCreateFromTemplate} defaultAppMode={defaultAppMode} />
</FullScreenModal> </FullScreenModal>
) )
} }

View File

@@ -211,14 +211,14 @@ const List = () => {
{(data && data[0].total > 0) {(data && data[0].total > 0)
? <div className='relative grid grow grid-cols-1 content-start gap-4 px-12 pt-2 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6'> ? <div className='relative grid grow grid-cols-1 content-start gap-4 px-12 pt-2 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6'>
{isCurrentWorkspaceEditor {isCurrentWorkspaceEditor
&& <NewAppCard ref={newAppCardRef} onSuccess={mutate} />} && <NewAppCard ref={newAppCardRef} onSuccess={mutate} selectedAppType={activeTab} />}
{data.map(({ data: apps }) => apps.map(app => ( {data.map(({ data: apps }) => apps.map(app => (
<AppCard key={app.id} app={app} onRefresh={mutate} /> <AppCard key={app.id} app={app} onRefresh={mutate} />
)))} )))}
</div> </div>
: <div className='relative grid grow grid-cols-1 content-start gap-4 overflow-hidden px-12 pt-2 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6'> : <div className='relative grid grow grid-cols-1 content-start gap-4 overflow-hidden px-12 pt-2 sm:grid-cols-1 md:grid-cols-2 xl:grid-cols-4 2xl:grid-cols-5 2k:grid-cols-6'>
{isCurrentWorkspaceEditor {isCurrentWorkspaceEditor
&& <NewAppCard ref={newAppCardRef} className='z-10' onSuccess={mutate} />} && <NewAppCard ref={newAppCardRef} className='z-10' onSuccess={mutate} selectedAppType={activeTab} />}
<Empty /> <Empty />
</div>} </div>}

View File

@@ -26,12 +26,14 @@ export type CreateAppCardProps = {
className?: string className?: string
onSuccess?: () => void onSuccess?: () => void
ref: React.RefObject<HTMLDivElement | null> ref: React.RefObject<HTMLDivElement | null>
selectedAppType?: string
} }
const CreateAppCard = ({ const CreateAppCard = ({
ref, ref,
className, className,
onSuccess, onSuccess,
selectedAppType,
}: CreateAppCardProps) => { }: CreateAppCardProps) => {
const { t } = useTranslation() const { t } = useTranslation()
const { onPlanInfoChanged } = useProviderContext() const { onPlanInfoChanged } = useProviderContext()
@@ -86,6 +88,7 @@ const CreateAppCard = ({
setShowNewAppTemplateDialog(true) setShowNewAppTemplateDialog(true)
setShowNewAppModal(false) setShowNewAppModal(false)
}} }}
defaultAppMode={selectedAppType !== 'all' ? selectedAppType as any : undefined}
/> />
)} )}
{showNewAppTemplateDialog && ( {showNewAppTemplateDialog && (