Files
inji-wallet/screens/Request/RequestScreen.tsx
PuBHARGAVI fe3f8a56e1 fix(INJI-329): fix received card expand view and redirect the user to history screen after VC transfer (#799)
* fix(INJI-329): remove onboarding related code from MyVcs machine to show the expanded view of received card

Onboarding is used to check whether we need to show the intro sliders or not now it is handled differently in AppLayout

* fix(INJI-329): redirect the user to the history screen after successfull vc share

* fix(INJI-329): show incoming card screen on the verifier after closing the success popup

redirect the user to received cards screen if user clicks on view received card button and QR code screen if clicks on back button

* refactor(INJI-329): extract bottom tab, scan and request screen names into separate file to maintain the consistency

* refactor(INJI-329): remove activeTab from routeConstants as it is not being used

before new UI merge we have 3 different tabs in home screen and activeTab is used for displaying the current active tab
2023-09-12 13:34:21 +05:30

165 lines
4.6 KiB
TypeScript

import React, { useEffect, useState } from 'react';
import { TFunction, useTranslation } from 'react-i18next';
import QRCode from 'react-native-qrcode-svg';
import { Centered, Button, Column, Text } from '../../components/ui';
import { Theme } from '../../components/ui/styleUtils';
import { useRequestScreen } from './RequestScreenController';
import BluetoothStateManager from 'react-native-bluetooth-state-manager';
import { Platform } from 'react-native';
import Storage from '../../shared/storage';
import { ErrorMessageOverlay } from '../../components/MessageOverlay';
import {
NavigationProp,
useFocusEffect,
useNavigation,
} from '@react-navigation/native';
import { MainBottomTabParamList } from '../../routes/main';
import { BOTTOM_TAB_ROUTES } from '../../routes/routesConstants';
type RequestStackParamList = {
RequestScreen: undefined;
ReceiveVcScreen: undefined;
};
type RequestLayoutNavigation = NavigationProp<
RequestStackParamList & MainBottomTabParamList
>;
export const RequestScreen: React.FC = () => {
const { t } = useTranslation('RequestScreen');
const controller = useRequestScreen();
const props: RequestScreenProps = { t, controller };
const [isBluetoothOn, setIsBluetoothOn] = useState(false);
const navigation = useNavigation<RequestLayoutNavigation>();
useEffect(() => {
(async () => {
await BluetoothStateManager.onStateChange((state) => {
if (state === 'PoweredOff') {
setIsBluetoothOn(false);
} else {
setIsBluetoothOn(true);
}
}, true);
})();
}, [isBluetoothOn]);
return (
<Column
fill
padding="24"
align="space-between"
backgroundColor={Theme.Colors.lightGreyBackgroundColor}>
{loadQRCode()}
{controller.isMinimumStorageLimitReached && (
<ErrorMessageOverlay
isVisible={controller.isMinimumStorageLimitReached}
error="errors.storageLimitReached"
onDismiss={() => {
navigation.navigate(BOTTOM_TAB_ROUTES.home);
}}
translationPath="RequestScreen"
/>
)}
</Column>
);
function loadQRCode() {
if (controller.isNearByDevicesPermissionDenied) {
return <NearByPrompt {...props} />;
}
if (
(controller.isBluetoothDenied || !isBluetoothOn) &&
controller.isReadyForBluetoothStateCheck
) {
return <BluetoothPrompt {...props} />;
}
if (
!controller.isCheckingBluetoothService &&
!controller.isBluetoothDenied
) {
return (
<Column align="flex-end" fill>
{controller.isWaitingForConnection && <SharingQR {...props} />}
<StatusMessage {...props} />
</Column>
);
}
}
};
const BluetoothPrompt: React.FC<RequestScreenProps> = ({ t }) => {
return (
<Centered fill>
<Text color={Theme.Colors.errorMessage} align="center" margin="0 10">
{t(
Platform.OS === 'ios' ? 'bluetoothStateIos' : 'bluetoothStateAndroid'
)}
</Text>
</Centered>
);
};
const NearByPrompt: React.FC<RequestScreenProps> = ({ t, controller }) => {
return (
<Column fill align="space-between">
<Centered fill>
<Text color={Theme.Colors.errorMessage} align="center">
{t('errors.nearbyDevicesPermissionDenied.message')}
</Text>
</Centered>
<Button
title={t('errors.nearbyDevicesPermissionDenied.button')}
onPress={controller.GOTO_SETTINGS}
/>
</Column>
);
};
const SharingQR: React.FC<RequestScreenProps> = ({ t, controller }) => {
return (
<React.Fragment>
<Text align="center">{t('showQrCode')}</Text>
<Centered fill>
{controller.openId4VpUri !== '' ? (
<QRCode
size={200}
value={controller.openId4VpUri}
backgroundColor={Theme.Colors.QRCodeBackgroundColor}
/>
) : null}
</Centered>
</React.Fragment>
);
};
const StatusMessage: React.FC<RequestScreenProps> = ({ t, controller }) => {
return (
controller.statusMessage !== '' && (
<Column elevation={1} padding="16 24">
<Text>{controller.statusMessage}</Text>
{controller.statusHint !== '' && (
<Text size="small" color={Theme.Colors.textLabel}>
{controller.statusHint}
</Text>
)}
{controller.isStatusCancellable && (
<Button
margin={[8, 0, 0, 0]}
title={t('cancel', { ns: 'common' })}
loading={controller.isCancelling}
onPress={controller.CANCEL}
/>
)}
</Column>
)
);
};
interface RequestScreenProps {
t: TFunction;
controller: ReturnType<typeof useRequestScreen>;
}