Skip to content

Commit 1de715e

Browse files
committed
fix: restore editor edit form loading
1 parent 7e0edad commit 1de715e

6 files changed

Lines changed: 83 additions & 50 deletions

File tree

ui/front/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@
111111
"onlyBuiltDependencies": [
112112
"sharp",
113113
"core-js"
114-
]
114+
],
115+
"patchedDependencies": {
116+
"@tiptap/react@3.14.0": "patches/@tiptap__react@3.14.0.patch"
117+
}
115118
}
116119
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
diff --git a/dist/index.cjs b/dist/index.cjs
2+
index 91cbf849c7d96511557d726db4aeb83f6f42f057..4db027cc4054282475c1b97e5cd1fff509c462e1 100644
3+
--- a/dist/index.cjs
4+
+++ b/dist/index.cjs
5+
@@ -727,7 +727,7 @@ var ReactRenderer = class {
6+
if (className) {
7+
this.element.classList.add(...className.split(" "));
8+
}
9+
- if (this.editor.isInitialized) {
10+
+ if (this.editor.isInitialized && !isReact19Plus()) {
11+
(0, import_react_dom2.flushSync)(() => {
12+
this.render();
13+
});
14+
diff --git a/dist/index.js b/dist/index.js
15+
index bf7aa68812a0eb3a00b5bb4689d2cf5a1959ccc3..6562bb1e453b8b9530567400a2f2ab114d6d4f71 100644
16+
--- a/dist/index.js
17+
+++ b/dist/index.js
18+
@@ -671,7 +671,7 @@ var ReactRenderer = class {
19+
if (className) {
20+
this.element.classList.add(...className.split(" "));
21+
}
22+
- if (this.editor.isInitialized) {
23+
+ if (this.editor.isInitialized && !isReact19Plus()) {
24+
flushSync(() => {
25+
this.render();
26+
});

ui/front/pnpm-lock.yaml

Lines changed: 11 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ui/front/src/app/[route_name]/[id]/ui/content.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,11 @@ const Content = (props: { data: ModelDiscussionDetail }) => {
239239
setSelfAnswerModalVisible(false)
240240
const parts = pathname.split('/').filter(Boolean)
241241
const routeName = parts[0] || ''
242-
if (routeName && data.uuid) {
243-
router.push(`/${routeName}/edit?id=${data.uuid}&type=${data.type}`)
242+
const discId = data.uuid || id
243+
if (routeName && discId) {
244+
router.push(`/${routeName}/edit?id=${discId}&type=${data.type}`)
244245
}
245-
}, [pathname, data.uuid, router])
246+
}, [pathname, data.uuid, data.type, id, router])
246247

247248
const handleAcceptComment = () => {
248249
setAnchorEl(null)

ui/front/src/app/[route_name]/[id]/ui/titleCard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ const TitleCard = ({ data, menuAnchorEl, onMenuClose }: TitleCardProps) => {
7373
const theme = useTheme()
7474
const isMobile = useMediaQuery(theme.breakpoints.down('lg'))
7575
const forums = useForumStore((s) => s.forums)
76-
const { route_name }: { route_name?: string } = (useParams() as any) || {}
76+
const { route_name, id }: { route_name?: string; id?: string } = (useParams() as any) || {}
7777

7878
// 刷新页面但不增加浏览次数
7979
const refreshWithoutView = useCallback(() => {
@@ -261,7 +261,7 @@ const TitleCard = ({ data, menuAnchorEl, onMenuClose }: TitleCardProps) => {
261261
{!(data.type === ModelDiscussionType.DiscussionTypeQA && isClosed) && (
262262
<MenuItem
263263
onClick={() => {
264-
router.push(`/${route_name}/edit?id=${data.uuid}&type=${data.type}`)
264+
router.push(`/${route_name}/edit?id=${data.uuid || id}&type=${data.type}`)
265265
menuClose()
266266
}}
267267
>

ui/front/src/app/[route_name]/edit/page.tsx

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import { getDiscussionDiscId, ModelDiscussionType } from '@/api'
44
import { postDiscussion, putDiscussionDiscId } from '@/api/Discussion'
5-
import { ModelGroupItemInfo, SvcDiscussionCreateReq, SvcDiscussionUpdateReq } from '@/api/types'
5+
import { ModelDiscussionDetail, ModelGroupItemInfo, SvcDiscussionCreateReq, SvcDiscussionUpdateReq } from '@/api/types'
66
import { Card } from '@/components'
77
import EditorWrap, { EditorWrapRef } from '@/components/editor'
88
import Modal from '@/components/modal'
@@ -25,7 +25,6 @@ import {
2525
TextField,
2626
Typography,
2727
} from '@mui/material'
28-
import { useRequest } from 'ahooks'
2928
import { useParams, useSearchParams } from 'next/navigation'
3029
import { useEffect, useMemo, useRef, useState } from 'react'
3130
import { 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

Comments
 (0)