1- import React , { useState } from "react" ;
1+ import React , { useCallback , useEffect , useRef , useState } from "react" ;
22import { PlusCircle , GripVertical , Trash2 , Eye , EyeOff } from "lucide-react" ;
33import { Reorder , AnimatePresence , motion } from "framer-motion" ;
44import { useTranslations } from "@/i18n/compat/client" ;
@@ -18,6 +18,7 @@ interface CustomFieldProps {
1818 field : CustomFieldType ;
1919 onUpdate : ( field : CustomFieldType ) => void ;
2020 onDelete : ( id : string ) => void ;
21+ onReorderEnd : ( ) => void ;
2122}
2223
2324const itemAnimations = {
@@ -31,6 +32,7 @@ const CustomField: React.FC<CustomFieldProps> = ({
3132 field,
3233 onUpdate,
3334 onDelete,
35+ onReorderEnd,
3436} ) => {
3537 const t = useTranslations ( "workbench.basicPanel" ) ;
3638
@@ -39,6 +41,7 @@ const CustomField: React.FC<CustomFieldProps> = ({
3941 value = { field }
4042 id = { field . id }
4143 className = "group touch-none list-none"
44+ onDragEnd = { onReorderEnd }
4245 >
4346 < motion . div
4447 { ...itemAnimations }
@@ -169,15 +172,28 @@ const BasicPanel: React.FC = () => {
169172 visible : field . visible ?? true ,
170173 } ) ) ;
171174 } ) ;
175+ const basicFieldsRef = useRef ( basicFields ) ;
176+ const customFieldsRef = useRef ( customFields ) ;
172177 const t = useTranslations ( "workbench.basicPanel" ) ;
173178
179+ useEffect ( ( ) => {
180+ basicFieldsRef . current = basicFields ;
181+ } , [ basicFields ] ) ;
182+
183+ useEffect ( ( ) => {
184+ customFieldsRef . current = customFields ;
185+ } , [ customFields ] ) ;
186+
174187 const handleBasicReorder = ( newOrder : BasicFieldType [ ] ) => {
188+ basicFieldsRef . current = newOrder ;
175189 setBasicFields ( newOrder ) ;
190+ } ;
191+
192+ const commitBasicReorder = useCallback ( ( ) => {
176193 updateBasicInfo ( {
177- ...basic ,
178- fieldOrder : newOrder ,
194+ fieldOrder : basicFieldsRef . current ,
179195 } ) ;
180- } ;
196+ } , [ updateBasicInfo ] ) ;
181197
182198 const toggleFieldVisibility = ( fieldId : string , isVisible : boolean ) => {
183199 const newFields = basicFields . map ( ( field ) =>
@@ -245,12 +261,15 @@ const BasicPanel: React.FC = () => {
245261 } ;
246262
247263 const handleCustomFieldsReorder = ( newOrder : CustomFieldType [ ] ) => {
264+ customFieldsRef . current = newOrder ;
248265 setCustomFields ( newOrder ) ;
266+ } ;
267+
268+ const commitCustomFieldsReorder = useCallback ( ( ) => {
249269 updateBasicInfo ( {
250- ...basic ,
251- customFields : newOrder ,
270+ customFields : customFieldsRef . current ,
252271 } ) ;
253- } ;
272+ } , [ updateBasicInfo ] ) ;
254273
255274 const renderBasicField = ( field : BasicFieldType ) => {
256275 const selectedIcon = basic ?. icons ?. [ field . key ] || "User" ;
@@ -262,6 +281,7 @@ const BasicPanel: React.FC = () => {
262281 key = { field . id }
263282 className = "group touch-none list-none"
264283 dragListener = { field . key !== "name" && field . key !== "title" }
284+ onDragEnd = { commitBasicReorder }
265285 >
266286 < motion . div
267287 { ...itemAnimations }
@@ -428,6 +448,7 @@ const BasicPanel: React.FC = () => {
428448 field = { field }
429449 onUpdate = { updateCustomField }
430450 onDelete = { deleteCustomField }
451+ onReorderEnd = { commitCustomFieldsReorder }
431452 />
432453 ) ) }
433454 </ Reorder . Group >
0 commit comments