mirror of
https://github.com/selfxyz/self.git
synced 2026-04-27 03:01:15 -04:00
add qrcode reader on android
This commit is contained in:
@@ -140,6 +140,8 @@ dependencies {
|
||||
implementation project(':passportreader')
|
||||
implementation 'org.jmrtd:jmrtd:0.7.18'
|
||||
|
||||
implementation 'com.github.blikoon:QRCodeScanner:0.1.2'
|
||||
|
||||
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
|
||||
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
|
||||
exclude group:'com.squareup.okhttp3', module:'okhttp'
|
||||
|
||||
@@ -13,6 +13,7 @@ import io.tradle.nfc.RNPassportReaderPackage;
|
||||
import java.util.List;
|
||||
import com.proofofpassport.prover.ProverPackage;
|
||||
import com.rnfs.RNFSPackage;
|
||||
import com.proofofpassport.QRCodeScannerPackage;
|
||||
|
||||
public class MainApplication extends Application implements ReactApplication {
|
||||
|
||||
@@ -32,6 +33,7 @@ public class MainApplication extends Application implements ReactApplication {
|
||||
// Add the custom package here
|
||||
packages.add(new CameraActivityPackage());
|
||||
packages.add(new ProverPackage());
|
||||
packages.add(new QRCodeScannerPackage());
|
||||
|
||||
return packages;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.proofofpassport;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import androidx.annotation.NonNull;
|
||||
import com.facebook.react.bridge.ActivityEventListener;
|
||||
import com.facebook.react.bridge.BaseActivityEventListener;
|
||||
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.blikoon.qrcodescanner.QrCodeActivity;
|
||||
|
||||
public class QRCodeScannerModule extends ReactContextBaseJavaModule {
|
||||
|
||||
private static final int REQUEST_CODE_QR_SCAN = 101;
|
||||
private Promise scanPromise;
|
||||
|
||||
private final ActivityEventListener activityEventListener = new BaseActivityEventListener() {
|
||||
@Override
|
||||
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
|
||||
if (requestCode == REQUEST_CODE_QR_SCAN) {
|
||||
if (scanPromise != null) {
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
String result = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult");
|
||||
scanPromise.resolve(result);
|
||||
} else {
|
||||
scanPromise.reject("SCAN_FAILED", "QR Code scanning failed");
|
||||
}
|
||||
scanPromise = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
QRCodeScannerModule(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
reactContext.addActivityEventListener(activityEventListener);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String getName() {
|
||||
return "QRCodeScanner";
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void scanQRCode(Promise promise) {
|
||||
Activity currentActivity = getCurrentActivity();
|
||||
if (currentActivity == null) {
|
||||
promise.reject("ACTIVITY_DOES_NOT_EXIST", "Activity doesn't exist");
|
||||
return;
|
||||
}
|
||||
|
||||
scanPromise = promise;
|
||||
Intent intent = new Intent(currentActivity, QrCodeActivity.class);
|
||||
currentActivity.startActivityForResult(intent, REQUEST_CODE_QR_SCAN);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.proofofpassport;
|
||||
|
||||
import com.facebook.react.ReactPackage;
|
||||
import com.facebook.react.bridge.NativeModule;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.uimanager.ViewManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class QRCodeScannerPackage implements ReactPackage {
|
||||
@Override
|
||||
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
||||
List<NativeModule> modules = new ArrayList<>();
|
||||
modules.add(new QRCodeScannerModule(reactContext));
|
||||
return modules;
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,9 @@ import { BadgeCheck, Binary, LayoutGrid, List, LockKeyhole, QrCode, ShieldCheck,
|
||||
import { bgBlue, bgGreen, separatorColor, textBlack } from '../utils/colors';
|
||||
import { orange } from '@tamagui/colors';
|
||||
import useUserStore from '../stores/userStore';
|
||||
import { Platform } from 'react-native';
|
||||
import { NativeModules } from 'react-native';
|
||||
|
||||
interface AppScreenProps {
|
||||
setSheetAppListOpen: (value: boolean) => void;
|
||||
setSheetRegisterIsOpen: (value: boolean) => void;
|
||||
@@ -48,13 +50,65 @@ const AppScreen: React.FC<AppScreenProps> = ({ setSheetAppListOpen, setSheetRegi
|
||||
gitcoinApp
|
||||
];
|
||||
|
||||
const scanQRCode = () => {
|
||||
if (Platform.OS === 'ios') {
|
||||
if (NativeModules.QRScannerModule && NativeModules.QRScannerModule.scanQRCode) {
|
||||
NativeModules.QRScannerModule.scanQRCode()
|
||||
.then((result: string) => {
|
||||
handleQRCodeScan(result);
|
||||
})
|
||||
.catch((error: any) => {
|
||||
console.error('QR Scanner Error:', error);
|
||||
toast.show('Error', {
|
||||
message: 'Failed to scan QR code',
|
||||
type: 'error',
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.error('QR Scanner module not found for iOS');
|
||||
toast.show('Error', {
|
||||
message: 'QR Scanner not available',
|
||||
type: 'error',
|
||||
});
|
||||
}
|
||||
} else if (Platform.OS === 'android') {
|
||||
if (NativeModules.QRCodeScanner && NativeModules.QRCodeScanner.scanQRCode) {
|
||||
NativeModules.QRCodeScanner.scanQRCode()
|
||||
.then((result: string) => {
|
||||
handleQRCodeScan(result);
|
||||
})
|
||||
.catch((error: any) => {
|
||||
console.error('QR Scanner Error:', error);
|
||||
toast.show('Error', {
|
||||
message: 'Failed to scan QR code',
|
||||
type: 'error',
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.error('QR Scanner module not found for Android');
|
||||
toast.show('Error', {
|
||||
message: 'QR Scanner not available',
|
||||
type: 'error',
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const handleQRCodeScan = (result: string) => {
|
||||
console.log(result);
|
||||
const app = createAppType(JSON.parse(result.replace(/'/g, '"')));
|
||||
console.log(app);
|
||||
setSelectedApp(app);
|
||||
setSelectedTab("prove");
|
||||
}
|
||||
try {
|
||||
console.log(result);
|
||||
const app = createAppType(JSON.parse(result));
|
||||
console.log(app);
|
||||
setSelectedApp(app);
|
||||
setSelectedTab("prove");
|
||||
} catch (error) {
|
||||
console.error('Error parsing QR code result:', error);
|
||||
toast.show('Error', {
|
||||
message: 'Invalid QR code format',
|
||||
type: 'error',
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<YStack f={1} pb="$3" px="$3">
|
||||
@@ -127,27 +181,17 @@ const AppScreen: React.FC<AppScreenProps> = ({ setSheetAppListOpen, setSheetRegi
|
||||
<XStack f={1} minHeight="$1" />
|
||||
|
||||
<YStack gap="$2.5">
|
||||
<CustomButton text="Scan QR Code" onPress={() => {
|
||||
|
||||
{
|
||||
registered ?
|
||||
NativeModules.QRScannerBridge.scanQRCode()
|
||||
.then((result: string) => {
|
||||
handleQRCodeScan(result);
|
||||
})
|
||||
.catch((error: any) => {
|
||||
console.error('QR Scanner Error:', error);
|
||||
})
|
||||
|
||||
:
|
||||
setSheetRegisterIsOpen(true)
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}} Icon={<QrCode size={18} color={textBlack} />} />
|
||||
<CustomButton
|
||||
text="Scan QR Code"
|
||||
onPress={() => {
|
||||
if (registered) {
|
||||
scanQRCode();
|
||||
} else {
|
||||
setSheetRegisterIsOpen(true);
|
||||
}
|
||||
}}
|
||||
Icon={<QrCode size={18} color={textBlack} />}
|
||||
/>
|
||||
<CustomButton bgColor='white' text="Open app list" onPress={
|
||||
registered ?
|
||||
() => setSheetAppListOpen(true)
|
||||
|
||||
Reference in New Issue
Block a user