From 9a4baaa22877dfc77d6d95184a11abcd955518a3 Mon Sep 17 00:00:00 2001 From: Alfred Rosenthal Date: Mon, 8 Sep 2025 11:48:20 -0700 Subject: [PATCH 1/6] feat: stubbing out new overlay changes for camera compoonents Signed-off-by: Alfred Rosenthal --- app/ios/Podfile.lock | 8 ++-- .../bcsc-theme/components/CircularMask.tsx | 46 ------------------- .../components/CodeScanningCamera.tsx | 13 +++--- .../bcsc-theme/components/MaskedCamera.tsx | 37 +++++++-------- .../bcsc-theme/components/RectangularMask.tsx | 45 ------------------ .../features/verify/SetupStepsScreen.tsx | 16 ++++++- .../non-photo/EvidenceCaptureScreen.tsx | 15 +++--- .../verify/send-video/TakePhotoScreen.tsx | 5 +- 8 files changed, 50 insertions(+), 135 deletions(-) delete mode 100644 app/src/bcsc-theme/components/CircularMask.tsx delete mode 100644 app/src/bcsc-theme/components/RectangularMask.tsx diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock index 9c5062c5e..a9cae9b86 100644 --- a/app/ios/Podfile.lock +++ b/app/ios/Podfile.lock @@ -1031,7 +1031,7 @@ PODS: - React-Mapbuffer (0.73.11): - glog - React-debug - - react-native-attestation (2.4.6): + - react-native-attestation (2.6.0): - glog - RCT-Folly (= 2022.05.16.00) - React-Core @@ -1625,7 +1625,7 @@ SPEC CHECKSUMS: React-jsinspector: a98428936fb888cc15d857226a26d9ac0a668a0e React-logger: 6e4873d1f9c54cca30f6c91a6617f8c91b75ba4c React-Mapbuffer: 57bf49a458398d329dad2bf8bc660e3e35b96989 - react-native-attestation: c2eaf0789330d5ae353d011458794bd6844d53bf + react-native-attestation: 8b3f86d2fcdf2818167ecd188ca68cecefe0280b react-native-config: 644074ab88db883fcfaa584f03520ec29589d7df react-native-date-picker: 2eca217a8fb09c517f5bb6b23978718c6cec59ec react-native-encrypted-storage: 569d114e329b1c2c2d9f8c84bcdbe4478dda2258 @@ -1677,8 +1677,8 @@ SPEC CHECKSUMS: SDWebImage: f29024626962457f3470184232766516dee8dfea SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 VisionCamera: 6ad4b86176f6fea45e90e380d3d530bc5e1abff9 - Yoga: 1f93d5925ea12fb0880b21efe3566677337cf2ed + Yoga: a813a6d82538ccba91c54406404e3ed80b48a692 PODFILE CHECKSUM: 7143c901b4221bb5cd19672e06910ed9b96d7c96 -COCOAPODS: 1.14.3 +COCOAPODS: 1.16.2 diff --git a/app/src/bcsc-theme/components/CircularMask.tsx b/app/src/bcsc-theme/components/CircularMask.tsx deleted file mode 100644 index b73501095..000000000 --- a/app/src/bcsc-theme/components/CircularMask.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { View, StyleSheet, useWindowDimensions } from 'react-native' -import { useTheme } from '@bifold/core' -import React from 'react' - -export interface CircularMaskProps { - maskWidth?: number - maskHeight?: number - maskBorderRadius?: number -} - -const CircularMask: React.FC = ({ - maskWidth: customWidth, - maskHeight: customHeight, - maskBorderRadius: customBorderRadius, -}) => { - const { Spacing, ColorPalette } = useTheme() - const { width } = useWindowDimensions() - - // Use provided dimensions or calculate defaults - const maskWidth = customWidth ?? width - Spacing.lg * 2 - const maskHeight = customHeight ?? width * 1.2 - const maskBorderRadius = customBorderRadius ?? maskWidth / 2 - - const styles = StyleSheet.create({ - mask: { - flex: 1, - backgroundColor: ColorPalette.notification.popupOverlay, - alignItems: 'center', - justifyContent: 'center', - }, - maskShape: { - backgroundColor: 'white', - width: maskWidth, - height: maskHeight, - borderRadius: maskBorderRadius, - }, - }) - - return ( - - - - ) -} - -export default CircularMask diff --git a/app/src/bcsc-theme/components/CodeScanningCamera.tsx b/app/src/bcsc-theme/components/CodeScanningCamera.tsx index f2882c08d..541f69f42 100644 --- a/app/src/bcsc-theme/components/CodeScanningCamera.tsx +++ b/app/src/bcsc-theme/components/CodeScanningCamera.tsx @@ -1,16 +1,15 @@ -import { useTheme } from '@bifold/core' +import { QRScannerTorch, useTheme } from '@bifold/core' import React, { useEffect, useRef, useState } from 'react' -import { StyleSheet, View, ViewStyle, useWindowDimensions, ColorValue } from 'react-native' +import { ColorValue, StyleSheet, View, ViewStyle, useWindowDimensions } from 'react-native' import { Camera, - useCameraPermission, - useCameraDevice, - useCodeScanner, - CodeType, Code, CodeScannerFrame, + CodeType, + useCameraDevice, + useCameraPermission, + useCodeScanner, } from 'react-native-vision-camera' -import QRScannerTorch from '@bifold/core/src/components/misc/QRScannerTorch' const overlayTint: ColorValue = 'rgba(0, 0, 0, 0.4)' diff --git a/app/src/bcsc-theme/components/MaskedCamera.tsx b/app/src/bcsc-theme/components/MaskedCamera.tsx index ab055a3d8..fe93e2ae0 100644 --- a/app/src/bcsc-theme/components/MaskedCamera.tsx +++ b/app/src/bcsc-theme/components/MaskedCamera.tsx @@ -1,26 +1,24 @@ -import { ThemedText, TOKENS, useServices, useTheme } from '@bifold/core' -import { useEffect, useState, useRef } from 'react' -import { StyleSheet, View, Text, Alert, TouchableOpacity } from 'react-native' +import { MaskType, SVGOverlay, ThemedText, TOKENS, useServices, useTheme } from '@bifold/core' +import { useEffect, useRef, useState } from 'react' +import { Alert, StyleSheet, Text, TouchableOpacity, View } from 'react-native' import { SafeAreaView } from 'react-native-safe-area-context' -import MaskedView from '@react-native-masked-view/masked-view' import Icon from 'react-native-vector-icons/MaterialCommunityIcons' import { Camera, useCameraDevice, useCameraPermission } from 'react-native-vision-camera' -import CircularMask from './CircularMask' type MaskedCameraProps = { navigation: any cameraFace: 'front' | 'back' cameraInstructions?: string cameraLabel?: string - cameraMask?: React.ReactElement + maskType?: MaskType onPhotoTaken: (path: string) => void } const MaskedCamera = ({ navigation, - cameraMask, cameraInstructions, cameraLabel, + maskType, cameraFace = 'back', onPhotoTaken, }: MaskedCameraProps) => { @@ -97,6 +95,7 @@ const MaskedCamera = ({ }, [hasPermission, requestPermission, navigation]) const toggleTorch = () => setTorchOn((prev) => !prev) + MaskType.ID_CARD if (!hasPermission) { return ( @@ -140,22 +139,20 @@ const MaskedCamera = ({ Alert.alert('Error', 'Failed to take photo. Please try again.') } } - const DefaultMask = return ( - - setIsActive(true)} - onError={onError} - torch={torchOn ? 'on' : 'off'} - /> - + setIsActive(true)} + onError={onError} + torch={torchOn ? 'on' : 'off'} + /> + {cameraLabel} diff --git a/app/src/bcsc-theme/components/RectangularMask.tsx b/app/src/bcsc-theme/components/RectangularMask.tsx deleted file mode 100644 index 115caeb14..000000000 --- a/app/src/bcsc-theme/components/RectangularMask.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useWindowDimensions, View, StyleSheet } from 'react-native' -import { useTheme } from '@bifold/core' -import React from 'react' - -interface RectangularMaskProps { - aspectRatio?: number // Default CR80 card ratio is 1.59 - padding?: number -} - -const RectangularMask: React.FC = ({ - aspectRatio = 1.59, // Standard ID card ratio (3.375/2.125) - padding = 40, -}) => { - const { width: screenWidth } = useWindowDimensions() - const { ColorPalette } = useTheme() - - // Calculate mask dimensions - const maskWidth = screenWidth - padding * 2 - const maskHeight = maskWidth / aspectRatio - - const styles = StyleSheet.create({ - maskContainer: { - flex: 1, - backgroundColor: ColorPalette.notification.popupOverlay, - alignItems: 'center', - justifyContent: 'center', - }, - cardMask: { - width: maskWidth, - height: maskHeight, - backgroundColor: 'black', - borderRadius: 16, // Slight rounding for ID card corners - borderWidth: 2, - borderColor: 'white', - }, - }) - - return ( - - - - ) -} - -export default RectangularMask diff --git a/app/src/bcsc-theme/features/verify/SetupStepsScreen.tsx b/app/src/bcsc-theme/features/verify/SetupStepsScreen.tsx index f90ae2db6..8c50b669c 100644 --- a/app/src/bcsc-theme/features/verify/SetupStepsScreen.tsx +++ b/app/src/bcsc-theme/features/verify/SetupStepsScreen.tsx @@ -4,12 +4,12 @@ import { StackNavigationProp } from '@react-navigation/stack' import React, { useMemo } from 'react' import useApi from '@/bcsc-theme/api/hooks/useApi' +import { BCSCCardType } from '@/bcsc-theme/types/cards' import { hitSlop } from '@/constants' import { BCDispatchAction, BCState } from '@/store' import { useTranslation } from 'react-i18next' import { Alert, StyleSheet, TouchableOpacity, View } from 'react-native' import Icon from 'react-native-vector-icons/MaterialCommunityIcons' -import { BCSCCardType } from '@/bcsc-theme/types/cards' type SetupStepsScreenProps = { navigation: StackNavigationProp @@ -383,7 +383,19 @@ const SetupStepsScreen: React.FC = ({ navigation }) => {