Skip to content

Commit 90cdf38

Browse files
committed
feat(node-modal): add loading spinner for fetching node data
1 parent e67c1e3 commit 90cdf38

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

dashboard/src/components/dialogs/node-modal.tsx

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { LoaderButton } from '../ui/loader-button'
2020
import useDynamicErrorHandler from '@/hooks/use-dynamic-errors.ts'
2121
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion'
2222
import { formatBytes, gbToBytes } from '@/utils/formatByte'
23+
import { LoadingSpinner } from '@/components/common/loading-spinner'
2324

2425
export 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

Comments
 (0)