diff --git a/public/app/features/provisioning/Wizard/SynchronizeStep.tsx b/public/app/features/provisioning/Wizard/SynchronizeStep.tsx index e625cd53349..a58b8f6ab3c 100644 --- a/public/app/features/provisioning/Wizard/SynchronizeStep.tsx +++ b/public/app/features/provisioning/Wizard/SynchronizeStep.tsx @@ -1,5 +1,5 @@ import { skipToken } from '@reduxjs/toolkit/query'; -import { memo, useEffect, useState } from 'react'; +import { memo, useEffect, useMemo, useState } from 'react'; import { useFormContext } from 'react-hook-form'; import { Trans, t } from '@grafana/i18n'; @@ -20,14 +20,29 @@ export interface SynchronizeStepProps { } export const SynchronizeStep = memo(function SynchronizeStep({ onCancel, isCancelling }: SynchronizeStepProps) { - const { watch, register, getValues } = useFormContext(); + const { watch, register } = useFormContext(); const { setStepStatusInfo } = useStepStatus(); const repoName = watch('repositoryName') ?? ''; const syncTarget = watch('repository.sync.target'); + const migrateResources = watch('migrate.migrateResources'); const { requiresMigration: baseRequiresMigration } = useResourceStats(repoName, syncTarget); + // Calculate final requiresMigration based on sync target and user selection + // For instance sync: use the base requiresMigration + // For folder sync: only migrate if user explicitly opts in via checkbox + const requiresMigration = useMemo(() => { + if (syncTarget === 'instance') { + return baseRequiresMigration; + } + if (syncTarget === 'folder') { + return migrateResources ?? false; + } + return baseRequiresMigration; + }, [syncTarget, baseRequiresMigration, migrateResources]); + const { createSyncJob } = useCreateSyncJob({ repoName, + requiresMigration, setStepStatusInfo, }); const [job, setJob] = useState(); @@ -64,15 +79,7 @@ export const SynchronizeStep = memo(function SynchronizeStep({ onCancel, isCance const isButtonDisabled = hasError || (checked !== undefined && isRepositoryHealthy === false) || healthStatusNotReady; const startSynchronization = async () => { - // Calculate final requiresMigration based on sync target and user selection - // For instance sync: use the base requiresMigration - // For folder sync: only migrate if user explicitly opts in via checkbox - let finalRequiresMigration = baseRequiresMigration; - if (syncTarget === 'folder') { - finalRequiresMigration = getValues('migrate.migrateResources') ?? false; - } - - const response = await createSyncJob(finalRequiresMigration); + const response = await createSyncJob(); if (response) { setJob(response); } diff --git a/public/app/features/provisioning/Wizard/hooks/useCreateSyncJob.ts b/public/app/features/provisioning/Wizard/hooks/useCreateSyncJob.ts index 1aaa7a250f0..7e3c0c30874 100644 --- a/public/app/features/provisioning/Wizard/hooks/useCreateSyncJob.ts +++ b/public/app/features/provisioning/Wizard/hooks/useCreateSyncJob.ts @@ -5,13 +5,14 @@ import { StepStatusInfo } from '../types'; export interface UseCreateSyncJobParams { repoName: string; + requiresMigration: boolean; setStepStatusInfo?: (info: StepStatusInfo) => void; } -export function useCreateSyncJob({ repoName, setStepStatusInfo }: UseCreateSyncJobParams) { +export function useCreateSyncJob({ repoName, requiresMigration, setStepStatusInfo }: UseCreateSyncJobParams) { const [createJob, { isLoading }] = useCreateRepositoryJobsMutation(); - const createSyncJob = async (requiresMigration: boolean) => { + const createSyncJob = async () => { if (!repoName) { setStepStatusInfo?.({ status: 'error',