Files
inji-wallet/components/HelpScreen.tsx
KiruthikaJeyashankar 68488f3f0c [INJIMOB-2381] fix compile and target SDK 34 is causing app crash in debug build (#1877)
* [INJIMOB-2381] update package.json and resolve dependencies for react 0.73.0

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-2381] setup for 0.73.6

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-2381] fix font & image not loading issue

changes include
- move common image assets to android & iOS folders
- update gradle version to 8.2
- add expo-font asset for Inter regular
- replace useFont with expo-font
- remove flipper (reason: 0.74 react native decoupled flipper)
- npm package updates
- close icon changed to close text in QRScanner.tsx

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>
Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>

* [INJIMOB-2381] update android:mosip script as per updated react native version

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] fix android build failure issue

Changes include:
- rename android assets folder as per convention
- remove unused biometrics dependency
- use env from react-native-dotenv as per module registered in babel config
- revert conversion of close icon to image in QRScanner component

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] fix iOS build issue

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] rm unused local images linking in adnroid

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] fix splash screen not rendering issue in android

Issue: Local assets were not loaded via React Native Image component in android, to fix this @react-native/assets-registry has been added
Reference: https://github.com/expo/expo/issues/31240#issuecomment-2459049911

Other changes:
- remove usage of expo-image as we dont have any explicit usecase for expo-image and its unused

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] rm unused intro slider image assets

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] revert back using local font assets in android

Reason: Previously expo-font was used for fonts, to bring back the same compatiblity it is bought back

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] use GestureHandlerRootView in root level to handle gestures

ref - https://docs.swmansion.com/react-native-gesture-handler/docs/1.x/#js

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove custom assets and linking for images in iOS

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] use default parameters instead of defaultProps

Reason: React 18 has marked defaultProps as deprecated and it is removed in React 19 version. To avoid the issue of deprated usage, its modified.

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove unused terminal option in android build script

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove font assets in android

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] optimize import

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] fix failing test

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] set package.resolved version to 2

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] fix setting of camera view in face scanner

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] fix setting of camera view in face compare

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove flipper config file

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove unused debug logs

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] refactor use component instead of type

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] refactor use GestureHandlerRootView only on root level

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] refactor remove unused config linking of font assets

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] refactor remove unused image assets

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] fix camera persmission issue in QRScanner

use expo-camera to request and getstatus of camera permission instead of expo-barcode-scanner to avoid multiple re-renders of scan screen in flow of camera permission denial

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove package expo-barcode-scanner

expo-barcode-scanner is deprecated and its suggested to use expo-camera to handle the scanning flows. The existing bar-code-scanner implementations have been replaced with expo-camera.

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] use extracted enums instead of legacy expo-camera

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove patch for react-native-0.71.8

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] revert date-fs version to 2.28.0

date-fns is not supporting filipino langauge, so we are maintaining patch for that. The patch created is for version 2.28.0 and updating the version of date-fns is causing conflicts in patch application if updated as well. To avoid this issue, version is kept as 2.28.0

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] update readme

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] remove usage of legacy expo-camera in getting image type

Other changes
- remove resolutions block from package.json
- sync pbxproj

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

* [INJIMOB-2381] add active prop to expo-camera as per suggestions

expo-camera suggests "Only one Camera preview can be active at any given time. If you have multiple screens in your app, you should unmount Camera components whenever a screen is unfocused.". To handle this active prop is used which is set to false on unMount of the component whenever rendering Camera from expo-camera

Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>

---------

Signed-off-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>
Signed-off-by: KiruthikaJeyashankar <kiruthikavjshankar@gmail.com>
Signed-off-by: adityankannan-tw <109274996+adityankannan-tw@users.noreply.github.com>
Co-authored-by: Abhishek Paul <paul.apaul.abhishek.ap@gmail.com>
Co-authored-by: adityankannan-tw <109274996+adityankannan-tw@users.noreply.github.com>
2025-04-10 14:37:41 +05:30

400 lines
10 KiB
TypeScript

import React, {useEffect, useRef, useState} from 'react';
import {useTranslation} from 'react-i18next';
import {FlatList, Linking, Pressable, SafeAreaView, View} from 'react-native';
import {Modal} from './ui/Modal';
import {Column, Text} from './ui';
import {Theme} from './ui/styleUtils';
import {BannerNotificationContainer} from './BannerNotificationContainer';
import getAllConfigurations from '../shared/api';
export const HelpScreen: React.FC<HelpScreenProps> = props => {
const {t} = useTranslation('HelpScreen');
const [showHelpPage, setShowHelpPage] = useState(false);
const [injiHelpUrl, setInjiHelpUrl] = useState('');
const listingRef = useRef();
useEffect(() => {
getAllConfigurations().then(response => {
setInjiHelpUrl(response.aboutInjiUrl);
});
}, []);
useEffect(() => {
if (props.source === 'BackUp') {
setTimeout(() => {
if (listingRef?.current != null) {
listingRef.current.scrollToIndex({
index: 18,
animated: true,
});
}
}, 2000);
} else if (props.source == 'keyManagement') {
setTimeout(() => {
if (listingRef?.current != null) {
listingRef.current.scrollToIndex({
index: 26,
animated: true,
});
}
}, 2000);
}
}, [showHelpPage]);
const getTextField = (value: string, component?: React.ReactElement) => {
return (
<Text style={Theme.TextStyles.helpDetails}>
{value} {component}
</Text>
);
};
const getLinkedText = (link: string, linkText: string) => {
return (
<Text
style={Theme.TextStyles.urlLinkText}
onPress={() => {
Linking.openURL(link);
}}>
{linkText}
</Text>
);
};
const BackupFaqMap = [
{
title: t('questions.backup.one'),
data: (
<React.Fragment>{getTextField(t('answers.backup.one'))}</React.Fragment>
),
},
{
title: t('questions.backup.two'),
data: (
<React.Fragment>{getTextField(t('answers.backup.two'))}</React.Fragment>
),
},
{
title: t('questions.backup.three'),
data: (
<React.Fragment>
{getTextField(t('answers.backup.three'))}
</React.Fragment>
),
},
{
title: t('questions.backup.four'),
data: (
<React.Fragment>
{getTextField(t('answers.backup.four'))}
</React.Fragment>
),
},
{
title: t('questions.backup.five'),
data: (
<React.Fragment>
{getTextField(t('answers.backup.five'))}
</React.Fragment>
),
},
{
title: t('questions.backup.six'),
data: (
<React.Fragment>{getTextField(t('answers.backup.six'))}</React.Fragment>
),
},
{
title: t('questions.backup.seven'),
data: (
<React.Fragment>
{getTextField(t('answers.backup.seven'))}
</React.Fragment>
),
},
{
title: t('questions.backup.eight'),
data: (
<React.Fragment>
{getTextField(t('answers.backup.eight'))}
</React.Fragment>
),
},
];
const InjiFaqMap = [
{
title: t('questions.inji.one'),
data: (
<React.Fragment>{getTextField(t('answers.inji.one'))}</React.Fragment>
),
},
{
title: t('questions.inji.two'),
data: (
<React.Fragment>
{getTextField(
t('answers.inji.two'),
getLinkedText(
'https://docs.mosip.io/1.2.0/id-lifecycle-management/identifiers',
t('here'),
),
)}
</React.Fragment>
),
},
{
title: t('questions.inji.three'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.three-a'))}
{getTextField(t('answers.inji.three-b'))}
{getTextField(t('answers.inji.three-c'))}
</React.Fragment>
),
},
{
title: t('questions.inji.four'),
data: (
<React.Fragment>{getTextField(t('answers.inji.four'))}</React.Fragment>
),
},
{
title: t('questions.inji.five'),
data: (
<React.Fragment>{getTextField(t('answers.inji.five'))}</React.Fragment>
),
},
{
title: t('questions.inji.six'),
data: (
<React.Fragment>{getTextField(t('answers.inji.six'))}</React.Fragment>
),
},
{
title: t('questions.inji.seven'),
data: (
<React.Fragment>
{getTextField(
t('answers.inji.seven'),
getLinkedText(
injiHelpUrl +
'/functional-overview/end-user-guide#downloading-vc',
t('here'),
),
)}
</React.Fragment>
),
},
{
title: t('questions.inji.eight'),
data: (
<React.Fragment>{getTextField(t('answers.inji.eight'))}</React.Fragment>
),
},
{
title: t('questions.inji.nine'),
data: (
<React.Fragment>
{getTextField(
t('answers.inji.nine'),
getLinkedText(
injiHelpUrl +
'/functional-overview/end-user-guide#activating-a-vc',
t('here'),
),
)}
</React.Fragment>
),
},
{
title: t('questions.inji.ten'),
data: (
<React.Fragment>
{getTextField(
t('answers.inji.ten-a'),
getLinkedText(
injiHelpUrl +
'/functional-overview/feature-workflows#id-4.-qr-code-login-process',
t('here'),
),
)}
{getTextField(t('answers.inji.ten-b'))}
</React.Fragment>
),
},
{
title: t('questions.inji.eleven'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.eleven'))}
</React.Fragment>
),
},
{
title: t('questions.inji.twelve'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.twelve'))}
</React.Fragment>
),
},
{
title: t('questions.inji.sixteen'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.sixteen'))}
</React.Fragment>
),
},
{
title: t('questions.inji.seventeen'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.seventeen'))}
</React.Fragment>
),
},
{
title: t('questions.inji.thirteen'),
data: (
<React.Fragment>
{getTextField(
t('answers.inji.thirteen-a'),
getLinkedText(
injiHelpUrl + '/functional-overview/end-user-guide#deleting-a-vc',
t('here'),
),
)}
{getTextField(t('answers.inji.thirteen-b'))}
</React.Fragment>
),
},
{
title: t('questions.inji.fourteen'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.fourteen'))}
</React.Fragment>
),
},
{
title: t('questions.inji.fifteen'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.fifteen'))}
</React.Fragment>
),
},
{
title: t('questions.inji.fifteen'),
data: (
<React.Fragment>
{getTextField(t('answers.inji.fifteen'))}
</React.Fragment>
),
},
];
const KeyManagementFaqMap = [
{
title: t('questions.KeyManagement.one'),
data: (
<React.Fragment>
{getTextField(t('answers.KeyManagement.one'))}
</React.Fragment>
),
},
{
title: t('questions.KeyManagement.two'),
data: (
<React.Fragment>
{getTextField(t('answers.KeyManagement.two'))}
</React.Fragment>
),
},
{
title: t('questions.KeyManagement.three'),
data: (
<React.Fragment>
{getTextField(t('answers.KeyManagement.three'))}
</React.Fragment>
),
},
{
title: t('questions.KeyManagement.four'),
data: (
<React.Fragment>
{getTextField(t('answers.KeyManagement.four'))}
</React.Fragment>
),
},
{
title: t('questions.KeyManagement.five'),
data: (
<React.Fragment>
{getTextField(t('answers.KeyManagement.five'))}
</React.Fragment>
),
},
{
title: t('questions.KeyManagement.six'),
data: (
<React.Fragment>
{getTextField(t('answers.KeyManagement.six'))}
</React.Fragment>
),
},
];
return (
<React.Fragment>
<Pressable
disabled={props.isDisabled}
accessible={false}
onPress={() => {
setShowHelpPage(!showHelpPage);
}}>
{props.triggerComponent}
</Pressable>
<Modal
testID="helpScreen"
isVisible={showHelpPage}
headerTitle={t('header')}
headerElevation={2}
onDismiss={() => {
setShowHelpPage(!showHelpPage);
}}>
<BannerNotificationContainer />
<SafeAreaView style={{flex: 1}}>
<Column fill padding="10" align="space-between">
<FlatList
ref={listingRef}
keyExtractor={(item, index) => 'FAQ' + index.toString()}
renderItem={({item}) => (
<View>
<Text style={Theme.TextStyles.helpHeader}>{item.title}</Text>
{item.data}
</View>
)}
data={[...InjiFaqMap, ...BackupFaqMap, ...KeyManagementFaqMap]}
onScrollToIndexFailed={info => {
const wait = new Promise(resolve => setTimeout(resolve, 500));
wait.then(() => {
listingRef.current?.scrollToIndex({
index: info.index,
animated: true,
});
});
}}
/>
</Column>
</SafeAreaView>
</Modal>
</React.Fragment>
);
};
interface HelpScreenProps {
source: 'Inji' | 'BackUp' | 'keyManagement';
triggerComponent: React.ReactElement;
isDisabled?: boolean;
}