From 62599fa8ff7f308259fe178fa37b7bcf3c1a408c Mon Sep 17 00:00:00 2001 From: Evan Bacon Date: Mon, 11 Feb 2019 01:20:49 -0800 Subject: [PATCH] Add deprecation notice to ImageStore (#23330) Summary: - Related: #23313 - ImageStore is **iOS only**. AFAIK there is no reason this functionality isn't available on Android. - base64 is very inefficient with the React Native bridge - Ideally the `FileSystem` solutions will integrate Turbo Modules to circumvent bridge issues by passing direct references to files. * [General][added] - A deprecation notice with info about third-party solutions for getting a base64-encoded string. * [General][fixed] - Missing warnings for unimplemented platform methods. Pull Request resolved: https://github.com/facebook/react-native/pull/23330 Differential Revision: D14022159 Pulled By: cpojer fbshipit-source-id: 2a026ebf47cb315e9a0cfe6e3697a1799c5cbe2c --- Libraries/Image/ImageStore.js | 33 ++++++++++++++++--- .../react-native-implementation.js | 7 ++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Libraries/Image/ImageStore.js b/Libraries/Image/ImageStore.js index 60273b79f201f2..8ba5c3162be83d 100644 --- a/Libraries/Image/ImageStore.js +++ b/Libraries/Image/ImageStore.js @@ -11,6 +11,19 @@ const RCTImageStoreManager = require('NativeModules').ImageStoreManager; +const Platform = require('Platform'); + +const warnOnce = require('warnOnce'); + +function warnUnimplementedMethod(methodName: string): void { + warnOnce( + `imagestore-${methodName}`, + `react-native: ImageStore.${methodName}() is not implemented on ${ + Platform.OS + }`, + ); +} + class ImageStore { /** * Check if the ImageStore contains image data for the specified URI. @@ -20,7 +33,7 @@ class ImageStore { if (RCTImageStoreManager.hasImageForTag) { RCTImageStoreManager.hasImageForTag(uri, callback); } else { - console.warn('hasImageForTag() not implemented'); + warnUnimplementedMethod('hasImageForTag'); } } @@ -36,7 +49,7 @@ class ImageStore { if (RCTImageStoreManager.removeImageForTag) { RCTImageStoreManager.removeImageForTag(uri); } else { - console.warn('removeImageForTag() not implemented'); + warnUnimplementedMethod('removeImageForTag'); } } @@ -56,7 +69,15 @@ class ImageStore { success: (uri: string) => void, failure: (error: any) => void, ) { - RCTImageStoreManager.addImageFromBase64(base64ImageData, success, failure); + if (RCTImageStoreManager.addImageFromBase64) { + RCTImageStoreManager.addImageFromBase64( + base64ImageData, + success, + failure, + ); + } else { + warnUnimplementedMethod('addImageFromBase64'); + } } /** @@ -75,7 +96,11 @@ class ImageStore { success: (base64ImageData: string) => void, failure: (error: any) => void, ) { - RCTImageStoreManager.getBase64ForTag(uri, success, failure); + if (RCTImageStoreManager.getBase64ForTag) { + RCTImageStoreManager.getBase64ForTag(uri, success, failure); + } else { + warnUnimplementedMethod('getBase64ForTag'); + } } } diff --git a/Libraries/react-native/react-native-implementation.js b/Libraries/react-native/react-native-implementation.js index d14722973dd932..849b7f066bfdc4 100644 --- a/Libraries/react-native/react-native-implementation.js +++ b/Libraries/react-native/react-native-implementation.js @@ -50,6 +50,13 @@ module.exports = { return require('ImageEditor'); }, get ImageStore() { + warnOnce( + 'imagestore-deprecation', + 'ImageStore is deprecated and will be removed in a future release. ' + + 'To get a base64-encoded string from a local image use either of the following third-party libraries:' + + "* expo-file-system: `readAsStringAsync(filepath, 'base64')`" + + "* react-native-fs: `readFile(filepath, 'base64')`", + ); return require('ImageStore'); }, get InputAccessoryView() {