diff --git a/ios/RNMBX/RNMBXFabricHelpers.h b/ios/RNMBX/RNMBXFabricHelpers.h index 974ee24295..e11606f7ac 100644 --- a/ios/RNMBX/RNMBXFabricHelpers.h +++ b/ios/RNMBX/RNMBXFabricHelpers.h @@ -1,6 +1,7 @@ #import #import #import +#import #import "rnmapbox_maps-Swift.pre.h" @@ -46,6 +47,68 @@ static id RNMBXConvertFollyDynamicToId(const folly::dynamic &dyn) } } +// copied from RCTFollyConvert +static folly::dynamic RNMBXConvertIdToFollyDynamic(id json) +{ + if (json == nil || json == (id)kCFNull) { + return nullptr; + } else if ([json isKindOfClass:[NSNumber class]]) { + const char *objCType = [json objCType]; + switch (objCType[0]) { + // This is a c++ bool or C99 _Bool. On some platforms, BOOL is a bool. + case _C_BOOL: + return (bool)[json boolValue]; + case _C_CHR: + // On some platforms, objc BOOL is a signed char, but it + // might also be a small number. Use the same hack JSC uses + // to distinguish them: + // https://phabricator.intern.facebook.com/diffusion/FBS/browse/master/fbobjc/xplat/third-party/jsc/safari-600-1-4-17/JavaScriptCore/API/JSValue.mm;b8ee03916489f8b12143cd5c0bca546da5014fc9$901 + if ([json isKindOfClass:[@YES class]]) { + return (bool)[json boolValue]; + } else { + return [json longLongValue]; + } + case _C_UCHR: + case _C_SHT: + case _C_USHT: + case _C_INT: + case _C_UINT: + case _C_LNG: + case _C_ULNG: + case _C_LNG_LNG: + case _C_ULNG_LNG: + return [json longLongValue]; + + case _C_FLT: + case _C_DBL: + return [json doubleValue]; + + // default: + // fall through + } + } else if ([json isKindOfClass:[NSString class]]) { + NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding]; + return std::string(reinterpret_cast(data.bytes), data.length); + } else if ([json isKindOfClass:[NSArray class]]) { + folly::dynamic array = folly::dynamic::array; + for (id element in json) { + array.push_back(RNMBXConvertIdToFollyDynamic(element)); + } + return array; + } else if ([json isKindOfClass:[NSDictionary class]]) { + __block folly::dynamic object = folly::dynamic::object(); + + [json enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, __unused BOOL *stop) { + object.insert(RNMBXConvertIdToFollyDynamic(key), RNMBXConvertIdToFollyDynamic(value)); + }]; + + return object; + } + + return nil; +} + + static std::tuple RNMBXStringifyEventData(NSDictionary* event) { std::string type = [event valueForKey:@"type"] == nil ? "" : std::string([[event valueForKey:@"type"] UTF8String]); std::string json = "{}"; diff --git a/ios/RNMBX/RNMBXModelsComponentView.mm b/ios/RNMBX/RNMBXModelsComponentView.mm index fe94bc6474..12fcf625ea 100644 --- a/ios/RNMBX/RNMBXModelsComponentView.mm +++ b/ios/RNMBX/RNMBXModelsComponentView.mm @@ -12,7 +12,6 @@ #import "rnmapbox_maps-Swift.pre.h" -#import "RCTFollyConvert.h" #import "RNMBXFabricPropConvert.h" diff --git a/ios/RNMBX/RNMBXViewportComponentView.mm b/ios/RNMBX/RNMBXViewportComponentView.mm index df6986ae56..a572d65fdf 100644 --- a/ios/RNMBX/RNMBXViewportComponentView.mm +++ b/ios/RNMBX/RNMBXViewportComponentView.mm @@ -11,9 +11,7 @@ #import #import "rnmapbox_maps-Swift.pre.h" - -#import "RCTFollyConvert.h" - +#import "RNMBXFabricHelpers.h" // TODO: use generated RNMBXViewportEventEmitter, but need 0.73+ for dynamic support class RNMBXViewportEventEmitter : public facebook::react::ViewEventEmitter { @@ -86,7 +84,7 @@ - (void)prepareView if (strongSelf != nullptr && strongSelf->_eventEmitter != nullptr) { auto type = std::string([[event objectForKey:@"type"] UTF8String]); - auto payload = convertIdToFollyDynamic([event objectForKey:@"payload"]); + auto payload = RNMBXConvertIdToFollyDynamic([event objectForKey:@"payload"]); ::RNMBXViewportEventEmitter::OnStatusChanged event = {type, payload}; std::reinterpret_pointer_cast(strongSelf->_eventEmitter)->onStatusChanged(event); } diff --git a/ios/RNMBX/Uitls/PropertyChanges.swift b/ios/RNMBX/Utils/PropertyChanges.swift similarity index 100% rename from ios/RNMBX/Uitls/PropertyChanges.swift rename to ios/RNMBX/Utils/PropertyChanges.swift