diff --git a/docs/extending/layout-inspector.md b/docs/extending/layout-inspector.md index 16545e5a9..b0d3a8f24 100644 --- a/docs/extending/layout-inspector.md +++ b/docs/extending/layout-inspector.md @@ -115,50 +115,17 @@ Sometimes all you need is to extend the functionality of an existing descriptor. ### Subdescriptors -If you want to extend the `SKComponentKitLayoutDescriptor` and add an additional section based on the nodes of the `SKComponentLayoutDescriptor`, you will have to subclass `SKSubDescriptor`. +If you want to extend the `SKComponentKitLayoutDescriptor` and add an additional section based on the nodes of the `SKComponentLayoutDescriptor`, you can use `SKSubDescriptor`. ```objc -#import +#import -@interface YourSubDescriptor: SKSubDescriptor - -@end - - -@implementation YourSubDescriptor - -- (NSString *) getName { - return @"Section Name"; +NSString *YourSubDescriptor(SKComponentLayoutWrapper *)node { + return @"Meta data"; } -- (NSString *)getDataForNode:(SKComponentLayoutWrapper *)node { - return @"Meta data" -} - -@end - -#endif +// At setup time, you must register it: +[SKComponentLayoutDescriptor registerSubDescriptor:&YourSubDescriptor forName:@"Section Name"]; ``` -Once you have implemented the descriptor, you will have to setup the Layout plugin as follows. - - - -```objc -NSArray *registeredSubDescriptors = @[ yourSubDescriptors ]; -SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults]; -[FlipperKitLayoutComponentKitSupport setUpWithDescriptorMapper: layoutDescriptorMapper subDescriptors: registeredSubDescriptors]; -[client addPlugin: [[FlipperKitLayoutPlugin alloc] initWithRootNode: application - withDescriptorMapper: layoutDescriptorMapper]]; -``` - -```swift -let subDescriptors = [ yourSubDescriptors ] -let layoutDescriptorMapper = SKDescriptorMapper(defaults: ()) -FlipperKitLayoutComponentKitSupport.setUpWith(layoutDescriptorMapper, subDescriptors: subDescriptors) -client?.add(FlipperKitLayoutPlugin(rootNode: application, with: layoutDescriptorMapper!)) - -``` - - - +Swift support is not yet available because you must access `SKComponentLayoutWrapper` to implement a subdescriptor. diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h index 76ead9a28..9104c8ede 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h @@ -8,13 +8,9 @@ #import #import -#import "SKSubDescriptor.h" @interface FlipperKitLayoutComponentKitSupport : NSObject + (void)setUpWithDescriptorMapper:(SKDescriptorMapper*)mapper; -+ (void)setUpWithDescriptorMapper:(SKDescriptorMapper*)mapper - subDescriptors:(NSArray*)subDescriptors; - @end diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm index c3048b19f..efa5ec03a 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.mm @@ -17,22 +17,9 @@ #import "SKComponentLayoutDescriptor.h" #import "SKComponentLayoutWrapper.h" #import "SKComponentRootViewDescriptor.h" -#import "SKSubDescriptor.h" @implementation FlipperKitLayoutComponentKitSupport -+ (void)setUpWithDescriptorMapper:(SKDescriptorMapper*)mapper - subDescriptors:(NSArray*)subDescriptors { - [mapper registerDescriptor:[[SKComponentRootViewDescriptor alloc] - initWithDescriptorMapper:mapper] - forClass:[CKComponentRootView class]]; - SKComponentLayoutDescriptor* layoutDescriptor = - [[SKComponentLayoutDescriptor alloc] initWithDescriptorMapper:mapper]; - [layoutDescriptor addSubDescriptors:subDescriptors]; - [mapper registerDescriptor:layoutDescriptor - forClass:[SKComponentLayoutWrapper class]]; -} - + (void)setUpWithDescriptorMapper:(SKDescriptorMapper*)mapper { // What we really want here is "forProtocol:@protocol(CKInspectableView)" but // no such luck. diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h index 485b51940..27a858917 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.h @@ -14,6 +14,7 @@ @interface SKComponentLayoutDescriptor : SKNodeDescriptor -- (void)addSubDescriptors:(NSArray*)subDescriptors; ++ (void)registerSubDescriptor:(SKSubDescriptor)descriptor + forName:(NSString*)name; @end diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm index 8130b3664..0e0ccf54d 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm @@ -9,6 +9,9 @@ #import "SKComponentLayoutDescriptor.h" +#import +#import + #import #import #import @@ -29,15 +32,18 @@ #import "SKSubDescriptor.h" #import "Utils.h" -@implementation SKComponentLayoutDescriptor { - NSArray* _registeredSubdescriptors; +@implementation SKComponentLayoutDescriptor + +static std::vector>& subDescriptors() { + // Avoid a global constructor; we want to lazily initialize this when needed. + static std::vector> d; + return d; } -- (void)setUp { - [super setUp]; - - if (!_registeredSubdescriptors) { - _registeredSubdescriptors = [NSArray new]; ++ (void)registerSubDescriptor:(SKSubDescriptor)descriptor + forName:(NSString*)name { + if (name && descriptor) { + subDescriptors().push_back({name, descriptor}); } } @@ -90,8 +96,8 @@ NSMutableDictionary* extraData = [[NSMutableDictionary alloc] init]; - for (SKSubDescriptor* s in _registeredSubdescriptors) { - [extraData setObject:[s getDataForNode:node] forKey:[s getName]]; + for (const auto& pair : subDescriptors()) { + [extraData setObject:pair.second(node) forKey:pair.first]; } if (extraData.count > 0) { [data addObject:[SKNamed newWithName:@"Extra Sections" @@ -102,10 +108,6 @@ return data; } -- (void)addSubDescriptors:(nonnull NSArray*)subDescriptors { - _registeredSubdescriptors = subDescriptors; -} - - (NSDictionary*)propsForFlexboxChild: (CKFlexboxComponentChild)child { return @{ diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h index 0ba2a057b..95cb30924 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h @@ -10,20 +10,8 @@ @class SKComponentLayoutWrapper; /** - A SKSubDescriptor is an object which knows how to expose an Object of type T - to the SKLayoutDescriptor. This class is for frameworks wanting to pass data + A SKSubDescriptor is a function which knows how to expose additional data + to SKLayoutDescriptor. This class is for frameworks wanting to pass data along through the Layout Descriptor. */ -@interface SKSubDescriptor : NSObject - -/** - This is the SubDescriptor name. - */ -- (NSString*)getName; - -/** - This is the data the SubDescriptor wants to pass up to the SKLayoutDescriptor. - */ -- (NSString*)getDataForNode:(SKComponentLayoutWrapper*)node; - -@end +typedef NSString* (*SKSubDescriptor)(SKComponentLayoutWrapper* node); diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm index ae2a00c27..8ecfd7c25 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.mm @@ -4,24 +4,3 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ - -#if FB_SONARKIT_ENABLED - -#import "SKSubDescriptor.h" -#import "SKComponentLayoutWrapper.h" - -@implementation SKSubDescriptor { -} - -- (NSDictionary*)getDataForNode: - (SKComponentLayoutWrapper*)node { - return @{}; -} - -- (NSString*)getName { - return @""; -} - -@end - -#endif