Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions ios/RNMBX/RNMBXFabricHelpers.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#import <React/RCTConversions.h>
#import <folly/dynamic.h>
#import <react/renderer/components/rnmapbox_maps_specs/Props.h>
#import <objc/runtime.h>

#import "rnmapbox_maps-Swift.pre.h"

Expand Down Expand Up @@ -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<const char *>(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<std::string, std::string> RNMBXStringifyEventData(NSDictionary* event) {
std::string type = [event valueForKey:@"type"] == nil ? "" : std::string([[event valueForKey:@"type"] UTF8String]);
std::string json = "{}";
Expand Down
1 change: 0 additions & 1 deletion ios/RNMBX/RNMBXModelsComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

#import "rnmapbox_maps-Swift.pre.h"

#import "RCTFollyConvert.h"
#import "RNMBXFabricPropConvert.h"


Expand Down
6 changes: 2 additions & 4 deletions ios/RNMBX/RNMBXViewportComponentView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@
#import <react/renderer/components/rnmapbox_maps_specs/RCTComponentViewHelpers.h>

#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 {
Expand Down Expand Up @@ -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<const ::RNMBXViewportEventEmitter>(strongSelf->_eventEmitter)->onStatusChanged(event);
}
Expand Down
Loading