1//
2//  AIRGoogleMapMarkerManager.m
3//  AirMaps
4//
5//  Created by Gil Birman on 9/2/16.
6//
7
8#ifdef HAVE_GOOGLE_MAPS
9
10#import "AIRGoogleMapMarkerManager.h"
11#import "AIRGoogleMapMarker.h"
12#import <MapKit/MapKit.h>
13#import <React/RCTUIManager.h>
14#import "RCTConvert+AirMap.h"
15
16@implementation AIRGoogleMapMarkerManager
17
18RCT_EXPORT_MODULE()
19
20- (UIView *)view
21{
22  AIRGoogleMapMarker *marker = [AIRGoogleMapMarker new];
23//  UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTap:)];
24//  // setting this to NO allows the parent MapView to continue receiving marker selection events
25//  tapGestureRecognizer.cancelsTouchesInView = NO;
26//  [marker addGestureRecognizer:tapGestureRecognizer];
27  marker.bridge = self.bridge;
28  marker.isAccessibilityElement = YES;
29  marker.accessibilityElementsHidden = NO;
30  return marker;
31}
32
33RCT_EXPORT_VIEW_PROPERTY(identifier, NSString)
34RCT_EXPORT_VIEW_PROPERTY(coordinate, CLLocationCoordinate2D)
35RCT_EXPORT_VIEW_PROPERTY(rotation, CLLocationDegrees)
36RCT_EXPORT_VIEW_PROPERTY(onPress, RCTBubblingEventBlock)
37RCT_REMAP_VIEW_PROPERTY(image, imageSrc, NSString)
38RCT_REMAP_VIEW_PROPERTY(icon, iconSrc, NSString)
39RCT_EXPORT_VIEW_PROPERTY(title, NSString)
40RCT_REMAP_VIEW_PROPERTY(testID, accessibilityIdentifier, NSString)
41RCT_REMAP_VIEW_PROPERTY(description, subtitle, NSString)
42RCT_EXPORT_VIEW_PROPERTY(pinColor, UIColor)
43RCT_EXPORT_VIEW_PROPERTY(anchor, CGPoint)
44RCT_EXPORT_VIEW_PROPERTY(calloutAnchor, CGPoint)
45RCT_EXPORT_VIEW_PROPERTY(zIndex, NSInteger)
46RCT_EXPORT_VIEW_PROPERTY(draggable, BOOL)
47RCT_EXPORT_VIEW_PROPERTY(tappable, BOOL)
48RCT_EXPORT_VIEW_PROPERTY(flat, BOOL)
49RCT_EXPORT_VIEW_PROPERTY(tracksViewChanges, BOOL)
50RCT_EXPORT_VIEW_PROPERTY(tracksInfoWindowChanges, BOOL)
51RCT_EXPORT_VIEW_PROPERTY(opacity, double)
52RCT_EXPORT_VIEW_PROPERTY(onDragStart, RCTDirectEventBlock)
53RCT_EXPORT_VIEW_PROPERTY(onDrag, RCTDirectEventBlock)
54RCT_EXPORT_VIEW_PROPERTY(onDragEnd, RCTDirectEventBlock)
55
56RCT_EXPORT_METHOD(showCallout:(nonnull NSNumber *)reactTag)
57{
58  [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
59    id view = viewRegistry[reactTag];
60    if (![view isKindOfClass:[AIRGoogleMapMarker class]]) {
61      RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view);
62    } else {
63      [(AIRGoogleMapMarker *) view showCalloutView];
64    }
65  }];
66}
67
68RCT_EXPORT_METHOD(hideCallout:(nonnull NSNumber *)reactTag)
69{
70  [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
71    id view = viewRegistry[reactTag];
72    if (![view isKindOfClass:[AIRGoogleMapMarker class]]) {
73      RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view);
74    } else {
75      [(AIRGoogleMapMarker *) view hideCalloutView];
76    }
77  }];
78}
79
80RCT_EXPORT_METHOD(redrawCallout:(nonnull NSNumber *)reactTag)
81{
82    [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
83        id view = viewRegistry[reactTag];
84        if (![view isKindOfClass:[AIRGoogleMapMarker class]]) {
85            RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view);
86        } else {
87            AIRGoogleMapMarker* marker = (AIRGoogleMapMarker *) view;
88
89            [NSTimer scheduledTimerWithTimeInterval:0.0
90                                             target:[NSBlockOperation blockOperationWithBlock:^{
91                [marker hideCalloutView];
92                [marker showCalloutView];
93            }]
94                                           selector:@selector(main)
95                                           userInfo:nil
96                                            repeats:NO
97             ];
98        }
99    }];
100}
101
102RCT_EXPORT_METHOD(redraw:(nonnull NSNumber *)reactTag)
103{
104  [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
105    id view = viewRegistry[reactTag];
106    if (![view isKindOfClass:[AIRGoogleMapMarker class]]) {
107      RCTLogError(@"Invalid view returned from registry, expecting AIRMap, got: %@", view);
108    } else {
109      [(AIRGoogleMapMarker *) view redraw];
110    }
111  }];
112}
113@end
114
115#endif
116