mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Move RCTTest & takeSnapshot to RNTester (#23721)
Summary: Part of: #23313. This moves the `RCTTest` lib from `Libraries/RCTTest` to `RNTester/RCTTest`. This also removes `takeSnapshot` from React Native, and implements it as a standalone module in RNTester called `ScreenshotManager`. [General] [Removed] - RCTTest & ReactNative.takeSnapshot Pull Request resolved: https://github.com/facebook/react-native/pull/23721 Differential Revision: D14434796 Pulled By: PeteTheHeat fbshipit-source-id: d6e103a0ea0b6702701cdb5ce8449163ca4628ce
This commit is contained in:
committed by
Facebook Github Bot
parent
d17e061c0e
commit
fc94ade11c
@@ -0,0 +1,28 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import type {TurboModule} from 'RCTExport';
|
||||
import * as TurboModuleRegistry from 'TurboModuleRegistry';
|
||||
|
||||
export interface Spec extends TurboModule {
|
||||
+getConstants: () => {||};
|
||||
takeSnapshot(id: string): Promise<string>;
|
||||
}
|
||||
|
||||
const NativeModule = TurboModuleRegistry.get<Spec>('ScreenshotManager');
|
||||
|
||||
export function takeSnapshot(id: string): Promise<string> {
|
||||
if (NativeModule != null) {
|
||||
return NativeModule.takeSnapshot(id);
|
||||
}
|
||||
return Promise.reject();
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
//
|
||||
// RNTTakeScreenshot.h
|
||||
// RNTester
|
||||
//
|
||||
// Created by Eric Lewis on 3/1/19.
|
||||
// Copyright © 2019 Facebook. All rights reserved.
|
||||
//
|
||||
|
||||
#import <React/RCTViewManager.h>
|
||||
|
||||
@interface ScreenshotManager : RCTViewManager
|
||||
@end
|
||||
@@ -0,0 +1,84 @@
|
||||
//
|
||||
// RNTTakeScreenshot.m
|
||||
// RNTester
|
||||
//
|
||||
// Created by Eric Lewis on 3/1/19.
|
||||
// Copyright © 2019 Facebook. All rights reserved.
|
||||
//
|
||||
|
||||
#import "Screenshot.h"
|
||||
|
||||
#import <React/RCTUIManager.h>
|
||||
|
||||
@implementation ScreenshotManager
|
||||
|
||||
RCT_EXPORT_MODULE();
|
||||
|
||||
RCT_EXPORT_METHOD(takeScreenshot:(id /* NSString or NSNumber */)target
|
||||
withOptions:(NSDictionary *)options
|
||||
resolve:(RCTPromiseResolveBlock)resolve
|
||||
reject:(RCTPromiseRejectBlock)reject)
|
||||
{
|
||||
[self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
||||
|
||||
// Get view
|
||||
UIView *view;
|
||||
if (target == nil || [target isEqual:@"window"]) {
|
||||
view = RCTKeyWindow();
|
||||
} else if ([target isKindOfClass:[NSNumber class]]) {
|
||||
view = viewRegistry[target];
|
||||
if (!view) {
|
||||
RCTLogError(@"No view found with reactTag: %@", target);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Get options
|
||||
CGSize size = [RCTConvert CGSize:options];
|
||||
NSString *format = [RCTConvert NSString:options[@"format"] ?: @"png"];
|
||||
|
||||
// Capture image
|
||||
if (size.width < 0.1 || size.height < 0.1) {
|
||||
size = view.bounds.size;
|
||||
}
|
||||
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
|
||||
BOOL success = [view drawViewHierarchyInRect:(CGRect){CGPointZero, size} afterScreenUpdates:YES];
|
||||
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
|
||||
UIGraphicsEndImageContext();
|
||||
|
||||
if (!success || !image) {
|
||||
reject(RCTErrorUnspecified, @"Failed to capture view snapshot.", nil);
|
||||
return;
|
||||
}
|
||||
|
||||
// Convert image to data (on a background thread)
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
|
||||
NSData *data;
|
||||
if ([format isEqualToString:@"png"]) {
|
||||
data = UIImagePNGRepresentation(image);
|
||||
} else if ([format isEqualToString:@"jpeg"]) {
|
||||
CGFloat quality = [RCTConvert CGFloat:options[@"quality"] ?: @1];
|
||||
data = UIImageJPEGRepresentation(image, quality);
|
||||
} else {
|
||||
RCTLogError(@"Unsupported image format: %@", format);
|
||||
return;
|
||||
}
|
||||
|
||||
// Save to a temp file
|
||||
NSError *error = nil;
|
||||
NSString *tempFilePath = RCTTempFilePath(format, &error);
|
||||
if (tempFilePath) {
|
||||
if ([data writeToFile:tempFilePath options:(NSDataWritingOptions)0 error:&error]) {
|
||||
resolve(tempFilePath);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// If we reached here, something went wrong
|
||||
reject(RCTErrorUnspecified, error.localizedDescription, error);
|
||||
});
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user