1/**
2 * Copyright (c) 2015-present, Facebook, Inc.
3 * All rights reserved.
4 *
5 * This source code is licensed under the BSD-style license found in the
6 * LICENSE file in the root directory of this source tree. An additional grant
7 * of patent rights can be found in the PATENTS file in the same directory.
8 */
9
10#import "AIRMapMarkerManager.h"
11
12#import <React/RCTConvert+CoreLocation.h>
13#import <React/RCTUIManager.h>
14#import <React/UIView+React.h>
15#import "AIRMapMarker.h"
16
17@interface AIRMapMarkerManager () <MKMapViewDelegate>
18
19@end
20
21@implementation AIRMapMarkerManager
22
23RCT_EXPORT_MODULE()
24
25- (UIView *)view
26{
27    AIRMapMarker *marker = [AIRMapMarker new];
28    [marker addTapGestureRecognizer];
29    marker.bridge = self.bridge;
30    marker.isAccessibilityElement = YES;
31    marker.accessibilityElementsHidden = NO;
32    return marker;
33}
34
35RCT_EXPORT_VIEW_PROPERTY(identifier, NSString)
36RCT_REMAP_VIEW_PROPERTY(testID, accessibilityIdentifier, NSString)
37//RCT_EXPORT_VIEW_PROPERTY(reuseIdentifier, NSString)
38RCT_EXPORT_VIEW_PROPERTY(title, NSString)
39RCT_REMAP_VIEW_PROPERTY(description, subtitle, NSString)
40RCT_EXPORT_VIEW_PROPERTY(coordinate, CLLocationCoordinate2D)
41RCT_EXPORT_VIEW_PROPERTY(centerOffset, CGPoint)
42RCT_EXPORT_VIEW_PROPERTY(calloutOffset, CGPoint)
43RCT_REMAP_VIEW_PROPERTY(image, imageSrc, NSString)
44RCT_EXPORT_VIEW_PROPERTY(pinColor, UIColor)
45RCT_EXPORT_VIEW_PROPERTY(draggable, BOOL)
46RCT_EXPORT_VIEW_PROPERTY(zIndex, NSInteger)
47RCT_EXPORT_VIEW_PROPERTY(opacity, double)
48RCT_EXPORT_VIEW_PROPERTY(isPreselected, BOOL)
49
50RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock)
51RCT_EXPORT_VIEW_PROPERTY(onSelect, RCTDirectEventBlock)
52RCT_EXPORT_VIEW_PROPERTY(onDeselect, RCTDirectEventBlock)
53RCT_EXPORT_VIEW_PROPERTY(onCalloutPress, RCTDirectEventBlock)
54RCT_EXPORT_VIEW_PROPERTY(onDragStart, RCTDirectEventBlock)
55RCT_EXPORT_VIEW_PROPERTY(onDrag, RCTDirectEventBlock)
56RCT_EXPORT_VIEW_PROPERTY(onDragEnd, RCTDirectEventBlock)
57
58
59RCT_EXPORT_METHOD(showCallout:(nonnull NSNumber *)reactTag)
60{
61    [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
62        id view = viewRegistry[reactTag];
63        if (![view isKindOfClass:[AIRMapMarker class]]) {
64            RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view);
65        } else {
66            [(AIRMapMarker *) view showCalloutView];
67        }
68    }];
69}
70
71RCT_EXPORT_METHOD(hideCallout:(nonnull NSNumber *)reactTag)
72{
73    [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
74        id view = viewRegistry[reactTag];
75        if (![view isKindOfClass:[AIRMapMarker class]]) {
76            RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view);
77        } else {
78            [(AIRMapMarker *) view hideCalloutView];
79        }
80    }];
81}
82
83RCT_EXPORT_METHOD(redrawCallout:(nonnull NSNumber *)reactTag)
84{
85    [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
86        id view = viewRegistry[reactTag];
87        if (![view isKindOfClass:[AIRMapMarker class]]) {
88            RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view);
89        } else {
90            //no need to do anything here
91        }
92    }];
93}
94
95@end
96