Skip to content

Commit

Permalink
FAT-131 - Custom image tool (#743)
Browse files Browse the repository at this point in the history
Custom image tool

First poc of image processing using webview on NFTs

Migrate Webview image processor to its own component

Improve code injection using toString() & "show source" directive

Move image fetching logic to own file

Fix code injection (not calling Function.toString at compile) + add debug helper

Add button to navigate to ImagePicker in NftViewer

Add tip for code injection issue (first call of toString()) in debug

Revert changes on NftImageViewer

Add button to request compact raw data from webview script

Comment

Add props to set brightness & contrast (filter not working yet)

Working flows on iOS: (image url / pick from gallery) -> crop at given ratio -> process

Cleanup a bit the comments mess

Fix android build issue by upgrading kotlin

Add descriptive labelling in the main screen

Gallery flow working on Android

Make injected code type script

Add multiple constrast filters using manual JS filter

Avoid recomputing result twice in computeResult

lint

lint

Fix import from URL on Android by downloading image in cache

Improve display of the preview for each step (dimensions)

Image resizing to target size (after crop, before processing)

Fix expo-image-manipulator version to match expo-barcode-scanner's dependency on expo-image-loader version

Fix ImageResizer: use fileURI instead of base64 (the former doesn't work on iOS)

Fix rerenders

Store floored value in rawResult to avoid division imprecisions

Fix issues post rebase

Cleanup types of image tools

Implement BottomModal & CroppingScreen w/ navigation (WIP)

Implement PreviewScreen

Move DebugScreen to CustomImageNavigator

Implement Step3Transfer with for now just a preview of the raw data

Proper design of bottom modal

Avoid loading source image data as base64 in JS to avoid memory issues

Put back expo-file-system as it's required by expo-image-manipulator

Less extreme contrast values

post rebase on develop with RN upgrade

Add rotate button in Step1Crop

Fix contrast causing out of bound values (out of [0, 255])

Fix nav to CustomImage in NftViewer

Fix gray level rounding

Handle errors in loading flow

Add error handling & loading state in import from gallery flow

Add error handling in image preview, cropper, resizer, processor

Add error handling in injected code

Use regular image for debug link

Add data validation: rebuild image from raw data & compare base64 with preview

Fix lint & ts

Add extreme aspect ratio image

Add some alerts to debug importImageFromPhoneGallery

more debug logs

Add expo-image-picker because react-native-image-picker is buggy on samsung/xiaomi

Remove debugging stuff in image importing flow

Remove react-native-image-picker

Move CustomImage entrypoints to debug screen

Adapt cropper layout for "extreme" aspect ratio (above 2:1)

Remove ImagePicker debug screen

Remove unused variables

Add "customImage" feature flag

Update injected code doc

Remove unused component

Document components

Remove react-native-image-picker lib

Changesets

Improve typing of Step1Crop params & loadImageToFileWithDimensions

Remove unused imports

Fix cleanup of image downloading useEffect (including cancellation)

Change ImageResizer component to a hook + cleanup useEffect

typing & typos

Fix fitImageContain & document

Improve injected code: pure functions where possible & documentation

Type navigation of CustomImageNavigator

Fix typing of ImageCropper (ref & style)

Fix post rebase

fix post rebase

lint

Add custom image (feature flagged) entry point in nft links panel

Fix rendering logic of NftLinksPanel (with sections & separator between)

update doc

Disable back gesture in the Error Screen

nft: add image/svg and image/svg+xml to mimeTypesMap for "image"

Fix custom image entry in NFT: should only be visible if there is an "image" uri

Remove fake url entrypoint

Fix layout of cropping UI

Revert bad change to NftViewer
Remove image/svg image/svg+xml from mimetypesmap

lint

Add wording for screen headers

Fix post rebase

Fix post rebase

Improve usage of the available area for the cropping UI


Implement native ImagePickerModule for Android (better than expo-image-picker)


Remove old dimensions logic


Remove unneeded loading of original image dimensions


Improve (Android) initial scaling of image in cropping UI (fills more space rather than fitting)


Remove customImage flag from debug screen


Fix post rebase
  • Loading branch information
ofreyssinet-ledger committed Sep 6, 2022
1 parent 7336177 commit a089100
Show file tree
Hide file tree
Showing 48 changed files with 2,478 additions and 59 deletions.
5 changes: 5 additions & 0 deletions .changeset/curly-dryers-explain.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"live-mobile": patch
---

Add custom image tool
5 changes: 5 additions & 0 deletions .changeset/green-ties-sit.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@ledgerhq/live-common": patch
---

Add "customImage" feature flag.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.ledger.live;

import static com.ledger.live.Constants.REQUEST_ENABLE_BT;

import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.app.Activity;
Expand All @@ -18,8 +20,6 @@

public class BluetoothHelperModule extends ReactContextBaseJavaModule {

private static final int REQUEST_ENABLE_BT = 0;

private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
private static final String E_BLE_CANCELLED = "E_BLE_CANCELLED";

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.ledger.live;

public class Constants {
public static final int REQUEST_ENABLE_BT = 0;
public static final int REQUEST_IMAGE = 1;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package com.ledger.live;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;

import java.util.List;

public class ImagePickerModule extends ReactContextBaseJavaModule implements ActivityEventListener{
private static String REACT_CLASS = "ImagePickerModule";
private static String E_NULL_RESULT = "E_NULL_RESULT";

private Promise pickerPromise;

public ImagePickerModule(ReactApplicationContext context) {
super(context);
context.addActivityEventListener(this);
}

@NonNull
@Override
public String getName() {
return REACT_CLASS;
}

@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
try {
if (requestCode == Constants.REQUEST_IMAGE) {
if (resultCode == Activity.RESULT_CANCELED){
WritableMap map = Arguments.createMap();
map.putBoolean("cancelled", true);
pickerPromise.resolve(map);
} else if (data == null) {
pickerPromise.reject(E_NULL_RESULT);
} else if (resultCode == Activity.RESULT_OK) {
if (pickerPromise == null) throw new Error(E_NULL_RESULT);
WritableMap map = Arguments.createMap();
map.putString("uri", data.getData().toString());
pickerPromise.resolve(map);
} else {
pickerPromise.reject(String.valueOf(resultCode));
}
pickerPromise = null;
}
} catch (Exception e) {
if (pickerPromise != null) pickerPromise.reject(e);
}
}

@Override
public void onNewIntent(Intent intent) {}

private String getDefaultPictureAppPackageName() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
List<ResolveInfo> pkgAppsList = getReactApplicationContext().getPackageManager().queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);
try {
return pkgAppsList.get(0).activityInfo.processName;
} catch (Exception e) {
return null;
}
}

@ReactMethod
public void pickImage(Promise promise) {
pickerPromise = promise;
try {
String defaultPictureApp = getDefaultPictureAppPackageName();
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
if (defaultPictureApp != null) intent.setPackage(defaultPictureApp);
getCurrentActivity().startActivityForResult(intent, Constants.REQUEST_IMAGE);
} catch(Exception e) {
promise.reject(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public boolean getUseDeveloperSupport() {
protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages();
packages.add(new BluetoothHelperPackage());
packages.add(new NativeModulesPackage());
packages.add(new ReactVideoPackage());
packages.add(new BackgroundRunnerPackager());
return packages;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import java.util.Collections;
import java.util.List;

public class BluetoothHelperPackage implements ReactPackage {
public class NativeModulesPackage implements ReactPackage {

@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
Expand All @@ -22,6 +22,7 @@ public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new BluetoothHelperModule(reactContext));
modules.add(new ImagePickerModule(reactContext));
return modules;
}

Expand Down
7 changes: 6 additions & 1 deletion apps/ledger-live-mobile/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ buildscript {
minSdkVersion = 24
compileSdkVersion = 30
targetSdkVersion = 30
kotlinVersion = "1.4.10"
kotlinVersion = "1.6.0"
androidXCore = "1.6.0"
if (System.properties['os.arch'] == "aarch64") {
// For M1 Users we need to use the NDK 24 which added support for aarch64
Expand Down Expand Up @@ -57,6 +57,11 @@ allprojects {
maven {
url "$rootDir/../node_modules/expo-camera/android/maven"
}
jcenter() {
content {
includeModule("com.theartofdev.edmodo", "android-image-cropper") // for expo-image-picker
}
}
}
configurations.all {
resolutionStrategy {
Expand Down
35 changes: 35 additions & 0 deletions apps/ledger-live-mobile/ios/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,16 @@ PODS:
- ZXingObjC/PDF417
- EXCamera (12.0.3):
- ExpoModulesCore
- EXFileSystem (13.1.4):
- ExpoModulesCore
- EXImageLoader (3.1.1):
- ExpoModulesCore
- React-Core
- EXImageManipulator (10.2.1):
- EXImageLoader
- ExpoModulesCore
- EXImagePicker (12.0.2):
- ExpoModulesCore
- Expo (43.0.5):
- ExpoModulesCore
- ExpoModulesCore (0.6.5):
Expand Down Expand Up @@ -421,6 +428,9 @@ PODS:
- react-native-flipper-performance-plugin/FBDefines (= 0.2.1)
- react-native-flipper-performance-plugin/FBDefines (0.2.1):
- React-Core
- react-native-image-crop-tools (1.6.2):
- React
- TOCropViewController (= 2.5.3)
- react-native-netinfo (6.2.1):
- React-Core
- react-native-performance (2.1.0):
Expand Down Expand Up @@ -516,6 +526,8 @@ PODS:
- React-jsi (= 0.68.2)
- React-logger (= 0.68.2)
- React-perflogger (= 0.68.2)
- rn-fetch-blob (0.12.0):
- React-Core
- RNAnalytics (1.5.3):
- Analytics
- React-Core
Expand Down Expand Up @@ -603,6 +615,7 @@ PODS:
- Storyly (~> 1.24.0)
- TcpSockets (4.0.0):
- React
- TOCropViewController (2.5.3)
- Yoga (1.14.0)
- YogaKit (1.18.1):
- Yoga (~> 1.14)
Expand All @@ -617,7 +630,10 @@ DEPENDENCIES:
- "DoubleConversion (from `../../../node_modules/.pnpm/[email protected]_qiqqwmyv63yhnuboofexv3s7x4/node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)"
- "EXBarCodeScanner (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-barcode-scanner/ios`)"
- "EXCamera (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-camera/ios`)"
- "EXFileSystem (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-file-system/ios`)"
- "EXImageLoader (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-image-loader/ios`)"
- "EXImageManipulator (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-image-manipulator/ios`)"
- "EXImagePicker (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-image-picker/ios`)"
- "Expo (from `../../../node_modules/.pnpm/[email protected]_@[email protected]/node_modules/expo/ios`)"
- "ExpoModulesCore (from `../../../node_modules/.pnpm/[email protected]/node_modules/expo-modules-core/ios`)"
- "FBLazyVector (from `../../../node_modules/.pnpm/[email protected]_qiqqwmyv63yhnuboofexv3s7x4/node_modules/react-native/Libraries/FBLazyVector`)"
Expand Down Expand Up @@ -672,6 +688,7 @@ DEPENDENCIES:
- "react-native-fast-crypto (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-native-fast-crypto`)"
- "react-native-fingerprint-scanner (from `../../../node_modules/.pnpm/github.com+hieuvp+react-native-fingerprint-scanner@[email protected]/node_modules/react-native-fingerprint-scanner`)"
- "react-native-flipper-performance-plugin (from `../../../node_modules/.pnpm/[email protected]/node_modules/react-native-flipper-performance-plugin`)"
- "react-native-image-crop-tools (from `../../../node_modules/.pnpm/[email protected]_ykxjy5s7xujdxmsgrwxo5mh3y4_zqxy7fpkavjkgz5xll7ed4r6rq/node_modules/react-native-image-crop-tools`)"
- "react-native-netinfo (from `../../../node_modules/.pnpm/@[email protected][email protected]/node_modules/@react-native-community/netinfo`)"
- "react-native-performance (from `../../../node_modules/.pnpm/[email protected][email protected]/node_modules/react-native-performance/ios`)"
- "react-native-randombytes (from `../../../node_modules/.pnpm/[email protected]/node_modules/react-native-randombytes`)"
Expand All @@ -694,6 +711,7 @@ DEPENDENCIES:
- "React-RCTVibration (from `../../../node_modules/.pnpm/[email protected]_qiqqwmyv63yhnuboofexv3s7x4/node_modules/react-native/Libraries/Vibration`)"
- "React-runtimeexecutor (from `../../../node_modules/.pnpm/[email protected]_qiqqwmyv63yhnuboofexv3s7x4/node_modules/react-native/ReactCommon/runtimeexecutor`)"
- "ReactCommon/turbomodule/core (from `../../../node_modules/.pnpm/[email protected]_qiqqwmyv63yhnuboofexv3s7x4/node_modules/react-native/ReactCommon`)"
- "rn-fetch-blob (from `../../../node_modules/.pnpm/[email protected]/node_modules/rn-fetch-blob`)"
- "RNAnalytics (from `../../../node_modules/.pnpm/@[email protected]/node_modules/@segment/analytics-react-native`)"
- "RNCAsyncStorage (from `../../../node_modules/.pnpm/@[email protected][email protected]/node_modules/@react-native-async-storage/async-storage`)"
- "RNCClipboard (from `../../../node_modules/.pnpm/@[email protected]_zqxy7fpkavjkgz5xll7ed4r6rq/node_modules/@react-native-community/clipboard`)"
Expand Down Expand Up @@ -753,6 +771,7 @@ SPEC REPOS:
- Sentry
- SocketRocket
- Storyly
- TOCropViewController
- YogaKit
- ZXingObjC

Expand All @@ -765,8 +784,14 @@ EXTERNAL SOURCES:
:path: "../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-barcode-scanner/ios"
EXCamera:
:path: "../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-camera/ios"
EXFileSystem:
:path: "../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-file-system/ios"
EXImageLoader:
:path: "../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-image-loader/ios"
EXImageManipulator:
:path: "../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-image-manipulator/ios"
EXImagePicker:
:path: "../../../node_modules/.pnpm/[email protected][email protected]/node_modules/expo-image-picker/ios"
Expo:
:path: "../../../node_modules/.pnpm/[email protected]_@[email protected]/node_modules/expo/ios"
ExpoModulesCore:
Expand Down Expand Up @@ -823,6 +848,8 @@ EXTERNAL SOURCES:
:path: "../../../node_modules/.pnpm/github.com+hieuvp+react-native-fingerprint-scanner@[email protected]/node_modules/react-native-fingerprint-scanner"
react-native-flipper-performance-plugin:
:path: "../../../node_modules/.pnpm/[email protected]/node_modules/react-native-flipper-performance-plugin"
react-native-image-crop-tools:
:path: "../../../node_modules/.pnpm/[email protected]_ykxjy5s7xujdxmsgrwxo5mh3y4_zqxy7fpkavjkgz5xll7ed4r6rq/node_modules/react-native-image-crop-tools"
react-native-netinfo:
:path: "../../../node_modules/.pnpm/@[email protected][email protected]/node_modules/@react-native-community/netinfo"
react-native-performance:
Expand Down Expand Up @@ -867,6 +894,8 @@ EXTERNAL SOURCES:
:path: "../../../node_modules/.pnpm/[email protected]_qiqqwmyv63yhnuboofexv3s7x4/node_modules/react-native/ReactCommon/runtimeexecutor"
ReactCommon:
:path: "../../../node_modules/.pnpm/[email protected]_qiqqwmyv63yhnuboofexv3s7x4/node_modules/react-native/ReactCommon"
rn-fetch-blob:
:path: "../../../node_modules/.pnpm/[email protected]/node_modules/rn-fetch-blob"
RNAnalytics:
:path: "../../../node_modules/.pnpm/@[email protected]/node_modules/@segment/analytics-react-native"
RNCAsyncStorage:
Expand Down Expand Up @@ -918,7 +947,10 @@ SPEC CHECKSUMS:
DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662
EXBarCodeScanner: e5ca0062d8ad1c4c1d2e386d6a308d5a32213020
EXCamera: 03d69135ceb6f5f18f37b63eddb63d7643b65c42
EXFileSystem: 08a3033ac372b6346becf07839e1ccef26fb1058
EXImageLoader: 347b72c2ec2df65120ccec40ea65a4c4f24317ff
EXImageManipulator: 60d1bf3f1d7709453b1feb38adf8594b7f58710f
EXImagePicker: bf4d62532cc2bf217edbe4abbb0014e73e079eac
Expo: d9588796cd19999da4d440d87bf7eb7ae4dbd608
ExpoModulesCore: 32c0ccb47f477d330ee93db72505380adf0de09a
FBLazyVector: a7a655862f6b09625d11c772296b01cd5164b648
Expand Down Expand Up @@ -974,6 +1006,7 @@ SPEC CHECKSUMS:
react-native-fast-crypto: 5943c42466b86ad70be60d3a5f64bd22251e5d9e
react-native-fingerprint-scanner: ac6656f18c8e45a7459302b84da41a44ad96dbbe
react-native-flipper-performance-plugin: ab280430bbdd17deffb7a30d94b604738cd04150
react-native-image-crop-tools: 06b171ac13f1cd520e633a0d190c00f664b4cb79
react-native-netinfo: 3d3769f0d65de15c83a9bf1346f8be71de5a24bf
react-native-performance: f4b6604a9d5a8a7407e34a82fab6c641d9a3ec12
react-native-randombytes: 421f1c7d48c0af8dbcd471b0324393ebf8fe7846
Expand All @@ -996,6 +1029,7 @@ SPEC CHECKSUMS:
React-RCTVibration: 79040b92bfa9c3c2d2cb4f57e981164ec7ab9374
React-runtimeexecutor: b960b687d2dfef0d3761fbb187e01812ebab8b23
ReactCommon: 095366164a276d91ea704ce53cb03825c487a3f2
rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba
RNAnalytics: 6fc4977ed662251d8a0066422aed1d1a5f697caf
RNCAsyncStorage: 9367a646dc24e3ab7b6874d79bc1bfd0832dce58
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
Expand All @@ -1021,6 +1055,7 @@ SPEC CHECKSUMS:
Storyly: 1ae05f53c33d2ce75e8fdcc57f2617c4304d433c
storyly-react-native: fb35dd20cb36da37a851a785d12969c95fe3c888
TcpSockets: 4ef55305239923b343ed0a378b1fac188b1373b0
TOCropViewController: 20a14b6a7a098308bf369e7c8d700dc983a974e6
Yoga: 99652481fcd320aefa4a7ef90095b95acd181952
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
ZXingObjC: fdbb269f25dd2032da343e06f10224d62f537bdb
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,7 @@
"${PODS_ROOT}/../../../../node_modules/.pnpm/[email protected]/node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf",
"${PODS_ROOT}/../../../../node_modules/.pnpm/[email protected]/node_modules/react-native-vector-icons/Fonts/Zocial.ttf",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TOCropViewController/TOCropViewControllerBundle.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
Expand All @@ -528,6 +529,7 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SimpleLineIcons.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Zocial.ttf",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TOCropViewControllerBundle.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
Expand Down
6 changes: 6 additions & 0 deletions apps/ledger-live-mobile/ios/ledgerlivemobile/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@
<string>3.3.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>NSCameraUsageDescription</key>
<string>The Ledger Live app needs access to your camera to scan QR codes</string>
<key>NSMicrophoneUsageDescription</key>
<string>Allow $(PRODUCT_NAME) to use the microphone</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Allow $(PRODUCT_NAME) to access your photos</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
Expand Down
5 changes: 5 additions & 0 deletions apps/ledger-live-mobile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,10 @@
"expo": "^43.0.1",
"expo-barcode-scanner": "~11.2.0",
"expo-camera": "~12.0.3",
"expo-file-system": "~13.1.3",
"expo-image-loader": "~3.1.1",
"expo-image-manipulator": "~10.2.1",
"expo-image-picker": "12.0.2",
"expo-modules-autolinking": "^0.5.5",
"expo-modules-core": "^0.6.5",
"fuse.js": "^6.4.6",
Expand Down Expand Up @@ -141,6 +144,7 @@
"react-native-fast-image": "^8.5.11",
"react-native-fingerprint-scanner": "git+https://github.com/hieuvp/react-native-fingerprint-scanner.git#f1d136f605412d58e4de9e7e155d6f818ba24731",
"react-native-gesture-handler": "^2.5.0",
"react-native-image-crop-tools": "^1.6.2",
"react-native-keychain": "^7.0.0",
"react-native-level-fs": "^3.0.0",
"react-native-localize": "^2.2.1",
Expand Down Expand Up @@ -173,6 +177,7 @@
"redux-actions": "2.6.5",
"redux-thunk": "2.3.0",
"reselect": "4.0.0",
"rn-fetch-blob": "^0.12.0",
"rn-snoopy": "^2.0.2",
"rxjs": "^6.6.6",
"rxjs-compat": "^6.6.6",
Expand Down
2 changes: 1 addition & 1 deletion apps/ledger-live-mobile/src/components/Alert.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type IconType = React.ComponentType<{ size: number; color: string }>;
type Props = {
id?: string;
type: AlertType;
children: React.ReactNode;
children?: React.ReactNode;
title?: string;
noIcon?: boolean;
onLearnMore?: () => any;
Expand Down
Loading

0 comments on commit a089100

Please sign in to comment.