diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm index 16c00ccda57..cbb042ad827 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm @@ -789,6 +789,10 @@ namespace facebook { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "reloadWithReason", @selector(reloadWithReason:), args, count); } + static facebook::jsi::Value __hostFunction_NativeDevSettingsSpecJSI_onFastRefresh(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { + return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "onFastRefresh", @selector(onFastRefresh), args, count); + } + static facebook::jsi::Value __hostFunction_NativeDevSettingsSpecJSI_setHotLoadingEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) { return static_cast(turboModule).invokeObjCMethod(rt, VoidKind, "setHotLoadingEnabled", @selector(setHotLoadingEnabled:), args, count); } @@ -823,6 +827,9 @@ namespace facebook { methodMap_["reloadWithReason"] = MethodMetadata {1, __hostFunction_NativeDevSettingsSpecJSI_reloadWithReason}; + methodMap_["onFastRefresh"] = MethodMetadata {0, __hostFunction_NativeDevSettingsSpecJSI_onFastRefresh}; + + methodMap_["setHotLoadingEnabled"] = MethodMetadata {1, __hostFunction_NativeDevSettingsSpecJSI_setHotLoadingEnabled}; diff --git a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h index b8d73129514..1dd003fdd9e 100644 --- a/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h +++ b/Libraries/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h @@ -740,6 +740,7 @@ namespace facebook { - (void)reload; - (void)reloadWithReason:(NSString *)reason; +- (void)onFastRefresh; - (void)setHotLoadingEnabled:(BOOL)isHotLoadingEnabled; - (void)setIsDebuggingRemotely:(BOOL)isDebuggingRemotelyEnabled; - (void)setProfilingEnabled:(BOOL)isProfilingEnabled; diff --git a/Libraries/NativeModules/specs/NativeDevSettings.js b/Libraries/NativeModules/specs/NativeDevSettings.js index a09d765501f..a23a2521136 100644 --- a/Libraries/NativeModules/specs/NativeDevSettings.js +++ b/Libraries/NativeModules/specs/NativeDevSettings.js @@ -16,6 +16,7 @@ import * as TurboModuleRegistry from '../../TurboModule/TurboModuleRegistry'; export interface Spec extends TurboModule { +reload: () => void; +reloadWithReason?: (reason: string) => void; + +onFastRefresh?: () => void; +setHotLoadingEnabled: (isHotLoadingEnabled: boolean) => void; +setIsDebuggingRemotely: (isDebuggingRemotelyEnabled: boolean) => void; +setProfilingEnabled: (isProfilingEnabled: boolean) => void; diff --git a/Libraries/Utilities/DevSettings.js b/Libraries/Utilities/DevSettings.js index 21b1ab8fd67..42ffec85148 100644 --- a/Libraries/Utilities/DevSettings.js +++ b/Libraries/Utilities/DevSettings.js @@ -47,6 +47,12 @@ class DevSettings extends NativeEventEmitter { } } + onFastRefresh() { + if (typeof NativeDevSettings.onFastRefresh === 'function') { + NativeDevSettings.onFastRefresh(); + } + } + // TODO: Add other dev setting methods exposed by the native module. } diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 804b4092f67..338d5d0864b 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -73,6 +73,11 @@ RCT_EXTERN NSString *const RCTDidSetupModuleNotificationSetupTimeKey; */ RCT_EXTERN NSString *const RCTBridgeWillReloadNotification; +/** + * This notification fires whenever a fast refresh happens. + */ +RCT_EXTERN NSString *const RCTBridgeFastRefreshNotification; + /** * This notification fires just before the bridge begins downloading a script * from the packager. @@ -261,6 +266,11 @@ RCT_EXTERN void RCTEnableTurboModule(BOOL enabled); */ - (void)reloadWithReason:(NSString *)reason; +/** + * Handle notifications for a fast refresh. Safe to call from any thread. + */ +- (void)onFastRefresh; + /** * Inform the bridge, and anything subscribing to it, that it should reload. */ diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 04398f884fe..6842c30332c 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -31,6 +31,7 @@ NSString *const RCTDidSetupModuleNotification = @"RCTDidSetupModuleNotification" NSString *const RCTDidSetupModuleNotificationModuleNameKey = @"moduleName"; NSString *const RCTDidSetupModuleNotificationSetupTimeKey = @"setupTime"; NSString *const RCTBridgeWillReloadNotification = @"RCTBridgeWillReloadNotification"; +NSString *const RCTBridgeFastRefreshNotification = @"RCTBridgeFastRefreshNotification"; NSString *const RCTBridgeWillDownloadScriptNotification = @"RCTBridgeWillDownloadScriptNotification"; NSString *const RCTBridgeDidDownloadScriptNotification = @"RCTBridgeDidDownloadScriptNotification"; NSString *const RCTBridgeWillInvalidateModulesNotification = @"RCTBridgeWillInvalidateModulesNotification"; @@ -320,6 +321,11 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) }); } +- (void)onFastRefresh +{ + [[NSNotificationCenter defaultCenter] postNotificationName:RCTBridgeFastRefreshNotification object:self]; +} + - (void)requestReload { [self reloadWithReason:@"Requested from bridge"]; diff --git a/React/Modules/RCTDevSettings.mm b/React/Modules/RCTDevSettings.mm index 32373e036aa..1e8ee126363 100644 --- a/React/Modules/RCTDevSettings.mm +++ b/React/Modules/RCTDevSettings.mm @@ -245,6 +245,11 @@ RCT_EXPORT_METHOD(reloadWithReason : (NSString *) reason) } +RCT_EXPORT_METHOD(onFastRefresh) +{ + [self.bridge onFastRefresh]; +} + RCT_EXPORT_METHOD(setIsShakeToShowDevMenuEnabled : (BOOL)enabled) { [self _updateSettingWithValue:@(enabled) forKey:kRCTDevSettingShakeToShowDevMenu]; diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java index e6227638ce8..d974d6b963f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/debug/DevSettingsModule.java @@ -57,6 +57,11 @@ public class DevSettingsModule extends ReactContextBaseJavaModule { this.reload(); } + @ReactMethod + public void onFastRefresh() { + // noop + } + @ReactMethod public void setHotLoadingEnabled(boolean isHotLoadingEnabled) { mDevSupportManager.setHotModuleReplacementEnabled(isHotLoadingEnabled);