@@ -177,15 +177,24 @@ export function SettingsProvider({
177177 return map ;
178178 } , [ scopeFieldKeysMap ] ) ;
179179
180+ // Track previous loading state to detect when loading finishes.
181+ const [ prevLoading , setPrevLoading ] = useState ( loading ) ;
182+
180183 // Sync internal values when external values change.
181- // NOTE: Do NOT reset initialValues here — that would break dirty tracking,
184+ // NOTE: Do NOT reset initialValues on every change — that would break dirty tracking,
182185 // because the consumer typically updates externalValues in their onChange handler
183- // (controlled component pattern). initialValues is captured once on mount
184- // and only reset after a save via resetPageDirty.
186+ // (controlled component pattern). However, when loading transitions from true→false,
187+ // we re-snapshot initialValues so dirty tracking compares against the real saved data
188+ // (not just schema defaults captured at mount time before async data arrived).
185189 useEffect ( ( ) => {
186190 const merged = { ...defaultValues , ...( externalValues || { } ) } ;
187191 setInternalValues ( merged ) ;
188- } , [ defaultValues , externalValues ] ) ;
192+
193+ if ( prevLoading && ! loading ) {
194+ setInitialValues ( merged ) ;
195+ }
196+ setPrevLoading ( loading ) ;
197+ } , [ defaultValues , externalValues , loading , prevLoading ] ) ;
189198
190199 // Auto-select first page/subpage on schema load
191200 useEffect ( ( ) => {
0 commit comments