@@ -20,6 +20,7 @@ import { LoaderButton } from '../ui/loader-button'
2020import useDynamicErrorHandler from '@/hooks/use-dynamic-errors.ts'
2121import { Accordion , AccordionContent , AccordionItem , AccordionTrigger } from '@/components/ui/accordion'
2222import { formatBytes , gbToBytes } from '@/utils/formatByte'
23+ import { LoadingSpinner } from '@/components/common/loading-spinner'
2324
2425export const nodeFormSchema = z . object ( {
2526 name : z . string ( ) . min ( 1 , 'Name is required' ) ,
@@ -64,6 +65,7 @@ export default function NodeModal({ isDialogOpen, onOpenChange, form, editingNod
6465 const [ autoCheck , setAutoCheck ] = useState ( false )
6566 const [ showErrorDetails , setShowErrorDetails ] = useState ( false )
6667 const [ debouncedValues , setDebouncedValues ] = useState < NodeFormValues | null > ( null )
68+ const [ isFetchingNodeData , setIsFetchingNodeData ] = useState ( false )
6769 // Ref to store raw input value for data_limit to allow typing decimals
6870 const dataLimitInputRef = React . useRef < string > ( '' )
6971
@@ -74,6 +76,7 @@ export default function NodeModal({ isDialogOpen, onOpenChange, form, editingNod
7476 setErrorDetails ( null )
7577 setAutoCheck ( true )
7678 dataLimitInputRef . current = ''
79+ setIsFetchingNodeData ( false )
7780 }
7881 } , [ isDialogOpen ] )
7982
@@ -109,6 +112,7 @@ export default function NodeModal({ isDialogOpen, onOpenChange, form, editingNod
109112 useEffect ( ( ) => {
110113 if ( editingNode && editingNodeId ) {
111114 const fetchNodeData = async ( ) => {
115+ setIsFetchingNodeData ( true )
112116 try {
113117 const nodeData = await getNode ( editingNodeId )
114118
@@ -148,6 +152,8 @@ export default function NodeModal({ isDialogOpen, onOpenChange, form, editingNod
148152 } catch ( error ) {
149153 console . error ( 'Error fetching node data:' , error )
150154 toast . error ( t ( 'nodes.fetchFailed' ) )
155+ } finally {
156+ setIsFetchingNodeData ( false )
151157 }
152158 }
153159
@@ -391,9 +397,19 @@ export default function NodeModal({ isDialogOpen, onOpenChange, form, editingNod
391397 ) }
392398 </ div >
393399
394- < Form { ...form } >
395- < form onSubmit = { form . handleSubmit ( onSubmit ) } className = "flex flex-col" >
396- < div className = "-mr-2 max-h-[65dvh] overflow-y-auto px-1 pr-2 sm:-mr-4 sm:max-h-[65dvh] sm:px-2 sm:pr-4" >
400+ { isFetchingNodeData ? (
401+ < div className = "flex min-h-[400px] items-center justify-center" >
402+ < LoadingSpinner size = "medium" />
403+ </ div >
404+ ) : (
405+ < Form { ...form } >
406+ < form onSubmit = { form . handleSubmit ( onSubmit ) } className = "flex flex-col" >
407+ < div className = { cn (
408+ "-mr-2 overflow-y-auto px-1 pr-2 sm:-mr-4 sm:px-2 sm:pr-4" ,
409+ showErrorDetails && connectionStatus === 'error'
410+ ? "max-h-[55dvh] sm:max-h-[55dvh]"
411+ : "max-h-[65dvh] sm:max-h-[65dvh]"
412+ ) } >
397413 < div className = "flex h-full flex-col items-start gap-4 lg:flex-row" >
398414 < div className = "w-full flex-1 space-y-4" >
399415 < FormField
@@ -1148,6 +1164,7 @@ export default function NodeModal({ isDialogOpen, onOpenChange, form, editingNod
11481164 </ div >
11491165 </ form >
11501166 </ Form >
1167+ ) }
11511168 </ DialogContent >
11521169 </ Dialog >
11531170 )
0 commit comments