refactor: replace Toast notifications with emit for editing state management

This commit is contained in:
twwu 2025-04-02 14:11:32 +08:00
parent 934d0a32cd
commit e87261e8ce
7 changed files with 30 additions and 38 deletions

View File

@ -9,7 +9,7 @@ import { JSON_SCHEMA_MAX_DEPTH } from '@/config'
import CodeEditor from './code-editor' import CodeEditor from './code-editor'
import ErrorMessage from './error-message' import ErrorMessage from './error-message'
import { useVisualEditorStore } from './visual-editor/store' import { useVisualEditorStore } from './visual-editor/store'
import Toast from '@/app/components/base/toast' import { useMittContext } from './visual-editor/context'
type JsonImporterProps = { type JsonImporterProps = {
onSubmit: (schema: any) => void onSubmit: (schema: any) => void
@ -27,6 +27,7 @@ const JsonImporter: FC<JsonImporterProps> = ({
const importBtnRef = useRef<HTMLButtonElement>(null) const importBtnRef = useRef<HTMLButtonElement>(null)
const advancedEditing = useVisualEditorStore(state => state.advancedEditing) const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField) const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
const { emit } = useMittContext()
useEffect(() => { useEffect(() => {
if (importBtnRef.current) { if (importBtnRef.current) {
@ -38,15 +39,10 @@ const JsonImporter: FC<JsonImporterProps> = ({
const handleTrigger = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent>) => { const handleTrigger = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent>) => {
e.stopPropagation() e.stopPropagation()
if (advancedEditing || isAddingNewField) { if (advancedEditing || isAddingNewField)
Toast.notify({ emit('quitEditing', {})
type: 'warning',
message: t('workflow.nodes.llm.jsonSchema.warningTips.jsonImport'),
})
return
}
setOpen(!open) setOpen(!open)
}, [open, advancedEditing, isAddingNewField, t]) }, [open, advancedEditing, isAddingNewField, emit])
const onClose = useCallback(() => { const onClose = useCallback(() => {
setOpen(false) setOpen(false)

View File

@ -17,7 +17,7 @@ import {
preValidateSchema, preValidateSchema,
validateSchemaAgainstDraft7, validateSchemaAgainstDraft7,
} from '../../utils' } from '../../utils'
import { MittProvider, VisualEditorContextProvider } from './visual-editor/context' import { MittProvider, VisualEditorContextProvider, useMittContext } from './visual-editor/context'
import ErrorMessage from './error-message' import ErrorMessage from './error-message'
import { useVisualEditorStore } from './visual-editor/store' import { useVisualEditorStore } from './visual-editor/store'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
@ -73,6 +73,7 @@ const JsonSchemaConfig: FC<JsonSchemaConfigProps> = ({
const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField) const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField) const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField)
const setHoveringProperty = useVisualEditorStore(state => state.setHoveringProperty) const setHoveringProperty = useVisualEditorStore(state => state.setHoveringProperty)
const { emit } = useMittContext()
const updateBtnWidth = useCallback((width: number) => { const updateBtnWidth = useCallback((width: number) => {
setBtnWidth(width + 32) setBtnWidth(width + 32)
@ -113,18 +114,12 @@ const JsonSchemaConfig: FC<JsonSchemaConfigProps> = ({
} }
} }
else if (currentTab === SchemaView.VisualEditor) { else if (currentTab === SchemaView.VisualEditor) {
if (advancedEditing || isAddingNewField) { if (advancedEditing || isAddingNewField)
Toast.notify({ emit('quitEditing', { callback: (backup: SchemaRoot) => setJson(JSON.stringify(backup || jsonSchema, null, 2)) })
type: 'warning',
message: t('workflow.nodes.llm.jsonSchema.warningTips.switchToJsonSchema'),
})
return
}
setJson(JSON.stringify(jsonSchema, null, 2))
} }
setCurrentTab(value) setCurrentTab(value)
}, [currentTab, jsonSchema, json, advancedEditing, isAddingNewField, t]) }, [currentTab, jsonSchema, json, advancedEditing, isAddingNewField, emit])
const handleApplySchema = useCallback((schema: SchemaRoot) => { const handleApplySchema = useCallback((schema: SchemaRoot) => {
if (currentTab === SchemaView.VisualEditor) if (currentTab === SchemaView.VisualEditor)

View File

@ -20,6 +20,7 @@ import { type FormValue, ModelTypeEnum } from '@/app/components/header/account-s
import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useModelListAndDefaultModelAndCurrentProviderAndModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
import { useVisualEditorStore } from '../visual-editor/store' import { useVisualEditorStore } from '../visual-editor/store'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { useMittContext } from '../visual-editor/context'
type JsonSchemaGeneratorProps = { type JsonSchemaGeneratorProps = {
onApply: (schema: SchemaRoot) => void onApply: (schema: SchemaRoot) => void
@ -52,6 +53,7 @@ export const JsonSchemaGenerator: FC<JsonSchemaGeneratorProps> = ({
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration) } = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.textGeneration)
const advancedEditing = useVisualEditorStore(state => state.advancedEditing) const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField) const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
const { emit } = useMittContext()
const SchemaGenerator = theme === Theme.light ? SchemaGeneratorLight : SchemaGeneratorDark const SchemaGenerator = theme === Theme.light ? SchemaGeneratorLight : SchemaGeneratorDark
useEffect(() => { useEffect(() => {
@ -66,15 +68,10 @@ export const JsonSchemaGenerator: FC<JsonSchemaGeneratorProps> = ({
const handleTrigger = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent>) => { const handleTrigger = useCallback((e: React.MouseEvent<HTMLElement, MouseEvent>) => {
e.stopPropagation() e.stopPropagation()
if (advancedEditing || isAddingNewField) { if (advancedEditing || isAddingNewField)
Toast.notify({ emit('quitEditing', {})
type: 'warning',
message: t('workflow.nodes.llm.jsonSchema.warningTips.jsonGeneration'),
})
return
}
setOpen(!open) setOpen(!open)
}, [open, advancedEditing, isAddingNewField, t]) }, [open, advancedEditing, isAddingNewField, emit])
const onClose = useCallback(() => { const onClose = useCallback(() => {
setOpen(false) setOpen(false)

View File

@ -89,11 +89,8 @@ const EditCard: FC<EditCardProps> = ({
}) })
useSubscribe('fieldChangeSuccess', () => { useSubscribe('fieldChangeSuccess', () => {
if (isAddingNewField) { isAddingNewField && setIsAddingNewField(false)
setIsAddingNewField(false) advancedEditing && setAdvancedEditing(false)
return
}
setAdvancedEditing(false)
}) })
const emitPropertyNameChange = useCallback(() => { const emitPropertyNameChange = useCallback(() => {

View File

@ -22,7 +22,10 @@ export const useSchemaNodeOperations = (props: VisualEditorProps) => {
const { schema: jsonSchema, onChange } = props const { schema: jsonSchema, onChange } = props
const backupSchema = useVisualEditorStore(state => state.backupSchema) const backupSchema = useVisualEditorStore(state => state.backupSchema)
const setBackupSchema = useVisualEditorStore(state => state.setBackupSchema) const setBackupSchema = useVisualEditorStore(state => state.setBackupSchema)
const isAddingNewField = useVisualEditorStore(state => state.isAddingNewField)
const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField) const setIsAddingNewField = useVisualEditorStore(state => state.setIsAddingNewField)
const advancedEditing = useVisualEditorStore(state => state.advancedEditing)
const setAdvancedEditing = useVisualEditorStore(state => state.setAdvancedEditing)
const setHoveringProperty = useVisualEditorStore(state => state.setHoveringProperty) const setHoveringProperty = useVisualEditorStore(state => state.setHoveringProperty)
const { emit, useSubscribe } = useMittContext() const { emit, useSubscribe } = useMittContext()
@ -33,6 +36,15 @@ export const useSchemaNodeOperations = (props: VisualEditorProps) => {
} }
}) })
useSubscribe('quitEditing', (params) => {
const { callback } = params as any
callback?.(backupSchema)
emit('restoreSchema')
isAddingNewField && setIsAddingNewField(false)
advancedEditing && setAdvancedEditing(false)
setHoveringProperty(null)
})
useSubscribe('propertyNameChange', (params) => { useSubscribe('propertyNameChange', (params) => {
const { parentPath, oldFields, fields } = params as ChangeEventParams const { parentPath, oldFields, fields } = params as ChangeEventParams
const { name: oldName } = oldFields const { name: oldName } = oldFields
@ -204,6 +216,7 @@ export const useSchemaNodeOperations = (props: VisualEditorProps) => {
}) })
useSubscribe('addField', (params) => { useSubscribe('addField', (params) => {
advancedEditing && setAdvancedEditing(false)
setBackupSchema(jsonSchema) setBackupSchema(jsonSchema)
const { path } = params as AddEventParams const { path } = params as AddEventParams
setIsAddingNewField(true) setIsAddingNewField(true)

View File

@ -442,9 +442,6 @@ const translation = {
fieldNamePlaceholder: 'Field Name', fieldNamePlaceholder: 'Field Name',
descriptionPlaceholder: 'Add description', descriptionPlaceholder: 'Add description',
warningTips: { warningTips: {
jsonGeneration: 'Please finish editing the current field before generating a schema',
jsonImport: 'Please finish editing the current field before importing a schema',
switchToJsonSchema: 'Please finish editing the current field before switching to JSON Schema',
saveSchema: 'Please finish editing the current field before saving the schema', saveSchema: 'Please finish editing the current field before saving the schema',
}, },
}, },

View File

@ -443,9 +443,6 @@ const translation = {
fieldNamePlaceholder: '字段名', fieldNamePlaceholder: '字段名',
descriptionPlaceholder: '添加描述', descriptionPlaceholder: '添加描述',
warningTips: { warningTips: {
jsonGeneration: '请先完成当前字段的编辑',
jsonImport: '请先完成当前字段的编辑',
switchToJsonSchema: '请先完成当前字段的编辑',
saveSchema: '请先完成当前字段的编辑', saveSchema: '请先完成当前字段的编辑',
}, },
}, },