1212#import < UIKit/UIKit.h>
1313#import < Photos/Photos.h>
1414#import " color-grabber.h"
15+ #import " RCTMultiPeer.h"
1516
17+ @interface RCTARKitManager () <MCBrowserViewControllerDelegate>
18+
19+ @end
1620@implementation RCTARKitManager
1721
1822RCT_EXPORT_MODULE ()
@@ -172,13 +176,21 @@ - (NSDictionary *)constantsToExport
172176RCT_EXPORT_VIEW_PROPERTY(onAnchorUpdated, RCTBubblingEventBlock)
173177RCT_EXPORT_VIEW_PROPERTY(onAnchorRemoved, RCTBubblingEventBlock)
174178
179+ RCT_EXPORT_VIEW_PROPERTY(onMultipeerJsonDataReceived, RCTBubblingEventBlock)
180+
181+ // TODO: Option to lock these three below down for host only
182+ RCT_EXPORT_VIEW_PROPERTY(onPeerConnected, RCTBubblingEventBlock)
183+ RCT_EXPORT_VIEW_PROPERTY(onPeerConnecting, RCTBubblingEventBlock)
184+ RCT_EXPORT_VIEW_PROPERTY(onPeerDisconnected, RCTBubblingEventBlock)
185+
175186RCT_EXPORT_VIEW_PROPERTY(onTrackingState, RCTBubblingEventBlock)
176187RCT_EXPORT_VIEW_PROPERTY(onFeaturesDetected, RCTBubblingEventBlock)
177188RCT_EXPORT_VIEW_PROPERTY(onLightEstimation, RCTBubblingEventBlock)
178189RCT_EXPORT_VIEW_PROPERTY(onTapOnPlaneUsingExtent, RCTBubblingEventBlock)
179190RCT_EXPORT_VIEW_PROPERTY(onTapOnPlaneNoExtent, RCTBubblingEventBlock)
180191RCT_EXPORT_VIEW_PROPERTY(onEvent, RCTBubblingEventBlock)
181192RCT_EXPORT_VIEW_PROPERTY(onARKitError, RCTBubblingEventBlock)
193+ RCT_EXPORT_VIEW_PROPERTY(worldMap, NSObject );
182194
183195RCT_EXPORT_METHOD (pause:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
184196 [[ARKit sharedInstance ] pause ];
@@ -199,6 +211,43 @@ - (NSDictionary *)constantsToExport
199211 resolve (@([ARKit isInitialized ]));
200212}
201213
214+ RCT_EXPORT_METHOD (openMultipeerBrowser:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
215+ [[ARKit sharedInstance ].multipeer openMultipeerBrowser: serviceType];
216+ }
217+
218+ RCT_EXPORT_METHOD (startBrowsingForPeers:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
219+ [[ARKit sharedInstance ].multipeer startBrowsingForPeers: serviceType];
220+ }
221+
222+ RCT_EXPORT_METHOD (advertiseReadyToJoinSession:(NSString *)serviceType resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
223+ [[ARKit sharedInstance ].multipeer advertiseReadyToJoinSession: serviceType];
224+ }
225+
226+ // TODO: Should be optionally to only be available to host
227+ RCT_EXPORT_METHOD (sendDataToAllPeers:(NSDictionary *)data resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
228+ [self sendData: [RCTARKit sharedInstance ].multipeer.connectedPeers data: data callback: resolve];
229+ }
230+
231+ // TODO: Should be optional to lock it down so peers can only send to host
232+ RCT_EXPORT_METHOD (sendDataToPeers:(NSDictionary *)data recepientPeerIDs:(NSArray *)recepientPeerIDs resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
233+ NSError *error = nil ;
234+ NSMutableArray *peers = [NSMutableArray array ];
235+ for (NSString *peerUUID in recepientPeerIDs) {
236+ [peers addObject: [[RCTARKit sharedInstance ].multipeer.connectedPeers valueForKey: peerUUID]];
237+ }
238+ [self sendData: [RCTARKit sharedInstance ].multipeer.connectedPeers data: data callback: resolve];
239+ }
240+
241+ // TODO: Should be optional to only be available to host
242+ RCT_EXPORT_METHOD (sendWorldmapData:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
243+ [[ARKit sharedInstance ] getCurrentWorldMap: resolve reject: reject];
244+ }
245+
246+ // TODO: Should be optional to only be available to host
247+ RCT_EXPORT_METHOD (getAllConnectedPeers:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
248+ // TODO: get all peer ids
249+ }
250+
202251RCT_EXPORT_METHOD (isMounted:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) {
203252 if ( [ARKit isInitialized ]) {
204253 dispatch_async (dispatch_get_main_queue (), ^{
@@ -228,6 +277,23 @@ - (NSDictionary *)constantsToExport
228277 [[ARKit sharedInstance ] hitTestSceneObjects: point resolve: resolve reject: reject];
229278}
230279
280+ - (void )sendData : (NSArray *)recipients data : (NSDictionary *)data callback : (RCTResponseSenderBlock)callback {
281+ NSError *error = nil ;
282+ NSMutableArray *peers = [NSMutableArray array ];
283+ // for (NSString *peerUUID in recipients) {
284+ // [peers addObject:[[ARKit sharedInstance].multipeer.session.connectedPeers valueForKey:peerUUID]];
285+ // }
286+ NSData *jsonData = [NSJSONSerialization dataWithJSONObject: data options: 0 error: &error];
287+ [[ARKit sharedInstance ].multipeer.session sendData: jsonData toPeers: recipients withMode: MCSessionSendDataReliable error: &error];
288+ NSLog (@" Sending data..." );
289+ if (error == nil ) {
290+ callback (@[[NSNull null ]]);
291+ }
292+ else {
293+ callback (@[[error description ]]);
294+ }
295+ }
296+
231297
232298
233299
@@ -398,4 +464,24 @@ - (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTP
398464 resolve (@{});
399465}
400466
467+ - (void )browserViewControllerDidFinish : (nonnull MCBrowserViewController *)browserViewController {
468+ dispatch_async (dispatch_get_main_queue (), ^{
469+ UIViewController *rootViewController = [UIApplication sharedApplication ].delegate .window .rootViewController ;
470+
471+ [rootViewController dismissViewControllerAnimated: YES completion: ^{
472+
473+ }];
474+ });
475+ }
476+
477+ - (void )browserViewControllerWasCancelled : (nonnull MCBrowserViewController *)browserViewController {
478+ dispatch_async (dispatch_get_main_queue (), ^{
479+ UIViewController *rootViewController = [UIApplication sharedApplication ].delegate .window .rootViewController ;
480+
481+ [rootViewController dismissViewControllerAnimated: YES completion: ^{
482+
483+ }];
484+ });
485+ }
486+
401487@end
0 commit comments