22
33import { getDiscussionDiscId , ModelDiscussionType } from '@/api'
44import { postDiscussion , putDiscussionDiscId } from '@/api/Discussion'
5- import { ModelGroupItemInfo , SvcDiscussionCreateReq , SvcDiscussionUpdateReq } from '@/api/types'
5+ import { ModelDiscussionDetail , ModelGroupItemInfo , SvcDiscussionCreateReq , SvcDiscussionUpdateReq } from '@/api/types'
66import { Card } from '@/components'
77import EditorWrap , { EditorWrapRef } from '@/components/editor'
88import Modal from '@/components/modal'
@@ -25,7 +25,6 @@ import {
2525 TextField ,
2626 Typography ,
2727} from '@mui/material'
28- import { useRequest } from 'ahooks'
2928import { useParams , useSearchParams } from 'next/navigation'
3029import { useEffect , useMemo , useRef , useState } from 'react'
3130import { Controller , useForm } from 'react-hook-form'
@@ -92,8 +91,8 @@ export default function EditPage() {
9291 const { getFilteredGroups } = useGroupData ( )
9392 const [ summaryModalOpen , setSummaryModalOpen ] = useState ( false )
9493 const [ summaryDraft , setSummaryDraft ] = useState ( '' )
95- const requestedDiscussionIdRef = useRef < string | undefined > ( undefined )
96- const hasUserEditedRef = useRef ( false )
94+ const [ loading , setLoading ] = useState ( false )
95+ const [ discussion , setDiscussion ] = useState < ModelDiscussionDetail | null > ( null )
9796 const schema = useMemo (
9897 ( ) =>
9998 z . object ( {
@@ -132,26 +131,39 @@ export default function EditPage() {
132131 } ,
133132 } )
134133
135- const {
136- run,
137- loading,
138- data : discussion ,
139- } = useRequest ( ( discId : string ) => getDiscussionDiscId ( { discId } ) , {
140- manual : true ,
141- onSuccess : ( result ) => {
142- if ( hasUserEditedRef . current ) return
134+ useEffect ( ( ) => {
135+ if ( ! queryId ) {
136+ setDiscussion ( null )
137+ return
138+ }
143139
144- const discussionData = ( ( result as any ) ?. data || result ) as any
140+ let ignore = false
141+ setLoading ( true )
142+ getDiscussionDiscId ( { discId : queryId } )
143+ . then ( ( result ) => {
144+ if ( ignore ) return
145145
146- reset ( {
147- title : discussionData . title || '' ,
148- summary : discussionData . summary || '' ,
149- content : discussionData . content || '' ,
150- group_ids : discussionData . group_ids || [ ] ,
151- type : ( discussionData . type as ModelDiscussionType ) || ModelDiscussionType . DiscussionTypeBlog ,
146+ const discussionData = ( ( result as any ) ?. data || result ) as ModelDiscussionDetail
147+ setDiscussion ( discussionData )
148+ reset ( {
149+ title : discussionData . title || '' ,
150+ summary : discussionData . summary || '' ,
151+ content : discussionData . content || '' ,
152+ group_ids : discussionData . group_ids || [ ] ,
153+ type : ( discussionData . type as ModelDiscussionType ) || ModelDiscussionType . DiscussionTypeBlog ,
154+ } )
155+ } )
156+ . catch ( ( ) => {
157+ if ( ! ignore ) setDiscussion ( null )
158+ } )
159+ . finally ( ( ) => {
160+ if ( ! ignore ) setLoading ( false )
152161 } )
153- } ,
154- } )
162+
163+ return ( ) => {
164+ ignore = true
165+ }
166+ } , [ queryId , reset ] )
155167
156168 // summary 字段没有显式输入框,依赖侧边栏 setValue 写入;
157169 // 这里主动 register,确保 handleSubmit 的 vals 中能拿到最新的 summary。
@@ -194,22 +206,6 @@ export default function EditPage() {
194206 setValue ( 'group_ids' , defaultGroupIds , { shouldDirty : true , shouldValidate : true } )
195207 } , [ defaultGroupIds , queryId , getValues , setValue ] )
196208
197- useEffect ( ( ) => {
198- if ( ! queryId ) return
199- if ( requestedDiscussionIdRef . current === queryId ) return
200- requestedDiscussionIdRef . current = queryId
201- hasUserEditedRef . current = false
202- run ( queryId )
203- } , [ queryId , run ] )
204-
205- useEffect ( ( ) => {
206- const subscription = watch ( ( ) => {
207- hasUserEditedRef . current = true
208- } )
209-
210- return ( ) => subscription . unsubscribe ( )
211- } , [ watch ] )
212-
213209 // 当systemConfig加载完成时,如果是新建Q&A帖子且内容为空,则设置默认内容
214210 useEffect ( ( ) => {
215211 if (
@@ -272,6 +268,8 @@ export default function EditPage() {
272268 }
273269 } )
274270
271+ const shouldRenderEditor = ! loading && ( ! queryId || Boolean ( discussion ) )
272+
275273 return (
276274 < Box
277275 sx = { {
@@ -433,7 +431,7 @@ export default function EditPage() {
433431 } ,
434432 } }
435433 >
436- { ! loading && (
434+ { shouldRenderEditor && (
437435 < EditorWrap
438436 ref = { editorRef }
439437 aiWriting
0 commit comments