diff --git a/.env b/.env
index 0615df933..cffb653fd 100644
--- a/.env
+++ b/.env
@@ -9,3 +9,6 @@ APPLICATION_THEME=orange
#environment can be changed if it is toggled
CREDENTIAL_REGISTRY_EDIT=true
+
+#supported languages( en, fil, ar, hi, kn, ta)
+APPLICATION_LANGUAGE=en
\ No newline at end of file
diff --git a/.github/workflows/clear_artifacts.yml b/.github/workflows/clear_artifacts.yml
index 0af8038ec..d880e16c8 100644
--- a/.github/workflows/clear_artifacts.yml
+++ b/.github/workflows/clear_artifacts.yml
@@ -1,4 +1,7 @@
name: 'Delete old artifacts'
+on:
+ workflow_dispatch:
+name: 'Delete old artifacts'
on:
workflow_dispatch:
@@ -8,5 +11,5 @@ jobs:
steps:
- uses: kolpav/purge-artifacts-action@v1
with:
- token: ${{ secrets. access_token }}
+ token: ${{ secrets.ACTION_PAT }}
expire-in: 2days # Setting this to 0 will delete all artifacts
\ No newline at end of file
diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml
index 85f04e2e5..2934dbe7b 100644
--- a/android/app/src/main/res/values/colors.xml
+++ b/android/app/src/main/res/values/colors.xml
@@ -1,6 +1,6 @@
- #ffffff
+ #F59B4B
#FFFFFF
#023c69
#ffffff
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 69e98b68e..ff10a980a 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -4,6 +4,6 @@
MOSIP Resident App - Mosip/Inji
MOSIP Resident App - Newlogic
MOSIP Resident App - PH
- contain
+ cover
false
\ No newline at end of file
diff --git a/app.config.ts b/app.config.ts
index f2b8a0061..92da0424b 100644
--- a/app.config.ts
+++ b/app.config.ts
@@ -6,7 +6,7 @@ export default {
icon: './assets/icon.png',
splash: {
image: './assets/splash.png',
- resizeMode: 'contain',
+ resizeMode: 'cover',
backgroundColor: '#ffffff',
},
updates: {
diff --git a/assets/Secure-Sharing.png b/assets/Secure-Sharing.png
new file mode 100644
index 000000000..f635f8da4
Binary files /dev/null and b/assets/Secure-Sharing.png differ
diff --git a/assets/Secure-Sharing2.png b/assets/Secure-Sharing2.png
new file mode 100644
index 000000000..ae2d449d4
Binary files /dev/null and b/assets/Secure-Sharing2.png differ
diff --git a/assets/biometric-unlock-icon.png b/assets/biometric-unlock-icon.png
new file mode 100644
index 000000000..1a6f10771
Binary files /dev/null and b/assets/biometric-unlock-icon.png differ
diff --git a/assets/digital-identity-icon.png b/assets/digital-identity-icon.png
new file mode 100644
index 000000000..5a678a4df
Binary files /dev/null and b/assets/digital-identity-icon.png differ
diff --git a/assets/features-walkaround-icon.png b/assets/features-walkaround-icon.png
new file mode 100644
index 000000000..b6a363102
Binary files /dev/null and b/assets/features-walkaround-icon.png differ
diff --git a/assets/help-icon.png b/assets/help-icon.png
new file mode 100644
index 000000000..3346d8fcc
Binary files /dev/null and b/assets/help-icon.png differ
diff --git a/assets/inji-home-logo.png b/assets/inji-home-logo.png
new file mode 100644
index 000000000..f8c595958
Binary files /dev/null and b/assets/inji-home-logo.png differ
diff --git a/assets/inji-logo-white.png b/assets/inji-logo-white.png
new file mode 100644
index 000000000..85505a13e
Binary files /dev/null and b/assets/inji-logo-white.png differ
diff --git a/assets/inji_small_logo.png b/assets/inji_small_logo.png
new file mode 100644
index 000000000..f70091869
Binary files /dev/null and b/assets/inji_small_logo.png differ
diff --git a/assets/intro-scanner.png b/assets/intro-scanner.png
new file mode 100644
index 000000000..fd8876e37
Binary files /dev/null and b/assets/intro-scanner.png differ
diff --git a/assets/intro-wallet-binding.png b/assets/intro-wallet-binding.png
new file mode 100644
index 000000000..fa59b5de1
Binary files /dev/null and b/assets/intro-wallet-binding.png differ
diff --git a/assets/legal-notices-icon.png b/assets/legal-notices-icon.png
new file mode 100644
index 000000000..69884e7c4
Binary files /dev/null and b/assets/legal-notices-icon.png differ
diff --git a/assets/lock-icon.png b/assets/lock-icon.png
new file mode 100644
index 000000000..147780f87
Binary files /dev/null and b/assets/lock-icon.png differ
diff --git a/assets/magnifier-zoom.png b/assets/magnifier-zoom.png
new file mode 100644
index 000000000..cbbc2153b
Binary files /dev/null and b/assets/magnifier-zoom.png differ
diff --git a/assets/otp-mobile-logo.png b/assets/otp-mobile-logo.png
index 4e6eaa73d..8a8a4a521 100644
Binary files a/assets/otp-mobile-logo.png and b/assets/otp-mobile-logo.png differ
diff --git a/assets/phone_mockup_1.png b/assets/phone_mockup_1.png
new file mode 100644
index 000000000..5e52fdc80
Binary files /dev/null and b/assets/phone_mockup_1.png differ
diff --git a/assets/progressing-logo.png b/assets/progressing-logo.png
new file mode 100644
index 000000000..dc8d0b74c
Binary files /dev/null and b/assets/progressing-logo.png differ
diff --git a/assets/receive-card-icon.png b/assets/receive-card-icon.png
new file mode 100644
index 000000000..b0db01a00
Binary files /dev/null and b/assets/receive-card-icon.png differ
diff --git a/assets/received-cards-icon.png b/assets/received-cards-icon.png
new file mode 100644
index 000000000..52afc034c
Binary files /dev/null and b/assets/received-cards-icon.png differ
diff --git a/assets/splash.png b/assets/splash.png
index 48c75eb72..df0075df5 100644
Binary files a/assets/splash.png and b/assets/splash.png differ
diff --git a/components/ActivityLogText.tsx b/components/ActivityLogText.tsx
index 3ef069070..937873c86 100644
--- a/components/ActivityLogText.tsx
+++ b/components/ActivityLogText.tsx
@@ -14,6 +14,7 @@ export const ActivityLogText: React.FC<{ activity: ActivityLog }> = (props) => {
);
};
diff --git a/components/DeviceInfoList.tsx b/components/DeviceInfoList.tsx
index 30e5d9b55..1d131b5cc 100644
--- a/components/DeviceInfoList.tsx
+++ b/components/DeviceInfoList.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
-import { TextItem } from './ui/TextItem';
+import { Text } from './ui';
export const DeviceInfoList: React.FC = (props) => {
const { t } = useTranslation('DeviceInfoList');
@@ -17,7 +17,6 @@ export const DeviceInfoList: React.FC = (props) => {
};
interface DeviceInfoProps {
- of: 'sender' | 'receiver';
deviceInfo: DeviceInfo;
}
diff --git a/components/EditableListItem.tsx b/components/EditableListItem.tsx
index 75f71f1aa..bbf995fe7 100644
--- a/components/EditableListItem.tsx
+++ b/components/EditableListItem.tsx
@@ -18,24 +18,27 @@ export const EditableListItem: React.FC = (props) => {
}, [props.credentialRegistryResponse]);
return (
- setIsEditing(true)}
- style={{ display: props.display }}>
+ setIsEditing(true)}>
- {props.label}
+
+ {props.label}
+
{props.value}
-
+
void;
display?: 'none' | 'flex';
credentialRegistryResponse: string;
diff --git a/components/HelpScreen.tsx b/components/HelpScreen.tsx
new file mode 100644
index 000000000..3b2b74ef6
--- /dev/null
+++ b/components/HelpScreen.tsx
@@ -0,0 +1,75 @@
+import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Pressable } from 'react-native';
+import { Modal } from './ui/Modal';
+import { ScrollView } from 'react-native-gesture-handler';
+import { MainRouteProps } from '../routes/main';
+import { Column, Text } from './ui';
+import { Theme } from './ui/styleUtils';
+
+export const HelpScreen: React.FC = (
+ props
+) => {
+ const { t } = useTranslation('HelpScreen');
+
+ const [showHelpPage, setShowHelpPage] = useState(false);
+
+ return (
+
+ {
+ setShowHelpPage(!showHelpPage);
+ }}>
+ {props.triggerComponent}
+
+ {
+ setShowHelpPage(!showHelpPage);
+ }}>
+
+
+
+ {t('whatIsDigitalCredential?')}
+
+ {t('detail-1')}
+
+ {t('whatCanDoWithDigitalCredential?')}
+
+ {t('detail-2')}
+
+ {t('howToAddCard?')}
+
+ {t('detail-3')}
+
+ {t('howToRemoveCardFromWallet?')}
+
+ {t('detail-4')}
+
+ {t('canWeAddMultipleCards?')}
+
+ {t('detail-5')}
+
+ {t('howToShareCard?')}
+
+ {t('detail-6')}
+
+ {t('howToActivateCardForOnlineLogin?')}
+
+ {t('detail-7')}
+
+ {t('howToViewActivity?')}
+
+ {t('detail-8')}
+
+
+
+
+ );
+};
+
+interface HelpScreenProps {
+ triggerComponent: React.ReactElement;
+}
diff --git a/components/KebabPopUp.tsx b/components/KebabPopUp.tsx
new file mode 100644
index 000000000..12c7111b1
--- /dev/null
+++ b/components/KebabPopUp.tsx
@@ -0,0 +1,93 @@
+import React from 'react';
+import { BottomSheet, Icon, ListItem } from 'react-native-elements';
+import { Theme } from '../components/ui/styleUtils';
+import { Centered, Column, Row, Text } from '../components/ui';
+import { WalletBinding } from '../screens/Home/MyVcs/WalletBinding';
+import { Pressable } from 'react-native';
+import { useKebabPopUp } from './KebabPopUpController';
+import { ActorRefFrom } from 'xstate';
+import { vcItemMachine } from '../machines/vcItem';
+import { useTranslation } from 'react-i18next';
+import { HistoryTab } from '../screens/Home/MyVcs/HistoryTab';
+import { RemoveVcWarningOverlay } from '../screens/Home/MyVcs/RemoveVcWarningOverlay';
+
+export const KebabPopUp: React.FC = (props) => {
+ const controller = useKebabPopUp(props);
+ const { t } = useTranslation('HomeScreenKebabPopUp');
+ return (
+
+
+
+
+ {t('title')}
+
+
+
+
+
+
+
+
+ {props.vcKey.split(':')[4] == 'true'
+ ? t('unPinCard')
+ : t('pinCard')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ controller.REMOVE(props.vcKey)}>
+
+ {t('removeFromWallet')}
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export interface KebabPopUpProps {
+ iconName: string;
+ iconType?: string;
+ vcKey: string;
+ isVisible: boolean;
+ onDismiss: () => void;
+ service: ActorRefFrom;
+}
diff --git a/components/KebabPopUpController.tsx b/components/KebabPopUpController.tsx
new file mode 100644
index 000000000..292415344
--- /dev/null
+++ b/components/KebabPopUpController.tsx
@@ -0,0 +1,80 @@
+import { useSelector } from '@xstate/react';
+import { ActorRefFrom } from 'xstate';
+import {
+ selectKebabPopUpWalletBindingInProgress,
+ selectKebabPopUp,
+ selectKebabPopUpAcceptingBindingOtp,
+ selectKebabPopUpBindingWarning,
+ selectRemoveWalletWarning,
+ selectEmptyWalletBindingId,
+ selectIsPinned,
+ selectOtpError,
+ selectShowWalletBindingError,
+ selectWalletBindingError,
+ VcItemEvents,
+ vcItemMachine,
+ selectShowActivities,
+} from '../machines/vcItem';
+import { selectActivities } from '../machines/activityLog';
+import { GlobalContext } from '../shared/GlobalContext';
+import { useContext } from 'react';
+
+export function useKebabPopUp(props) {
+ const service = props.service as ActorRefFrom;
+ const PIN_CARD = () => service.send(VcItemEvents.PIN_CARD());
+ const KEBAB_POPUP = () => service.send(VcItemEvents.KEBAB_POPUP());
+ const ADD_WALLET_BINDING_ID = () =>
+ service.send(VcItemEvents.ADD_WALLET_BINDING_ID());
+ const CONFIRM = () => service.send(VcItemEvents.CONFIRM());
+ const REMOVE = (vcKey: string) => service.send(VcItemEvents.REMOVE(vcKey));
+ const DISMISS = () => service.send(VcItemEvents.DISMISS());
+ const CANCEL = () => service.send(VcItemEvents.CANCEL());
+ const SHOW_ACTIVITY = () => service.send(VcItemEvents.SHOW_ACTIVITY());
+ const INPUT_OTP = (otp: string) => service.send(VcItemEvents.INPUT_OTP(otp));
+ const isPinned = useSelector(service, selectIsPinned);
+ const isBindingWarning = useSelector(service, selectKebabPopUpBindingWarning);
+ const isRemoveWalletWarning = useSelector(service, selectRemoveWalletWarning);
+ const isAcceptingOtpInput = useSelector(
+ service,
+ selectKebabPopUpAcceptingBindingOtp
+ );
+ const isWalletBindingError = useSelector(
+ service,
+ selectShowWalletBindingError
+ );
+ const otpError = useSelector(service, selectOtpError);
+ const walletBindingError = useSelector(service, selectWalletBindingError);
+ const WalletBindingInProgress = useSelector(
+ service,
+ selectKebabPopUpWalletBindingInProgress
+ );
+ const emptyWalletBindingId = useSelector(service, selectEmptyWalletBindingId);
+ const isKebabPopUp = useSelector(service, selectKebabPopUp);
+ const isShowActivities = useSelector(service, selectShowActivities);
+ const { appService } = useContext(GlobalContext);
+ const activityLogService = appService.children.get('activityLog');
+
+ return {
+ isPinned,
+ PIN_CARD,
+ KEBAB_POPUP,
+ ADD_WALLET_BINDING_ID,
+ CONFIRM,
+ DISMISS,
+ REMOVE,
+ CANCEL,
+ INPUT_OTP,
+ SHOW_ACTIVITY,
+ isBindingWarning,
+ isAcceptingOtpInput,
+ isWalletBindingError,
+ walletBindingError,
+ otpError,
+ WalletBindingInProgress,
+ emptyWalletBindingId,
+ isKebabPopUp,
+ isShowActivities,
+ isRemoveWalletWarning,
+ activities: useSelector(activityLogService, selectActivities),
+ };
+}
diff --git a/components/MessageOverlay.tsx b/components/MessageOverlay.tsx
index cb07cbed0..1b7aec303 100644
--- a/components/MessageOverlay.tsx
+++ b/components/MessageOverlay.tsx
@@ -14,14 +14,33 @@ export const MessageOverlay: React.FC = (props) => {
overlayStyle={Theme.MessageOverlayStyles.overlay}
onShow={props.onShow}
onBackdropPress={props.onBackdropPress}>
-
-
+
+
{props.title && (
-
+
{props.title}
)}
- {props.message && {props.message}}
+ {props.message && (
+
+ {props.message}
+
+ )}
{props.progress && }
{props.hint && (
= (props) => {
{!props.children && props.onCancel ? (
diff --git a/components/VcItem.tsx b/components/VcItem.tsx
index 18a147d58..fae5daf37 100644
--- a/components/VcItem.tsx
+++ b/components/VcItem.tsx
@@ -12,6 +12,7 @@ import {
selectEmptyWalletBindingId,
selectStoreError,
selectIsSavingFailedInIdle,
+ selectKebabPopUp,
} from '../machines/vcItem';
import { VcItemEvents } from '../machines/vcItem';
import { ErrorMessageOverlay } from '../components/MessageOverlay';
@@ -19,6 +20,8 @@ import { Theme } from './ui/styleUtils';
import { GlobalContext } from '../shared/GlobalContext';
import { VcItemContent } from './VcItemContent';
import { VcItemActivationStatus } from './VcItemActivationStatus';
+import { Row } from './ui';
+import { KebabPopUp } from './KebabPopUp';
export const VcItem: React.FC = (props) => {
const { appService } = useContext(GlobalContext);
@@ -33,9 +36,11 @@ export const VcItem: React.FC = (props) => {
const context = useSelector(service, selectContext);
const verifiableCredential = useSelector(service, selectVerifiableCredential);
const emptyWalletBindingId = useSelector(service, selectEmptyWalletBindingId);
+ const isKebabPopUp = useSelector(service, selectKebabPopUp);
+ const DISMISS = () => service.send(VcItemEvents.DISMISS());
+ const KEBAB_POPUP = () => service.send(VcItemEvents.KEBAB_POPUP());
const storeError = useSelector(service, selectStoreError);
const isSavingFailedInIdle = useSelector(service, selectIsSavingFailedInIdle);
- const DISMISS = () => service.send(VcItemEvents.DISMISS());
let storeErrorTranslationPath = 'errors.savingFailed';
@@ -63,16 +68,34 @@ export const VcItem: React.FC = (props) => {
verifiableCredential={verifiableCredential}
generatedOn={generatedOn}
tag={tag}
+ selectable={props.selectable}
+ selected={props.selected}
+ service={service}
+ iconName={props.iconName}
+ iconType={props.iconType}
+ onPress={() => props.onPress(service)}
/>
- {props.activeTab !== 'receivedVcsTab' &&
- props.activeTab != 'sharingVcScreen' && (
- props.onPress(service)}
- showOnlyBindedVc={props.showOnlyBindedVc}
+
+ {props.activeTab !== 'receivedVcsTab' &&
+ props.activeTab != 'sharingVcScreen' && (
+ props.onPress(service)}
+ showOnlyBindedVc={props.showOnlyBindedVc}
+ />
+ )}
+
+
- )}
+
+
) => void;
onShow?: (vcRef?: ActorRefFrom) => void;
activeTab?: string;
+ iconName?: string;
+ iconType?: string;
}
diff --git a/components/VcItemActivationStatus.tsx b/components/VcItemActivationStatus.tsx
index 061a06e61..c34c5c7dd 100644
--- a/components/VcItemActivationStatus.tsx
+++ b/components/VcItemActivationStatus.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
-import { Dimensions, Pressable } from 'react-native';
+import { Dimensions } from 'react-native';
import { Icon } from 'react-native-elements';
import { ActorRefFrom } from 'xstate';
import { vcItemMachine } from '../machines/vcItem';
@@ -58,15 +58,6 @@ const WalletUnverifiedActivationDetails: React.FC<
}
children={t('offlineAuthDisabledHeader')}>
-
- (props.verifiableCredential ? props.onPress() : null)}>
-
-
);
};
@@ -98,16 +89,6 @@ const WalletVerifiedActivationDetails: React.FC = (
}
children={t('profileAuthenticated')}>
-
- {props.showOnlyBindedVc ? null : (
- props.onPress()}>
-
-
- )}
);
};
diff --git a/components/VcItemContent.tsx b/components/VcItemContent.tsx
index fa8d2fa06..261ce4882 100644
--- a/components/VcItemContent.tsx
+++ b/components/VcItemContent.tsx
@@ -8,6 +8,7 @@ import { VcItemTags } from './VcItemTags';
import VerifiedIcon from './VerifiedIcon';
import { Column, Row, Text } from './ui';
import { Theme } from './ui/styleUtils';
+import { CheckBox, Icon } from 'react-native-elements';
const getDetails = (arg1, arg2, verifiableCredential) => {
if (arg1 === 'Status') {
@@ -71,113 +72,122 @@ const getDetails = (arg1, arg2, verifiableCredential) => {
}
};
-export const VcItemContent: React.FC = ({
- context,
- verifiableCredential,
- generatedOn,
- tag,
-}) => {
+export const VcItemContent: React.FC = (props) => {
//Assigning the UIN and VID from the VC details to display the idtype label
- const uin = verifiableCredential?.credentialSubject.UIN;
- const vid = verifiableCredential?.credentialSubject.VID;
- const fullName = !verifiableCredential
+ const uin = props.verifiableCredential?.credentialSubject.UIN;
+ const vid = props.verifiableCredential?.credentialSubject.VID;
+ const fullName = !props.verifiableCredential
? ''
- : getLocalizedField(verifiableCredential.credentialSubject.fullName);
+ : getLocalizedField(props.verifiableCredential.credentialSubject.fullName);
const { t } = useTranslation('VcDetails');
+ const isvalid = !props.verifiableCredential ? '' : t('valid');
+ const selectableOrCheck = props.selectable ? (
+ }
+ uncheckedIcon={}
+ onPress={() => props.onPress()}
+ />
+ ) : null;
return (
-
-
-
- {t('idType')}
-
-
- {t('nationalCard')}
-
-
-
-
-
-
-
-
-
+
+
+
+ {props.iconName && (
+
+ )}
+
+
+ {getDetails(t('fullName'), fullName, props.verifiableCredential)}
+
+
+
+ weight="semibold"
+ size="smaller"
+ align="left">
+ {t('idType')}
+
+
+ {t('nationalCard')}
+
+
+
+
-
- {getDetails(t('fullName'), fullName, verifiableCredential)}
- {!verifiableCredential
- ? getDetails(t('id'), uin || vid, verifiableCredential)
- : null}
- {uin ? getDetails(t('uin'), uin, verifiableCredential) : null}
- {vid ? getDetails(t('vid'), vid, verifiableCredential) : null}
- {getDetails(t('generatedOn'), generatedOn, verifiableCredential)}
- {getDetails(t('status'), t('valid'), verifiableCredential)}
+
+ {props.verifiableCredential ? selectableOrCheck : null}
-
+
- {!verifiableCredential && (
-
- )}
-
-
+
+
+ {uin ? getDetails(t('uin'), uin, props.verifiableCredential) : null}
+ {vid ? getDetails(t('vid'), vid, props.verifiableCredential) : null}
+ {!props.verifiableCredential
+ ? getDetails(t('id'), uin || vid, props.verifiableCredential)
+ : null}
+ {getDetails(
+ t('generatedOn'),
+ props.generatedOn,
+ props.verifiableCredential
+ )}
+
+
+ {props.verifiableCredential
+ ? getDetails(t('status'), isvalid, props.verifiableCredential)
+ : null}
+
+
+
+
+
+
+
);
};
@@ -187,4 +197,10 @@ interface VcItemContentProps {
verifiableCredential: VerifiableCredential;
generatedOn: string;
tag: string;
+ selectable: boolean;
+ selected: boolean;
+ iconName?: string;
+ iconType?: string;
+ service: any;
+ onPress?: () => void;
}
diff --git a/components/ui/Button.tsx b/components/ui/Button.tsx
index e607772bd..c5d58a89b 100644
--- a/components/ui/Button.tsx
+++ b/components/ui/Button.tsx
@@ -8,7 +8,7 @@ import { Text } from './Text';
import { Theme, Spacing } from './styleUtils';
export const Button: React.FC = (props) => {
- const type = props.type || 'solid';
+ const type = props.type || 'solid' || 'radius' || 'gradient';
const buttonStyle: StyleProp = [
props.fill ? Theme.ButtonStyles.fill : null,
Theme.ButtonStyles[type],
@@ -16,9 +16,14 @@ export const Button: React.FC = (props) => {
];
const containerStyle: StyleProp = [
- Theme.ButtonStyles.container,
+ !(type === 'gradient') ? Theme.ButtonStyles.container : null,
props.disabled ? Theme.ButtonStyles.disabled : null,
props.margin ? Theme.spacing('margin', props.margin) : null,
+ type === 'gradient'
+ ? props.isVcThere
+ ? Theme.ButtonStyles.float
+ : Theme.ButtonStyles.gradient
+ : null,
props.styles,
];
@@ -28,7 +33,7 @@ export const Button: React.FC = (props) => {
}
};
- return (
+ return !(type === 'gradient') ? (
= (props) => {
color={
type === 'solid' || type === 'addId' || type === 'radius'
? Theme.Colors.whiteText
+ : type === 'plain'
+ ? Theme.Colors.plainText
: Theme.Colors.AddIdBtnTxt
}>
{props.title}
@@ -54,6 +61,35 @@ export const Button: React.FC = (props) => {
onPress={handleOnPress}
loading={props.loading}
/>
+ ) : (
+
+ {props.title}
+
+ }
+ buttonStyle={!props.isVcThere ? { height: 45 } : { height: 42 }}
+ icon={props.icon}
+ onPress={handleOnPress}
+ loading={props.loading}
+ />
);
};
@@ -62,10 +98,12 @@ interface ButtonProps {
disabled?: boolean;
margin?: Spacing;
type?: RNEButtonProps['type'];
+ isVcThere?: boolean;
onPress?: RNEButtonProps['onPress'];
fill?: boolean;
raised?: boolean;
loading?: boolean;
icon?: RNEButtonProps['icon'];
styles?: StyleProp;
+ colors?: (string | number)[];
}
diff --git a/components/ui/Modal.tsx b/components/ui/Modal.tsx
index 2d3a09c8b..2bcc64d23 100644
--- a/components/ui/Modal.tsx
+++ b/components/ui/Modal.tsx
@@ -2,9 +2,13 @@ import React from 'react';
import { I18nManager, Modal as RNModal, View } from 'react-native';
import { Icon } from 'react-native-elements';
import { Column, Row, Text } from '.';
+import { useSendVcScreen } from '../../screens/Scan/SendVcScreenController';
+import { DeviceInfoList } from '../DeviceInfoList';
import { ElevationLevel, Theme } from './styleUtils';
export const Modal: React.FC = (props) => {
+ const controller = useSendVcScreen();
+
return (
= (props) => {
flex: 1,
flexDirection: 'row',
alignItems: 'center',
- marginHorizontal: 21,
- marginVertical: 16,
+ marginHorizontal: 18,
+ marginVertical: 8,
}}>
{props.headerRight ? (
= (props) => {
name="arrow-left"
type="material-community"
onPress={props.onDismiss}
- color={Theme.Colors.Details}
+ containerStyle={Theme.Styles.backArrowContainer}
+ color={Theme.Colors.Icon}
/>
) : null}
-
- {props.headerTitle}
+
+
+
+ {props.headerTitle || props.headerLeft}
+
+ {!props.requester ? (
+
+ {props.headerLabel}
+
+ ) : (
+
+
+
+ )}
+
{props.headerRight || props.arrowLeft || (
)}
@@ -57,10 +89,14 @@ export const Modal: React.FC = (props) => {
export interface ModalProps {
isVisible: boolean;
- onDismiss: () => void;
+ requester?: boolean;
+ onDismiss?: () => void;
headerTitle?: string;
headerElevation?: ElevationLevel;
+ headerLabel?: string;
+ headerLabelColor?: string;
headerRight?: React.ReactElement;
+ headerLeft?: React.ReactElement;
arrowLeft?: React.ReactElement;
onShow?: () => void;
}
diff --git a/components/ui/SetupPicker.tsx b/components/ui/SetupPicker.tsx
new file mode 100644
index 000000000..eb45caf02
--- /dev/null
+++ b/components/ui/SetupPicker.tsx
@@ -0,0 +1,69 @@
+import React, { useEffect, useState } from 'react';
+import { Dimensions } from 'react-native';
+import { Icon, ListItem } from 'react-native-elements';
+import { Column } from './Layout';
+import { Text } from './Text';
+import { Theme } from './styleUtils';
+
+interface Picker extends React.VFC> {
+ (props: PickerProps): ReturnType;
+}
+
+export const SetupPicker: Picker = (props: PickerProps) => {
+ const [isContentVisible, setIsContentVisible] = useState(false);
+ const [selectedIndex, setSelectedIndex] = useState(-1);
+
+ useEffect(() => {
+ setSelectedIndex(
+ props.items.findIndex(({ value }) => value === props.selectedValue)
+ );
+ }, [props.selectedValue]);
+
+ const toggleContent = () => setIsContentVisible(!isContentVisible);
+
+ const selectItem = (index: number) => {
+ setSelectedIndex(index);
+ props.onValueChange(props.items[index].value, index);
+ toggleContent();
+ };
+
+ return (
+
+ {props.items.map((item, index) => (
+ selectItem(index)}
+ key={index}>
+
+
+
+ {item.label}
+
+
+
+ {selectedIndex === index ? (
+
+ ) : (
+
+ )}
+
+ ))}
+
+ );
+};
+
+interface PickerProps {
+ items: PickerItem[];
+ selectedValue: T;
+ onValueChange: (value: T, index: number) => void;
+}
+
+interface PickerItem {
+ label: string;
+ value: T;
+}
diff --git a/components/ui/Text.tsx b/components/ui/Text.tsx
index 30b132264..26244550b 100644
--- a/components/ui/Text.tsx
+++ b/components/ui/Text.tsx
@@ -28,7 +28,7 @@ interface TextProps {
weight?: 'regular' | 'semibold' | 'bold';
align?: TextStyle['textAlign'];
margin?: Spacing;
- size?: 'small' | 'smaller' | 'regular';
+ size?: 'small' | 'smaller' | 'regular' | 'large';
lineHeight?: number;
numLines?: number;
style?: StyleProp;
diff --git a/components/ui/TextItem.tsx b/components/ui/TextItem.tsx
index 448068833..a10f3d2ee 100644
--- a/components/ui/TextItem.tsx
+++ b/components/ui/TextItem.tsx
@@ -10,10 +10,17 @@ export const TextItem: React.FC = (props) => {
pX={24}
pY={props.label ? 16 : 12}
style={{
- borderBottomColor: Theme.Colors.borderBottomColor,
- borderBottomWidth: props.divider ? 1 : 0,
+ borderColor: Theme.Colors.borderBottomColor,
+ borderBottomWidth: props.divider ? 2 : 0,
+ borderTopWidth: props.topDivider ? 2 : 0,
alignItems: 'flex-start',
}}>
+
+ {props.text}
+
{props.label && (
= (props) => {
{props.label}
)}
-
- {props.text}
-
);
};
@@ -37,5 +38,6 @@ interface TextItemProps {
text: string;
label?: string;
divider?: boolean;
+ topDivider?: boolean;
margin?: string;
}
diff --git a/components/ui/themes/DefaultTheme.ts b/components/ui/themes/DefaultTheme.ts
index 099ec1b69..25cf72880 100644
--- a/components/ui/themes/DefaultTheme.ts
+++ b/components/ui/themes/DefaultTheme.ts
@@ -1,25 +1,39 @@
/* eslint-disable sonarjs/no-duplicate-string */
import { Dimensions, StyleSheet, ViewStyle } from 'react-native';
import { Spacing } from '../styleUtils';
+import { colors } from 'react-native-elements';
const Colors = {
- Black: '#231F20',
- Grey: '#B0B0B0',
+ Black: '#000000',
+ Zambezi: '#5F5F5F',
+ Grey: '#C7C7C7',
Grey5: '#E0E0E0',
Grey6: '#F2F2F2',
+ Gray40: '#666666',
+ Gray44: '#707070',
Gray9: '#171717',
DimGray: '#737373',
Orange: '#F2811D',
- LightGrey: '#f7f5f0',
+ LightGrey: '#F5F5F5',
+ ShadeOfGrey: '#6F6F6F',
White: '#FFFFFF',
- Red: '#EB5757',
- Green: '#219653',
+ Red: '#D52929',
+ Green: '#4B9D20',
Transparent: 'transparent',
Warning: '#f0ad4e',
- LightOrange: '#fce7e3',
+ GrayText: '#6F6F6F',
+ dorColor: '#CBCBCB',
+ plainText: '#FFD6A7',
+ walletbindingLabel: '#000000',
+ LightOrange: '#FDF1E6',
+ GradientColors: ['#F59B4B', '#E86E04'],
+ DisabledColors: ['#C7C7C7', '#C7C7C7'],
+ TimeoutHintBoxColor: '#FFF7E5',
+ TimoutText: '#8B6105',
+ resendCodeTimer: '#555555',
};
-export type ElevationLevel = 0 | 1 | 2 | 3 | 4 | 5;
+export type ElevationLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6;
export const DefaultTheme = {
Colors: {
@@ -29,17 +43,20 @@ export const DefaultTheme = {
LoadingDetailsLabel: Colors.Orange,
AddIdBtnBg: Colors.Orange,
AddIdBtnTxt: Colors.Orange,
- ClearAddIdBtnBg: Colors.Transparent,
+ DownloadIdBtnTxt: Colors.White,
Loading: Colors.Orange,
+ Cursor: Colors.Orange,
noUinText: Colors.Orange,
IconBg: Colors.Orange,
+ popUp: Colors.Green,
Icon: Colors.Orange,
GrayIcon: Colors.Grey,
+ helpText: Colors.Gray44,
borderBottomColor: Colors.Grey6,
whiteBackgroundColor: Colors.White,
lightGreyBackgroundColor: Colors.LightGrey,
profileLanguageValue: Colors.Grey,
- profileVersion: Colors.Grey,
+ aboutVersion: Colors.Gray40,
profileAuthFactorUnlock: Colors.Grey,
profileLabel: Colors.Black,
profileValue: Colors.Grey,
@@ -51,6 +68,7 @@ export const DefaultTheme = {
loadingLabel: Colors.Grey6,
textLabel: Colors.Grey,
textValue: Colors.Black,
+ requesterName: Colors.Red,
errorMessage: Colors.Red,
QRCodeBackgroundColor: Colors.LightGrey,
ReceiveVcModalBackgroundColor: Colors.LightGrey,
@@ -59,15 +77,28 @@ export const DefaultTheme = {
whiteText: Colors.White,
flipCameraIcon: Colors.Black,
IdInputModalBorder: Colors.Grey,
+ RetrieveIdLabel: Colors.ShadeOfGrey,
inputSelection: Colors.Orange,
checkCircleIcon: Colors.White,
OnboardingCircleIcon: Colors.White,
OnboardingCloseIcon: Colors.White,
WarningIcon: Colors.Warning,
+ DefaultToggle: Colors.LightOrange,
ProfileIconBg: Colors.LightOrange,
- Cursor: Colors.Orange,
- version: Colors.DimGray,
- poweredByBLE: Colors.Gray9,
+ GrayText: Colors.GrayText,
+ gradientBtn: ['#F59B4B', '#E86E04'],
+ dotColor: Colors.dorColor,
+ plainText: Colors.plainText,
+ IconBackground: Colors.LightOrange,
+ GradientColors: Colors.GradientColors,
+ DisabledColors: Colors.DisabledColors,
+ getVidColor: Colors.Zambezi,
+ TimeoutHintBoxColor: Colors.TimeoutHintBoxColor,
+ TimoutText: Colors.TimoutText,
+ walletbindingLabel: Colors.Black,
+ walletbindingContent: Colors.Gray40,
+ resendCodeTimer: Colors.resendCodeTimer,
+ statusLabel: Colors.Black,
},
Styles: StyleSheet.create({
title: {
@@ -117,6 +148,31 @@ export const DefaultTheme = {
borderRadius: 4,
},
cardDetailsContainer: {},
+ bottomTabIconStyle: {
+ padding: 4,
+ width: 36,
+ height: 36,
+ borderRadius: 6,
+ backgroundColor: Colors.LightOrange,
+ },
+ popUp: {
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ backgroundColor: Colors.Green,
+ height: 39,
+ position: 'relative',
+ paddingHorizontal: 12,
+ },
+ homeScreenContainer: {
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderRadius: 10,
+ backgroundColor: '#fff',
+ shadowColor: '#000',
+ shadowOpacity: 0.4,
+ elevation: 5,
+ padding: 10,
+ },
vertloadingContainer: {
flex: 1,
backgroundColor: Colors.Grey6,
@@ -127,10 +183,11 @@ export const DefaultTheme = {
flex: 1,
justifyContent: 'flex-start',
},
- logoContainer: {
+ closecardMosipLogo: {
flex: 1,
flexDirection: 'row',
justifyContent: 'flex-end',
+ alignSelf: 'flex-end',
marginLeft: 300,
},
closeCardBgContainer: {
@@ -144,10 +201,16 @@ export const DefaultTheme = {
elevation: 4,
},
selectedBindedVc: {
+ borderRadius: 15,
+ margin: 5,
+ borderWidth: 3,
+ borderColor: Colors.Green,
+ },
+ selectedVc: {
borderRadius: 10,
margin: 5,
borderWidth: 2,
- borderColor: Colors.Green,
+ borderColor: Colors.Orange,
},
labelPartContainer: {
marginLeft: 16,
@@ -166,7 +229,7 @@ export const DefaultTheme = {
width: 100,
},
bottomButtonsContainer: {
- height: 120,
+ height: 'auto',
borderTopLeftRadius: 27,
borderTopRightRadius: 27,
padding: 6,
@@ -227,9 +290,8 @@ export const DefaultTheme = {
height: 35,
width: 90,
},
- loadingCardDetailsHeader: {
+ homeCloseCardDetailsHeader: {
flex: 1,
- justifyContent: 'space-between',
},
cardDetailsHeader: {
flex: 1,
@@ -252,6 +314,38 @@ export const DefaultTheme = {
borderRadius: 6,
backgroundColor: Colors.LightOrange,
},
+ IconContainer: {
+ padding: 6,
+ width: 36,
+ marginRight: 4,
+ marginLeft: 10,
+ height: 36,
+ borderRadius: 10,
+ backgroundColor: Colors.LightOrange,
+ },
+ settingsIconBg: {
+ padding: 6,
+ width: 36,
+ marginRight: 4,
+ height: 36,
+ backgroundColor: Colors.Transparent,
+ },
+ backArrowContainer: {
+ padding: 6,
+ width: 36,
+ height: 36,
+ borderRadius: 10,
+ backgroundColor: Colors.LightOrange,
+ },
+ receiveCardsContainer: {
+ height: Dimensions.get('window').height * 0.12,
+ width: Dimensions.get('window').width * 0.45,
+ alignItems: 'center',
+ borderBottomRightRadius: 0,
+ padding: 15,
+ marginVertical: 18,
+ elevation: 1,
+ },
domainVerifiyIcon: {
padding: 20,
marginLeft: 120,
@@ -272,24 +366,28 @@ export const DefaultTheme = {
height: 135,
borderRadius: 5,
},
+ versionContainer: {
+ backgroundColor: Colors.Grey6,
+ margin: 4,
+ borderRadius: 14,
+ },
scannerContainer: {
- borderWidth: 4,
- borderColor: Colors.Black,
borderRadius: 32,
- justifyContent: 'center',
- height: 300,
- width: 300,
+ alignSelf: 'center',
+ height: 330,
+ width: 320,
overflow: 'hidden',
- marginLeft: 18,
+ marginTop: -65,
},
scanner: {
height: 400,
width: '100%',
margin: 'auto',
},
- flipIconButton: {
- alignSelf: 'center',
- alignItems: 'center',
+ photoConsentLabel: {
+ backgroundColor: Colors.White,
+ padding: 0,
+ borderWidth: 0,
},
tabIndicator: {
backgroundColor: Colors.Orange,
@@ -304,15 +402,47 @@ export const DefaultTheme = {
detailsText: {
fontWeight: 'bold',
fontSize: 15,
- fontFamily: 'Poppins_700Bold',
+ fontFamily: 'Inter_700Bold',
},
getId: {
justifyContent: 'center',
alignItems: 'center',
- marginTop: 10,
+ marginVertical: 6,
},
placeholder: {
- fontFamily: 'Poppins_400Regular',
+ fontFamily: 'Inter_600SemiBold',
+ },
+ hrLine: {
+ borderBottomColor: 'black',
+ borderBottomWidth: 1,
+ marginTop: 10,
+ },
+ }),
+ QrCodeStyles: StyleSheet.create({
+ magnifierZoom: {
+ backgroundColor: Colors.White,
+ width: 30,
+ height: 30,
+ alignItems: 'center',
+ padding: 5,
+ borderTopLeftRadius: 11,
+ elevation: 4,
+ },
+ expandedQrCode: {
+ backgroundColor: Colors.White,
+ width: 350,
+ borderRadius: 21,
+ },
+ QrCodeHeader: {
+ backgroundColor: Colors.White,
+ borderTopLeftRadius: 21,
+ borderTopRightRadius: 21,
+ justifyContent: 'space-between',
+ fontFamily: 'Inter_700Bold',
+ paddingBottom: 10,
+ paddingRight: 15,
+ paddingLeft: 130,
+ elevation: 2,
},
warningText: {
color: Colors.Red,
@@ -321,42 +451,85 @@ export const DefaultTheme = {
}),
PinInputStyle: StyleSheet.create({
input: {
- borderBottomWidth: 1,
+ borderBottomWidth: 3,
borderColor: Colors.Grey,
color: Colors.Black,
flex: 1,
- fontFamily: 'Poppins_600SemiBold',
- fontSize: 18,
- fontWeight: '600',
+ fontSize: 33,
+ fontFamily: 'Inter_600SemiBold',
height: 40,
lineHeight: 28,
margin: 8,
textAlign: 'center',
},
+ onEnteringPin: {
+ borderBottomWidth: 3,
+ borderColor: Colors.Orange,
+ color: Colors.Black,
+ flex: 1,
+ fontFamily: 'Inter_700Bold',
+ fontSize: 29,
+ height: 40,
+ margin: 8,
+ textAlign: 'center',
+ },
}),
TextStyles: StyleSheet.create({
- base: {
+ header: {
color: Colors.Black,
+ fontFamily: 'Inter_700Bold',
fontSize: 18,
- lineHeight: 28,
+ lineHeight: 22,
+ paddingTop: 4,
+ },
+ retrieveIdLabel: {
+ color: Colors.ShadeOfGrey,
+ fontFamily: 'Inter_600SemiBold',
+ lineHeight: 18,
+ },
+ helpDetailes: {
+ margin: 5,
+ color: Colors.Gray44,
+ fontFamily: 'Inter_600SemiBold',
+ },
+ aboutDetailes: {
+ color: Colors.Black,
+ fontSize: 18,
+ margin: 7,
+ lineHeight: 18,
+ },
+ error: {
+ color: Colors.Red,
+ fontFamily: 'Inter_600SemiBold',
+ fontSize: 12,
+ },
+ base: {
+ color: Colors.Black,
+ fontSize: 16,
+ lineHeight: 18,
},
regular: {
- fontFamily: 'Poppins_400Regular',
+ fontFamily: 'Inter_400Regular',
+ fontSize: 14,
},
semibold: {
- fontFamily: 'Poppins_600SemiBold',
+ fontFamily: 'Inter_600SemiBold',
+ fontSize: 15,
},
bold: {
- fontFamily: 'Poppins_700Bold',
+ fontFamily: 'Inter_700Bold',
},
small: {
- fontSize: 14,
+ fontSize: 13,
lineHeight: 21,
},
smaller: {
- fontSize: 12,
+ fontSize: 11,
lineHeight: 18,
},
+ large: {
+ fontSize: 18,
+ },
}),
VcItemStyles: StyleSheet.create({
title: {
@@ -411,15 +584,29 @@ export const DefaultTheme = {
borderColor: Colors.Orange,
},
container: {
- minHeight: 48,
+ height: 45,
flexDirection: 'row',
},
disabled: {
- opacity: 0.5,
+ backgroundColor: Colors.Grey,
},
addId: {
backgroundColor: Colors.Orange,
},
+ gradient: {
+ borderRadius: 9,
+ width: Dimensions.get('window').width * 0.72,
+ alignSelf: 'center',
+ margin: 4,
+ },
+ float: {
+ borderRadius: 9,
+ alignSelf: 'center',
+ fontSize: 10,
+ elevation: 5,
+ position: 'absolute',
+ bottom: 24,
+ },
clearAddIdBtnBg: {
backgroundColor: Colors.Transparent,
},
@@ -439,12 +626,33 @@ export const DefaultTheme = {
padding: 32,
},
}),
+ QRCodeOverlay: StyleSheet.create({
+ header: {},
+ }),
SelectVcOverlayStyles: StyleSheet.create({
overlay: {
elevation: 5,
backgroundColor: Colors.White,
padding: 0,
},
+ consentCheckContainer: {
+ backgroundColor: Colors.White,
+ borderWidth: 0,
+ marginTop: -15,
+ fontFamily: 'Inter_600SemiBold',
+ padding: 0,
+ },
+ timeoutHintContainer: {
+ backgroundColor: Colors.TimeoutHintBoxColor,
+ margin: 21,
+ paddingHorizontal: 14,
+ paddingVertical: 12,
+ borderRadius: 12,
+ },
+ sharedSuccessfully: {
+ flex: 1,
+ backgroundColor: Colors.White,
+ },
}),
AppMetaDataStyles: StyleSheet.create({
buttonContainer: {
@@ -513,12 +721,33 @@ export const DefaultTheme = {
height: Dimensions.get('screen').height,
},
}),
+ KebabPopUpStyles: StyleSheet.create({
+ kebabPopUp: {
+ marginHorizontal: 4,
+ },
+ kebabHeaderStyle: {
+ backgroundColor: Colors.White,
+ borderTopLeftRadius: 24,
+ borderTopRightRadius: 24,
+ justifyContent: 'space-between',
+ fontFamily: 'Inter_700Bold',
+ paddingRight: 15,
+ paddingLeft: 130,
+ paddingTop: 18,
+ },
+ }),
MessageOverlayStyles: StyleSheet.create({
overlay: {
elevation: 5,
backgroundColor: Colors.White,
padding: 0,
},
+ popupOverLay: {
+ height: 260,
+ backgroundColor: Colors.White,
+ borderRadius: 15,
+ margin: -13.5,
+ },
button: {
borderTopLeftRadius: 0,
borderTopRightRadius: 0,
@@ -680,7 +909,7 @@ export const DefaultTheme = {
sliderTitle: {
color: Colors.White,
marginBottom: 20,
- fontFamily: 'Poppins_700Bold',
+ fontFamily: 'Inter_700Bold',
},
text: {
color: Colors.White,
@@ -700,14 +929,21 @@ export const DefaultTheme = {
top: 40,
zIndex: 1,
},
+ bottomContainer: {
+ padding: 20,
+ borderTopLeftRadius: 30,
+ borderTopRightRadius: 30,
+ marginTop: -185,
+ paddingBottom: 100,
+ },
}),
claimsContainer: StyleSheet.create({
container: {
backgroundColor: Colors.Transparent,
},
}),
- OpenCard: require('../../../assets/ID-open.png'),
- CloseCard: require('../../../assets/ID-closed.png'),
+ OpenCard: '',
+ CloseCard: '',
ProfileIcon: require('../../../assets/placeholder-photo.png'),
MosipSplashLogo: require('../../../assets/icon.png'),
MosipLogo: require('../../../assets/mosip-logo.png'),
@@ -715,6 +951,20 @@ export const DefaultTheme = {
WarningLogo: require('../../../assets/warningLogo.png'),
OtpLogo: require('../../../assets/otp-mobile-logo.png'),
SuccessLogo: require('../../../assets/success-logo.png'),
+ ReceiveCardIcon: require('../../../assets/receive-card-icon.png'),
+ ReceivedCardsIcon: require('../../../assets/received-cards-icon.png'),
+ DigitalIdentityLogo: require('../../../assets/digital-identity-icon.png'),
+ InjiLogoWhite: require('../../../assets/inji-logo-white.png'),
+ InjiProgressingLogo: require('../../../assets/progressing-logo.png'),
+ LockIcon: require('../../../assets/lock-icon.png'),
+ InjiHomeLogo: require('../../../assets/inji-home-logo.png'),
+ MagnifierZoom: require('../../../assets/magnifier-zoom.png'),
+ HelpIcon: require('../../../assets/help-icon.png'),
+ sharingIntro: require('../../../assets/Secure-Sharing.png'),
+ walletIntro: require('../../../assets/intro-wallet-binding.png'),
+ IntroScanner: require('../../../assets/intro-scanner.png'),
+ injiSmallLogo: require('../../../assets/inji_small_logo.png'),
+ protectPrivacy: require('../../../assets/phone_mockup_1.png'),
elevation(level: ElevationLevel): ViewStyle {
// https://ethercreative.github.io/react-native-shadow-generator/
diff --git a/components/ui/themes/PurpleTheme.ts b/components/ui/themes/PurpleTheme.ts
index 69f97bd12..546fa838c 100644
--- a/components/ui/themes/PurpleTheme.ts
+++ b/components/ui/themes/PurpleTheme.ts
@@ -18,6 +18,13 @@ const Colors = {
Purple2: '#AEA7FF',
Transparent: 'transparent',
Warning: '#f0ad4e',
+ GrayText: '#6F6F6F',
+ LightOrange: '#FDF1E6',
+ ShadeOfGrey: '#6F6F6F',
+ Gray44: '#707070',
+ Zambezi: '#5F5F5F',
+ resendCodeTimer: '#555555',
+ Gray40: '#666666',
};
export type ElevationLevel = 0 | 1 | 2 | 3 | 4 | 5;
@@ -66,9 +73,14 @@ export const PurpleTheme = {
OnboardingCircleIcon: Colors.White,
OnboardingCloseIcon: Colors.White,
WarningIcon: Colors.Warning,
+ GrayText: Colors.GrayText,
+ gradientBtn: ['#F59B4B', '#E86E04'],
Cursor: Colors.Purple,
- version: Colors.DimGray,
- poweredByBLE: Colors.Gray9,
+ getVidColor: Colors.Zambezi,
+ resendCodeTimer: Colors.resendCodeTimer,
+ RetrieveIdLabel: Colors.ShadeOfGrey,
+ walletbindingContent: Colors.Gray40,
+ ProfileIconBg: Colors.Purple2,
},
Styles: StyleSheet.create({
title: {
@@ -90,6 +102,15 @@ export const PurpleTheme = {
statusLabel: {
color: Colors.Black,
},
+ IconContainer: {
+ padding: 6,
+ width: 36,
+ marginRight: 4,
+ marginLeft: 10,
+ height: 36,
+ borderRadius: 10,
+ backgroundColor: Colors.LightOrange,
+ },
verifiedIconContainer: {
marginLeft: 5,
},
@@ -123,6 +144,31 @@ export const PurpleTheme = {
padding: 10,
paddingTop: 0,
},
+ bottomTabIconStyle: {
+ padding: 4,
+ width: 36,
+ height: 36,
+ borderRadius: 6,
+ backgroundColor: Colors.LightOrange,
+ },
+ popUp: {
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ backgroundColor: Colors.Green,
+ height: 39,
+ position: 'relative',
+ paddingHorizontal: 12,
+ },
+ homeScreenContainer: {
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderRadius: 10,
+ backgroundColor: '#fff',
+ shadowColor: '#000',
+ shadowOpacity: 0.4,
+ elevation: 5,
+ padding: 10,
+ },
vertloadingContainer: {
flex: 1,
backgroundColor: Colors.Grey6,
@@ -220,6 +266,9 @@ export const PurpleTheme = {
alignItems: 'center',
justifyContent: 'center',
},
+ closecardMosipLogo: {
+ alignSelf: 'flex-end',
+ },
details: {
width: 290,
marginLeft: 110,
@@ -230,6 +279,13 @@ export const PurpleTheme = {
padding: 20,
paddingTop: 10,
},
+ profileIconBg: {
+ padding: 8,
+ width: 40,
+ height: 40,
+ borderRadius: 6,
+ backgroundColor: Colors.LightOrange,
+ },
closeCardImage: {
width: 105,
height: 135,
@@ -249,6 +305,13 @@ export const PurpleTheme = {
width: 300,
overflow: 'hidden',
},
+ settingsIconBg: {
+ padding: 6,
+ width: 36,
+ marginRight: 4,
+ height: 36,
+ backgroundColor: Colors.Transparent,
+ },
scanner: {
height: 400,
width: '100%',
@@ -271,7 +334,7 @@ export const PurpleTheme = {
detailsText: {
fontWeight: 'bold',
fontSize: 15,
- fontFamily: 'Poppins_700Bold',
+ fontFamily: 'Inter_700Bold',
},
getId: {
justifyContent: 'center',
@@ -279,7 +342,12 @@ export const PurpleTheme = {
marginTop: 10,
},
placeholder: {
- fontFamily: 'Poppins_400Regular',
+ fontFamily: 'Inter_400Regular',
+ },
+ hrLine: {
+ borderBottomColor: 'black',
+ borderBottomWidth: 1,
+ marginTop: 10,
},
warningText: {
color: Colors.Red,
@@ -292,7 +360,7 @@ export const PurpleTheme = {
borderColor: Colors.Grey,
color: Colors.Black,
flex: 1,
- fontFamily: 'Poppins_600SemiBold',
+ fontFamily: 'Inter_600SemiBold',
fontSize: 18,
fontWeight: '600',
height: 40,
@@ -302,28 +370,63 @@ export const PurpleTheme = {
},
}),
TextStyles: StyleSheet.create({
+ header: {
+ color: Colors.Black,
+ fontFamily: 'Inter_700Bold',
+ fontSize: 18,
+ lineHeight: 22,
+ paddingTop: 4,
+ },
+ retrieveIdLabel: {
+ color: Colors.ShadeOfGrey,
+ fontFamily: 'Inter_600SemiBold',
+ lineHeight: 18,
+ },
+ helpDetailes: {
+ margin: 5,
+ color: Colors.Gray44,
+ fontFamily: 'Inter_600SemiBold',
+ },
+ aboutDetailes: {
+ color: Colors.Black,
+ fontSize: 18,
+ margin: 7,
+ lineHeight: 18,
+ },
+ error: {
+ color: Colors.Red,
+ fontFamily: 'Inter_600SemiBold',
+ fontSize: 12,
+ },
base: {
color: Colors.Black,
+ fontFamily: 'Inter_700Bold',
fontSize: 18,
- lineHeight: 28,
+ lineHeight: 22,
+ paddingTop: 4,
},
regular: {
- fontFamily: 'Poppins_400Regular',
+ fontFamily: 'Inter_400Regular',
+ fontSize: 14,
},
semibold: {
- fontFamily: 'Poppins_600SemiBold',
+ fontFamily: 'Inter_600SemiBold',
+ fontSize: 15,
},
bold: {
- fontFamily: 'Poppins_700Bold',
+ fontFamily: 'Inter_700Bold',
},
small: {
- fontSize: 14,
+ fontSize: 13,
lineHeight: 21,
},
smaller: {
- fontSize: 12,
+ fontSize: 11,
lineHeight: 18,
},
+ large: {
+ fontSize: 18,
+ },
}),
VcItemStyles: StyleSheet.create({
title: {
@@ -394,6 +497,9 @@ export const PurpleTheme = {
borderRadius: 10,
backgroundColor: Colors.Purple,
},
+ gradient: {
+ borderRadius: 10,
+ },
}),
OIDCAuthStyles: StyleSheet.create({
viewContainer: {
@@ -480,6 +586,21 @@ export const PurpleTheme = {
height: Dimensions.get('screen').height,
},
}),
+ KebabPopUpStyles: StyleSheet.create({
+ kebabPopUp: {
+ marginHorizontal: 4,
+ },
+ kebabHeaderStyle: {
+ backgroundColor: Colors.White,
+ borderTopLeftRadius: 24,
+ borderTopRightRadius: 24,
+ justifyContent: 'space-between',
+ fontFamily: 'Inter_700Bold',
+ paddingRight: 15,
+ paddingLeft: 130,
+ paddingTop: 18,
+ },
+ }),
MessageOverlayStyles: StyleSheet.create({
overlay: {
elevation: 5,
@@ -635,7 +756,7 @@ export const PurpleTheme = {
sliderTitle: {
color: Colors.White,
marginBottom: 20,
- fontFamily: 'Poppins_700Bold',
+ fontFamily: 'Inter_700Bold',
},
text: {
color: Colors.White,
@@ -681,6 +802,7 @@ export const PurpleTheme = {
WarningLogo: require('../../../assets/warningLogo.png'),
OtpLogo: require('../../../purpleAssets/otp-mobile-logo.png'),
SuccessLogo: require('../../../assets/success-logo.png'),
+ DigitalIdentityLogo: require('../../../assets/digital-identity-icon.png'),
elevation(level: ElevationLevel): ViewStyle {
// https://ethercreative.github.io/react-native-shadow-generator/
diff --git a/i18n.ts b/i18n.ts
index b139fd869..c84fec2c8 100644
--- a/i18n.ts
+++ b/i18n.ts
@@ -10,10 +10,13 @@ import kn from './locales/kan.json';
import ta from './locales/tam.json';
import Storage from './shared/storage';
-const resources = { en, fil, ar, hi, kn, ta };
import { iso6393To1 } from 'iso-639-3';
import { LocalizedField } from './types/vc';
+import { APPLICATION_LANGUAGE } from 'react-native-dotenv';
+
+const resources = { en, fil, ar, hi, kn, ta };
+
const languageCodeMap = {};
export const SUPPORTED_LANGUAGES = {
@@ -40,11 +43,15 @@ i18next
i18next.changeLanguage(language);
populateLanguageCodeMap();
}
+ if (!Object.keys(SUPPORTED_LANGUAGES).includes(i18next.language)) {
+ i18next.changeLanguage('en');
+ populateLanguageCodeMap();
+ }
});
export default i18next;
-function getLanguageCode(code: string) {
+export function getLanguageCode(code: string) {
const [language] = code.split('-');
return language;
}
diff --git a/locales/ara.json b/locales/ara.json
index 53b60fb75..ec4451453 100644
--- a/locales/ara.json
+++ b/locales/ara.json
@@ -11,22 +11,18 @@
"VC_RECEIVED_BUT_PRESENCE_VERIFICATION_FAILED": "الواردة. فشل التحقق من التواجد",
"PRESENCE_VERIFIED_AND_VC_SHARED": "التحقق منها ومشاركتها",
"PRESENCE_VERIFICATION_FAILED": "فشل التحقق",
- "QRLOGIN_SUCCESFULL": "QRL تم تسجيل الدخول بنجاح",
- "WALLET_BINDING_SUCCESSFULL": "تفعيل ناجحة",
- "WALLET_BINDING_FAILURE": "فشل التفعيل"
+ "QRLOGIN_SUCCESFULL": "QRL تم تسجيل الدخول بنجاح"
},
"DeviceInfoList": {
"requestedBy": "مطلوب بواسطة",
"sentBy": "مرسل بواسطة",
"deviceRefNumber": "الرقم المرجعي للجهاز",
- "name": "اسم",
- "Verifier": "المدقق",
- "Wallet": "محفظة"
+ "name": "اسم"
},
"FaceScanner": {},
"OIDcAuth": {
"title": "مصادقة OIDC",
- "text": "ليتم استبداله بموفر OIDC UI",
+ "text": "ليتم استبداله بموفر واجهة مستخدم OIDC",
"verify": "تحقق"
},
"PasscodeVerify": {
@@ -49,14 +45,15 @@
"address": "عنوان",
"reasonForSharing": "سبب المشاركة",
"idType": "نوع الهوية",
- "id": "Id",
+ "id": "بطاقة تعريف",
+ "qrCodeHeader": "رمز الاستجابة السريعة",
"nationalCard": "البطاقة الوطنية",
"uin": "UIN",
+ "vid": "VID",
"enableVerification": "تفعيل",
"profileAuthenticated": "تم تنشيطه لتسجيل الدخول عبر الإنترنت",
"offlineAuthDisabledHeader": "التنشيط معلق لتسجيل الدخول عبر الإنترنت",
"offlineAuthDisabledMessage": "الرجاء النقر فوق الزر أدناه لتفعيل بيانات الاعتماد هذه لاستخدامها في تسجيل الدخول عبر الإنترنت.",
- "vid": "VID",
"verificationEnabledSuccess": "تم تنشيطه لتسجيل الدخول عبر الإنترنت",
"goback": "عُد",
"BindingWarning": "إذا قمت بتمكين التحقق من بيانات الاعتماد هذه في محفظة أخرى ، فسيتم تجاوزها. هل تريد المتابعة؟",
@@ -76,8 +73,31 @@
}
}
},
+ "HomeScreenKebabPopUp": {
+ "title": "المزيد من الخيارات",
+ "unPinCard": "Unpin البطاقة",
+ "pinCard": "البطاقة الشخصية",
+ "offlineAuthenticationDisabled!": "تم تعطيل المصادقة دون اتصال!",
+ "offlineAuthDisabledMessage": "انقر هنا لتمكين بيانات الاعتماد هذه لاستخدامها في المصادقة دون اتصال.",
+ "viewActivityLog": "عرض سجل النشاط",
+ "removeFromWallet": "إزالة من المحفظة",
+ "revokeId": "إبطال الهوية",
+ "revokeMessage": "إبطال المعرف الظاهري لملف التعريف هذا",
+ "ActivityLog": "عرض سجل النشاط"
+ },
+ "WalletBinding": {
+ "inProgress": "في تَقَدم",
+ "profileAuthenticated": "تمت مصادقة الملف الشخصي!"
+ },
+ "BindingVcWarningOverlay": {
+ "alert": "يرجى تأكيد",
+ "BindingWarning": "إذا قمت بتمكين التحقق من بيانات الاعتماد هذه في محفظة أخرى ، فسيتم تجاوزها. هل تريد المتابعة؟",
+ "yesConfirm": "نعم ، أؤكد",
+ "no": "لا"
+ },
"AuthScreen": {
"header": "هل ترغب في استخدام المقاييس الحيوية لفتح التطبيق؟",
+ "Description": "هل ترغب في استخدام المقاييس الحيوية لفتح التطبيق؟",
"useBiometrics": "استخدام القياسات الحيوية",
"usePasscode": "मأفضل استخدام رمز مرور",
"errors": {
@@ -90,18 +110,57 @@
"BiometricScreen": {
"unlock": "افتح ببصمة الإصبع"
},
- "HistoryTab": {
- "noHistory": "لا يوجد سجل متاح حتى الآن",
- "downloaded": "تم التنزيل",
- "shared": "مشتركة",
- "received": "مستلم",
- "deleted": "محذوف"
+ "HistoryScreen": {
+ "noHistory": "لا يوجد سجل حتى الان",
+ "downloaded": "يملك",
+ "shared": "مشترك",
+ "received": "تلقى",
+ "deleted": "إزالة"
+ },
+ "SettingScreen": {
+ "header": "إعدادات",
+ "injiAsVerifierApp": " كتطبيق للتحقق إنجي",
+ "basicSettings": "الإعدادات الأساسية",
+ "bioUnlock": "افتح مع القياسات الحيوية",
+ "language": "لغة",
+ "aboutInji": "حول إنجي",
+ "credentialRegistry": "سجل الاعتماد",
+ "injiTourGuide": "مرشد إنجي السياحي",
+ "logout": "تسجيل خروج"
+ },
+ "AboutInji": {
+ "aboutInji": "حول إنجي",
+ "header": "حول إنجي",
+ "aboutDetailes": "إنجي هو تطبيق جوال يمكن استخدامه كمحفظة رقمية لتخزين بيانات الاعتماد. كما يسمح بالتحقق من الهوية في الوضعين غير المتصلين بالإنترنت وفي أي مكان وزمان.",
+ "forMoreDetailes": "لمزيد من التفاصيل",
+ "clickHere": "انقر هنا",
+ "version": "الإصدار",
+ "tuvaliVersion": "نسخة توفالي"
},
"HomeScreen": {
- "myVcsTab": "لي\nالبطاقات",
- "receivedVcsTab": "تم استلام \n البطاقات",
+ "myVcsTab": "محذوف\nبطاقة",
+ "receivedVcsTab": "مستلم\nبطاقة",
"historyTab": "تاريخ"
},
+ "HelpScreen": {
+ "header": "يساعد",
+ "whatIsDigitalCredential?": "ما هو الاعتماد الرقمي؟",
+ "detail-1": "بيانات الاعتماد الرقمية هي النسخة الرقمية لبطاقة الهوية الفعلية الخاصة بك",
+ "whatCanDoWithDigitalCredential?": "ماذا يمكننا أن نفعل ببيانات الاعتماد الرقمية؟",
+ "detail-2": "يمكنك الاستفادة من مختلف الخدمات الحكومية والخاصة باستخدام بيانات الاعتماد الرقمية الخاصة بك.",
+ "howToAddCard?": "كيف تضيف بطاقة؟",
+ "detail-3": "لإضافة بطاقة ، انقر فوق الزر '+' في الصفحة الرئيسية وحدد الخيار المناسب.",
+ "howToRemoveCardFromWallet?": "كيف تشارك البطاقة؟",
+ "detail-4": "اسحب لليسار على البطاقة> انقر فوق المزيد> إزالة من المحفظة",
+ "canWeAddMultipleCards?": "هل يمكننا إضافة عدة بطاقات؟",
+ "detail-5": "نعم ، يمكنك إضافة عدة بطاقات إلى المحفظة بالنقر فوق الزر '+' في الصفحة الرئيسية.",
+ "howToShareCard?": "كيف تشارك البطاقة؟",
+ "detail-6": "انقر فوق الزر 'مشاركة' وقم بمسح رمز الاستجابة السريعة ضوئيًا من الطرف الطالب. بمجرد إنشاء الاتصال ، ستتم مشاركة البطاقة.",
+ "howToActivateCardForOnlineLogin?": "كيف يتم تفعيل البطاقة لتسجيل الدخول عبر الإنترنت؟",
+ "detail-7": "بعد إضافة بطاقة إلى المحفظة بنجاح ، انقر فوق 'تعليق التنشيط لتسجيل الدخول عبر الإنترنت' على البطاقة. عند النقر فوق 'تنشيط' ، ستكون البطاقة جاهزة للاستخدام لتسجيل الدخول عبر الإنترنت.",
+ "howToViewActivity?": "كيفية عرض سجلات النشاط؟",
+ "detail-8": "في الصفحة الرئيسية ، انقر فوق 'المحفوظات' لعرض تفاصيل نشاط المستخدم."
+ },
"AddVcModal": {
"requestingCredential": "جارٍ طلب بيانات الاعتماد...",
"errors": {
@@ -134,95 +193,100 @@
"applicationProcessing": "غير جاهز AID",
"noMessageAvailable": "حاول بعد فترة",
"networkRequestFailed": "فشل طلب الشبكة",
- "invalidAid": "AID الذي تم إدخاله غير متوفر. يرجى التحقق من AID الخاص بك قبل الدخول",
"timeout": "نفذ الوقت"
}
}
},
"DownloadingVcModal": {
- "header": "تنزيل بطاقتك",
+ "header": "تنزيل ملفبطاقة",
"bodyText": "قد يستغرق هذا بعض الوقت ، وسنخبرك عندما يتم تنزيل بطاقة وإتاحته",
"backButton": "العودة إلى المنزل"
},
"GetIdInputModal": {
- "header": "أدخل معرف التطبيق الخاص بك للحصول على UIN الخاص بك",
- "getUIN": "احصل على UIN / VID",
- "applicationId": "رقم الاستمارة",
- "requestingOTP": "طلب OTP...",
- "qstnMarkToolTip": "معرف التطبيق متاح في الإقرار الذي تم استلامه بعد التسجيل."
+ "header": "استرجع UIN / VID الخاص بك",
+ "applicationIdLabel": "الرجاء إدخال معرف التطبيق الخاص بك",
+ "enterApplicationId": "أدخل معرف التطبيق",
+ "requestingOTP": "جارٍ طلب OTP ...",
+ "qstnMarkToolTip": "معرف التطبيق متاح في الإقرار الذي تم استلامه بعد التسجيل.",
+ "getUIN": "احصل على UIN / VID"
},
"IdInputModal": {
- "header": "أدخل UIN / VID لتنزيل بطاقتك",
- "generateVc": "يولد لي بطاقة",
+ "header": "استرجع هويتك",
+ "guideLabel": "حدد نوع المعرف وأدخل UIN أو VID المقدم من MOSIP للمعرف الذي ترغب في استرداده",
+ "generateVc": "إنشاء بطاقة",
"enterId": "أدخل {{idType}}",
- "noUIN/VID": "ليس لديك UIN / VID الخاص بك؟ أحضره هنا",
- "requestingOTP": "طلب OTP..."
+ "noUIN/VID": "ليس لديك UIN / VID؟ ",
+ "getItHere": "احصل عليها الآن",
+ "requestingOTP": "جارٍ طلب OTP ..."
},
"OtpVerificationModal": {
- "enterOtp": "أدخل رمز التحقق المكون من 6 أرقام الذي أرسلناه إليك",
- "header": "التحقق من OTP"
+ "title": "التحقق من OTP",
+ "otpSentMessage": "لقد أرسلنا الرمز المكون من 6 أرقام إلى رقم هاتفك المحمول المسجل!",
+ "resendTheCode": "يمكنك إعادة إرسال الرمز بتنسيق ",
+ "resendCode": "أعد إرسال الرمز"
},
"MyVcsTab": {
- "addVcButton": "بطاقة إضافة",
- "generateVc": "البطاقاتإنشاء",
+ "bringYourDigitalID": "أحضر هويتك الرقمية",
"generateVcDescription": "اضغط على \"إضافة بطاقة \" أدناه لتنزيل بطاقتك",
- "errors": {
- "savingFailed": {
- "title": "فشل حفظ بطاقة",
- "message": "حدث خطأ أثناء حفظ البطاقة في المتجر."
- },
- "diskFullError": {
- "title": "فشل حفظ بطاقة",
- "message": "لا يمكن استلام المزيد من بطاقةالبطاقات أو حفظه لأن بيانات التطبيق ممتلئة."
- }
- }
+ "downloadCard": "تحميل البطاقة",
+ "downloadingYourId": "تنزيل بطاقتك ، قد يستغرق هذا ما يصل إلى 5 دقائق"
},
"OnboardingOverlay": {
- "stepOneTitle": "مرحبًا!",
- "stepOneText": "احتفظ ببيانات الاعتماد الرقمية معك في جميع الأوقات. للبدء ، أضف البطاقات إلى ملفك الشخصي.",
- "stepTwoTitle": "إدارة البطاقة",
- "stepTwoText": "بمجرد إنشائه ، يتم تخزين البطاقاتبأمان على هاتفك المحمول ويمكن إعادة تسميته أو مشاركته في أي وقت.",
- "stepThreeTitle": "مشاركة سهلة",
- "stepThreeText": "مشاركة واستلام البطاقات switflyباستخدام كاميرا هاتفك لمسح رموز QR.",
- "stepThreeButton": "ابدأ وأضف البطاقة"
+ "stepOneTitle": "مشاركة آمنة!",
+ "stepOneText": "احتفظ ببيانات الاعتماد الرقمية الخاصة بك معك في جميع الأوقات. يساعدك Inji على إدارتها واستخدامها بشكل فعال. للبدء ، أضف بطاقات إلى ملف التعريف الخاص بك.",
+ "stepTwoTitle": "المحفظة الرقمية الموثوقة",
+ "stepTwoText": "قم بتخزين وحمل جميع بطاقاتك المهمة في محفظة واحدة موثوق بها.",
+ "stepThreeTitle": "مشاركة آمنة",
+ "stepThreeText": "شارك بطاقاتك بأمان وبطريقة خالية من المتاعب واستفد من الخدمات المتنوعة.",
+ "stepFourTitle": "مصادقة خالية من المتاعب",
+ "stepFourText": "قم بمصادقة نفسك بسهولة باستخدام بيانات الاعتماد الرقمية المخزنة.",
+ "stepFourButton": "البدء",
+ "skip": "يتخطى",
+ "next": "التالي"
},
"ReceivedVcsTab": {
- "noReceivedVcsTitle": "لا يوجد البطاقات متاح حتى الآن",
- "noReceivedVcsText": "اضغط على الطلب أدناه لاستلام البطاقة"
+ "receivedCards": "البطاقات المستلمة",
+ "header": "البطاقات المستلمة",
+ "noReceivedVcsTitle": "لا يوجد بطاقة متاح حتى الآن",
+ "noReceivedVcsText": "اضغط على الطلب أدناه لتلقيبطاقة"
},
"ViewVcModal": {
+ "title": "تفاصيل الهوية",
"cancel": "يلغي",
"lock": "قفل",
"unlock": "الغاء القفل",
"rename": "إعادة تسمية",
- "delete": "حذف",
- "revoke": "إبطال",
+ "delete": "يمسح",
+ "revoke": "سحب او إبطال",
"revoking": "تحتوي محفظتك على بيانات اعتماد مع VID {{vid}}. سيؤدي إبطال هذا إلى حذفه تلقائيًا من المحفظة. هل انت متأكد انك تريد المتابعة؟",
- "requestingOtp": "جارٍ طلب OTP...",
- "editTag": "टتحرير العلامة",
+ "requestingOtp": "جارٍ طلب OTP ...",
+ "editTag": "إعادة تسمية",
"redirecting": "إعادة توجيه...",
- "inProgress": "جار التحميل...",
"success": {
- "unlocked": "تم إلغاء قفل بطاقة بنجاح",
- "locked": "تم قفل بطاقة بنجاح",
+ "unlocked": "تم إلغاء قفل بطاقة بنجاح",
+ "locked": "تم قفل بطاقة بنجاح",
"revoked": "تم إبطال VID {{vid}}. ستتم إزالة أي بيانات اعتماد تحتوي على نفس الشيء تلقائيًا من المحفظة"
}
},
"MainLayout": {
"home": "المنزل",
"scan": "مسح",
+ "history": "تاريخ",
"request": "طلب",
"settings": "إعدادات"
},
"PasscodeScreen": {
- "header": "تعيين رمز مرور لتأمين تطبيقك",
- "confirmPasscode": "تأكيد رمز المرور الخاص بك",
- "enterPasscode": "المرور الخاص بك"
+ "header": "تعيين رمز المرور",
+ "enterNewPassword": "أدخل رمز مرور جديد",
+ "reEnterPassword": "أعد إدخال رمز المرور الجديد",
+ "confirmPasscode": "قم بتأكيد رمز المرور",
+ "enterPasscode": "أدخل رمز المرور الخاص"
},
"AppMetaData": {
"header": "حول إنجي",
"version": "الإصدار",
- "useBle": "Powered by BLE"
+ "useBle": "مدعوم من BLE",
+ "useGoogleNearby": "مدعوم من GoogleNearby"
},
"ProfileScreen": {
"name": "اسم",
@@ -247,7 +311,7 @@
"checkDomain": "تحقق أيضًا من وجود رمز قفل على شريط العناوين.",
"domainHead": "https://",
"selectId": "حدد المعرف",
- "noBindedVc": "لا يوجد البطاقات مرتبط متاح للتحقق",
+ "noBindedVc": "لا يوجد بطاقة مرتبط متاح للتحقق",
"back": "عُد",
"confirm": "يتأكد",
"verify": "تحقق",
@@ -258,49 +322,47 @@
"access": " يطلب الوصول إلى",
"status": "حالة",
"successMessage": "لقد قمت بتسجيل الدخول بنجاح ",
- "okay": "تمام"
+ "okay": "تمام",
+ "allow": "يسمح",
+ "cancel": "يلغي",
+ "essentialClaims": "الادعاءات الأساسية",
+ "voluntaryClaims": "المطالبات الطوعية",
+ "required": "مطلوب"
},
"ReceiveVcScreen": {
- "header": "تفاصيل بطاقة ",
- "save": "احفظ البطاقة",
- "acceptRequest": "قبول الطلب واختيار البطاقة",
- "acceptRequestAndVerify": "قبول الطلب والتحقق",
- "reject": "رفض",
+ "header": "تفاصيل بطاقة",
+ "save": "احفظ بطاقة",
+ "verifyAndSave": "تحقق وحفظ",
+ "reject": "يرفض",
"discard": "ينبذ",
- "goToReceivedVCTab": "عرض البطاقات المستلمة",
- "saving": "إنقاذ",
+ "goToReceivedVCTab": "عرض تم استلامه بطاقة",
"errors": {
"savingFailed": {
"title": "فشل حفظ بطاقة",
- "message": "حدث خطأ أثناء حفظ البطاقة في المتجر."
+ "message": "شئ ما ذهب خطأ بينما إنقاذ بطاقة ل ال محل."
},
"diskFullError": {
"title": "فشل حفظ بطاقة",
- "message": "لا يمكن استلام المزيد من بطاقةالبطاقات أو حفظه لأن بيانات التطبيق ممتلئة."
+ "message": "لا يمكن استلام المزيد من البطاقات أو حفظه لأن بيانات التطبيق ممتلئة."
}
}
},
"RequestScreen": {
- "bluetoothDenied": "يرجى تمكين البلوتوث لتتمكن من طلب البطاقة",
- "bluetoothStateAndroid": "يرجى تشغيل البلوتوث من الإعدادات السريعة لدعم المشاركة المحلية",
- "bluetoothStateIos": "يرجى تشغيل البلوتوث من مركز التحكم لدعم المشاركة المحلية",
- "showQrCode": "اعرض رمز الاستجابة السريعة هذا لطلب المقيم بطاقة ",
- "incomingVc": "بطاقة واردة",
+ "receiveCard": "البطاقة المستلمة",
+ "bluetoothDenied": "يرجى تمكين بلوتوث لتتمكن من طلب البطاقة",
+ "bluetoothStateIos": "تم إيقاف تشغيل البلوتوث ، يرجى تشغيله من مركز التحكم",
+ "bluetoothStateAndroid": "تم إيقاف تشغيل البلوتوث ، يرجى تشغيله من قائمة الإعدادات السريعة",
+ "showQrCode": "اعرض رمز الاستجابة السريعة هذا لطلب المقيم بطاقة",
+ "incomingVc": "الوارد بطاقة",
"request": "طلب",
- "errors": {
- "nearbyDevicesPermissionDenied": {
- "message": "مطلوب إذن الأجهزة المجاورة لتتمكن من طلب البطاقة",
- "button": "السماح إذن"
- }
- },
"status": {
"accepted": {
"title": "نجاح!",
- "message": "تم استلام بطاقة بنجاح من محفظة"
+ "message": "تم استلام بطاقةبنجاح من محفظة"
},
"rejected": {
"title": " إشعار",
- "message": "تم تجاهل بطاقة المحفظة بواسطتك"
+ "message": "لقد رفضت محفظة بطاقة"
},
"disconnected": {
"title": "ير متصل",
@@ -312,14 +374,14 @@
"timeoutHint": "يستغرق تبادل معلومات الجهاز وقتًا طويلاً..."
},
"connected": {
- "message": "متصل بالجهاز. في انتظار بطاقة ...",
+ "message": "متصل بالجهاز. في انتظار بطاقة...",
"timeoutHint": "لم ترد بيانات حتى الآن. هل جهاز الإرسال لا يزال متصلاً؟"
},
"offline": {
"message": "يرجى الاتصال بالإنترنت لتمكين وضع المشاركة عبر الإنترنت"
},
"bleError": {
- "title": "فشل التحويل",
+ "title": "فشل التحويل!",
"message": "حدث خطأ أثناء نقل بطاقة. حاول مرة اخرى."
}
},
@@ -337,58 +399,58 @@
"sharingVc": "مشاركة بطاقة ",
"errors": {
"locationDisabled": {
- "message": "يجب تمكين خدمات الموقع لمشاركة البطاقة",
+ "message": "يجب تمكين خدمات الموقع لوظيفة المسح",
"button": "تمكين خدمات الموقع"
},
"locationDenied": {
- "message": "مطلوب إذن الموقع لمشاركة البطاقة",
+ "message": "إذن الموقع مطلوب لوظيفة المسح",
"button": "الموقع"
- },
- "nearbyDevicesPermissionDenied": {
- "message": "مطلوب إذن \"الأجهزة المجاورة\" لتتمكن من مشاركة البطاقة",
- "button": "السماح إذن"
}
},
"status": {
- "connecting": "ارٍ التوصيل...",
+ "inProgress": "في تَقَدم",
+ "establishingConnection": "اجراء اتصال",
+ "sharingInProgress": "جاري المشاركة",
"connectingTimeout": "يستغرق إنشاء الاتصال بعض الوقت. هل الجهاز الآخر مفتوح للاتصالات؟",
"exchangingDeviceInfo": "تبادل معلومات الجهاز ...",
"exchangingDeviceInfoTimeout": "يستغرق الأمر بعض الوقت لتبادل معلومات الجهاز. قد تضطر إلى إعادة الاتصال.",
- "invalid": "غير صالح",
+ "invalid": "رمز الاستجابة السريعة غير صالح",
"offline": "يرجى الاتصال بالإنترنت لمسح رموز QR ضوئيًا باستخدام وضع المشاركة عبر الإنترنت",
- "sent": "تم إرسال البطاقة ...",
- "sentHint": "في انتظار أن يحفظ المستلم بطاقة أو يتجاهلها",
+ "sent": "تم إرسال بطاقة ...",
+ "sentHint": "في انتظار أن يحفظ المستلم بطاقة أو يتجاهلها",
"sharing": {
"title": "مشاركة...",
"hint": "الرجاء الانتظار حتى يقبل الجهاز المتلقي المشاركة أو يرفضها.",
"timeoutHint": "تستغرق مشاركتها وقتًا أطول من المتوقع. قد تكون هناك مشكلة في الاتصال."
},
"accepted": {
- "title": "نجاح!",
- "message": "تمت مشاركة بطاقة بنجاح مع المدقق"
+ "title": "تم مشاركة المعرف بنجاح",
+ "message": "تمت مشاركة بطاقة بنجاح مع المدقق",
+ "gotohome": "اذهب الى المنزل"
},
"rejected": {
"title": "يلاحظ",
- "message": "تم تجاهل بطاقة بواسطة المدقق"
+ "message": "تم تجاهل بطاقة بواسطة المدقق"
},
"bleError": {
- "title": "فشل التحويل",
- "message": "حدث خطأ أثناء نقل بطاقة . حاول مرة اخرى.",
- "hint": "خطأ: {{code}}"
+ "title": "فشل التحويل!",
+ "message": "حدث خطأ أثناء نقل بطاقة. حاول مرة اخرى."
}
}
},
"SelectVcOverlay": {
- "header": "يشارك بطاقة ",
- "chooseVc": "اختر بطاقة الذي ترغب في المشاركة معه",
+ "header": "يشارك بطاقة",
+ "chooseVc": "اختر بطاقة الذي ترغب في المشاركة معه",
"share": "شارك",
"verifyAndShare": "التحقق من الهوية والمشاركة"
},
"SendVcScreen": {
"reasonForSharing": "سبب المشاركة (اختياري)",
"acceptRequest": "يشارك",
- "acceptRequestAndVerify": "شارك مع سيلفي",
+ "acceptRequestAndVerify": "شارك مع Selfie",
"reject": "رفض",
+ "consentToPhotoVerification": "أوافق على التقاط صورتي للمصادقة",
+ "pleaseSelectAnId": "الرجاء تحديد معرف",
"status": {
"sharing": {
"title": "مشاركة...",
@@ -397,14 +459,13 @@
},
"accepted": {
"title": "النجاح!",
- "message": "تمت مشاركة بطاقة بنجاح مع {{receiver}}"
+ "message": "تمت مشاركة بطاقة بنجاح مع المدقق"
},
"rejected": {
"title": "تنويه",
- "message": "تم رفض بطاقة من قِبل {{receiver}}"
+ "message": "تم رفض بطاقة من قِبل المدقق"
}
- },
- "consentToPhotoVerification": "أوافق على التقاط صورتي للمصادقة"
+ }
},
"VerifyIdentityOverlay": {
"status": {
@@ -420,18 +481,18 @@
},
"SendVcModal": {
"reasonForSharing": "سبب المشاركة (optional)",
- "acceptRequest": "اقبل الطلب واختر البطاقة",
+ "acceptRequest": "قبول الطلب واختيار بطاقة",
"reject": "رفض",
"statusSharing": {
"title": "مشاركة ..."
},
"statusAccepted": {
"title": "نجاح!",
- "message": "تمت مشاركة بطاقة بنجاح مع{{receiver}}"
+ "message": "تمت مشاركة بطاقة بنجاح معالمدقق"
},
"statusRejected": {
"title": " إشعار",
- "message": "تم رفض بطاقتك من قِبل {{receiver}}"
+ "message": "تم رفض بطاقةمن قِبل المدقق"
}
},
"WelcomeScreen": {
@@ -439,6 +500,11 @@
"getStarted": "البدء",
"unlockApp": "فتح التطبيق"
},
+ "SetupLanguage": {
+ "header": "حدد اللغة",
+ "description": "اختر لغتك المفضلة",
+ "save": "حفظ التفضيل"
+ },
"common": {
"cancel": "إلغاء",
"save": "حفظ",
@@ -450,9 +516,6 @@
"missingPermission": "يستخدم هذا التطبيق الكاميرا لمسح رمز الاستجابة السريعة لجهاز آخر."
},
"allowAccess": "اسمح بالوصول إلى الكاميرا"
- },
- "errors": {
- "genericError": "هناك خطأ ما. من فضلك حاول مرة أخرى بعد بعض من الوقت!"
}
}
}
diff --git a/locales/en.json b/locales/en.json
index d2bda7fee..a9252e7ed 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -19,9 +19,7 @@
"requestedBy": "Requested by",
"sentBy": "Sent by",
"deviceRefNumber": "Device reference number",
- "name": "Name",
- "Verifier": "Verifier",
- "Wallet": "Wallet"
+ "name": "Name"
},
"FaceScanner": {},
"OIDcAuth": {
@@ -50,36 +48,41 @@
"reasonForSharing": "Reason for sharing",
"idType": "ID type",
"id": "Id",
+ "qrCodeHeader": "QR Code",
"nationalCard": "National Card",
"uin": "UIN",
- "enableVerification": "Activate",
- "profileAuthenticated": "Activated for online login",
- "offlineAuthDisabledHeader": "Activation pending for online login",
- "offlineAuthDisabledMessage": "Please click the button below to activate this credential to be used for online login.",
"vid": "VID",
- "verificationEnabledSuccess": "Activated for online login",
- "goback": "GO BACK",
- "BindingWarning": "If you have enabled verification for this credential on another wallet, it will get overridden. Do you want to proceed?",
- "yes_confirm": "Yes, I Confirm",
- "no": "No",
- "Alert": "Alert",
- "ok": "Okay",
- "credentialRegistry": "Credential Registry",
- "errors": {
- "savingFailed": {
- "title": "Failed to save the Card",
- "message": "Something went wrong while saving Card to the store."
- },
- "diskFullError": {
- "title": "Failed to save the Card",
- "message": "No more Cards can be received or saved as App Data is full."
- }
- }
+ "enableVerification": "Enable Verification",
+ "profileAuthenticated": "Profile is authenticated!",
+ "offlineAuthDisabledHeader": "Offline Authentication disabled!",
+ "offlineAuthDisabledMessage": "Click 'Enable Authentication' to enable this credentials to be used for offline authentication."
+ },
+ "HomeScreenKebabPopUp": {
+ "title": "More Options",
+ "unPinCard": "Unpin Card",
+ "pinCard": "Pin Card",
+ "offlineAuthenticationDisabled!": "Offline authentication disabled!",
+ "offlineAuthDisabledMessage": "Click here to enable this credentials to be used for offline authentication.",
+ "viewActivityLog": "View Activity Log",
+ "removeFromWallet": "Remove from Wallet",
+ "revokeId": "Revoke ID",
+ "revokeMessage": "Revoke the virtual ID for this profile"
+ },
+ "WalletBinding": {
+ "inProgress": "In progress",
+ "profileAuthenticated": "Profile is authenticated!"
+ },
+ "BindingVcWarningOverlay": {
+ "alert": "Alert",
+ "BindingWarning": "You have already activated online login for this credential on another device. You will no longer be able to use that device for login if you activate it again on this device. Do you want to proceed?",
+ "yesConfirm": "Yes, I Confirm",
+ "no": "No"
},
"AuthScreen": {
- "header": "Would you like to use biometrics to unlock the application?",
- "useBiometrics": "Use biometrics",
- "usePasscode": "I'd rather use a passcode",
+ "header": "Select App Unlock Method",
+ "Description": "Would you like to use biometrics to unlock the application?",
+ "useBiometrics": "Use Biometrics",
+ "usePasscode": "Use Passcode",
"errors": {
"unavailable": "Device does not support Biometrics",
"unenrolled": "To use Biometrics, please enroll your biometrics in your device settings",
@@ -90,17 +93,49 @@
"BiometricScreen": {
"unlock": "Unlock with biometrics"
},
- "HistoryTab": {
+ "HistoryScreen": {
"noHistory": "No history available yet",
"downloaded": "downloaded",
"shared": "shared",
"received": "received",
"deleted": "deleted"
},
- "HomeScreen": {
- "myVcsTab": "My\nCards",
- "receivedVcsTab": "Received\nCards",
- "historyTab": "History"
+ "SettingScreen": {
+ "header": "Settings",
+ "bioUnlock": "Unlock with Biometric",
+ "language": "Language",
+ "aboutInji": "About Inji",
+ "credentialRegistry": "Credential Registry",
+ "injiTourGuide": "Inji Tour Guide",
+ "logout": "Logout"
+ },
+ "AboutInji": {
+ "aboutInji": "About Inji",
+ "header": "ABOUT INJI",
+ "aboutDetailes": "Inji is a mobile app that can be used as a digital wallet to store credentials. It also allows identity verification in both offline and online modes, at any place and time.",
+ "forMoreDetailes": "For more details",
+ "clickHere": "Click here",
+ "version": "Version",
+ "tuvaliVersion": "Tuvali-version"
+ },
+ "HelpScreen": {
+ "header": "Help",
+ "whatIsDigitalCredential?": "What is a digital credential?",
+ "detail-1": "A digital credential is the digital version of your physical Identity card",
+ "whatCanDoWithDigitalCredential?": "What can we do with digital credentials?",
+ "detail-2": "You can avail various Government and private services using your digital credentials.",
+ "howToAddCard?": "How to add a card?",
+ "detail-3": "To add a card, click on '+' button on the Home page and select the appropriate option.",
+ "howToRemoveCardFromWallet?": "How to share a card?",
+ "detail-4": "Swipe left on the card > click on More > Remove from Wallet",
+ "canWeAddMultipleCards?": "Can we add multiple cards?",
+ "detail-5": "Yes, you can add multiple cards to the wallet by clicking on '+' button on the Home page.",
+ "howToShareCard?": "How to share a card?",
+ "detail-6": "Click on 'Share' button and scan the QR code from the requesting party. Once the connection is established, the card will be shared.",
+ "howToActivateCardForOnlineLogin?": "How to activate a card for online login?",
+ "detail-7": "After successfully adding a card to the wallet, click on 'Activation pending for Online login' on the card. On clicking on 'Activate', the card will be ready to be used for online login.",
+ "howToViewActivity?": "How to view activity logs?",
+ "detail-8": "On the Home page, click on 'History' to view the details of the user's activitie."
},
"AddVcModal": {
"requestingCredential": "Requesting credential...",
@@ -116,8 +151,8 @@
"invalidVid": "VID invalid",
"missingUin": "UIN not available in database",
"missingVid": "VID not available in database",
- "noMessageAvailable": "Try after sometime",
- "whileGeneratingOtpErrorIsOccured": "while generating otp error is occurred",
+ "noMessageAvailable": "Try after some time",
+ "whileGeneratingOtpErrorIsOccured": "while generating OTP error occurred",
"networkRequestFailed": "Network request failed"
}
}
@@ -125,72 +160,75 @@
"GetVcModal": {
"errors": {
"input": {
- "empty": "The input cannot be empty",
+ "empty": "Input cannot be empty",
"invalidFormat": "The input format is incorrect"
},
"backend": {
- "invalidOtp": "OTP is invalid",
+ "invalidOtp": "Invalid OTP",
"expiredOtp": "OTP has expired",
- "applicationProcessing": "AID is not ready",
- "noMessageAvailable": "Try after sometime",
+ "applicationProcessing": "AID is not ready yet",
+ "noMessageAvailable": "Try after some time",
"networkRequestFailed": "Network request failed",
- "invalidAid": "AID entered is not available. Please check your AID before entering",
- "timeOut": "Timeout"
+ "timeout": "Timeout"
}
}
},
"DownloadingVcModal": {
- "header": "Downloading your Card",
- "bodyText": "This may take some time, we will notify you when your Card has been downloaded and is available",
+ "header": "Downloading your card",
+ "bodyText": "This may take some time, we will notify you when your card has been downloaded and is available",
"backButton": "Back home"
},
"GetIdInputModal": {
- "header": "Enter your Application ID to get your UIN",
- "getUIN": "Get UIN/VID",
- "applicationId": "Application ID",
+ "header": "Retrieve your UIN/VID",
+ "applicationIdLabel": "Please enter your Application ID",
+ "enterApplicationId": "Enter Application ID",
"requestingOTP": "Requesting OTP...",
- "qstnMarkToolTip": "Application ID is available in the acknowledgement received after enrolment."
+ "qstnMarkToolTip": "Application ID is available in the acknowledgement received after enrolment.",
+ "getUIN": "Get UIN/VID"
},
"IdInputModal": {
- "header": "Enter your UIN/VID to download your Card",
- "generateVc": "Generate My Card",
- "enterId": "Enter your {{idType}}",
- "noUIN/VID": "Don't have your UIN/VID? Get it here",
+ "header": "Retrieve your ID",
+ "guideLabel": "Select ID type and enter the MOSIP provided UIN or VID of the ID you wish to retrieve",
+ "generateVc": "Generate Card",
+ "downloadCard": "Download ID",
+ "enterId": "Enter ID",
+ "noUIN/VID": "Don’t have UIN/VID? ",
+ "getItHere": "Get it now",
"requestingOTP": "Requesting OTP..."
},
"OtpVerificationModal": {
- "enterOtp": "Enter the 6-digit verification code we sent you",
- "header": "OTP Verification"
+ "title": "OTP Verification",
+ "otpSentMessage": "We've sent the 6 digit code to your registered mobile number!",
+ "resendTheCode": "You can resend the code in ",
+ "resendCode": "Resend Code"
},
"MyVcsTab": {
- "addVcButton": "Add Card",
- "generateVc": "Generate your Cards",
- "generateVcDescription": "Tap on \"Add Card\" below to download your Card",
- "errors": {
- "savingFailed": {
- "title": "Failed to save the Card",
- "message": "Something went wrong while saving Card to the store."
- },
- "diskFullError": {
- "title": "Failed to save the Card",
- "message": "No more Cards can be received or saved as App Data is full."
- }
- }
+ "bringYourDigitalID": "Bring your digital identity",
+ "generateVcDescription": "Tap on \"Download card\" below to download your card",
+ "downloadCard": "Download Card",
+ "downloadingYourId": "Downloading your ID, this can take upto 5 minutes"
},
"OnboardingOverlay": {
"stepOneTitle": "Welcome!",
- "stepOneText": "Keep your digital credential with you at all times. To get started, add Cards to your profile.",
- "stepTwoTitle": "Card management",
- "stepTwoText": "Once generated, Cards are safely stored on your mobile and can be renamed or shared at any time.",
- "stepThreeTitle": "Easy sharing",
- "stepThreeText": "Share and receive Cards switfly using your phone camera to scan QR codes.",
- "stepThreeButton": "Get started and add Card"
+ "stepOneText": "Keep your digital credential with you at all times. Inji helps you manage and use them effectively. To get started, add cards to your profile.",
+ "stepTwoTitle": "Trusted Digital Wallet",
+ "stepTwoText": "Store and carry all your important cards in a single trusted wallet.",
+ "stepThreeTitle": "Secure Sharing",
+ "stepThreeText": "Share your cards securely in a hassle free way and avail various services.",
+ "stepFourTitle": "Hassle free authentication",
+ "stepFourText": "Authenticate yourself with ease using the stored digital credential.",
+ "stepFourButton": "Get Started",
+ "skip": "Skip",
+ "next": "Next"
},
"ReceivedVcsTab": {
- "noReceivedVcsTitle": "No Cards available yet",
- "noReceivedVcsText": "Tap on Request below to receive Card"
+ "receivedCards": "Received Cards",
+ "header": "Received Cards",
+ "noReceivedVcsTitle": "No card available yet",
+ "noReceivedVcsText": "Tap on Request below to receive card"
},
"ViewVcModal": {
+ "title": "ID Details",
"cancel": "Cancel",
"lock": "Lock",
"unlock": "Unlock",
@@ -201,7 +239,6 @@
"requestingOtp": "Requesting OTP...",
"editTag": "Rename",
"redirecting": "Redirecting...",
- "inProgress": "Loading...",
"success": {
"unlocked": "Card successfully unlocked",
"locked": "Card successfully locked",
@@ -211,91 +248,74 @@
"MainLayout": {
"home": "Home",
"scan": "Scan",
+ "history": "History",
"request": "Request",
"settings": "Settings"
},
"PasscodeScreen": {
- "header": "Set a passcode to secure your application",
- "confirmPasscode": "Confirm your passcode",
+ "header": "Set Passcode",
+ "enterNewPassword": "Enter a new passcode",
+ "reEnterPassword": "Re-enter the new passcode",
+ "confirmPasscode": "Confirm passcode",
"enterPasscode": "Enter your passcode"
},
"AppMetaData": {
"header": "About Inji",
"version": "Version",
- "useBle": "Powered by BLE"
- },
- "ProfileScreen": {
- "name": "Name",
- "vcLabel": "VC Label",
- "language": "Language",
- "bioUnlock": "Unlock with biometrics",
- "authFactorUnlock": "Unlock auth factor",
- "AppMetaData": "About Inji",
- "logout": "Logout",
- "revokeLabel": "Revoke VID",
- "revokeHeader": "REVOKE VID",
- "revokingVids": "You are about to revoke ({{count}}) VIDs.",
- "revokingVidsAfter": "This means you will no longer be able to use or view any of the IDs linked to those VID(s). \nAre you sure you want to proceed?",
- "empty": "Empty",
- "revokeSuccessful": "VID successfully revoked"
+ "useBle": "Powered by BLE",
+ "useGoogleNearby": "Powered by GoogleNearby"
},
"QrScreen": {
"title": "QR Login",
"alignQr": "Align the QR code within the frame to scan",
"confirmation": "Confirmation",
- "checkDomain": "Also, check that there is a lock icon on the address bar.",
+ "checkDomain": "Also, check for a lock icon in the address bar.",
"domainHead": "https://",
- "selectId": "Select ID",
- "noBindedVc": "No Binded Cards Available to Verify",
- "back": "Go Back",
+ "selectId": "Select an ID",
+ "noBindedVc": "There is no binded card available to verify",
+ "back": "Come back",
"confirm": "Confirm",
"verify": "Verify",
"faceAuth": "Face Authentication",
"consent": "Consent",
"loading": "Loading...",
- "domainWarning": "Please confirm the domain of the website you are scanning the QR code from is as below",
+ "domainWarning": "Please confirm the domain of the website you are scanning the QR code from below",
"access": " is requesting access to",
"status": "Status",
- "successMessage": "You Have Successfully Logged Into ",
- "okay": "Okay",
+ "successMessage": "You are successfully logged in ",
+ "okay": "All right",
"allow": "Allow",
"cancel": "Cancel",
- "essentialClaims": "Essential Claims",
+ "essentialClaims": "Important Claims",
"voluntaryClaims": "Voluntary Claims",
- "required": "Required"
+ "required": "It is necessary"
},
"ReceiveVcScreen": {
"header": "Card details",
- "save": "Save Card",
+ "save": "Save card",
"verifyAndSave": "Verify and save",
"reject": "Reject",
"discard": "Discard",
- "goToReceivedVCTab": "View Received Cards",
- "saving": "Saving",
+ "goToReceivedVCTab": "View Received card",
"errors": {
"savingFailed": {
- "title": "Failed to save the Card",
- "message": "Something went wrong while saving Card to the store."
+ "title": "Failed to save the card",
+ "message": "Something went wrong while saving card to the store."
},
"diskFullError": {
- "title": "Failed to save the Card",
- "message": "No more Cards can be received or saved as App Data is full."
+ "title": "Failed to save the card",
+ "message": "No more cards can be received or saved as App Data is full."
}
}
},
"RequestScreen": {
- "bluetoothDenied": "Please enable Bluetooth to be able to request Card",
- "bluetoothStateAndroid": "Please turn on bluetooth from quick settings to support local sharing",
- "bluetoothStateIos": "Please turn on bluetooth from control center to support local sharing",
+ "bluetoothDenied": "Please enable Bluetooth to be able to request card",
+ "bluetoothStateIos": "Bluetooth is turned OFF, please turn it ON from Control center",
+ "bluetoothStateAndroid": "Bluetooth is turned OFF, please turn it ON from Quick settings menu",
+ "nearbyDevicesPermissionDenied": "Please enable Nearby Devices Permission to be able to request card",
"showQrCode": "Display this QR code to request resident Card",
"incomingVc": "Incoming Card",
"request": "Request",
- "errors": {
- "nearbyDevicesPermissionDenied": {
- "message": "Nearby Devices permission is required to be able to request Card",
- "button": "Allow Permission"
- }
- },
"status": {
"accepted": {
"title": "Success!",
@@ -315,16 +335,15 @@
"timeoutHint": "It's taking too long to exchange device info..."
},
"connected": {
- "message": "Connected to the device. Waiting for Card...",
+ "message": "Connected to the device. Waiting for card...",
"timeoutHint": "No data received yet. Is sending device still connected?"
},
"offline": {
"message": "Please connect to the internet to enable Online sharing mode"
},
"bleError": {
- "title": "Failed to transfer",
- "message": "Something went wrong while transferring Card. Please try again.",
- "hint": "Error: {{code}}"
+ "title": "Failed to transfer!",
+ "message": "Something went wrong while transferring card. Please try again."
}
},
"online": "Online",
@@ -333,28 +352,24 @@
},
"ScanScreen": {
"header": "Scan QR Code",
- "noShareableVcs": "No shareable Cards are available.",
- "sharingVc": "Sharing Card",
- "bluetoothStateAndroid": "Please turn on bluetooth from quick settings to support local sharing",
- "bluetoothStateIos": "Please turn on bluetooth from control center to support local sharing",
- "enableBluetoothMessage": "Please enable bluetooth permissions to support local sharing",
- "enableBluetoothButtonText": "Allow Bluetooth Permissions",
+ "noShareableVcs": "No shareable card are available.",
+ "sharingVc": "Sharing card",
+ "bluetoothStateIos": "Bluetooth is turned OFF, please turn it ON from Control center",
+ "bluetoothStateAndroid": "Bluetooth is turned OFF, please turn it ON from Quick settings menu",
"errors": {
"locationDisabled": {
- "message": "Location services must be enabled to share card",
+ "message": "Location services must be enabled for the scanning functionality",
"button": "Enable location services"
},
"locationDenied": {
- "message": "Location permission is required to share card",
+ "message": "Location permission is required for the scanning functionality",
"button": "Allow access to location"
- },
- "nearbyDevicesPermissionDenied": {
- "message": "Nearby Devices permission is required to be able to share card",
- "button": "Allow Permission"
}
},
"status": {
- "connecting": "Connecting...",
+ "inProgress": "In progress",
+ "establishingConnection": "Establishing connection",
+ "sharingInProgress": "Sharing in Progress",
"connectingTimeout": "It's taking a while to establish the connection. Is the other device open for connections?",
"exchangingDeviceInfo": "Exchanging device info...",
"exchangingDeviceInfoTimeout": "It's taking a while to exchange device info. You may have to reconnect.",
@@ -369,16 +384,16 @@
},
"accepted": {
"title": "Success!",
- "message": "Your Card has been successfully shared with Verifier"
+ "message": "Your Card has been successfully shared with Verifier",
+ "gotohome": "Go to Home"
},
"rejected": {
"title": "Notice",
"message": "Your Card was discarded by Verifier"
},
"bleError": {
- "title": "Failed to transfer",
- "message": "Something went wrong while transferring Card. Please try again.",
- "hint": "Error: {{code}}"
+ "title": "Failed to transfer!",
+ "message": "Something went wrong while transferring Card. Please try again."
}
}
},
@@ -391,9 +406,24 @@
"SendVcScreen": {
"reasonForSharing": "Reason for sharing (optional)",
"acceptRequest": "Share",
- "acceptRequestAndVerify": "Share with Selfie",
+ "acceptRequestAndVerify": "Accept request and verify",
"reject": "Reject",
- "consentToPhotoVerification": "I give consent to have my photo taken for authentication"
+ "consentToPhotoVerification": "I give consent to have my photo taken for authentication",
+ "pleaseSelectAnId": "Please select an ID",
+ "status": {
+ "sharing": {
+ "title": "Sharing",
+ "timeoutHint": "VC shares take a bit longer. There may be a connection problem."
+ },
+ "accepted": {
+ "title": "Success!",
+ "message": "Your card has been successfully shared with {{receiver}}"
+ },
+ "rejected": {
+ "title": "Pay attention",
+ "message": "Your card has been declined by {{receiver}}"
+ }
+ }
},
"VerifyIdentityOverlay": {
"status": {
@@ -412,6 +442,11 @@
"getStarted": "Get started",
"unlockApp": "Unlock application"
},
+ "SetupLanguage": {
+ "header": "Choose Language",
+ "description": "Select your preferred language",
+ "save": "Save Preference"
+ },
"common": {
"cancel": "Cancel",
"save": "Save",
@@ -423,9 +458,6 @@
"missingPermission": "This app uses the camera to scan the QR code of another device."
},
"allowAccess": "Allow access to the camera"
- },
- "errors": {
- "genericError": "Something went wrong. Please try again after some time!"
}
}
-}
+}
\ No newline at end of file
diff --git a/locales/fil.json b/locales/fil.json
index 752aeced6..b6e3f4916 100644
--- a/locales/fil.json
+++ b/locales/fil.json
@@ -19,9 +19,7 @@
"requestedBy": "Hiniling ni",
"sentBy": "Ipinadala ni",
"deviceRefNumber": "Reference number ng device",
- "name": "Pangalan",
- "Verifier": "Verifier",
- "Wallet": "Wallet"
+ "name": "Pangalan"
},
"PasscodeVerify": {
"passcodeMismatchError": "Hindi tumugma ang passcode."
@@ -50,13 +48,14 @@
"reasonForSharing": "Dahilan ng pagbabahagi",
"idType": "Uri ng ID",
"id": "Id",
+ "qrCodeHeader": "QR Code",
"nationalCard": "Pambansang Kard",
"uin": "UIN",
+ "vid": "VID",
"enableVerification": "I-activate",
"profileAuthenticated": "Na-activate para sa online na pag-login",
"offlineAuthDisabledHeader": "Nakabinbin ang pag-activate para sa online na pag-login",
"offlineAuthDisabledMessage": "Mangyaring i-click ang pindutan sa ibaba upang i-activate ang kredensyal na ito upang magamit para sa online na pag-login.",
- "vid": "VID",
"verificationEnabledSuccess": "Na-activate para sa online na pag-login",
"goback": "BUMALIK KA",
"BindingWarning": "Kung pinagana mo ang pag-verify para sa kredensyal na ito sa isa pang wallet, ma-override ito. Gusto mo bang magpatuloy?",
@@ -78,6 +77,7 @@
},
"AuthScreen": {
"header": "Gusto mo bang gumamit ng biometrics upang i-unlock ang aplikasyon?",
+ "Description": "Gusto mo bang gumamit ng biometrics upang i-unlock ang application?",
"useBiometrics": "Gamitin ang biometrics",
"usePasscode": "Gumamit na lang ng passcode",
"errors": {
@@ -90,7 +90,7 @@
"BiometricScreen": {
"unlock": "I-unlock gamit ang biometrics"
},
- "HistoryTab": {
+ "HistoryScreen": {
"noHistory": "Wala pang kasaysayan",
"downloaded": "nakuha",
"shared": "ibinahagi",
@@ -98,10 +98,49 @@
"deleted": "tinanggal"
},
"HomeScreen": {
- "myVcsTab": "Aking\nMga kard",
- "receivedVcsTab": "Nakuhang\nMga kard",
+ "myVcsTab": "Aking\nCard",
+ "receivedVcsTab": "Nakuhang\nCard",
"historyTab": "Pangyayari"
},
+ "SettingScreen": {
+ "header": "Mga setting",
+ "injiAsVerifierApp": "Inji bilang Verifier App",
+ "basicSettings": "Mga Pangunahing Setting",
+ "bioUnlock": "I-unlock gamit ang Biometrics",
+ "language": "Wika",
+ "aboutInji": "About Inji",
+ "credentialRegistry": "Credential Registry",
+ "injiTourGuide": "Inji Tour Guide",
+ "logout": "Mag-logout"
+ },
+ "AboutInji": {
+ "aboutInji": "Tungkol kay Inji",
+ "header": "TUNGKOL KAY INJI",
+ "aboutDetailes": "Ang Inji ay isang mobile app na maaaring gamitin bilang digital wallet para mag-imbak ng mga kredensyal. Pinapayagan din nito ang pag-verify ng pagkakakilanlan sa parehong offline at online na mga mode, sa anumang lugar at oras.",
+ "forMoreDetailes": "Para sa karagdagang detalye",
+ "clickHere": "Pindutin dito",
+ "version": "Bersyon:",
+ "tuvaliVersion": "Tuvali-bersyon"
+ },
+ "HelpScreen": {
+ "header": "Tulong",
+ "whatIsDigitalCredential?": "Ano ang isang digital na kredensyal?",
+ "detail-1": "Ang digital na kredensyal ay ang digital na bersyon ng iyong pisikal na Identity card",
+ "whatCanDoWithDigitalCredential?": "Ano ang maaari nating gawin sa mga digital na kredensyal?",
+ "detail-2": "Maaari kang makakuha ng iba't ibang serbisyo ng Pamahalaan at pribadong gamit ang iyong mga digital na kredensyal.",
+ "howToAddCard?": "Paano magdagdag ng card?",
+ "detail-3": "Upang magdagdag ng card, mag-click sa '+' na button sa Home page at piliin ang naaangkop na opsyon.",
+ "howToRemoveCardFromWallet?": "Paano magbahagi ng card?",
+ "detail-4": "Mag-swipe pakaliwa sa card > mag-click sa Higit pa > Alisin sa Wallet",
+ "canWeAddMultipleCards?": "Maaari ba tayong magdagdag ng maraming card?",
+ "detail-5": "Oo, maaari kang magdagdag ng maraming card sa wallet sa pamamagitan ng pag-click sa '+' na button sa Home page.",
+ "howToShareCard?": "Paano magbahagi ng card?",
+ "detail-6": "Mag-click sa pindutang 'Ibahagi' at i-scan ang QR code mula sa humihiling na partido. Kapag naitatag na ang koneksyon, ibabahagi ang card.",
+ "howToActivateCardForOnlineLogin?": "Paano i-activate ang isang card para sa online na pag-login?",
+ "detail-7": "Matapos matagumpay na magdagdag ng card sa wallet, mag-click sa 'Activation pending for Online login' sa card. Sa pag-click sa 'I-activate', ang card ay handa nang gamitin para sa online na pag-login.",
+ "howToViewActivity?": "Paano tingnan ang mga log ng aktibidad?",
+ "detail-8": "Sa Home page, mag-click sa 'Kasaysayan' upang tingnan ang mga detalye ng aktibidad ng user."
+ },
"AddVcModal": {
"requestingCredential": "Humihiling ng kredensyal...",
"errors": {
@@ -134,7 +173,6 @@
"applicationProcessing": "Hindi pa handa ang AID",
"noMessageAvailable": "Subukan pagkatapos ng ilang oras",
"networkRequestFailed": "Nabigo ang kahilingan sa network",
- "invalidAid": "Hindi available ang ipinasok na AID.Pakisuri ang iyong AID bago pumasok",
"timeout": "timeout"
}
}
@@ -145,84 +183,90 @@
"backButton": "Bumalik"
},
"GetIdInputModal": {
- "header": "Ilagay ang iyong Application ID para makuha ang iyong UIN",
- "getUIN": "Kumuha ng UIN/VID",
- "applicationId": "Application ID",
+ "header": "Kunin ang iyong UIN/VID",
+ "applicationIdLabel": "Pakilagay ang iyong Application ID",
+ "enterApplicationId": "Ilagay ang Application ID",
"requestingOTP": "Humihiling ng OTP...",
- "qstnMarkToolTip": "Available ang Application ID sa natanggap na acknowledgement pagkatapos ng enrollment."
+ "qstnMarkToolTip": "Available ang Application ID sa natanggap na acknowledgement pagkatapos ng enrollment.",
+ "getUIN": "Kumuha ng UIN/VID"
},
"IdInputModal": {
- "header": "Ilagay ang iyong UIN/VID para i-download ang iyong Card",
- "generateVc": "Bumuo ng Aking Card",
- "enterId": "Ilagay ang iyong {{idType}}",
- "noUIN/VID": "Wala ka bang UIN/VID? Kuhanin dito",
+ "header": "Kunin ang iyong ID",
+ "guideLabel": "Piliin ang uri ng ID at ilagay ang MOSIP na ibinigay na UIN o VID ng ID na nais mong makuha",
+ "generateVc": "Bumuo ng Card",
+ "enterId": "Ipasok ang {{idType}}",
+ "noUIN/VID": "Walang UIN/VID? ",
+ "getItHere": "Kunin mo na",
"requestingOTP": "Humihiling ng OTP..."
},
"OtpVerificationModal": {
- "enterOtp": "Ilagay ang 6 na numerong verification code na ipinadala namin sayo",
- "header": "Pag-verify ng OTP"
+ "title": "Pag-verify ng OTP",
+ "otpSentMessage": "Ipinadala namin ang 6 na digit na code sa iyong rehistradong mobile number!",
+ "resendTheCode": "Maaari mong ipadala muli ang code sa ",
+ "resendCode": "Ipadala muli ang Code"
},
"MyVcsTab": {
- "addVcButton": "Magdagdag ng Card",
- "generateVc": "Gumawa ng iyong Mga kard",
- "generateVcDescription": "Pindutin ang \"Magdagdag ng Card\" sa ibaba upang makuha ang iyong Card",
- "errors": {
- "savingFailed": {
- "title": "Nabigong i-save ang Card",
- "message": "Nagkaproblema habang nagse-save ng Card sa tindahan."
- },
- "diskFullError": {
- "title": "Nabigong i-save ang Card",
- "message": "Wala nang mga Mga kard na matatanggap o mai-save dahil puno na ang Data ng App."
- }
- }
+ "bringYourDigitalID": "Dalhin ang Iyong Digital ID",
+ "generateVcDescription": "Upang i-download ang iyong Card i-tap ang I-download Card sa ibaba",
+ "downloadingYourId": "Ang pagda-download ng iyong card, maaari itong tumagal nang hanggang 5 minuto",
+ "downloadCard": "I-download ang Card"
},
"OnboardingOverlay": {
- "stepOneTitle": "Mabuhay!",
- "stepOneText": "Panatilihing pribado ang iyong digital na kredensyal sa lahat ng pagkakataon. Upang makapagsimula, magdagdag ng Mga kard sa iyong profile.",
- "stepTwoTitle": "Pamamahala ng Card",
- "stepTwoText": "Kapag nalikha na ang Mga kard, ito ay ligtas na nakatago sa iyong mobile at maaaring palitan ang pangalan o ibahagi anumang oras.",
- "stepThreeTitle": "Madaling pagbabahagi",
- "stepThreeText": "Ibahagi at tumanggap ng Mga kard nang mabilis gamit ang camera ng iyong mobile upang mag-scan ng mga QR code.",
- "stepThreeButton": "Magsimula at magdagdag ng Card"
+ "stepOneTitle": "Ligtas na Pagbabahagi!",
+ "stepOneText": "Panatilihin ang iyong digital na kredensyal sa iyo sa lahat ng oras. Tinutulungan ka ng Inji na pamahalaan at gamitin ang mga ito nang epektibo. Upang makapagsimula, magdagdag ng mga card sa iyong profile.",
+ "stepTwoTitle": "Pinagkakatiwalaang Digital Wallet",
+ "stepTwoText": "Itabi at dalhin ang lahat ng iyong mahahalagang card sa isang pinagkakatiwalaang wallet.",
+ "stepThreeTitle": "Ligtas na Pagbabahagi",
+ "stepThreeText": "Ibahagi ang iyong mga card nang ligtas sa isang walang problemang paraan at mag-avail ng iba't ibang serbisyo.",
+ "stepFourTitle": "Walang problema sa pagpapatotoo",
+ "stepFourText": "I-authenticate ang iyong sarili nang madali gamit ang nakaimbak na digital na kredensyal.",
+ "stepFourButton": "Magsimula",
+ "skip": "Laktawan",
+ "next": "Susunod"
},
"ReceivedVcsTab": {
- "noReceivedVcsTitle": "Wala pang Mga kard",
+ "receivedCards": "Mga Natanggap na Card",
+ "header": "Mga Natanggap na Card",
+ "noReceivedVcsTitle": "Wala pang Card",
"noReceivedVcsText": "Pindutin ang Humiling sa ibaba para makatanggap ng Card"
},
"ViewVcModal": {
+ "title": "Mga Detalye ng ID",
"cancel": "Kanselahin",
- "lock": "Isara ang paggamit",
- "unlock": "Buksan ang paggamit",
+ "lock": "Lock",
+ "unlock": "I-unlock",
"rename": "Palitan ang pangalan",
"delete": "Tanggalin",
"revoke": "Bawiin",
- "revoking": "Ang iyong wallet ay naglalaman ng kredensyal na may VID {{vid}}. Ang pagkansela nito ay awtomatikong mag-aalis ng pareho sa wallet. Sigurado ka bang gusto mong magpatuloy?",
+ "revoking": "Ang iyong wallet ay naglalaman ng kredensyal na may VID {{vid}}. Ang pagbawi nito ay awtomatikong mag-aalis ng pareho sa wallet. Sigurado ka bang gusto mong magpatuloy?",
"requestingOtp": "Humihiling ng OTP...",
"editTag": "Palitan ang pangalan",
- "redirecting": "Redirecting...",
- "inProgress": "Naglo-load...",
+ "redirecting": "Nire-redirect...",
"success": {
- "unlocked": "Ang Card ay matagumpay na na-unlock",
- "locked": "Ang Card ay matagumpay na na-lock",
- "revoked": "Ang VID {{vid}} ay nakansela. Ang lahat ng mga detalye na naglalaman ng pareho ay awtomatikong aalisin wallet."
+ "unlocked": "Matagumpay na na-unlock ang Card.",
+ "locked": "Matagumpay na na-lock ang Card.",
+ "revoked": "Ang VID {{vid}} ay binawi. Awtomatikong aalisin sa wallet ang anumang kredensyal na naglalaman ng pareho"
}
},
"MainLayout": {
"home": "Bahay",
"scan": "Scan",
- "request": "Request",
+ "history": "Kasaysayan",
+ "request": "Hiling",
"settings": "mga setting"
},
"PasscodeScreen": {
- "header": "Magtakda ng passcode upang masigurado ang iyong aplikasyon",
- "confirmPasscode": "Kumpirmahin ang iyong passcode",
+ "header": "Itakda ang Passcode",
+ "enterNewPassword": "Maglagay ng bagong passcode",
+ "reEnterPassword": "Ipasok muli ang bagong passcode",
+ "confirmPasscode": "Kumpirmahin ang passcode",
"enterPasscode": "Ilagay ang iyong passcode"
},
"AppMetaData": {
"header": "Tungkol kay Inji",
"version": "Bersyon",
- "useBle": "Powered by BLE"
+ "useBle": "Pinapatakbo ng BLE",
+ "useGoogleNearby": "Pinapagana ng GoogleNearby"
},
"ProfileScreen": {
"name": "Pangalan",
@@ -247,7 +291,7 @@
"checkDomain": "Gayundin, tingnan kung mayroong icon ng lock sa address bar.",
"domainHead": "https://",
"selectId": "Pumili ng ID",
- "noBindedVc": "Available sa Verifyct ID ang SeleNo Binded Mga kard",
+ "noBindedVc": "Available sa Verifyct ID ang SeleNo Binded Card",
"back": "Bumalik ka",
"confirm": "Kumpirmahin",
"verify": "I-verify",
@@ -258,48 +302,47 @@
"access": " ay humihiling ng access sa",
"status": "Katayuan",
"successMessage": "Ikaw ay Matagumpay na Naka-log In ",
- "okay": "Sige"
+ "okay": "Sige",
+ "allow": "Payagan",
+ "cancel": "Kanselahin",
+ "essentialClaims": "Mahahalagang Claim",
+ "voluntaryClaims": "Mga Kusang-loob na Claim",
+ "required": "Kailangan"
},
"ReceiveVcScreen": {
- "header": "Mga detalye ng Card",
+ "header": "Card mga detalye",
"save": "I-save ang Card",
- "acceptRequest": "Tanggapin ang kahilingan at tumanggap ng Card",
+ "verifyAndSave": "I-verify at i-save",
"reject": "Tanggihan",
"discard": "Itapon",
- "goToReceivedVCTab": "Tingnan ang mga Natanggap na Mga kard",
- "saving": "Nagtitipid",
+ "goToReceivedVCTab": "Natanggap na View Card",
"errors": {
"savingFailed": {
- "title": "Nabigong i-save ang Card",
- "message": "Nagkaproblema habang nagse-save ng Card sa tindahan."
+ "title": "Failed to save card",
+ "message": "Nagkaproblema habang sine-save ang card sa tindahan."
},
"diskFullError": {
- "title": "Nabigong i-save ang Card",
- "message": "Wala nang mga Mga kard na matatanggap o mai-save dahil puno na ang Data ng App."
+ "title": "Nabigong i-save ang card",
+ "message": "Wala nang card ang matatanggap o mai-save dahil puno na ang Data ng App."
}
}
},
"RequestScreen": {
+ "receiveCard": "Tumanggap ng Card",
"bluetoothDenied": "Mangyaring paganahin ang Bluetooth upang makahiling ng Card",
- "bluetoothStateAndroid": "Mangyaring i-on ang bluetooth mula sa mga mabilisang setting upang suportahan ang lokal na pagbabahagi",
- "bluetoothStateIos": "Mangyaring i-on ang bluetooth mula sa control center upang suportahan ang lokal na pagbabahagi",
+ "bluetoothStateIos": "Naka-OFF ang Bluetooth, paki-ON ito mula sa control center",
+ "bluetoothStateAndroid": "Naka-OFF ang Bluetooth, paki-ON ito mula sa control center",
"showQrCode": "Ipakita ang QR code na ito para humiling ng resident Card",
"incomingVc": "Padating na Card",
"request": "Hilingin",
- "errors": {
- "nearbyDevicesPermissionDenied": {
- "message": "Kinakailangan ang pahintulot ng Mga Kalapit na Device para makahiling ng Card",
- "button": "Pahintulutan"
- }
- },
"status": {
"accepted": {
"title": "Tagumpay!",
- "message": "Tagumpay na nakuha ang Card mula kay Wallet"
+ "message": "Tagumpay na nakuha ang Card mula kay {{sender}}"
},
"rejected": {
"title": "Paunawa",
- "message": "Iwinaksi ang Card ni Wallet"
+ "message": "Iwinaksi ang Card ni {{sender}}"
},
"disconnected": {
"title": "Nadiskonekta",
@@ -329,52 +372,50 @@
},
"ScanScreen": {
"header": "I-scan ang QR Code",
- "noShareableVcs": "Walang magagamit na maibabahaging Mga kard.",
- "bluetoothStateAndroid": "Mangyaring i-on ang bluetooth mula sa mga mabilisang setting upang suportahan ang lokal na pagbabahagi",
- "bluetoothStateIos": "Mangyaring i-on ang bluetooth mula sa control center upang suportahan ang lokal na pagbabahagi",
+ "noShareableVcs": "Walang magagamit na maibabahaging Card..",
+ "bluetoothStateIos": "Naka-OFF ang Bluetooth, paki-ON ito mula sa control center",
+ "bluetoothStateAndroid": "Naka-OFF ang Bluetooth, paki-ON ito mula sa control center",
"enableBluetoothMessage": "Mangyaring paganahin ang mga pahintulot ng bluetooth upang suportahan ang lokal na pagbabahagi",
- "enableBluetoothButtonText": "Payagan ang Mga Pahintulot sa Bluetooth",
+ "enableBluetoothButtonText": "Payagan ang Mga Pahintulot sa bluetooth",
"sharingVc": "Pagbabahagi ng Card",
"errors": {
"locationDisabled": {
- "message": "Dapat na pinagana ang mga serbisyo ng lokasyon upang makapagbahagi ng card",
+ "message": "Dapat na nakabukas ang Location services ng iyong mobile para maaaring makapag-scan",
"button": "Buksan ang location services"
},
"locationDenied": {
- "message": "Kailangan ng pahintulot sa lokasyon para makapagbahagi ng card",
+ "message": "Kinakailangan ang pahintulot sa lokasyon ng iyong mobile para maaaring makapag-scan",
"button": "Payagan ng pahintulot sa lokasyon"
- },
- "nearbyDevicesPermissionDenied": {
- "message": "Kinakailangan ang pahintulot ng Mga Kalapit na Device upang makapagbahagi ng card",
- "button": "Pahintulutan"
}
},
"status": {
- "connecting": "Kumokonekta...",
- "connectingTimeout": "Medyo nagtatagal bago magtatag ng koneksyon. Bukas ba ang ibang device para sa mga koneksyon?",
+ "inProgress": "Isinasagawa",
+ "establishingConnection": "Pagtatatag ng Koneksyon",
+ "sharingInProgress": "Isinasagawa ang pagbabahagi",
+ "connectingTimeout": "Ito ay tumatagal ng ilang sandali upang maitaguyod ang koneksyon. Bukas ba ang ibang device para sa mga koneksyon?",
"exchangingDeviceInfo": "Nagpapalitan ng impormasyon ng device...",
- "exchangingDeviceInfoTimeout": "Medyo nagtatagal ang paglabas ng impormasyon ng device. Bukas ba ang ibang device para sa mga koneksyon?",
- "invalid": "Di-wasto ang QR Code",
- "offline": "Mangyaring kumonekta sa internet upang makapag-scan ng QR codes na gumagamit ng Online sharing mode",
- "sent": "Naibahagi na ang Card...",
- "sentHint": "Iniintay ang nakatanggap na itabi o iwaksi ang iyong Card",
+ "exchangingDeviceInfoTimeout": "Medyo nagtatagal ang palitan ng impormasyon ng device. Maaaring kailanganin mong kumonekta muli.",
+ "invalid": "Di-wastong QR Code",
+ "offline": "Mangyaring kumonekta sa internet upang i-scan ang mga QR code gamit ang Online sharing mode",
+ "sent": "Naipadala na ang Card...",
+ "sentHint": "Naghihintay para sa receiver na i-save o itapon ang iyong Card",
"sharing": {
"title": "Pagbabahagi...",
"hint": "Pakihintay na tanggapin o tanggihan ng tumatanggap na device ang pagbabahagi.",
"timeoutHint": "Mas tumatagal kaysa sa inaasahan ang pagbabahagi. Maaaring may problema sa koneksyon."
},
"accepted": {
- "title": "Tagumpay!",
- "message": "Ang iyong Card ay matagumpay na naibahagi sa Verifier"
+ "title": "Matagumpay na naibahagi ang ID",
+ "message": "Ang iyong Card ay matagumpay na naibahagi sa Verifier",
+ "gotohome": "Pumunta sa bahay"
},
"rejected": {
"title": "Pansinin",
"message": "Ang iyong Card ay itinapon ng Verifier"
},
"bleError": {
- "title": "Nabigong ilipat",
- "message": "Nagkaproblema habang inililipat ang Card. Pakisubukang muli.",
- "hint": "Pagkakamali: {{code}}"
+ "title": "Nabigong ilipat!",
+ "message": "Nagkaproblema habang inililipat ang Card. Pakisubukang muli."
}
}
},
@@ -386,9 +427,11 @@
},
"SendVcScreen": {
"reasonForSharing": "Dahilan ng pagbabahagi (opsyonal)",
- "acceptRequest": "Ibahagi",
+ "acceptRequest": "Tanggapin ang kahilingan at pumili ng card",
"acceptRequestAndVerify": "Ibahagi sa Selfie",
"reject": "Tanggihan",
+ "consentToPhotoVerification": "Nagbibigay ako ng pahintulot na kunin ang aking larawan para sa pagpapatunay",
+ "pleaseSelectAnId": "Mangyaring pumili ng ID",
"status": {
"sharing": {
"title": "Pagbabahagi",
@@ -396,14 +439,13 @@
},
"accepted": {
"title": "Tagumpay!",
- "message": "Ang iyong Card ay matagumpay na naibahagi kay {{receiver}}"
+ "message": "Ang iyong Card ay matagumpay na naibahagi kay Verifier"
},
"rejected": {
"title": "Pansinin",
- "message": "Ang iyong Card ay tinanggihan ng {{receiver}}"
+ "message": "Ang iyong Card ay tinanggihan ng Verifier"
}
- },
- "consentToPhotoVerification": "Nagbibigay ako ng pahintulot na kunin ang aking larawan para sa pagpapatunay"
+ }
},
"VerifyIdentityOverlay": {
"status": {
@@ -412,7 +454,8 @@
"errors": {
"invalidIdentity": {
"title": "Hindi ma-verify ang pagkakakilanlan",
- "message": "Hindi nakikilala ang mukha. Pakisubukang muli."
+ "message": "Hindi nakikilala ang mukha. Pakisubukang muli.",
+ "messageNoRetry": "Face not recognised."
}
}
},
@@ -421,13 +464,22 @@
"getStarted": "Magsimula",
"unlockApp": "Buksan ang aplikasyon"
},
+ "SetupLanguage": {
+ "header": "Piliin ang Wika",
+ "description": "Piliin ang iyong gustong wika",
+ "save": "I-save ang Kagustuhan"
+ },
"common": {
"cancel": "Kanselahin",
"save": "I-save",
+ "dismiss": "Dismissed",
"editLabel": "Palitan ang {{label}}",
"tryAgain": "Subukan muli",
- "errors": {
- "genericError": "Nagkaproblema. Pakisubukang muli pagkatapos ng ilang oras!"
+ "camera": {
+ "errors": {
+ "missingPermission": "Ginagamit ng app na ito ang camera upang i-scan ang QR code ng isa pang device."
+ },
+ "allowAccess": "Payagan ang access sa camera"
}
}
}
diff --git a/locales/hin.json b/locales/hin.json
index ff84f1b89..31d508258 100644
--- a/locales/hin.json
+++ b/locales/hin.json
@@ -15,447 +15,484 @@
"WALLET_BINDING_SUCCESSFULL": "सक्रियण सफल",
"WALLET_BINDING_FAILURE": "सक्रियकरण असफल"
},
- "DeviceInfoList": {
- "requestedBy": "द्वारा अनुरोध किया गया",
- "sentBy": "द्वारा भेजा गया",
- "deviceRefNumber": "डिवाइस संदर्भ संख्या",
- "name": "नाम",
- "Verifier": "सत्यापनकर्ता",
- "Wallet": "वॉलेट"
- },
- "PasscodeVerify": {
- "passcodeMismatchError": "पासकोड का मिलान नहीं हुआ।"
- },
- "FaceScanner": {},
- "OIDcAuth": {
- "title": "OIDC प्रमाणीकरण",
- "text": "OIDC प्रदाता UI के साथ प्रतिस्थापित करने के लिए",
- "verify": "सत्यापित करना"
- },
- "QrScanner": {
- "missingPermissionText": "यह ऐप दूसरे डिवाइस के क्यूआर कोड को स्कैन करने के लिए कैमरे का इस्तेमाल करता है।",
- "allowCameraButton": "कैमरे तक पहुंच की अनुमति दें"
- },
- "VcDetails": {
- "generatedOn": "पर उत्पन्न हुआ",
- "status": "दर्जा",
- "valid": "वैध",
- "photo": "फ़ोटो",
- "fullName": "पूरा नाम",
- "gender": "लिंग",
- "dateOfBirth": "जन्म की तारीख",
- "phoneNumber": "फ़ोन नंबर",
- "email": "ईमेल",
- "address": "पता",
- "reasonForSharing": "साझा करने का कारण",
- "idType": "पहचान का प्रकार",
- "id": "पहचान",
- "nationalCard": "राष्ट्रीय कार्ड",
- "uin": "UIN",
- "enableVerification": "सक्रिय",
- "profileAuthenticated": "ऑनलाइन लॉगिन के लिए सक्रिय",
- "offlineAuthDisabledHeader": "ऑनलाइन लॉगिन के लिए सक्रियता लंबित है",
- "offlineAuthDisabledMessage": "ऑनलाइन लॉगिन के लिए उपयोग किए जाने वाले इस क्रेडेंशियल को सक्रिय करने के लिए कृपया नीचे दिए गए बटन पर क्लिक करें।",
- "vid": "VID",
- "verificationEnabledSuccess": "ऑनलाइन लॉगिन के लिए सक्रिय",
- "goback": "वापस जाओ",
- "BindingWarning": "यदि आपने किसी अन्य वॉलेट पर इस क्रेडेंशियल के सत्यापन को सक्षम किया है, तो यह ओवरराइड हो जाएगा। क्या आपकी आगे बढ़ने की इच्छा है?",
- "yes_confirm": "हां, मैं पुष्टि करता हूं",
- "no": "नहीं",
- "Alert": "चेतावनी",
- "ok": "ठीक",
- "credentialRegistry": "साख रजिस्ट्री",
- "errors": {
- "savingFailed": {
- "title": "कार्ड सहेजने में विफल",
- "message1": "कार्ड को स्टोर में सेव करते समय कोई गड़बड़ी हुई.",
- "message": "स्टोर में कार्ड सहेजते समय कोई गड़बड़ी हुई।"
- },
- "diskFullError": {
- "title": "कार्ड सहेजने में विफल",
- "message": "ऐप डेटा पूर्ण होने के कारण कोई और कार्ड्स प्राप्त या सहेजा नहीं जा सकता है।"
- }
- }
- },
- "AuthScreen": {
- "header": "क्या आप एप्लिकेशन को अनलॉक करने के लिए बायोमेट्रिक्स का उपयोग करना चाहेंगे?",
- "useBiometrics": "बायोमेट्रिक्स का उपयोग करें",
- "usePasscode": "मैं एक पासकोड का उपयोग करना चाहूँगा",
- "errors": {
- "unavailable": "डिवाइस बायोमेट्रिक्स का समर्थन नहीं करता",
- "unenrolled": "बायोमेट्रिक्स का उपयोग करने के लिए, कृपया अपने फ़िंगरप्रिंट को अपनी डिवाइस सेटिंग में दर्ज करें",
- "failed": "बायोमेट्रिक्स से प्रमाणित करने में विफल",
- "generic": "बायोमेट्रिक्स प्रमाणीकरण में त्रुटि प्रतीत होती है"
- }
- },
- "BiometricScreen": {
- "unlock": "फिंगरप्रिंट से अनलॉक करें"
- },
- "HistoryTab": {
- "noHistory": "अभी तक कोई इतिहास उपलब्ध नहीं है",
- "downloaded": "डाउनलोड किया गया",
- "shared": "साझा",
- "received": "प्राप्त",
- "deleted": "डिलीट"
- },
- "HomeScreen": {
- "myVcsTab": "मेरा\nकार्ड्स",
- "receivedVcsTab": "प्राप्त\nकार्ड्स",
- "historyTab": "इतिहास"
- },
- "AddVcModal": {
- "requestingCredential": "क्रेडेंशियल का अनुरोध कर रहा है...",
- "errors": {
- "input": {
- "empty": "इनपुट खाली नहीं हो सकता",
- "invalidFormat": "इनपुट फॉर्मेट गलत है"
- },
- "backend": {
- "invalidOtp": "OTP अमान्य है",
- "expiredOtp": "ओटीपी समाप्त हो गया है",
- "invalidUin": "UIN अमान्य",
- "invalidVid": "VID अमान्य",
- "missingUin": "UIN यूआईएन डेटाबेस में उपलब्ध नहीं है",
- "missingVid": "VID वीआईडी डेटाबेस में उपलब्ध नहीं है",
- "noMessageAvailable": "कुछ देर बाद कोशिश करें",
- "whileGeneratingOtpErrorIsOccured": "ओटीपी जनरेट करते समय एरर आ गया",
- "networkRequestFailed": "नेटवर्क अनुरोध विफल रहा"
- }
- }
- },
- "GetVcModal": {
- "errors": {
- "input": {
- "empty": "इनपुट खाली नहीं हो सकता",
- "invalidFormat": "इनपुट फॉर्मेट गलत"
- },
- "backend":{
- "invalidOtp": "ओटीपी अमान्य है",
- "expiredOtp": "ओटीपी समाप्त हो गया है",
- "applicationProcessing": "AID तैयार नहीं है",
- "noMessageAvailable": "कुछ देर बाद कोशिश करें",
- "networkRequestFailed": "नेटवर्क अनुरोध विफल रहा",
- "invalidAid": "दर्ज सहायता उपलब्ध नहीं है। प्रवेश करने से पहले कृपया अपने सहायता की जाँच करें",
- "timeOut": "समय समाप्त"
- }
- }
- },
- "DownloadingVcModal": {
- "header": "अपना कार्ड डाउनलोड कर रहा है",
- "bodyText": "इसमें कुछ समय लग सकता है, हम आपको सूचित करेंगे जब आपका कार्ड डाउनलोड हो जाएगा और उपलब्ध होगा",
- "backButton": "बैक होम"
- },
- "GetIdInputModal": {
- "header": "अपना यूआईएन प्राप्त करने के लिए अपनी एप्लिकेशन ID दर्ज करें",
- "getUIN": "UIN/VID प्राप्त करें",
- "applicationId": "आवेदन ID",
- "requestingOTP": "OTP का अनुरोध...",
- "qstnMarkToolTip": "आवेदन ID नामांकन के बाद प्राप्त पावती में उपलब्ध है।"
- },
- "IdInputModal": {
- "header": "अपना कार्ड डाउनलोड करने के लिए अपना UIN/VID दर्ज करें",
- "generateVc": "मेरा कार्ड जनरेट करें",
- "enterId": "अपना {{idType}} दर्ज करें",
- "noUIN/VID": "आपका UIN/VID नहीं है? इसे यहां लाओ",
- "requestingOTP": "OTP का अनुरोध..."
- },
- "OtpVerificationModal": {
- "enterOtp": "हमारे द्वारा भेजा गया 6 अंकों का सत्यापन कोड दर्ज करें",
- "header": "ओटीपी सत्यापन"
- },
- "MyVcsTab": {
- "addVcButton": "कार्ड जोड़ें",
- "generateVc": "अपना कार्ड्स जेनरेट करें",
- "generateVcDescription": "अपना कार्ड डाउनलोड करने के लिए नीचे \"कार्ड जोड़ें\" पर टैप करें",
- "errors": {
- "savingFailed": {
- "title": "कार्ड सहेजने में विफल",
- "message1": "कार्ड को स्टोर में सेव करते समय कोई गड़बड़ी हुई.",
- "message": "स्टोर में कार्ड सहेजते समय कोई गड़बड़ी हुई।"
- },
- "diskFullError": {
- "title": "कार्ड सहेजने में विफल",
- "message": "ऐप डेटा पूर्ण होने के कारण कोई और कार्ड्स प्राप्त या सहेजा नहीं जा सकता है।"
- }
- }
- },
- "OnboardingOverlay": {
- "stepOneTitle": "स्वागत है!",
- "stepOneText": "अपना डिजिटल क्रेडेंशियल हमेशा अपने पास रखें। आरंभ करने के लिए, अपनी प्रोफ़ाइल में कार्ड्स जोड़ें।",
- "stepTwoTitle": "कार्ड प्रबंधन",
- "stepTwoText": "एक बार जनरेट हो जाने पर, कार्ड्स आपके मोबाइल पर सुरक्षित रूप से संगृहीत हो जाते हैं और उनका नाम बदला जा सकता है या किसी भी समय साझा किया जा सकता है।",
- "stepThreeTitle": "आसान साझा करना",
- "stepThreeText": "QR कोड स्कैन करने के लिए अपने फ़ोन कैमरे का उपयोग करके कार्ड्स switfly साझा करें और प्राप्त करें।",
- "stepThreeButton": "आरंभ करें और कार्ड जोड़ें"
- },
- "ReceivedVcsTab": {
- "noReceivedVcsTitle": "नहीं कार्ड्स अभी तक उपलब्ध नहीं है",
- "noReceivedVcsText": "प्राप्त करने के लिए नीचे दिए गए अनुरोध पर टैप करें कार्ड"
- },
- "ViewVcModal": {
- "cancel": "रद्द करना",
- "lock": "लॉक",
- "unlock": "अनलॉक",
- "rename": "नाम बदले",
- "delete": "हटाएं",
- "revoke": "निरस्त",
- "revoking": "आपके वॉलेट में VID {{vid}} के साथ एक क्रेडेंशियल है. ಇದನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳುವುದರಿಂದ ಅದನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವ್ಯಾಲೆಟ್ನಿಂದ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. क्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?",
- "requestingOtp": "OTP का अनुरोध...",
- "editTag": "टैग संपादित करें",
- "redirecting": "पुन: निर्देशित...",
- "inProgress": "लोड हो रहा है...",
- "success": {
- "unlocked": "कार्ड सफलतापूर्वक अनलॉक किया गया",
- "locked": "कार्ड सफलतापूर्वक लॉक हो गया",
- "revoked": "VID {{vid}} निरस्त कर दिया गया है. इसमें शामिल कोई भी क्रेडेंशियल वॉलेट से स्वचालित रूप से हटा दिया जाएगा"
- }
- },
- "MainLayout": {
- "home": "घर",
- "scan": "स्कैन",
- "request": "अनुरोध",
- "settings": "सेटिंग्स"
- },
- "PasscodeScreen": {
- "header": "अपना आवेदन सुरक्षित करने के लिए पासकोड सेट करें",
- "confirmPasscode": "अपना पासकोड कन्फर्म करें",
- "enterPasscode": "अपना पासकोड दर्ज करे"
- },
- "AppMetaData":{
- "header": "इंजी के बारे में",
- "version": "संस्करण",
- "useBle": "Powered by BLE"
- },
- "ProfileScreen": {
- "name": "नाम",
- "vcLabel": "वीसी लेबल",
- "language": "भाषा",
- "credentialRegistry": "साख रजिस्ट्री",
- "bioUnlock": "बायोमेट्रिक्स से अनलॉक करें",
- "authFactorUnlock": "अनलॉक ऑथ फैक्टर",
- "AppMetaData": "इंजी के बारे में",
- "logout": "लॉग आउट",
- "revokeLabel": "VID रद्द करना",
- "revokeHeader": "VID रद्द करना",
- "revokingVids": "आप ({{count}}) VID's को निरस्त करने वाले हैं .",
- "revokingVidsAfter": "इसका अर्थ है कि अब आप उनसे लिंक की गई किसी भी आईडी का उपयोग या देखने में सक्षम नहीं होंगे VID(s). \nक्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?",
- "empty": "खाली",
- "revokeSuccessful": "VID को सफलतापूर्वक निरस्त कर दिया गया"
- },
- "QrScreen": {
- "title": "क्यूआर लॉगिन",
- "alignQr": "स्कैन करने के लिए फ्रेम के भीतर क्यूआर कोड को संरेखित करें",
- "confirmation": "पुष्टीकरण",
- "checkDomain": "यह भी जांचें कि एड्रेस बार पर लॉक आइकन है।",
- "domainHead": "https://",
- "selectId": "आईडी चुनें",
- "noBindedVc": "सत्यापित करने के लिए कोई आबद्ध कार्ड्स उपलब्ध नहीं है",
- "back": "वापस जाओ",
- "confirm": "पुष्टि करें",
- "verify": "सत्यापित करना",
- "faceAuth": "चेहरा प्रमाणीकरण",
- "consent": "अनुमति",
- "loading": "लोड हो रहा है...",
- "domainWarning": "कृपया उस वेबसाइट के डोमेन की पुष्टि करें जिसे आप नीचे दिए गए क्यूआर कोड से स्कैन कर रहे हैं",
- "access": " तक पहुंच का अनुरोध कर रहा है",
- "status": "दर्जा",
- "successMessage":"आपने सफलतापूर्वक लॉग इन कर लिया है ",
- "okay": "ठीक"
- },
- "ReceiveVcScreen": {
- "header": "कार्ड विवरण",
- "save": "सेव कार्ड",
- "acceptRequest": "अनुरोध स्वीकार करें और कार्ड प्राप्त करें",
- "acceptRequestAndVerify": "अनुरोध स्वीकार करें और सत्यापित करें",
- "reject": "अस्वीकार",
- "discard": "खारिज करना",
- "goToReceivedVCTab": "प्राप्त कार्ड्स देखें",
- "saving": "सहेजा जा रहा है",
- "errors": {
- "savingFailed": {
- "title": "कार्ड सहेजने में विफल",
- "message": "कार्ड को स्टोर में सेव करते समय कोई गड़बड़ी हुई."
- },
- "diskFullError": {
- "title": "कार्ड सहेजने में विफल",
- "message": "ऐप डेटा पूर्ण होने के कारण कोई और कार्ड्स प्राप्त या सहेजा नहीं जा सकता है।"
- }
+ "DeviceInfoList": {
+ "requestedBy": "द्वारा अनुरोध किया गया",
+ "sentBy": "द्वारा भेजा गया",
+ "deviceRefNumber": "डिवाइस संदर्भ संख्या",
+ "name": "नाम"
+ },
+ "PasscodeVerify": {
+ "passcodeMismatchError": "पासकोड का मिलान नहीं हुआ।"
+ },
+ "FaceScanner": {},
+ "OIDcAuth": {
+ "title": "OIDC प्रमाणीकरण",
+ "text": "OIDC प्रदाता UI के साथ प्रतिस्थापित करने के लिए",
+ "verify": "सत्यापित करना"
+ },
+ "QrScanner": {
+ "missingPermissionText": "यह ऐप दूसरे डिवाइस के क्यूआर कोड को स्कैन करने के लिए कैमरे का इस्तेमाल करता है।",
+ "allowCameraButton": "कैमरे तक पहुंच की अनुमति दें"
+ },
+ "VcDetails": {
+ "generatedOn": "पर उत्पन्न हुआ",
+ "status": "दर्जा",
+ "valid": "वैध",
+ "photo": "फ़ोटो",
+ "fullName": "पूरा नाम",
+ "gender": "लिंग",
+ "dateOfBirth": "जन्म की तारीख",
+ "phoneNumber": "फ़ोन नंबर",
+ "email": "ईमेल",
+ "address": "पता",
+ "reasonForSharing": "साझा करने का कारण",
+ "idType": "पहचान का प्रकार",
+ "id": "पहचान",
+ "qrCodeHeader": "क्यू आर संहिता",
+ "nationalCard": "राष्ट्रीय कार्ड",
+ "uin": "UIN",
+ "vid": "VID",
+ "enableVerification": "सक्रिय",
+ "profileAuthenticated": "ऑनलाइन लॉगिन के लिए सक्रिय",
+ "offlineAuthDisabledHeader": "ऑनलाइन लॉगिन के लिए सक्रियता लंबित है",
+ "offlineAuthDisabledMessage": "ऑनलाइन लॉगिन के लिए उपयोग किए जाने वाले इस क्रेडेंशियल को सक्रिय करने के लिए कृपया नीचे दिए गए बटन पर क्लिक करें।",
+ "verificationEnabledSuccess": "ऑनलाइन लॉगिन के लिए सक्रिय",
+ "goback": "वापस जाओ",
+ "BindingWarning": "यदि आपने किसी अन्य वॉलेट पर इस क्रेडेंशियल के सत्यापन को सक्षम किया है, तो यह ओवरराइड हो जाएगा। क्या आपकी आगे बढ़ने की इच्छा है?",
+ "yes_confirm": "हां, मैं पुष्टि करता हूं",
+ "no": "नहीं",
+ "Alert": "चेतावनी",
+ "ok": "ठीक"
+ },
+ "HomeScreenKebabPopUp": {
+ "title": "अधिक विकल्प",
+ "unPinCard": "अनपिन कार्ड",
+ "pinCard": "पिन कार्ड",
+ "offlineAuthenticationDisabled!": "ऑफ़लाइन प्रमाणीकरण अक्षम!",
+ "offlineAuthDisabledMessage": "इस क्रेडेंशियल को ऑफ़लाइन प्रमाणीकरण के लिए उपयोग करने के लिए यहां क्लिक करें।",
+ "viewActivityLog": "गतिविधि लॉग देखें",
+ "removeFromWallet": "बटुए से निकालें",
+ "revokeId": "आईडी निरस्त करें",
+ "revokeMessage": "इस प्रोफ़ाइल के लिए वर्चुअल आईडी निरस्त करें"
+ },
+ "WalletBinding": {
+ "inProgress": "चालू",
+ "profileAuthenticated": "प्रोफ़ाइल प्रमाणित है!"
+ },
+ "BindingVcWarningOverlay": {
+ "alert": "कृपया पुष्टि करें",
+ "BindingWarning": "यदि आपने किसी अन्य वॉलेट पर इस क्रेडेंशियल के सत्यापन को सक्षम किया है, तो यह ओवरराइड हो जाएगा। क्या आपकी आगे बढ़ने की इच्छा है?",
+ "yesConfirm": "हां, मैं पुष्टि करता हूं",
+ "no": "नहीं"
+ },
+ "AuthScreen": {
+ "header": "क्या आप एप्लिकेशन को अनलॉक करने के लिए बायोमेट्रिक्स का उपयोग करना चाहेंगे?",
+ "Description": "क्या आप एप्लिकेशन को अनलॉक करने के लिए बायोमेट्रिक्स का उपयोग करना चाहेंगे?",
+ "useBiometrics": "बायोमेट्रिक्स का उपयोग करें",
+ "usePasscode": "मैं एक पासकोड का उपयोग करना चाहूँगा",
+ "errors": {
+ "unavailable": "डिवाइस बायोमेट्रिक्स का समर्थन नहीं करता",
+ "unenrolled": "बायोमेट्रिक्स का उपयोग करने के लिए, कृपया अपने फ़िंगरप्रिंट को अपनी डिवाइस सेटिंग में दर्ज करें",
+ "failed": "बायोमेट्रिक्स से प्रमाणित करने में विफल",
+ "generic": "बायोमेट्रिक्स प्रमाणीकरण में त्रुटि प्रतीत होती है"
+ }
+ },
+ "BiometricScreen": {
+ "unlock": "फिंगरप्रिंट से अनलॉक करें"
+ },
+ "HistoryScreen": {
+ "noHistory": "अभी तक कोई इतिहास नहीं है",
+ "downloaded": "डाउनलोड",
+ "shared": "साझा",
+ "received": "प्राप्त",
+ "deleted": "हटाए गए"
+ },
+ "SettingScreen": {
+ "header": "समायोजन",
+ "injiAsVerifierApp": "सत्यापनकर्ता ऐप के रूप में इंजी",
+ "basicSettings": "मूल सेटिंग्स",
+ "bioUnlock": "बायोमेट्रिक्स से अनलॉक करें",
+ "language": "भाषा",
+ "aboutInji": "इंजी के बारे में",
+ "credentialRegistry": "क्रेडेंशियल रजिस्ट्री",
+ "injiTourGuide": "इंजी टूर गाइड",
+ "logout": "लॉग आउट"
+ },
+ "AboutInji": {
+ "aboutInji": "इंजी के बारे में",
+ "header": "इंजी के बारे में",
+ "aboutDetailes": "इंजी एक मोबाइल ऐप है जिसे क्रेडेंशियल स्टोर करने के लिए डिजिटल वॉलेट के रूप में इस्तेमाल किया जा सकता है। यह किसी भी स्थान और समय पर ऑफ़लाइन और ऑनलाइन दोनों तरीकों से पहचान के सत्यापन की अनुमति देता है।",
+ "forMoreDetailes": "अधिक जानकारी के लिए",
+ "clickHere": "यहाँ क्लिक करें",
+ "version": "संस्करण",
+ "tuvaliVersion": "तुवाली-संस्करण"
+ },
+ "HelpScreen": {
+ "header": "मदद",
+ "whatIsDigitalCredential?": "डिजिटल क्रेडेंशियल क्या है?",
+ "detail-1": "डिजिटल क्रेडेंशियल आपके भौतिक पहचान पत्र का डिजिटल संस्करण है",
+ "whatCanDoWithDigitalCredential?": "हम डिजिटल क्रेडेंशियल्स के साथ क्या कर सकते हैं?",
+ "detail-2": "आप अपने डिजिटल क्रेडेंशियल्स का उपयोग करके विभिन्न सरकारी और निजी सेवाओं का लाभ उठा सकते हैं।",
+ "howToAddCard?": "कार्ड कैसे जोड़ें?",
+ "detail-3": "कार्ड जोड़ने के लिए होम पेज पर '+' बटन पर क्लिक करें और उचित विकल्प चुनें।",
+ "howToRemoveCardFromWallet?": "कार्ड कैसे साझा करें?",
+ "detail-4": "कार्ड पर बाईं ओर स्वाइप करें > अधिक > वॉलेट से निकालें पर क्लिक करें",
+ "canWeAddMultipleCards?": "क्या हम अनेक कार्ड जोड़ सकते हैं?",
+ "detail-5": "हां, आप होम पेज पर '+' बटन पर क्लिक करके वॉलेट में कई कार्ड जोड़ सकते हैं।",
+ "howToShareCard?": "कार्ड कैसे साझा करें?",
+ "detail-6": "'शेयर' बटन पर क्लिक करें और अनुरोध करने वाले पक्ष से क्यूआर कोड स्कैन करें। एक बार कनेक्शन स्थापित हो जाने पर, कार्ड साझा किया जाएगा।",
+ "howToActivateCardForOnlineLogin?": "ऑनलाइन लॉगिन के लिए कार्ड कैसे सक्रिय करें?",
+ "detail-7": "वॉलेट में सफलतापूर्वक कार्ड जोड़ने के बाद, कार्ड पर 'ऑनलाइन लॉगिन के लिए सक्रियण लंबित' पर क्लिक करें। 'एक्टिवेट' पर क्लिक करने पर, कार्ड ऑनलाइन लॉगिन के लिए उपयोग के लिए तैयार हो जाएगा।",
+ "howToViewActivity?": "गतिविधि लॉग कैसे देखें?",
+ "detail-8": "होम पेज पर, उपयोगकर्ता की गतिविधि का विवरण देखने के लिए 'इतिहास' पर क्लिक करें।"
+ },
+ "HomeScreen": {
+ "myVcsTab": "मेरा\nकार्ड",
+ "receivedVcsTab": "प्राप्त\nकार्ड",
+ "historyTab": "इतिहास"
+ },
+ "AddVcModal": {
+ "requestingCredential": "क्रेडेंशियल का अनुरोध कर रहा है...",
+ "errors": {
+ "input": {
+ "empty": "इनपुट खाली नहीं हो सकता",
+ "invalidFormat": "इनपुट फॉर्मेट गलत है"
+ },
+ "backend": {
+ "invalidOtp": "OTP अमान्य है",
+ "expiredOtp": "ओटीपी समाप्त हो गया है",
+ "invalidUin": "UIN अमान्य",
+ "invalidVid": "VID अमान्य",
+ "missingUin": "UIN यूआईएन डेटाबेस में उपलब्ध नहीं है",
+ "missingVid": "VID वीआईडी डेटाबेस में उपलब्ध नहीं है",
+ "noMessageAvailable": "कुछ देर बाद कोशिश करें",
+ "whileGeneratingOtpErrorIsOccured": "ओटीपी जनरेट करते समय एरर आ गया",
+ "networkRequestFailed": "नेटवर्क अनुरोध विफल रहा"
}
- },
- "RequestScreen": {
- "bluetoothDenied": "कृपया ब्लूटूथ को सक्षम करें ताकि वह कार्ड का अनुरोध कर सके",
- "bluetoothStateAndroid": "स्थानीय साझाकरण का समर्थन करने के लिए कृपया त्वरित सेटिंग से ब्लूटूथ चालू करें",
- "bluetoothStateIos": " स्थानीय साझाकरण का समर्थन करने के लिए कृपया नियंत्रण केंद्र से ब्लूटूथ चालू करें",
- "showQrCode": "निवासी कार्ड का अनुरोध करने के लिए यह क्यूआर कोड प्रदर्शित करें",
- "incomingVc": "इनकमिंग कार्ड",
- "request": "प्रार्थना",
- "errors": {
- "nearbyDevicesPermissionDenied": {
- "message": "कार्ड का अनुरोध करने में सक्षम होने के लिए आस-पास के उपकरणों की अनुमति आवश्यक है",
- "button": "अनुमति दें"
+ }
+ },
+ "GetVcModal": {
+ "errors": {
+ "input": {
+ "empty": "इनपुट खाली नहीं हो सकता",
+ "invalidFormat": "इनपुट फॉर्मेट गलत"
+ },
+ "backend": {
+ "invalidOtp": "ओटीपी अमान्य है",
+ "expiredOtp": "ओटीपी समाप्त हो गया है",
+ "applicationProcessing": "AID तैयार नहीं है",
+ "noMessageAvailable": "कुछ देर बाद कोशिश करें",
+ "networkRequestFailed": "नेटवर्क अनुरोध विफल रहा",
+ "timeOut": "समय समाप्त"
}
- },
- "status": {
- "accepted": {
- "title": "सफलता!",
- "message": "कार्ड वॉलेट से सफलतापूर्वक प्राप्त हो गया है"
- },
- "rejected": {
- "title": "सूचना",
- "message": "आपने वॉलेट के कार्ड को अस्वीकार कर दिया है"
- },
- "disconnected": {
- "title": "डिस्कनेक्ट किया गया",
- "message": "कनेक्शन बाधित हो गया था। कृपया पुन: प्रयास करें।"
- },
- "waitingConnection": "कनेक्शन की प्रतीक्षा कर रहा है...",
- "exchangingDeviceInfo": {
- "message": "डिवाइस की जानकारी का आदान-प्रदान करना...",
- "timeoutHint": "डिवाइस की जानकारी का आदान-प्रदान करने में बहुत अधिक समय लग रहा है..."
- },
- "connected": {
- "message": "डिवाइस से कनेक्ट किया गया। कार्ड के लिए प्रतीक्षारत...",
- "timeoutHint": "अभी तक कोई डेटा प्राप्त नहीं हुआ है. भेजने वाला उपकरण अभी भी जुड़ा हुआ है?"
- },
- "offline": {
- "message": "ऑनलाइन साझाकरण मोड सक्षम करने के लिए कृपया इंटरनेट से कनेक्ट करें"
- },
- "bleError": {
- "title": "स्थानांतरित करने में विफल",
- "message": "कार्ड को स्थानांतरित करते समय कुछ गलत हो गया। कृपया पुन: प्रयास करें।",
- "hint": "गलती: {{code}}"
- }
+ }
+ },
+ "DownloadingVcModal": {
+ "header": "अपनाकार्डडाउनलोड कर रहा है",
+ "bodyText": "इसमें कुछ समय लग सकता है, हम आपको सूचित करेंगे जब आपका कार्ड डाउनलोड हो जाएगा और उपलब्ध होगा",
+ "backButton": "बैक होम"
+ },
+ "GetIdInputModal": {
+ "header": "अपना UIN/VID पुनः प्राप्त करें",
+ "applicationIdLabel": "कृपया अपना आवेदन आईडी दर्ज करें",
+ "enterApplicationId": "एप्लिकेशन आईडी दर्ज करें",
+ "requestingOTP": "ओटीपी का अनुरोध...",
+ "qstnMarkToolTip": "आवेदन आईडी नामांकन के बाद प्राप्त पावती में उपलब्ध है।",
+ "getUIN": "यूआईएन/वीआईडी प्राप्त करें"
+ },
+ "IdInputModal": {
+ "header": "अपनी आईडी पुनर्प्राप्त करें",
+ "guideLabel": "आईडी प्रकार का चयन करें और एमओएसआईपी प्रदान की गई यूआईएन या उस आईडी का वीआईडी दर्ज करें जिसे आप पुनर्प्राप्त करना चाहते हैं",
+ "generateVc": "कार्ड जनरेट करें",
+ "downloadID": "डाउनलोड आईडी",
+ "enterId": "{{idType}} दर्ज करें",
+ "noUIN/VID": "यूआईएन/वीआईडी नहीं है? ",
+ "getItHere": "अब समझे",
+ "requestingOTP": "ओटीपी का अनुरोध..."
+ },
+ "OtpVerificationModal": {
+ "title": "ओटीपी सत्यापन",
+ "otpSentMessage": "हमने आपके पंजीकृत मोबाइल नंबर पर 6 अंकों का कोड भेज दिया है!",
+ "resendTheCode": "आप कोड को फिर से भेज सकते हैं ",
+ "resendCode": "पुन: कोड भेजे"
+ },
+ "MyVcsTab": {
+ "downloadCard": "डाउनलोड कार्ड",
+ "bringYourDigitalID": "अपनी डिजिटल आईडी लाओ",
+ "generateVcDescription": "अपना कार्ड डाउनलोड करने के लिए नीचे डाउनलोड कार्ड टैप करें",
+ "downloadingYourId": "आपका कार्ड डाउनलोड करने में, इसमें 5 मिनट तक लग सकते हैं"
+ },
+ "OnboardingOverlay": {
+ "stepOneTitle": "सुरक्षित साझाकरण!",
+ "stepOneText": "अपना डिजिटल क्रेडेंशियल हर समय अपने पास रखें। इंजी आपको उन्हें प्रभावी ढंग से प्रबंधित करने और उपयोग करने में मदद करता है। आरंभ करने के लिए, अपनी प्रोफ़ाइल में कार्ड जोड़ें।",
+ "stepTwoTitle": "विश्वसनीय डिजिटल वॉलेट",
+ "stepTwoText": "अपने सभी महत्वपूर्ण कार्डों को एक ही विश्वसनीय वॉलेट में रखें और रखें।",
+ "stepThreeTitle": "सुरक्षित साझाकरण",
+ "stepThreeText": "परेशानी मुक्त तरीके से अपने कार्ड सुरक्षित रूप से साझा करें और विभिन्न सेवाओं का लाभ उठाएं।",
+ "stepFourTitle": "परेशानी मुक्त प्रमाणीकरण",
+ "stepFourText": "संग्रहीत डिजिटल क्रेडेंशियल का उपयोग करके आसानी से स्वयं को प्रमाणित करें।",
+ "stepFourButton": "शुरू हो जाओ",
+ "skip": "छोडना",
+ "next": "अगला"
+ },
+ "ReceivedVcsTab": {
+ "receivedCards": "प्राप्त कार्ड",
+ "header": "प्राप्त कार्ड",
+ "noReceivedVcsTitle": "नहीं कार्ड अभी तक उपलब्ध नहीं है",
+ "noReceivedVcsText": "प्राप्त करने के लिए नीचे दिए गए अनुरोध पर टैप करें कार्ड"
+ },
+ "ViewVcModal": {
+ "title": "आईडी विवरण",
+ "cancel": "रद्द करना",
+ "lock": "ताला",
+ "unlock": "अनलॉक",
+ "rename": "नाम बदलें",
+ "delete": "मिटाना",
+ "revoke": "रद्द करना",
+ "revoking": "आपके वॉलेट में VID {{vid}} के साथ एक क्रेडेंशियल है। इसे रद्द करने से यह अपने आप बटुए से हट जाएगा। क्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?",
+ "requestingOtp": "ओटीपी का अनुरोध...",
+ "editTag": "नाम बदलें",
+ "redirecting": "पुन: निर्देशित...",
+ "success": {
+ "unlocked": "कार्ड सफलतापूर्वक अनलॉक किया गया",
+ "locked": "कार्ड सफलतापूर्वक अनलॉक किया गया",
+ "revoked": "VID {{vid}} निरस्त कर दिया गया है। इसमें शामिल कोई भी क्रेडेंशियल वॉलेट से स्वचालित रूप से हटा दिया जाएगा"
+ }
+ },
+ "MainLayout": {
+ "home": "होम",
+ "scan": "स्कैन",
+ "history": "इतिहास",
+ "request": "अनुरोध",
+ "settings": "सेटिंग्स"
+ },
+ "PasscodeScreen": {
+ "header": "पास कोड सेट करो",
+ "enterNewPassword": "एक नया पासकोड दर्ज करें",
+ "reEnterPassword": "नया पासकोड पुनः दर्ज करें",
+ "confirmPasscode": "पासकोड की पुष्टि करें",
+ "enterPasscode": "अपना पासकोड प्रविष्ट करें"
+ },
+ "AppMetaData": {
+ "header": "इंजी के बारे में",
+ "version": "संस्करण",
+ "useBle": "BLE द्वारा संचालित",
+ "useGoogleNearby": "GoogleNearby द्वारा संचालित"
+ },
+ "QrScreen": {
+ "title": "क्यूआर लॉगिन",
+ "alignQr": "स्कैन करने के लिए फ्रेम के भीतर क्यूआर कोड को संरेखित करें",
+ "confirmation": "पुष्टीकरण",
+ "checkDomain": "यह भी जांचें कि एड्रेस बार पर लॉक आइकन है।",
+ "domainHead": "https://",
+ "selectId": "आईडी चुनें",
+ "noBindedVc": "सत्यापित करने के लिए कोई आबद्ध कार्ड उपलब्ध नहीं है",
+ "back": "वापस जाओ",
+ "confirm": "पुष्टि करें",
+ "verify": "सत्यापित करना",
+ "faceAuth": "चेहरा प्रमाणीकरण",
+ "consent": "अनुमति",
+ "loading": "लोड हो रहा है...",
+ "domainWarning": "कृपया उस वेबसाइट के डोमेन की पुष्टि करें जिसे आप नीचे दिए गए क्यूआर कोड से स्कैन कर रहे हैं",
+ "access": " तक पहुंच का अनुरोध कर रहा है",
+ "status": "दर्जा",
+ "successMessage": "आपने सफलतापूर्वक लॉग इन कर लिया है ",
+ "okay": "ठीक",
+ "allow": "अनुमति देना",
+ "cancel": "रद्द करना",
+ "essentialClaims": "आवश्यक दावे",
+ "voluntaryClaims": "स्वैच्छिक दावे",
+ "required": "आवश्यक"
+ },
+ "ReceiveVcScreen": {
+ "header": "कार्ड विवरण",
+ "save": "कार्ड सहेजें",
+ "verifyAndSave": "सत्यापित करें और सहेजें",
+ "reject": "अस्वीकार करना",
+ "discard": "खारिज करना",
+ "goToReceivedVCTab": "प्राप्त कार्ड देखें",
+ "errors": {
+ "savingFailed": {
+ "title": "कार्ड को सहेजने में विफल",
+ "message": "कार्ड को स्टोर में सहेजते समय कुछ गड़बड़ी हुई।"
},
- "online": "ऑनलाइन",
- "offline": "ऑफलाइन",
- "gotoSettings": "सेटिंग्स में जाओ"
- },
- "ScanScreen": {
- "header": "क्यूआर कोड स्कैन करे",
- "noShareableVcs": "कोई साझा करने योग्य कार्ड्स उपलब्ध नहीं है।",
- "bluetoothStateAndroid": "स्थानीय साझाकरण का समर्थन करने के लिए कृपया त्वरित सेटिंग से ब्लूटूथ चालू करें",
- "bluetoothStateIos": " स्थानीय साझाकरण का समर्थन करने के लिए कृपया नियंत्रण केंद्र से ब्लूटूथ चालू करें",
- "enableBluetoothMessage": "स्थानीय साझाकरण का समर्थन करने के लिए कृपया ब्लूटूथ अनुमतियां सक्षम करें",
- "enableBluetoothButtonText": "ब्लूटूथ अनुमतियों की अनुमति दें",
- "sharingVc": "शेयरिंग कार्ड",
- "errors": {
- "locationDisabled": {
- "message": "कार्ड साझा करने के लिए स्थान सेवाओं को सक्षम किया जाना चाहिए",
- "button": "स्थान सेवाएं सक्षम करें"
- },
- "locationDenied": {
- "message": "कार्ड साझा करने के लिए स्थान की अनुमति आवश्यक है",
- "button": "स्थान तक पहुंच की अनुमति दें"
- },
- "nearbyDevicesPermissionDenied": {
- "message": "कार्ड साझा करने में सक्षम होने के लिए आस-पास के उपकरणों की अनुमति आवश्यक है",
- "button": "अनुमति दें"
+ "diskFullError": {
+ "title": "पत्ते सहेजने में विफल",
+ "message": "अब और पत्ते प्राप्त या सहेजा नहीं जा सकता क्योंकि ऐप डेटा भरा हुआ है।"
}
+ }
+ },
+ "RequestScreen": {
+ "receiveCard": "कार्ड प्राप्त करें",
+ "bluetoothDenied": "कृपया ब्लूटूथ को सक्षम करें ताकि वह कार्ड का अनुरोध कर सके",
+ "bluetoothStateIos": "ब्लूटूथ बंद है, कृपया इसे निsयंत्रण केंद्र से चालू करें",
+ "bluetoothStateAndroid": "ब्लूटूथ बंद है, कृपया इसे त्वरित सेटिंग मेनू से चालू करें",
+ "showQrCode": "निवासी कार्ड का अनुरोध करने के लिए यह क्यूआर कोड प्रदर्शित करें",
+ "incomingVc": "इनकमिंग कार्ड",
+ "request": "प्रार्थना",
+ "status": {
+ "accepted": {
+ "title": "सफलता!",
+ "message": "कार्ड बटुआ से सफलतापूर्वक प्राप्त हो गया है"
+ },
+ "rejected": {
+ "title": "सूचना",
+ "message": "आपने बटुआ के कार्ड को अस्वीकार कर दिया है"
+ },
+ "disconnected": {
+ "title": "डिस्कनेक्ट किया गया",
+ "message": "कनेक्शन बाधित हो गया था। कृपया पुन: प्रयास करें।"
+ },
+ "waitingConnection": "कनेक्शन की प्रतीक्षा कर रहा है...",
+ "exchangingDeviceInfo": {
+ "message": "डिवाइस की जानकारी का आदान-प्रदान करना...",
+ "timeoutHint": "डिवाइस की जानकारी का आदान-प्रदान करने में बहुत अधिक समय लग रहा है..."
+ },
+ "connected": {
+ "message": "डिवाइस से कनेक्ट किया गया। कार्ड के लिए प्रतीक्षारत...",
+ "timeoutHint": "अभी तक कोई डेटा प्राप्त नहीं हुआ है. भेजने वाला उपकरण अभी भी जुड़ा हुआ है?"
},
- "status": {
- "connecting": "कनेक्टिंग...",
- "connectingTimeout": "कनेक्शन स्थापित करने में कुछ समय लग रहा है. क्या अन्य डिवाइस कनेक्शन के लिए खुला है?",
- "exchangingDeviceInfo": "डिवाइस की जानकारी का आदान-प्रदान...",
- "exchangingDeviceInfoTimeout": "It's taking a while to exchange device info. You may have to reconnect.",
- "invalid": "अमान्य क्यूआर कोड",
- "offline": "ऑनलाइन साझाकरण मोड का उपयोग करके क्यूआर कोड स्कैन करने के लिए कृपया इंटरनेट से कनेक्ट करें",
- "sent": "कार्ड भेज दिया गया है...",
- "sentHint": "आपके कार्ड को सहेजने या छोड़ने के लिए रिसीवर की प्रतीक्षा की जा रही है",
- "sharing": {
- "title": "साझा कर रहा है...",
- "hint": "शेयर को स्वीकार या अस्वीकार करने के लिए कृपया प्राप्त करने वाले डिवाइस की प्रतीक्षा करें।",
- "timeoutHint": "साझा करने में अपेक्षा से अधिक समय लग रहा है। कनेक्शन में कोई समस्या हो सकती है।"
- },
- "accepted": {
- "title": "सफलता!",
- "message": "आपका कार्ड सफलतापूर्वक सत्यापनकर्ता के साथ साझा किया गया"
- },
- "rejected": {
- "title": "सूचना",
- "message": "आपका कार्ड सत्यापनकर्ता द्वारा खारिज कर दिया गया था"
- },
- "bleError": {
- "title": "स्थानांतरित करने में विफल",
- "message": "कार्ड को स्थानांतरित करते समय कुछ गलत हो गया। कृपया पुन: प्रयास करें।",
- "hint": "गलती: {{code}}"
- }
+ "offline": {
+ "message": "ऑनलाइन साझाकरण मोड सक्षम करने के लिए कृपया इंटरनेट से कनेक्ट करें"
+ },
+ "bleError": {
+ "title": "स्थानांतरित करने में विफल!",
+ "message": "कार्ड को स्थानांतरित करते समय कुछ गलत हो गया। कृपया पुन: प्रयास करें।"
}
},
- "SelectVcOverlay": {
- "header": "शेयर कार्ड",
- "chooseVc": "वह कार्ड चुनें जिसके साथ आप साझा करना चाहते हैं",
- "share": "बाँट",
- "verifyAndShare": "पहचान सत्यापित करें और साझा करें"
- },
- "SendVcScreen": {
- "reasonForSharing": "साझा करने का कारण (वैकल्पिक)",
- "acceptRequest": "शेयर करना",
- "acceptRequestAndVerify": "सेल्फी के साथ शेयर करें",
- "reject": "अस्वीकार",
- "status": {
- "sharing": {
- "title": "बंटवारे...",
- "hint": "शेयर को स्वीकार या अस्वीकार करने के लिए कृपया प्राप्त करने वाले डिवाइस की प्रतीक्षा करें.",
- "timeoutHint": "साझा करने में अपेक्षा से अधिक समय लग रहा है. कनेक्शन में कोई समस्या हो सकती है."
- },
- "accepted": {
- "title": "सफलता!",
- "message": "आपका कार्ड को {{receiver}} के साथ सफलतापूर्वक साझा कर दिया गया है"
- },
- "rejected": {
- "title": "सूचना",
- "message": "आपके कार्ड को {{receiver}} ने अस्वीकार कर दिया था"
- }
+ "online": "ऑनलाइन",
+ "offline": "ऑफलाइन",
+ "gotoSettings": "सेटिंग्स में जाओ"
+ },
+ "ScanScreen": {
+ "header": "स्कैन क्यू आर कोड",
+ "noShareableVcs": "कोई साझा करने योग्य कार्ड उपलब्ध नहीं है।",
+ "sharingVc": "कार्ड साझा करना",
+ "bluetoothStateIos": "ब्लूटूथ बंद है, कृपया इसे नियंत्रण केंद्र से चालू करें",
+ "bluetoothStateAndroid": "ब्लूटूथ बंद है, कृपया इसे त्वरित सेटिंग मेनू से चालू करें",
+ "errors": {
+ "locationDisabled": {
+ "message": "स्थान सेवाओं को स्कैनिंग कार्यक्षमता के लिए सक्षम किया जाना चाहिए",
+ "button": "स्थान सेवाएं सक्षम करें"
},
- "consentToPhotoVerification": "मैं प्रमाणीकरण के लिए अपनी फोटो लेने की सहमति देता हूं"
+ "locationDenied": {
+ "message": "स्कैनिंग कार्यक्षमता के लिए स्थान अनुमति आवश्यक है",
+ "button": "स्थान तक पहुंच की अनुमति दें"
+ }
},
- "VerifyIdentityOverlay": {
- "status": {
- "verifyingIdentity": "पहचान सत्यापित की जा रही है..."
+ "status": {
+ "inProgress": "चालू",
+ "establishingConnection": "संपर्क स्थापित करना",
+ "sharingInProgress": "साझाकरण प्रगति पर है",
+ "connectingTimeout": "कनेक्शन स्थापित करने में कुछ समय लग रहा है। क्या अन्य डिवाइस कनेक्शन के लिए खुला है?",
+ "exchangingDeviceInfo": "डिवाइस की जानकारी का आदान-प्रदान करना...",
+ "exchangingDeviceInfoTimeout": "डिवाइस की जानकारी का आदान-प्रदान करने में कुछ समय लग रहा है। आपको फिर से कनेक्ट करना पड़ सकता है।",
+ "invalid": "अमान्य क्यूआर कोड",
+ "offline": "ऑनलाइन साझाकरण मोड का उपयोग करके क्यूआर कोड स्कैन करने के लिए कृपया इंटरनेट से कनेक्ट करें",
+ "sent": "कार्ड भेज दिया गया है...",
+ "sentHint": "आपके {{vcLabel }} को सहेजने या छोड़ने के लिए रिसीवर की प्रतीक्षा की जा रही है",
+ "sharing": {
+ "title": "शेयरिंग...",
+ "hint": "शेयर को स्वीकार या अस्वीकार करने के लिए कृपया प्राप्त करने वाले डिवाइस की प्रतीक्षा करें।",
+ "timeoutHint": "साझा करने में अपेक्षा से अधिक समय लग रहा है। कनेक्शन में कोई समस्या हो सकती है।"
},
- "errors": {
- "invalidIdentity": {
- "title": "पहचान सत्यापित करने में असमर्थ",
- "message": "चेहरा नहीं पहचाना। कृपया पुन: प्रयास करें।",
- "messageNoRetry": "चेहरा नहीं पहचाना।"
- }
+ "accepted": {
+ "title": "आईडी सफलतापूर्वक साझा किया गया",
+ "message": "आपका कार्ड सफलतापूर्वक {{रिसीवर}} के साथ साझा किया गया",
+ "gotohome": "घर जाओ"
+ },
+ "rejected": {
+ "title": "सूचना",
+ "message": "आपका कार्ड {{रिसीवर}} द्वारा खारिज कर दिया गया था"
+ },
+ "bleError": {
+ "title": "स्थानांतरित करने में विफल!",
+ "message": "कार्ड को स्थानांतरित करते समय कुछ गलत हो गया। कृपया पुन: प्रयास करें।"
}
- },
- "SendVcModal": {
- "reasonForSharing": "साझा करने का कारण (optional)",
- "acceptRequest": "अनुरोध स्वीकार करें और चुनें कार्ड",
- "reject": "अस्वीकार करे",
- "statusSharing": {
- "title": "साझा किया जा रहा है..."
+ }
+
+ },
+ "SelectVcOverlay": {
+ "header": "शेयर कार्ड",
+ "chooseVc": "वह कार्ड चुनें जिसके साथ आप साझा करना चाहते हैं",
+ "share": "बाँट",
+ "verifyAndShare": "पहचान सत्यापित करें और साझा करें"
+ },
+ "SendVcScreen": {
+ "reasonForSharing": "साझा करने का कारण (वैकल्पिक)",
+ "acceptRequest": "शेयर करना",
+ "acceptRequestAndVerify": "सेल्फी के साथ शेयर करें",
+ "consentToPhotoVerification": "मैं सत्यापन के लिए अपना फोटो लेने की अनुमति देता हूं",
+ "pleaseSelectAnId": "कृपया एक आईडी चुनें",
+ "reject": "अस्वीकार",
+ "status": {
+ "sharing": {
+ "title": "बंटवारे...",
+ "hint": "शेयर को स्वीकार या अस्वीकार करने के लिए कृपया प्राप्त करने वाले डिवाइस की प्रतीक्षा करें.",
+ "timeoutHint": "साझा करने में अपेक्षा से अधिक समय लग रहा है. कनेक्शन में कोई समस्या हो सकती है."
},
- "statusAccepted": {
+ "accepted": {
"title": "सफलता!",
- "message": "आपका कार्ड के साथ सफलतापूर्वक साझा कर दिया गया है {{receiver}}"
+ "message": "आपका कार्ड को {{रिसीवर}} के साथ सफलतापूर्वक साझा कर दिया गया है"
},
- "statusRejected": {
+ "rejected": {
"title": "सूचना",
- "message": "आपका कार्ड ने अस्वीकार कर दिया था {{receiver}}"
+ "message": "आपके कार्ड को सत्यापनकर्ता ने अस्वीकार कर दिया था"
}
- },
- "WelcomeScreen": {
- "title": "ओपन सोर्स आइडेंटिटी सॉल्यूशन",
- "getStarted": "आरंभ करें",
- "unlockApp": "एप्लिकेशन अनलॉक करें"
- },
- "common": {
- "cancel": "रद्द करें",
- "save": "सहेजें",
- "dismiss": "नकार देना",
- "editLabel": "संपादित करें {{label}}",
- "tryAgain": "पुनः प्रयास करें",
- "camera": {
- "errors": {
- "missingPermission": "यह ऐप दूसरे डिवाइस के क्यूआर कोड को स्कैन करने के लिए कैमरे का इस्तेमाल करता है."
- },
- "allowAccess": "कैमरे तक पहुंच की अनुमति दें"
- },
- "errors": {
- "genericError": "कुछ गलत हो गया। कृपया कुछ समय बाद पुन: प्रयास करें!"
+ }
+ },
+ "VerifyIdentityOverlay": {
+ "status": {
+ "verifyingIdentity": "पहचान सत्यापित की जा रही है..."
+ },
+ "errors": {
+ "invalidIdentity": {
+ "title": "पहचान सत्यापित करने में असमर्थ",
+ "message": "चेहरा नहीं पहचाना। कृपया पुन: प्रयास करें।",
+ "messageNoRetry": "चेहरा नहीं पहचाना।"
}
}
+ },
+ "SendVcModal": {
+ "reasonForSharing": "साझा करने का कारण (optional)",
+ "acceptRequest": "अनुरोध स्वीकार करें और चुनें कार्ड",
+ "reject": "अस्वीकार करे",
+ "statusSharing": {
+ "title": "साझा किया जा रहा है..."
+ },
+ "statusAccepted": {
+ "title": "सफलता!",
+ "message": "आपका कार्ड के साथ सफलतापूर्वक साझा कर दिया गया है सत्यापनकर्ता"
+ },
+ "statusRejected": {
+ "title": "सूचना",
+ "message": "आपका कार्ड ने अस्वीकार कर दिया था सत्यापनकर्ता"
+ }
+ },
+ "WelcomeScreen": {
+ "title": "ओपन सोर्स आइडेंटिटी सॉल्यूशन",
+ "getStarted": "आरंभ करें",
+ "unlockApp": "एप्लिकेशन अनलॉक करें"
+ },
+ "SetupLanguage": {
+ "header": "भाषा चुनें",
+ "description": "अपनी पसंदीदा भाषा चुनें",
+ "save": "वरीयता सहेजें"
+ },
+ "common": {
+ "cancel": "रद्द करें",
+ "save": "सहेजें",
+ "dismiss": "नकार देना",
+ "editLabel": "संपादित करें {{label}}",
+ "tryAgain": "पुनः प्रयास करें",
+ "camera": {
+ "errors": {
+ "missingPermission": "यह ऐप दूसरे डिवाइस के क्यूआर कोड को स्कैन करने के लिए कैमरे का इस्तेमाल करता है."
+ },
+ "allowAccess": "कैमरे तक पहुंच की अनुमति दें"
+ },
+ "errors": {
+ "genericError": "कुछ गलत हो गया। कृपया कुछ समय बाद पुन: प्रयास करें!"
+ }
}
+}
\ No newline at end of file
diff --git a/locales/kan.json b/locales/kan.json
index 1b1b40e4d..4b6463ca4 100644
--- a/locales/kan.json
+++ b/locales/kan.json
@@ -19,9 +19,7 @@
"requestedBy": "ವಿನಂತಿಸಿದವರು",
"sentBy": "ಕಳುಹಿಸಿದವರು",
"deviceRefNumber": "ಸಾಧನ ಉಲ್ಲೇಖ ಸಂಖ್ಯೆ",
- "name": "ಹೆಸರು",
- "Verifier": "ಪರಿಶೀಲಕ",
- "Wallet": "ವಾಲೆಟ್"
+ "name": "ಹೆಸರು"
},
"PasscodeVerify": {
"passcodeMismatchError": "ಪಾಸ್ಕೋಡ್ ಹೊಂದಿಕೆಯಾಗಲಿಲ್ಲ."
@@ -49,14 +47,15 @@
"address": "ವಿಳಾಸ",
"reasonForSharing": "ಹಂಚಿಕೆಗೆ ಕಾರಣ",
"idType": "ಐಡಿಟೈಪ್",
- "id": "Id",
+ "id": "ಐಡಿ",
+ "qrCodeHeader": "QR ಕೋಡ್",
"nationalCard": "ರಾಷ್ಟ್ರೀಯ ಕಾರ್ಡ್",
"uin": "UIN",
+ "vid": "ವಿಐಡಿ",
"enableVerification": "ಸಕ್ರಿಯಗೊಳಿಸಿ",
"profileAuthenticated": "ಆನ್ಲೈನ್ ಲಾಗಿನ್ಗಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ",
"offlineAuthDisabledHeader": "ಆನ್ಲೈನ್ ಲಾಗಿನ್ಗಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸುವಿಕೆ ಬಾಕಿ ಉಳಿದಿದೆ",
"offlineAuthDisabledMessage": "ಆನ್ಲೈನ್ ಲಾಗಿನ್ಗಾಗಿ ಬಳಸಲು ಈ ರುಜುವಾತುಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ದಯವಿಟ್ಟು ಕೆಳಗಿನ ಬಟನ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ.",
- "vid": "VID",
"verificationEnabledSuccess": "ಆನ್ಲೈನ್ ಲಾಗಿನ್ಗಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ",
"goback": "ಹಿಂದೆ ಹೋಗು",
"BindingWarning": "ನೀವು ಇನ್ನೊಂದು ವ್ಯಾಲೆಟ್ನಲ್ಲಿ ಈ ರುಜುವಾತುಗಳಿಗಾಗಿ ಪರಿಶೀಲನೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಅದನ್ನು ಅತಿಕ್ರಮಿಸಲಾಗುತ್ತದೆ. ನೀವು ಮುಂದುವರೆಯಲು ಬಯಸುವಿರಾ?",
@@ -76,8 +75,30 @@
}
}
},
+ "HomeScreenKebabPopUp": {
+ "title": "ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು",
+ "unPinCard": "ಅನ್ಪಿನ್ ಕಾರ್ಡ್",
+ "pinCard": "ಪಿನ್ ಕಾರ್ಡ್",
+ "offlineAuthenticationDisabled!": "ಆಫ್ಲೈನ್ ದೃಢೀಕರಣವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ!",
+ "offlineAuthDisabledMessage": "ಆಫ್ಲೈನ್ ದೃಢೀಕರಣಕ್ಕಾಗಿ ಬಳಸಲು ಈ ರುಜುವಾತುಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ.",
+ "viewActivityLog": "ಚಟುವಟಿಕೆ ಲಾಗ್ ಅನ್ನು ವೀಕ್ಷಿಸಿ",
+ "removeFromWallet": "ಕೈಚೀಲದಿಂದ ತೆಗೆದುಹಾಕಿ",
+ "revokeId": "ID ಹಿಂತೆಗೆದುಕೊಳ್ಳಿ",
+ "revokeMessage": "ಈ ಪ್ರೊಫೈಲ್ಗಾಗಿ ವರ್ಚುವಲ್ ಐಡಿಯನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳಿ"
+ },
+ "WalletBinding": {
+ "inProgress": "ಪ್ರಗತಿಯಲ್ಲಿದೆ",
+ "profileAuthenticated": "ಪ್ರೊಫೈಲ್ ಅನ್ನು ದೃಢೀಕರಿಸಲಾಗಿದೆ!"
+ },
+ "BindingVcWarningOverlay": {
+ "alert": "ದಯವಿಟ್ಟು ದ್ರುಡೀಕರಿಸಿ",
+ "BindingWarning": "ನೀವು ಇನ್ನೊಂದು ವ್ಯಾಲೆಟ್ನಲ್ಲಿ ಈ ರುಜುವಾತುಗಳಿಗಾಗಿ ಪರಿಶೀಲನೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ, ಅದನ್ನು ಅತಿಕ್ರಮಿಸಲಾಗುತ್ತದೆ. ನೀವು ಮುಂದುವರೆಯಲು ಬಯಸುವಿರಾ?",
+ "yesConfirm": "ಹೌದು, ನಾನು ದೃಢೀಕರಿಸುತ್ತೇನೆ",
+ "no": "ಸಂ"
+ },
"AuthScreen": {
"header": "ಅಪ್ಲಿಕೇಶನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಬಳಸಲು ನೀವು ಬಯಸುವಿರಾ?",
+ "Description": "ಅಪ್ಲಿಕೇಶನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಬಳಸಲು ನೀವು ಬಯಸುವಿರಾ?",
"useBiometrics": "ಬಯೋಮೆಟ್ರಿಕ್ಸ್ ಬಳಸಿ",
"usePasscode": "ನಾನು ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಬಳಸುತ್ತೇನೆ",
"errors": {
@@ -90,16 +111,55 @@
"BiometricScreen": {
"unlock": "ಫಿಂಗರ್ಪ್ರಿಂಟ್ನೊಂದಿಗೆ ಅನ್ಲಾಕ್"
},
- "HistoryTab": {
- "noHistory": "ಇನ್ನೂ ಯಾವುದೇ ಇತಿಹಾಸ ಲಭ್ಯವಿಲ್ಲ",
- "downloaded": "ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಿದೆ",
- "shared": "ಹಂಚಿಕೊಂಡಿದೆ",
- "received": "ಸ್ವೀಕರಿಸಲಾಗಿದೆ",
- "deleted": "ಅಳಿಸಲಾಗಿದೆ"
+ "HistoryScreen": {
+ "noHistory": "ಇನ್ನೂ ಇತಿಹಾಸವಿಲ್ಲ",
+ "downloaded": "ಸಿಕ್ಕಿತು",
+ "shared": "ಹಂಚಿಕೊಂಡಿದ್ದಾರೆ",
+ "received": "ಸ್ವೀಕರಿಸಿದರು",
+ "deleted": "ತೆಗೆದುಹಾಕಲಾಗಿದೆ"
+ },
+ "SettingScreen": {
+ "header": "ಸಂಯೋಜನೆಗಳು",
+ "injiAsVerifierApp": "ವೆರಿಫೈಯರ್ ಆಪ್ ಆಗಿ ಇಂಜಿ",
+ "basicSettings": "ಮೂಲ ಸೆಟ್ಟಿಂಗ್ಗಳು",
+ "bioUnlock": "ಬಯೋಮೆಟ್ರಿಕ್ಸ್ನೊಂದಿಗೆ ಅನ್ಲಾಕ್ ಮಾಡಿ",
+ "language": "ಭಾಷೆ",
+ "aboutInji": "ಇಂಜಿ ಬಗ್ಗೆ",
+ "credentialRegistry": "ರುಜುವಾತು ನೋಂದಣಿ",
+ "injiTourGuide": "ಇಂಜಿ ಪ್ರವಾಸ ಮಾರ್ಗದರ್ಶಿ",
+ "logout": "ಲಾಗ್ ಔಟ್"
+ },
+ "AboutInji": {
+ "aboutInji": "ಇಂಜಿ ಬಗ್ಗೆ",
+ "header": "ಇಂಜಿ ಬಗ್ಗೆ",
+ "aboutDetailes": "ಇಂಜಿ ಎನ್ನುವುದು ರುಜುವಾತುಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು ಡಿಜಿಟಲ್ ವ್ಯಾಲೆಟ್ ಆಗಿ ಬಳಸಬಹುದಾದ ಮೊಬೈಲ್ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿದೆ. ಇದು ಯಾವುದೇ ಸ್ಥಳ ಮತ್ತು ಸಮಯದಲ್ಲಿ ಆಫ್ಲೈನ್ ಮತ್ತು ಆನ್ಲೈನ್ ಮೋಡ್ಗಳಲ್ಲಿ ಗುರುತಿನ ಪರಿಶೀಲನೆಯನ್ನು ಅನುಮತಿಸುತ್ತದೆ.",
+ "forMoreDetailes": "ಹೆಚ್ಚಿನ ವಿವರಗಳಿಗಾಗಿ",
+ "clickHere": "ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ",
+ "version": "ಆವೃತ್ತಿ",
+ "tuvaliVersion": "ಟುವಾಲಿ-ಆವೃತ್ತಿ"
+ },
+ "HelpScreen": {
+ "header": "ಸಹಾಯ",
+ "whatIsDigitalCredential?": "ಡಿಜಿಟಲ್ ರುಜುವಾತು ಎಂದರೇನು?",
+ "detail-1": "ಡಿಜಿಟಲ್ ರುಜುವಾತು ನಿಮ್ಮ ಭೌತಿಕ ಗುರುತಿನ ಚೀಟಿಯ ಡಿಜಿಟಲ್ ಆವೃತ್ತಿಯಾಗಿದೆ",
+ "whatCanDoWithDigitalCredential?": "ಡಿಜಿಟಲ್ ರುಜುವಾತುಗಳೊಂದಿಗೆ ನಾವು ಏನು ಮಾಡಬಹುದು?",
+ "detail-2": "ನಿಮ್ಮ ಡಿಜಿಟಲ್ ರುಜುವಾತುಗಳನ್ನು ಬಳಸಿಕೊಂಡು ನೀವು ವಿವಿಧ ಸರ್ಕಾರಿ ಮತ್ತು ಖಾಸಗಿ ಸೇವೆಗಳನ್ನು ಪಡೆಯಬಹುದು.",
+ "howToAddCard?": "ಕಾರ್ಡ್ ಅನ್ನು ಹೇಗೆ ಸೇರಿಸುವುದು?",
+ "detail-3": "ಕಾರ್ಡ್ ಸೇರಿಸಲು, ಮುಖಪುಟದಲ್ಲಿ '+' ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ಸೂಕ್ತವಾದ ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ.",
+ "howToRemoveCardFromWallet?": "ಕಾರ್ಡ್ ಹಂಚಿಕೊಳ್ಳುವುದು ಹೇಗೆ?",
+ "detail-4": "ಕಾರ್ಡ್ನಲ್ಲಿ ಎಡಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ > ಇನ್ನಷ್ಟು ಕ್ಲಿಕ್ ಮಾಡಿ > ವಾಲೆಟ್ನಿಂದ ತೆಗೆದುಹಾಕಿ",
+ "canWeAddMultipleCards?": "ನಾವು ಬಹು ಕಾರ್ಡ್ಗಳನ್ನು ಸೇರಿಸಬಹುದೇ?",
+ "detail-5": "ಹೌದು, ಮುಖಪುಟದಲ್ಲಿ '+' ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ನೀವು ಬಹು ಕಾರ್ಡ್ಗಳನ್ನು ವ್ಯಾಲೆಟ್ಗೆ ಸೇರಿಸಬಹುದು.",
+ "howToShareCard?": "ಕಾರ್ಡ್ ಹಂಚಿಕೊಳ್ಳುವುದು ಹೇಗೆ?",
+ "detail-6": "'ಹಂಚಿಕೊಳ್ಳಿ' ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ವಿನಂತಿಸಿದ ಪಕ್ಷದಿಂದ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ. ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಿದ ನಂತರ, ಕಾರ್ಡ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.",
+ "howToActivateCardForOnlineLogin?": "ಆನ್ಲೈನ್ ಲಾಗಿನ್ಗಾಗಿ ಕಾರ್ಡ್ ಅನ್ನು ಹೇಗೆ ಸಕ್ರಿಯಗೊಳಿಸುವುದು?",
+ "detail-7": "ವ್ಯಾಲೆಟ್ಗೆ ಕಾರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸೇರಿಸಿದ ನಂತರ, ಕಾರ್ಡ್ನಲ್ಲಿರುವ 'ಆನ್ಲೈನ್ ಲಾಗಿನ್ಗಾಗಿ ಆಕ್ಟಿವೇಶನ್ ಪೆಂಡಿಂಗ್' ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. 'ಸಕ್ರಿಯಗೊಳಿಸು' ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ, ಕಾರ್ಡ್ ಆನ್ಲೈನ್ ಲಾಗಿನ್ಗೆ ಬಳಸಲು ಸಿದ್ಧವಾಗುತ್ತದೆ.",
+ "howToViewActivity?": "ಚಟುವಟಿಕೆ ಲಾಗ್ಗಳನ್ನು ವೀಕ್ಷಿಸುವುದು ಹೇಗೆ?",
+ "detail-8": "ಮುಖಪುಟದಲ್ಲಿ, ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆಯ ವಿವರಗಳನ್ನು ವೀಕ್ಷಿಸಲು 'ಇತಿಹಾಸ' ಕ್ಲಿಕ್ ಮಾಡಿ."
},
"HomeScreen": {
- "myVcsTab": "ನನ್ನ\nಕಾರ್ಡ್ಗಳು",
- "receivedVcsTab": "ಸ್ವೀಕರಿಸಲಾಗಿದೆ\nಕಾರ್ಡ್ಗಳು",
+ "myVcsTab": "ನನ್ನ\nಕಾರ್ಡ್",
+ "receivedVcsTab": "ಸ್ವೀಕರಿಸಲಾಗಿದೆ\nಕಾರ್ಡ್",
"historyTab": "ಇತಿಹಾಸ"
},
"AddVcModal": {
@@ -134,7 +194,6 @@
"applicationProcessing": "AID ಸಿದ್ಧವಾಗಿಲ್ಲ",
"noMessageAvailable": "ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಪ್ರಯತ್ನಿಸಿ",
"networkRequestFailed": "ನೆಟ್ವರ್ಕ್ ವಿನಂತಿ ವಿಫಲವಾಗಿದೆ",
- "invalidAid": "ನಮೂದಿಸಿದ AID ಲಭ್ಯವಿಲ್ಲ. ಪ್ರವೇಶಿಸುವ ಮೊದಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ AID ಅನ್ನು ಪರಿಶೀಲಿಸಿ",
"timeout": "ಸಮಯ ಮೀರಿದೆ"
}
}
@@ -145,52 +204,56 @@
"backButton": "ಬ್ಯಾಕ್ ಹೋಮ್"
},
"GetIdInputModal": {
- "header": "ನಿಮ್ಮ UIN ಪಡೆಯಲು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ID ನಮೂದಿಸಿ",
- "getUIN": "UIN/VID ಪಡೆಯಿರಿ",
- "applicationId": "ಅಪ್ಲಿಕೇಶನ್ ID",
+ "header": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಹಿಂಪಡೆಯಿರಿ",
+ "applicationIdLabel": "ದಯವಿಟ್ಟು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಐಡಿಯನ್ನು ನಮೂದಿಸಿ",
+ "enterApplicationId": "ಅಪ್ಲಿಕೇಶನ್ ID ನಮೂದಿಸಿ",
"requestingOTP": "OTP ಯನ್ನು ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ...",
- "qstnMarkToolTip": "ನೋಂದಣಿಯ ನಂತರ ಸ್ವೀಕರಿಸಿದ ಸ್ವೀಕೃತಿಯಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ID ಲಭ್ಯವಿದೆ."
+ "qstnMarkToolTip": "ನೋಂದಣಿಯ ನಂತರ ಸ್ವೀಕರಿಸಿದ ಸ್ವೀಕೃತಿಯಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ID ಲಭ್ಯವಿದೆ.",
+ "getUIN": "UIN/VID ಪಡೆಯಿರಿ"
},
"IdInputModal": {
- "header": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ನಿಮ್ಮ UIN/VID ಅನ್ನು ನಮೂದಿಸಿ",
- "generateVc": "ನನ್ನ ಕಾರ್ಡ್ ಅನ್ನು ರಚಿಸಿ",
- "enterId": "ನಿಮ್ಮ {{idType}}ನಮೂದಿಸಿ",
- "noUIN/VID": "ನಿಮ್ಮ UIN/VID ಇಲ್ಲವೇ? ಇಲ್ಲಿ ಪಡೆಯಿರಿ",
+ "header": "ನಿಮ್ಮ ಐಡಿಯನ್ನು ಹಿಂಪಡೆಯಿರಿ",
+ "guideLabel": "ID ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆಮಾಡಿ ಮತ್ತು MOSIP ಒದಗಿಸಿದ UIN ಅಥವಾ ನೀವು ಹಿಂಪಡೆಯಲು ಬಯಸುವ ID ಯ VID ಅನ್ನು ನಮೂದಿಸಿ",
+ "generateVc": "ಕಾರ್ಡ್ ಅನ್ನು ರಚಿಸಿ",
+ "downloadID": "ಐಡಿ ಡೌನ್ಲೋಡ್ ಮಾಡಿ",
+ "enterId": "{{idType}} ನಮೂದಿಸಿ",
+ "noUIN/VID": "UIN/VID ಇಲ್ಲವೇ? ",
+ "getItHere": "ಈಗಲೇ ತಾ",
"requestingOTP": "OTP ಯನ್ನು ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ..."
},
"OtpVerificationModal": {
- "enterOtp": "ನಾವು ನಿಮಗೆ ಕಳುಹಿಸಿದ 6-ಅಂಕಿಯ ಪರಿಶೀಲನೆ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ",
- "header": "OTP ಪರಿಶೀಲನೆ"
+ "title": "OTP ಪರಿಶೀಲನೆ",
+ "otpSentMessage": "ನಿಮ್ಮ ನೋಂದಾಯಿತ ಮೊಬೈಲ್ ಸಂಖ್ಯೆಗೆ ನಾವು 6 ಅಂಕಿಗಳ ಕೋಡ್ ಅನ್ನು ಕಳುಹಿಸಿದ್ದೇವೆ!",
+ "resendTheCode": "ನೀವು ಕೋಡ್ ಅನ್ನು ಮತ್ತೆ ಕಳುಹಿಸಬಹುದು ",
+ "resendCode": "ಕೋಡ್ ಅನ್ನು ಮರುಕಳುಹಿಸಿ"
},
"MyVcsTab": {
- "addVcButton": "ಸೇರಿಸಿ ಕಾರ್ಡ್",
- "generateVc": "ನಿಮ್ಮ ಕಾರ್ಡ್ಗಳು ಅನ್ನು ರಚಿಸಿ",
- "generateVcDescription": "ನಿಮ್ಮ \"ಸೇರಿಸಿ ಕಾರ್ಡ್\" ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ ಕಾರ್ಡ್",
- "errors": {
- "savingFailed": {
- "title": "ಕಾರ್ಡ್ ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ",
- "message": "ಸ್ಟೋರ್ನಲ್ಲಿ ಕಾರ್ಡ್ ಉಳಿಸುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ."
- },
- "diskFullError": {
- "title": "ಕಾರ್ಡ್ ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ",
- "message": "ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾ ತುಂಬಿರುವುದರಿಂದ ಇನ್ನು ಮುಂದೆ ಕಾರ್ಡ್ಗಳು ಸ್ವೀಕರಿಸಲು ಅಥವಾ ಉಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."
- }
- }
+ "downloadCard": "ಕಾರ್ಡ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ",
+ "bringYourDigitalID": "ನಿಮ್ಮ ಡಿಜಿಟಲ್ ಐಡಿ ತನ್ನಿ",
+ "generateVcDescription": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಕೆಳಗಿನ ಡೌನ್ಲೋಡ್ ಕಾರ್ಡ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ",
+ "downloadingYourId": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ, ಇದು 5 ನಿಮಿಷಗಳವರೆಗೆ ತೆಗೆದುಕೊಳ್ಳಬಹುದು"
},
"OnboardingOverlay": {
- "stepOneTitle": "ಸ್ವಾಗತ!",
- "stepOneText": "ನಿಮ್ಮ ಡಿಜಿಟಲ್ ರುಜುವಾತುಗಳನ್ನು ಯಾವಾಗಲೂ ನಿಮ್ಮೊಂದಿಗೆ ಇರಿಸಿಕೊಳ್ಳಿ. ಪ್ರಾರಂಭಿಸಲು, ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ಗೆ ಕಾರ್ಡ್ಗಳು ಸೇರಿಸಿ.",
- "stepTwoTitle": "ಕಾರ್ಡ್ ನಿರ್ವಹಣೆ",
- "stepTwoText": "ಒಮ್ಮೆ ರಚಿಸಿದ ನಂತರ, ಕಾರ್ಡ್ಗಳು ಅನ್ನು ನಿಮ್ಮ ಮೊಬೈಲ್ನಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಮರುಹೆಸರಿಸಬಹುದು ಅಥವಾ ಹಂಚಿಕೊಳ್ಳಬಹುದು.",
- "stepThreeTitle": "ಸುಲಭ ಹಂಚಿಕೆ",
- "stepThreeText": "QR ಕೋಡ್ಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು ನಿಮ್ಮ ಫೋನ್ ಕ್ಯಾಮೆರಾವನ್ನು ಬಳಸಿಕೊಂಡು ಕಾರ್ಡ್ಗಳನ್ನು ತ್ವರಿತವಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ ಮತ್ತು ಸ್ವೀಕರಿಸಿ.",
- "stepThreeButton": "ಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಕಾರ್ಡ್ ಸೇರಿಸಿ"
+ "stepOneTitle": "ಸುರಕ್ಷಿತ ಹಂಚಿಕೆ!",
+ "stepOneText": "ನಿಮ್ಮ ಡಿಜಿಟಲ್ ರುಜುವಾತುಗಳನ್ನು ಯಾವಾಗಲೂ ನಿಮ್ಮೊಂದಿಗೆ ಇರಿಸಿಕೊಳ್ಳಿ. ಅವುಗಳನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ನಿರ್ವಹಿಸಲು ಮತ್ತು ಬಳಸಲು ಇಂಜಿ ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಪ್ರಾರಂಭಿಸಲು, ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ಗೆ ಕಾರ್ಡ್ಗಳನ್ನು ಸೇರಿಸಿ.",
+ "stepTwoTitle": "ವಿಶ್ವಾಸಾರ್ಹ ಡಿಜಿಟಲ್ ವಾಲೆಟ್",
+ "stepTwoText": "ನಿಮ್ಮ ಎಲ್ಲಾ ಪ್ರಮುಖ ಕಾರ್ಡ್ಗಳನ್ನು ಒಂದೇ ವಿಶ್ವಾಸಾರ್ಹ ವ್ಯಾಲೆಟ್ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಿ ಮತ್ತು ಒಯ್ಯಿರಿ.",
+ "stepThreeTitle": "ಸುರಕ್ಷಿತ ಹಂಚಿಕೆ",
+ "stepThreeText": "ನಿಮ್ಮ ಕಾರ್ಡ್ಗಳನ್ನು ಜಗಳ ಮುಕ್ತ ರೀತಿಯಲ್ಲಿ ಸುರಕ್ಷಿತವಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ ಮತ್ತು ವಿವಿಧ ಸೇವೆಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಿ.",
+ "stepFourTitle": "ಜಗಳ ಮುಕ್ತ ದೃಢೀಕರಣ",
+ "stepFourText": "ಸಂಗ್ರಹಿಸಿದ ಡಿಜಿಟಲ್ ರುಜುವಾತುಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಸುಲಭವಾಗಿ ನಿಮ್ಮನ್ನು ದೃಢೀಕರಿಸಿ.",
+ "stepFourButton": "ಪ್ರಾರಂಭಿಸಿ",
+ "skip": "ಬಿಟ್ಟುಬಿಡಿ",
+ "next": "ಮುಂದೆ"
},
"ReceivedVcsTab": {
- "noReceivedVcsTitle": "ಇನ್ನೂ ಯಾವುದೇ ಕಾರ್ಡ್ಗಳು ಲಭ್ಯವಿಲ್ಲ",
+ "receivedCards": "ಕಾರ್ಡ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ",
+ "header": "ಕಾರ್ಡ್ಗಳನ್ನು ಸ್ವೀಕರಿಸಲಾಗಿದೆ",
+ "noReceivedVcsTitle": "ಇನ್ನೂ ಯಾವುದೇ ಕಾರ್ಡ್ ಲಭ್ಯವಿಲ್ಲ",
"noReceivedVcsText": "ಕಾರ್ಡ್ ಸ್ವೀಕರಿಸಲು ಕೆಳಗಿನ ವಿನಂತಿಯ ಮೇಲೆ ಟ್ಯಾಪ್ ಮಾಡಿ"
},
"ViewVcModal": {
+ "title": "ID ವಿವರಗಳು",
"cancel": "ರದ್ದುಮಾಡು",
"lock": "ಲಾಕ್",
"unlock": "ಅನ್ಲಾಕ್",
@@ -200,29 +263,32 @@
"revoking": "ನಿಮ್ಮ ವ್ಯಾಲೆಟ್ VID {{vid}} ಜೊತೆಗೆ ರುಜುವಾತುಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. ಇದನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳುವುದರಿಂದ ಅದನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ವ್ಯಾಲೆಟ್ನಿಂದ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. ನೀವು ಮುಂದುವರೆಯಲು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?",
"requestingOtp": "ಒಟಿಪಿಯನ್ನು ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ...",
"editTag": "ಟ್ಯಾಗ್ ಸಂಪಾದಿಸು",
- "redirecting": "Redirecting...",
- "inProgress": "ಲೋಡ್ ಆಗುತ್ತಿದೆ...",
+ "redirecting": "ಮರುನಿರ್ದೇಶಿಸಲಾಗುತ್ತಿದೆ...",
"success": {
"unlocked": "ಕಾರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ",
- "locked": "ಕಾರ್ಡ್ successfully locked",
+ "locked": "ಕಾರ್ಡ್ ಯಶಸ್ವಿಯಾಗಿ ಲಾಕ್ ಆಗಿದೆ",
"revoked": "VID {{vid}} ಅನ್ನು ಹಿಂಪಡೆಯಲಾಗಿದೆ. ಅದೇ ಒಳಗೊಂಡಿರುವ ಯಾವುದೇ ರುಜುವಾತುಗಳನ್ನು ವ್ಯಾಲೆಟ್ನಿಂದ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ"
}
},
"MainLayout": {
"home": "ಲೇಔಟ್",
"scan": "ಮನೆ",
+ "history": "ಇತಿಹಾಸ",
"request": "ವಿನಂತಿ",
"settings": "ಸೆಟ್ಟಿಂಗ್ಗಳು"
},
"PasscodeScreen": {
"header": "ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಿ",
+ "enterNewPassword": "ಹೊಸ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ",
+ "reEnterPassword": "ಹೊಸ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಮರು-ನಮೂದಿಸಿ",
"confirmPasscode": "ನಿಮ್ಮ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ದೃಢೀಕರಿಸಿ",
"enterPasscode": "ನಿಮ್ಮ ಪಾಸ್ಕೋಡ್ ನಮೂದಿಸಿ"
},
"AppMetaData": {
"header": "ಇಂಜಿ ಬಗ್ಗೆ",
"version": "ಆವೃತ್ತಿ",
- "useBle": "Powered by BLE"
+ "useBle": "BLE ನಿಂದ ನಡೆಸಲ್ಪಡುತ್ತಿದೆ",
+ "useGoogleNearby": "GoogleNearby ನಿಂದ ನಡೆಸಲ್ಪಡುತ್ತಿದೆ"
},
"ProfileScreen": {
"name": "ಹೆಸರು",
@@ -247,7 +313,7 @@
"checkDomain": "ಅಲ್ಲದೆ, ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ ಲಾಕ್ ಐಕಾನ್ ಇದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.",
"domainHead": "https://",
"selectId": "ID ಆಯ್ಕೆಮಾಡಿ",
- "noBindedVc": "ಪರಿಶೀಲಿಸಲು ಯಾವುದೇ ಬೈಂಡೆಡ್ ಕಾರ್ಡ್ಗಳು ಲಭ್ಯವಿಲ್ಲ",
+ "noBindedVc": "ಪರಿಶೀಲಿಸಲು ಯಾವುದೇ ಬೈಂಡೆಡ್ ಕಾರ್ಡ್ ಲಭ್ಯವಿಲ್ಲ",
"back": "ಹಿಂದೆ ಹೋಗು",
"confirm": "ದೃಢೀಕರಿಸಿ",
"verify": "ಪರಿಶೀಲಿಸಿ",
@@ -258,17 +324,20 @@
"access": " ಗೆ ಪ್ರವೇಶವನ್ನು ವಿನಂತಿಸುತ್ತಿದೆ",
"status": "ಸ್ಥಿತಿ",
"successMessage": "ನೀವು ಯಶಸ್ವಿಯಾಗಿ ಲಾಗ್ ಇನ್ ಆಗಿರುವಿರಿ ",
- "okay": "ಸರಿ"
+ "okay": "ಸರಿ",
+ "allow": "ಅನುಮತಿಸಿ",
+ "cancel": "ರದ್ದುಮಾಡು",
+ "essentialClaims": "ಅಗತ್ಯ ಹಕ್ಕುಗಳು",
+ "voluntaryClaims": "ಸ್ವಯಂಪ್ರೇರಿತ ಹಕ್ಕುಗಳು",
+ "required": "ಅಗತ್ಯವಿದೆ"
},
"ReceiveVcScreen": {
"header": "ಕಾರ್ಡ್ ವಿವರಗಳು",
"save": "ಕಾರ್ಡ್ ಉಳಿಸಿ",
- "acceptRequest": "ವಿನಂತಿಯನ್ನು ಸ್ವೀಕರಿಸಿ ಮತ್ತು ಕಾರ್ಡ್ ಸ್ವೀಕರಿಸಿ",
- "acceptRequestAndVerify": "ವಿನಂತಿಯನ್ನು ಸ್ವೀಕರಿಸಿ ಮತ್ತು ಪರಿಶೀಲಿಸಿ",
+ "verifyAndSave": "ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಉಳಿಸಿ",
"reject": "ತಿರಸ್ಕರಿಸಿ",
"discard": "ತಿರಸ್ಕರಿಸು",
- "goToReceivedVCTab": "ಸ್ವೀಕರಿಸಿದ ಕಾರ್ಡ್ಗಳು ವೀಕ್ಷಿಸಿ",
- "saving": "ಉಳಿಸಲಾಗುತ್ತಿದೆ",
+ "goToReceivedVCTab": "ಸ್ವೀಕರಿಸಿದ ಕಾರ್ಡ್ ವೀಕ್ಷಿಸಿ",
"errors": {
"savingFailed": {
"title": "ಕಾರ್ಡ್ ಉಳಿಸಲು ವಿಫಲವಾಗಿದೆ",
@@ -281,18 +350,13 @@
}
},
"RequestScreen": {
- "bluetoothDenied": "ವಿನಂತಿಸಲು ಬ್ಲೂಟೂತ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಕಾರ್ಡ್",
- "bluetoothStateAndroid": "ಸ್ಥಳೀಯ ಹಂಚಿಕೆಯನ್ನು ಬೆಂಬಲಿಸಲು ದಯವಿಟ್ಟು ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ",
- "bluetoothStateIos": " ಸ್ಥಳೀಯ ಹಂಚಿಕೆಯನ್ನು ಬೆಂಬಲಿಸಲು ದಯವಿಟ್ಟು ನಿಯಂತ್ರಣ ಕೇಂದ್ರದಿಂದ ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ",
+ "receiveCard": "ಕಾರ್ಡ್ ಸ್ವೀಕರಿಸಿ",
+ "bluetoothDenied": "ವಿನಂತಿಸಲು ಬ್ಲೂಟೂತ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಕಾರ್ಡ್",
+ "bluetoothStateIos": "ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ, ದಯವಿಟ್ಟು ಅದನ್ನು ನಿಯಂತ್ರಣ ಕೇಂದ್ರದಿಂದ ಆನ್ ಮಾಡಿ",
+ "bluetoothStateAndroid": "ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ, ದಯವಿಟ್ಟು ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೆನುವಿನಿಂದ ಅದನ್ನು ಆನ್ ಮಾಡಿ",
"showQrCode": "ನಿವಾಸಿ ಕಾರ್ಡ್ ಅನ್ನು ವಿನಂತಿಸಲು ಈ QR ಕೋಡ್ ಅನ್ನು ಪ್ರದರ್ಶಿಸಿ",
"incomingVc": "ಒಳಬರುವ ಕಾರ್ಡ್",
"request": "ವಿನಂತಿ",
- "errors": {
- "nearbyDevicesPermissionDenied": {
- "message": "ಕಾರ್ಡ್ಗಳು ಅನ್ನು ವಿನಂತಿಸಲು ಸಾಧ್ಯವಾಗಲು ಸಮೀಪದ ಸಾಧನಗಳ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ",
- "button": "ಅನುಮತಿಯನ್ನು ಅನುಮತಿಸಿ"
- }
- },
"status": {
"accepted": {
"title": "ಯಶಸ್ಸು!",
@@ -319,9 +383,8 @@
"message": "ಆನ್ಲೈನ್ ಹಂಚಿಕೆ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ದಯವಿಟ್ಟು ಇಂಟರ್ನೆಟ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ"
},
"bleError": {
- "title": "ವರ್ಗಾಯಿಸಲು ವಿಫಲವಾಗಿದೆ",
- "message": "ಕಾರ್ಡ್ ಅನ್ನು ವರ್ಗಾಯಿಸುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.",
- "hint": "ದೋಷ: {{code}}"
+ "title": "ವರ್ಗಾಯಿಸಲು ವಿಫಲವಾಗಿದೆ!",
+ "message": "ಕಾರ್ಡ್ ಅನ್ನು ವರ್ಗಾಯಿಸುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."
}
},
"online": "ಆನ್ಲೈನ್",
@@ -329,53 +392,49 @@
"gotoSettings": "ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"
},
"ScanScreen": {
- "header": "ಸ್ಕ್ಯಾನ್ ಕ್ಯೂಆರ್ ಕೋಡ್",
- "noShareableVcs": "ಯಾವುದೇ ಹಂಚಿಕೊಳ್ಳಬಹುದಾದ ಕಾರ್ಡ್ಗಳು ಲಭ್ಯವಿಲ್ಲ.",
- "bluetoothStateAndroid": "ಸ್ಥಳೀಯ ಹಂಚಿಕೆಯನ್ನು ಬೆಂಬಲಿಸಲು ದಯವಿಟ್ಟು ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ",
- "bluetoothStateIos": " ಸ್ಥಳೀಯ ಹಂಚಿಕೆಯನ್ನು ಬೆಂಬಲಿಸಲು ದಯವಿಟ್ಟು ನಿಯಂತ್ರಣ ಕೇಂದ್ರದಿಂದ ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ",
- "enableBluetoothMessage": "ದಯವಿಟ್ಟು ಸ್ಥಳೀಯ ಹಂಚಿಕೆಯನ್ನು ಬೆಂಬಲಿಸಲು ಬ್ಲೂಟೂತ್ ಅನುಮತಿಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ",
- "enableBluetoothButtonText": "ಬ್ಲೂಟೂತ್ ಅನುಮತಿಗಳನ್ನು ಅನುಮತಿಸಿ",
- "sharingVc": "ಹಂಚಿಕೆ ಕಾರ್ಡ್",
+ "header": "QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ",
+ "noShareableVcs": "ಯಾವುದೇ ಹಂಚಿಕೊಳ್ಳಬಹುದಾದ ಕಾರ್ಡ್ ಲಭ್ಯವಿಲ್ಲ.",
+ "sharingVc": "ಕಾರ್ಡ್ ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ",
+ "bluetoothStateIos": "ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ, ದಯವಿಟ್ಟು ಅದನ್ನು ನಿಯಂತ್ರಣ ಕೇಂದ್ರದಿಂದ ಆನ್ ಮಾಡಿ",
+ "bluetoothStateAndroid": "ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ, ದಯವಿಟ್ಟು ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೆನುವಿನಿಂದ ಅದನ್ನು ಆನ್ ಮಾಡಿ",
"errors": {
"locationDisabled": {
- "message": "ಕಾರ್ಡ್ ಹಂಚಿಕೊಳ್ಳಲು ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು",
+ "message": "ಸ್ಕ್ಯಾನಿಂಗ್ ಕಾರ್ಯಕ್ಕಾಗಿ ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು",
"button": "ಸ್ಥಳ ಸೇವೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"
},
"locationDenied": {
- "message": "ಕಾರ್ಡ್ ಹಂಚಿಕೊಳ್ಳಲು ಸ್ಥಳ ಅನುಮತಿ ಅಗತ್ಯವಿದೆ",
+ "message": "ಸ್ಕ್ಯಾನಿಂಗ್ ಕಾರ್ಯಕ್ಕಾಗಿ ಸ್ಥಳ ಅನುಮತಿ ಅಗತ್ಯವಿದೆ",
"button": "ಸ್ಥಳಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ"
- },
- "nearbyDevicesPermissionDenied": {
- "message": "ಕಾರ್ಡ್ ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗಲು ಸಮೀಪದ ಸಾಧನಗಳ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ",
- "button": "ಅನುಮತಿಯನ್ನು ಅನುಮತಿಸಿ"
}
},
"status": {
- "connecting": "ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ...",
+ "inProgress": "ಪ್ರಗತಿಯಲ್ಲಿದೆ",
+ "establishingConnection": "ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸುವುದು",
+ "sharingInProgress": "ಹಂಚಿಕೆ ಪ್ರಗತಿಯಲ್ಲಿದೆ",
"connectingTimeout": "ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲು ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಇತರ ಸಾಧನವು ಸಂಪರ್ಕಗಳಿಗಾಗಿ ತೆರೆದಿದೆಯೇ?",
"exchangingDeviceInfo": "ಸಾಧನದ ಮಾಹಿತಿಯನ್ನು ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ...",
"exchangingDeviceInfoTimeout": "ಸಾಧನದ ಮಾಹಿತಿಯನ್ನು ವಿನಿಮಯ ಮಾಡಿಕೊಳ್ಳಲು ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತಿದೆ. ನೀವು ಮರುಸಂಪರ್ಕಿಸಬೇಕಾಗಬಹುದು.",
- "invalid": "ಅಮಾನ್ಯ QR ಕೋಡ್",
+ "invalid": "ಅಮಾನ್ಯವಾದ QR ಕೋಡ್",
"offline": "ಆನ್ಲೈನ್ ಹಂಚಿಕೆ ಮೋಡ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು QR ಕೋಡ್ಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು ದಯವಿಟ್ಟು ಇಂಟರ್ನೆಟ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ",
- "sent": "ಕಾರ್ಡ್ ಅನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ...",
- "sentHint": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಉಳಿಸಲು ಅಥವಾ ತ್ಯಜಿಸಲು ರಿಸೀವರ್ಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ",
+ "sent": "{{ vcLabel }} ಅನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ...",
+ "sentHint": "ನಿಮ್ಮ {{ vcLabel }} ಅನ್ನು ಉಳಿಸಲು ಅಥವಾ ತ್ಯಜಿಸಲು ರಿಸೀವರ್ಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ",
"sharing": {
- "title": "ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ...",
+ "title": "ಹಂಚಿಕೆ...",
"hint": "ಸ್ವೀಕರಿಸುವ ಸಾಧನವು ಹಂಚಿಕೆಯನ್ನು ಸ್ವೀಕರಿಸಲು ಅಥವಾ ತಿರಸ್ಕರಿಸಲು ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.",
"timeoutHint": "ಹಂಚಿಕೊಳ್ಳಲು ನಿರೀಕ್ಷಿಸಿದ್ದಕ್ಕಿಂತ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತಿದೆ. ಸಂಪರ್ಕದಲ್ಲಿ ಸಮಸ್ಯೆ ಇರಬಹುದು."
},
"accepted": {
- "title": "ಯಶಸ್ಸು!",
- "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಕ ಜೊತೆಗೆ ಯಶಸ್ವಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ"
+ "title": "ಐಡಿಯನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ",
+ "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು {{ರಿಸೀವರ್}} ಜೊತೆಗೆ ಯಶಸ್ವಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ",
+ "gotohome": "ಮನೆಗೆ ಹೋಗು"
},
"rejected": {
"title": "ಗಮನಿಸಿ",
- "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಕ ತಿರಸ್ಕರಿಸಿದ್ದಾರೆ"
+ "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು {{ರಿಸೀವರ್}} ತಿರಸ್ಕರಿಸಿದ್ದಾರೆ"
},
"bleError": {
- "title": "ವರ್ಗಾಯಿಸಲು ವಿಫಲವಾಗಿದೆ",
- "message": "ಕಾರ್ಡ್ ಅನ್ನು ವರ್ಗಾಯಿಸುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.",
- "hint": "ದೋಷ: {{code}}"
+ "title": "ವರ್ಗಾಯಿಸಲು ವಿಫಲವಾಗಿದೆ!",
+ "message": "ಕಾರ್ಡ್ ಅನ್ನು ವರ್ಗಾಯಿಸುವಾಗ ಏನೋ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."
}
}
},
@@ -390,6 +449,8 @@
"acceptRequest": "ಹಂಚಿಕೊಳ್ಳಿ",
"acceptRequestAndVerify": "ಸೆಲ್ಫಿಯೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ",
"reject": "ತಿರಸ್ಕರಿಸಿ",
+ "consentToPhotoVerification": "ದೃಢೀಕರಣಕ್ಕಾಗಿ ನನ್ನ ಫೋಟೋ ತೆಗೆಯಲು ನಾನು ಒಪ್ಪಿಗೆ ನೀಡುತ್ತೇನೆ",
+ "pleaseSelectAnId": "ದಯವಿಟ್ಟು ಐಡಿ ಆಯ್ಕೆಮಾಡಿ",
"status": {
"sharing": {
"title": "ಹಂಚಿಕೆ...",
@@ -398,14 +459,13 @@
},
"accepted": {
"title": "ಯಶಸ್ಸು!",
- "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ನ್ನು {{receiver}} ಅವರೊಂದಿಗೆ ಯಶಸ್ವಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ"
+ "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ನ್ನು ಪರಿಶೀಲಕ ಅವರೊಂದಿಗೆ ಯಶಸ್ವಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ"
},
"rejected": {
"title": "ಗಮನಿಸಿ",
- "message": "Your ಕಾರ್ಡ್ನ್ನು {{receiver}} ತಿರಸ್ಕರಿಸಿದ್ದಾರೆ "
+ "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ನ್ನು ಪರಿಶೀಲಕ ತಿರಸ್ಕರಿಸಿದ್ದಾರೆ "
}
- },
- "consentToPhotoVerification": "ದೃಢೀಕರಣಕ್ಕಾಗಿ ನನ್ನ ಫೋಟೋ ತೆಗೆಯಲು ನಾನು ಒಪ್ಪಿಗೆ ನೀಡುತ್ತೇನೆ"
+ }
},
"VerifyIdentityOverlay": {
"status": {
@@ -428,11 +488,11 @@
},
"statusAccepted": {
"title": "ಯಶಸ್ಸು!",
- "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ {{receiver}}ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ"
+ "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಪರಿಶೀಲಕಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲಾಗಿದೆ"
},
"statusRejected": {
"title": "ಸೂಚನೆ",
- "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ಅನ್ನು {{receiver}}ತಿರಸ್ಕರಿಸಿದ್ದಾರೆ"
+ "message": "ನಿಮ್ಮ ಕಾರ್ಡ್ಅನ್ನು ಪರಿಶೀಲಕತಿರಸ್ಕರಿಸಿದ್ದಾರೆ"
}
},
"WelcomeScreen": {
@@ -440,6 +500,11 @@
"getStarted": "ಪ್ರಾರಂಭಿಸಿ",
"unlockApp": "ಅಪ್ಲಿಕೇಶನ್ ಅನ್ಲಾಕ್ ಮಾಡಿ"
},
+ "SetupLanguage": {
+ "header": "ಭಾಷೆಯನ್ನು ಆರಿಸಿ",
+ "description": "ನಿಮ್ಮ ಆದ್ಯತೆಯ ಭಾಷೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ",
+ "save": "ಆದ್ಯತೆಯನ್ನು ಉಳಿಸಿ"
+ },
"common": {
"cancel": "ರದ್ದು",
"save": "ಉಳಿಸು",
@@ -456,4 +521,4 @@
"genericError": "ಏನೋ ತಪ್ಪಾಗಿದೆ. ದಯವಿಟ್ಟು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ!"
}
}
-}
+}
\ No newline at end of file
diff --git a/locales/tam.json b/locales/tam.json
index e4ec759c7..5b2be515d 100644
--- a/locales/tam.json
+++ b/locales/tam.json
@@ -11,17 +11,13 @@
"VC_RECEIVED_BUT_PRESENCE_VERIFICATION_FAILED": "பெற்றது. இருப்பைச் சரிபார்க்க முடியவில்லை",
"PRESENCE_VERIFIED_AND_VC_SHARED": "சரிபார்க்கப்பட்டு பகிரப்பட்டது",
"PRESENCE_VERIFICATION_FAILED": "சரிபார்ப்பு தோல்வியடைந்தது",
- "QRLOGIN_SUCCESFULL": "QRஉள்நுழைவு வெற்றிகரமாக உள்ளது",
- "WALLET_BINDING_SUCCESSFULL": "செயல்படுத்தல் வெற்றி",
- "WALLET_BINDING_FAILURE": "செயல்படுத்துவதில் தோல்வி"
+ "QRLOGIN_SUCCESFULL": "QRஉள்நுழைவு வெற்றிகரமாக உள்ளது"
},
"DeviceInfoList": {
"requestedBy": "கோரியவர்",
"sentBy": "அனுப்பியவர்",
"deviceRefNumber": "சாதன குறிப்பு எண்",
- "name": "பெயர்",
- "Verifier": "சரிபார்ப்பவர்",
- "Wallet": "வாலட்"
+ "name": "பெயர்"
},
"PasscodeVerify": {
"passcodeMismatchError": "கடவுக்குறியீடு பொருந்தவில்லை."
@@ -49,35 +45,47 @@
"address": "முகவரி",
"reasonForSharing": "பகிர்வதற்கான காரணம்",
"idType": "ஐடி வகை",
- "id": "Id",
+ "id": "ஐடி",
+ "qrCodeHeader": "க்யு ஆர் குறியீடு",
"nationalCard": "தேசிய அட்டை್",
"uin": "UIN",
+ "vid": "VID",
"enableVerification": "செயல்படுத்த",
"profileAuthenticated": "ஆன்லைன் உள்நுழைவுக்காக செயல்படுத்தப்பட்டது",
"offlineAuthDisabledHeader": "ஆன்லைன் உள்நுழைவுக்கான செயல்படுத்தல் நிலுவையில் உள்ளது",
"offlineAuthDisabledMessage": "இந்த நற்சான்றிதழை ஆன்லைன் உள்நுழைவுக்குப் பயன்படுத்த, கீழே உள்ள பொத்தானைக் கிளிக் செய்யவும்.",
- "vid": "VID",
"verificationEnabledSuccess": "ஆன்லைன் உள்நுழைவுக்காக செயல்படுத்தப்பட்டது",
"goback": "திரும்பி செல்",
"BindingWarning": "இந்த நற்சான்றிதழுக்கான சரிபார்ப்பை நீங்கள் வேறொரு பணப்பையில் இயக்கியிருந்தால், அது மேலெழுதப்படும். தொடர வேண்டுமா?",
"yes_confirm": "ஆம், நான் உறுதி செய்கிறேன்",
"no": "இல்லை",
"Alert": "எச்சரிக்கை",
- "ok": "சரி",
- "credentialRegistry": "நற்சான்றிதழ்கள் பதிவு",
- "errors": {
- "savingFailed": {
- "title": "அட்டைஐ சேமிப்பதில் தோல்வி",
- "message": "கடையில் அட்டைஐ சேமிக்கும் போது ஏதோ தவறு ஏற்பட்டது."
- },
- "diskFullError": {
- "title": "அட்டைஐ சேமிக்க முடியவில்லை",
- "message": "ஆப்ஸ் டேட்டா நிரம்பியதால் அட்டைகள் பெறவோ சேமிக்கவோ முடியாது."
- }
- }
+ "ok": "சரி"
+ },
+ "HomeScreenKebabPopUp": {
+ "title": "மேலும் விருப்பங்கள்",
+ "unPinCard": "கார்டை அன்பின் செய்யவும்",
+ "pinCard": "பின் அட்டை",
+ "offlineAuthenticationDisabled!": "ஆஃப்லைன் அங்கீகாரம் முடக்கப்பட்டுள்ளது!",
+ "offlineAuthDisabledMessage": "இந்த நற்சான்றிதழை ஆஃப்லைன் அங்கீகாரத்திற்காகப் பயன்படுத்த இங்கே கிளிக் செய்யவும்.",
+ "viewActivityLog": "செயல்பாட்டு பதிவைக் காண்க",
+ "removeFromWallet": "பணப்பையிலிருந்து அகற்று",
+ "revokeId": "ஐடியைத் திரும்பப் பெறு",
+ "revokeMessage": "இந்தச் சுயவிவரத்திற்கான விர்ச்சுவல் ஐடியைத் திரும்பப் பெறவும்"
+ },
+ "WalletBinding": {
+ "inProgress": "செயல்பாட்டில் உள்ளது",
+ "profileAuthenticated": "சுயவிவரம் அங்கீகரிக்கப்பட்டது!"
+ },
+ "BindingVcWarningOverlay": {
+ "alert": "தயவுசெய்து உறுதிப்படுத்தவும்",
+ "BindingWarning": "இந்த நற்சான்றிதழுக்கான சரிபார்ப்பை நீங்கள் வேறொரு பணப்பையில் இயக்கியிருந்தால், அது மேலெழுதப்படும். தொடர வேண்டுமா?",
+ "yesConfirm": "ஆம், உறுதி செய்கிறேன்",
+ "no": "இல்லை"
},
"AuthScreen": {
"header": "பயன்பாட்டைத் திறக்க பயோமெட்ரிக்ஸைப் பயன்படுத்த விரும்புகிறீர்களா?",
+ "Description": "பயன்பாட்டைத் திறக்க பயோமெட்ரிக்ஸைப் பயன்படுத்த விரும்புகிறீர்களா??",
"useBiometrics": "பயோமெட்ரிக்ஸைப் பயன்படுத்து",
"usePasscode": "நான் கடவுக்குறியீட்டைப் பயன்படுத்த விரும்புகிறேன்",
"errors": {
@@ -90,16 +98,55 @@
"BiometricScreen": {
"unlock": "கைரேகை மூலம் திற"
},
- "HistoryTab": {
- "noHistory": "இன்னும் வரலாறு கிடைக்கவில்லை",
- "downloaded": "பதிவிறக்கம்",
- "shared": "பகிரப்பட்டது",
- "received": "பெறப்பட்டது",
- "deleted": "நீக்கப்பட்டது"
+ "HistoryScreen": {
+ "noHistory": "இதுவரை வரலாறு இல்லை",
+ "downloaded": "கிடைத்தது",
+ "shared": "பகிர்ந்து கொண்டார்",
+ "received": "பெற்றது",
+ "deleted": "அகற்றப்பட்டது"
+ },
+ "SettingScreen": {
+ "header": "அமைப்புகள்",
+ "injiAsVerifierApp": "சரிபார்ப்பு பயன்பாடாக இன்ஜி",
+ "basicSettings": "அடிப்படை அமைப்புகள்",
+ "bioUnlock": "பயோமெட்ரிக்ஸ் மூலம் திறக்கவும்",
+ "language": "மொழி",
+ "aboutInji": "இன்ஜி பற்றி",
+ "credentialRegistry": "நற்சான்றிதழ் பதிவு",
+ "injiTourGuide": "இன்ஜி சுற்றுலா வழிகாட்டி",
+ "logout": "வெளியேறு"
+ },
+ "AboutInji": {
+ "aboutInji": "இன்ஜி பற்றி",
+ "header": "இன்ஜி பற்றி",
+ "aboutDetailes": "இன்ஜி என்பது ஒரு மொபைல் பயன்பாடாகும், இது நற்சான்றிதழ்களைச் சேமிக்க டிஜிட்டல் பணப்பையாகப் பயன்படுத்தப்படலாம். எந்த இடத்திலும் நேரத்திலும், ஆஃப்லைன் மற்றும் ஆன்லைன் முறைகள் இரண்டிலும் அடையாளச் சரிபார்ப்பை இது அனுமதிக்கிறது.",
+ "forMoreDetailes": "மேலும் விவரங்களுக்கு",
+ "clickHere": "இங்கே கிளிக் செய்யவும்",
+ "version": "பதிப்பு",
+ "tuvaliVersion": "துவாலி-பதிப்பு"
+ },
+ "HelpScreen": {
+ "header": "உதவி",
+ "whatIsDigitalCredential?": "டிஜிட்டல் நற்சான்றிதழ் என்றால் என்ன?",
+ "detail-1": "டிஜிட்டல் நற்சான்றிதழ் என்பது உங்கள் உடல் அடையாள அட்டையின் டிஜிட்டல் பதிப்பாகும்",
+ "whatCanDoWithDigitalCredential?": "டிஜிட்டல் சான்றுகளை வைத்து நாம் என்ன செய்ய முடியும்?",
+ "detail-2": "உங்கள் டிஜிட்டல் சான்றுகளைப் பயன்படுத்தி பல்வேறு அரசு மற்றும் தனியார் சேவைகளைப் பெறலாம்.",
+ "howToAddCard?": "அட்டையை எவ்வாறு சேர்ப்பது?",
+ "detail-3": "கார்டைச் சேர்க்க, முகப்புப் பக்கத்தில் உள்ள '+' பொத்தானைக் கிளிக் செய்து, பொருத்தமான விருப்பத்தைத் தேர்ந்தெடுக்கவும்.",
+ "howToRemoveCardFromWallet?": "ஒரு அட்டையை எவ்வாறு பகிர்வது?",
+ "detail-4": "கார்டில் இடதுபுறமாக ஸ்வைப் செய்யவும் > மேலும் என்பதைக் கிளிக் செய்யவும் > வாலட்டில் இருந்து அகற்று",
+ "canWeAddMultipleCards?": "பல அட்டைகளைச் சேர்க்கலாமா?",
+ "detail-5": "ஆம், முகப்புப் பக்கத்தில் உள்ள '+' பொத்தானைக் கிளிக் செய்வதன் மூலம் பல அட்டைகளை வாலட்டில் சேர்க்கலாம்.",
+ "howToShareCard?": "ஒரு அட்டையை எவ்வாறு பகிர்வது?",
+ "detail-6": "'பகிர்' பொத்தானைக் கிளிக் செய்து, கோரும் தரப்பினரிடமிருந்து QR குறியீட்டை ஸ்கேன் செய்யவும். இணைப்பு நிறுவப்பட்டதும், அட்டை பகிரப்படும்.",
+ "howToActivateCardForOnlineLogin?": "ஆன்லைன் உள்நுழைவுக்கான அட்டையை எவ்வாறு செயல்படுத்துவது?",
+ "detail-7": "வாலட்டில் கார்டை வெற்றிகரமாகச் சேர்த்த பிறகு, கார்டில் உள்ள 'ஆன்லைன் உள்நுழைவுக்கான ஆக்டிவேஷன் பெண்டிங்' என்பதைக் கிளிக் செய்யவும். 'செயல்படுத்து' என்பதைக் கிளிக் செய்தால், ஆன்லைன் உள்நுழைவுக்கு கார்டு தயாராக இருக்கும்.",
+ "howToViewActivity?": "செயல்பாட்டுப் பதிவுகளை எவ்வாறு பார்ப்பது?",
+ "detail-8": "முகப்புப் பக்கத்தில், பயனரின் செயல்பாட்டின் விவரங்களைப் பார்க்க, 'வரலாறு' என்பதைக் கிளிக் செய்யவும்."
},
"HomeScreen": {
- "myVcsTab": "எனது\nஅட்டைகள்",
- "receivedVcsTab": "பெறப்பட்டது\nஅட்டைகள்",
+ "myVcsTab": "எனது\nஅட்டை",
+ "receivedVcsTab": "பெறப்பட்டது\nஅட்டை",
"historyTab": "வரலாறு"
},
"AddVcModal": {
@@ -134,7 +181,6 @@
"applicationProcessing": "AID தயாராக இல்லை",
"noMessageAvailable": "சிறிது நேரம் கழித்து முயற்சிக்கவும்",
"networkRequestFailed": "நெட்வொர்க் கோரிக்கை தோல்வியடைந்தது",
- "invalidAid": "உள்ளிடப்பட்ட எய்ட் கிடைக்கவில்லை.நுழைவதற்கு முன் உங்கள் உதவியை சரிபார்க்கவும்",
"timeout": "நேரம் முடிந்தது"
}
}
@@ -145,52 +191,56 @@
"backButton": "பேக் ஹோம்"
},
"GetIdInputModal": {
- "header": "உங்கள் UIN ஐப் பெற உங்கள் விண்ணப்ப ID ஐ உள்ளிடவும்",
- "getUIN": "UIN/VIDஐப் பெறுங்கள்",
- "applicationId": "விண்ணப்ப ID",
+ "header": "உங்கள் UIN/VID ஐ மீட்டெடுக்கவும்",
+ "applicationIdLabel": "உங்கள் விண்ணப்ப ஐடியை உள்ளிடவும்",
+ "enterApplicationId": "விண்ணப்ப ஐடியை உள்ளிடவும்",
"requestingOTP": "OTP ஐக் கோருகிறது...",
- "qstnMarkToolTip": "விண்ணப்ப ID பதிவுசெய்த பிறகு பெறப்பட்ட ஒப்புகையில் கிடைக்கும்."
+ "qstnMarkToolTip": "விண்ணப்ப ஐடி பதிவுசெய்த பிறகு பெறப்பட்ட ஒப்புகையில் கிடைக்கும்.",
+ "getUIN": "UIN/VIDஐப் பெறுங்கள்"
},
"IdInputModal": {
- "header": "உங்கள் அட்டைஐப் பதிவிறக்க உங்கள் UIN/VID ஐ உள்ளிடவும்",
- "generateVc": "எனது அட்டைஐ உருவாக்கவும்",
- "enterId": "உங்கள் {{idType}}ஐ உள்ளிடவும்",
- "noUIN/VID": "உங்கள் UIN/VID இல்லையா? இங்கே பெறுங்கள்",
+ "header": "உங்கள் ஐடியை மீட்டெடுக்கவும்",
+ "guideLabel": "ஐடி வகையைத் தேர்ந்தெடுத்து, நீங்கள் மீட்டெடுக்க விரும்பும் ஐடியின் MOSIP வழங்கப்பட்ட UIN அல்லது VID ஐ உள்ளிடவும்",
+ "generateVc": "அட்டை ஐ உருவாக்கு",
+ "downloadID": "ஐடியைப் பதிவிறக்கவும்",
+ "enterId": "{{idType}} ஐ உள்ளிடவும்",
+ "noUIN/VID": "UIN/VID இல்லையா? ",
+ "getItHere": "இப்பொழுதே பெற்றுக்கொள்ளவும்",
"requestingOTP": "OTP ஐக் கோருகிறது..."
},
"OtpVerificationModal": {
- "enterOtp": "நாங்கள் உங்களுக்கு அனுப்பிய 6 இலக்க சரிபார்ப்புக் குறியீட்டை உள்ளிடவும்",
- "header": "OTP சரிபார்ப்பு"
+ "title": "OTP சரிபார்ப்பு",
+ "otpSentMessage": "உங்கள் பதிவு செய்யப்பட்ட மொபைல் எண்ணுக்கு 6 இலக்கக் குறியீட்டை அனுப்பியுள்ளோம்!",
+ "resendTheCode": "நீங்கள் குறியீட்டை மீண்டும் அனுப்பலாம் ",
+ "resendCode": "குறியீட்டை மீண்டும் அனுப்பு"
},
"MyVcsTab": {
- "addVcButton": "அட்டை சேர்",
- "generateVc": "உங்கள் அட்டைகள்ஐ உருவாக்கவும்",
- "generateVcDescription": "உங்கள் அட்டைஐப் பதிவிறக்க, கீழே உள்ள \"அட்டை சேர்\" என்பதைத் தட்டவும்",
- "errors": {
- "savingFailed": {
- "title": "அட்டைஐ சேமிப்பதில் தோல்வி",
- "message": "கடையில் அட்டைஐ சேமிக்கும் போது ஏதோ தவறு ஏற்பட்டது."
- },
- "diskFullError": {
- "title": "அட்டைஐ சேமிக்க முடியவில்லை",
- "message": "ஆப்ஸ் டேட்டா நிரம்பியதால் அட்டைகள் பெறவோ சேமிக்கவோ முடியாது."
- }
- }
+ "bringYourDigitalID": "உங்கள் டிஜிட்டல் ஐடியைக் கொண்டு வாருங்கள்",
+ "generateVcDescription": "உங்கள் அட்டை ஐப் பதிவிறக்க, கீழே உள்ள பதிவிறக்கு அட்டை என்பதைத் தட்டவும்",
+ "downloadCard": "கார்டைப் பதிவிறக்கவும்",
+ "downloadingYourId": "உங்கள் கார்டைப் பதிவிறக்க, இதற்கு 5 நிமிடங்கள் வரை ஆகலாம்"
},
"OnboardingOverlay": {
- "stepOneTitle": "வரவேற்கிறேன்!",
- "stepOneText": "உங்கள் டிஜிட்டல் நற்சான்றிதழை எப்போதும் உங்களுடன் வைத்திருக்கவும். தொடங்குவதற்கு, உங்கள் சுயவிவரத்தில் அட்டைகள்ஐச் சேர்க்கவும்.",
- "stepTwoTitle": "அட்டை மேலாண்மை",
- "stepTwoText": "உருவாக்கப்பட்டவுடன், அட்டைகள் உங்கள் மொபைலில் பாதுகாப்பாகச் சேமிக்கப்பட்டு, எந்த நேரத்திலும் மறுபெயரிடலாம் அல்லது பகிரலாம்.",
- "stepThreeTitle": "எளிதான பகிர்வு",
- "stepThreeText": "QR குறியீடுகளை ஸ்கேன் செய்ய உங்கள் ஃபோன் கேமராவைப் பயன்படுத்தி விரைவாக அட்டைகளைப் பகிரவும் மற்றும் பெறவும்.",
- "stepThreeButton": "தொடங்கவும் அட்டைஐச் சேர்க்கவும்"
+ "stepOneTitle": "பாதுகாப்பான பகிர்வு!",
+ "stepOneText": "உங்கள் டிஜிட்டல் நற்சான்றிதழை எப்போதும் உங்களுடன் வைத்திருக்கவும். அவற்றை திறம்பட நிர்வகிக்கவும் பயன்படுத்தவும் இன்ஜி உதவுகிறது. தொடங்குவதற்கு, உங்கள் சுயவிவரத்தில் கார்டுகளைச் சேர்க்கவும்.",
+ "stepTwoTitle": "நம்பகமான டிஜிட்டல் வாலட்",
+ "stepTwoText": "உங்கள் முக்கியமான கார்டுகளை ஒரே நம்பகமான பணப்பையில் சேமித்து எடுத்துச் செல்லுங்கள்.",
+ "stepThreeTitle": "பாதுகாப்பான பகிர்வு",
+ "stepThreeText": "தொந்தரவு இல்லாத வகையில் உங்கள் கார்டுகளைப் பாதுகாப்பாகப் பகிர்ந்து, பல்வேறு சேவைகளைப் பெறுங்கள்.",
+ "stepFourTitle": "தொந்தரவு இல்லாத அங்கீகாரம்",
+ "stepFourText": "சேமிக்கப்பட்ட டிஜிட்டல் நற்சான்றிதழைப் பயன்படுத்தி உங்களை எளிதாக அங்கீகரிக்கவும்.",
+ "stepFourButton": "தொடங்குங்கள்",
+ "skip": "தவிர்க்கவும்",
+ "next": "அடுத்தது"
},
"ReceivedVcsTab": {
- "noReceivedVcsTitle": "இன்னும் அட்டைகள் கிடைக்கவில்லை",
+ "receivedCards": "பெற்ற அட்டைகள்",
+ "header": "பெற்ற அட்டைகள்",
+ "noReceivedVcsTitle": "இன்னும் அட்டை கிடைக்கவில்லை",
"noReceivedVcsText": "அட்டை பெறுவதற்கு கீழே உள்ள கோரிக்கையைத் தட்டவும்"
},
"ViewVcModal": {
+ "title": "அடையாள விவரங்கள்",
"cancel": "ரத்து செய்",
"lock": "பூட்டு",
"unlock": "திறத்தல்",
@@ -201,7 +251,6 @@
"requestingOtp": "ஓடிபியைக் கோருகிறது...",
"editTag": "திருத்து குறி",
"redirecting": "வழிமாற்று...",
- "inProgress": "ஏற்றுகிறது...",
"success": {
"unlocked": "அட்டை வெற்றிகரமாக திறக்கப்பட்டது",
"locked": "அட்டை வெற்றிகரமாக பூட்டப்பட்டது",
@@ -212,33 +261,21 @@
"home": "வீடு",
"scan": "ஸ்கேன்",
"request": "கோரிக்கை",
+ "history": "வரலாறு",
"settings": "செட்டிங்ஸ்"
},
"PasscodeScreen": {
- "header": "உங்கள் விண்ணப்பத்தைப் பாதுகாக்க கடவுக்குறியீட்டை அமைக்கவும்",
- "confirmPasscode": "உங்கள் கடவுக்குறியீட்டை உறுதிப்படுத்தவும்",
+ "header": "கடவுக்குறியீட்டை அமைக்கவும்",
+ "enterNewPassword": "புதிய கடவுக்குறியீட்டை உள்ளிடவும்",
+ "reEnterPassword": "புதிய கடவுக்குறியீட்டை மீண்டும் உள்ளிடவும்",
+ "confirmPasscode": "கடவுக்குறியீட்டை உறுதிப்படுத்தவும்",
"enterPasscode": "உங்கள் கடவுக்குறியீட்டை உள்ளிடவும்"
},
"AppMetaData": {
"header": "இன்ஜி பற்றி",
"version": "பதிப்பு",
- "useBle": "Powered by BLE"
- },
- "ProfileScreen": {
- "name": "பெயர்",
- "vcLabel": "VC லேபிள்",
- "language": "மொழி",
- "credentialRegistry": "நற்சான்றிதழ்கள் பதிவு",
- "bioUnlock": "பயோமெட்ரிக்ஸ் மூலம் திறக்கவும்",
- "authFactorUnlock": "அங்கீகார காரணியைத் திற",
- "AppMetaData": "இன்ஜி பற்றி",
- "logout": "வெளியேறு",
- "revokeLabel": "திரும்பப் பெறு VID",
- "revokeHeader": "திரும்பப் பெறு VID",
- "revokingVids": "நீங்கள் ({{count}}) ஐ ரத்து செய்ய உள்ளீர்கள் VIDs.",
- "revokingVidsAfter": "அதாவது, அந்த VID(s) உடன் இணைக்கப்பட்ட எந்த ஐடியையும் நீங்கள் இனி பயன்படுத்தவோ பார்க்கவோ முடியாது. \nநீங்கள் நிச்சயமாக தொடர விரும்புகிறீர்களா?",
- "empty": "காலியாக",
- "revokeSuccessful": "VID வெற்றிகரமாக ரத்து செய்யப்பட்டது"
+ "useBle": "BLE ஆல் இயக்கப்படுகிறது",
+ "useGoogleNearby": "GoogleNearby மூலம் இயக்கப்படுகிறது"
},
"QrScreen": {
"title": "QR உள்நுழைவு",
@@ -247,7 +284,7 @@
"checkDomain": "மேலும், முகவரிப் பட்டியில் பூட்டு ஐகான் உள்ளதா எனச் சரிபார்க்கவும்.",
"domainHead": "https://",
"selectId": "ஐடியைத் தேர்ந்தெடுக்கவும்",
- "noBindedVc": "சரிபார்க்க, பிணைக்கப்பட்ட அட்டைகள் எதுவும் இல்லை",
+ "noBindedVc": "சரிபார்க்க, பிணைக்கப்பட்ட அட்டை எதுவும் இல்லை",
"back": "திரும்பி செல்",
"confirm": "உறுதிப்படுத்தவும்",
"verify": "சரிபார்க்கவும்",
@@ -258,17 +295,20 @@
"access": " அணுகலைக் கோருகிறது",
"status": "நிலை",
"successMessage": "நீங்கள் வெற்றிகரமாக உள்நுழைந்துள்ளீர்கள் ",
- "okay": "சரி"
+ "okay": "சரி",
+ "allow": "அனுமதி",
+ "cancel": "ரத்து செய்",
+ "essentialClaims": "அத்தியாவசிய உரிமைகோரல்கள்",
+ "voluntaryClaims": "தன்னார்வ உரிமைகோரல்கள்",
+ "required": "தேவை"
},
"ReceiveVcScreen": {
"header": "அட்டை விவரங்கள்",
- "save": "அட்டையைச் சேமிக்கவும்",
- "acceptRequest": "கோரிக்கையை ஏற்று அட்டை ஐப் பெறவும்",
- "acceptRequestAndVerify": "கோரிக்கையை ஏற்று சரிபார்க்கவும்",
+ "save": "சேமி அட்டை",
+ "verifyAndSave": "சரிபார்த்து சேமிக்கவும்",
"reject": "நிராகரிக்கவும்",
"discard": "நிராகரிக்கவும்",
- "goToReceivedVCTab": "பெறப்பட்ட அட்டைகளைப் பார்க்கவும் ",
- "saving": "சேமிப்பு",
+ "goToReceivedVCTab": "பெறப்பட்ட அட்டை ஐக் காண்க",
"errors": {
"savingFailed": {
"title": "அட்டைஐ சேமிப்பதில் தோல்வி",
@@ -281,26 +321,21 @@
}
},
"RequestScreen": {
+ "receiveCard": "பெற்ற அட்டை",
"bluetoothDenied": "அட்டைஐக் கோர புளூடூத்தை இயக்கவும்",
- "bluetoothStateAndroid": "உள்ளூர் பகிர்வை ஆதரிக்க விரைவான அமைப்புகளிலிருந்து புளூடூத்தை இயக்கவும்",
- "bluetoothStateIos": "உள்ளூர் பகிர்வை ஆதரிக்க, கட்டுப்பாட்டு மையத்திலிருந்து புளூடூத்தை இயக்கவும்",
+ "bluetoothStateIos": "புளூடூத் முடக்கப்பட்டுள்ளது, கட்டுப்பாட்டு மையத்திலிருந்து அதை இயக்கவும்",
+ "bluetoothStateAndroid": "புளூடூத் முடக்கப்பட்டுள்ளது, விரைவு அமைப்புகள் மெனுவிலிருந்து அதை இயக்கவும்",
"showQrCode": "குடியுரிமை அட்டைஐக் கோர இந்த QR குறியீட்டைக் காட்டு",
"incomingVc": "உள்வரும் அட்டை",
"request": "கோரிக்கை",
- "errors": {
- "nearbyDevicesPermissionDenied": {
- "message": "அட்டைகள் கோருவதற்கு அருகிலுள்ள சாதனங்களின் அனுமதி தேவை",
- "button": "அனுமதி அனுமதி"
- }
- },
"status": {
"accepted": {
"title": "வெற்றி!",
- "message": "அட்டை ஆனது வாலட் இடமிருந்து வெற்றிகரமாகப் பெறப்பட்டது"
+ "message": "அட்டை ஆனது பணப்பை இடமிருந்து வெற்றிகரமாகப் பெறப்பட்டது"
},
"rejected": {
"title": "அறிவிப்பு",
- "message": "நீங்கள் வாலட் இன் அட்டை ஐ நிராகரித்தீர்கள்"
+ "message": "நீங்கள் பணப்பை இன் அட்டை ஐ நிராகரித்தீர்கள்"
},
"disconnected": {
"title": "துண்டிக்கப்பட்டது",
@@ -319,9 +354,8 @@
"message": "ஆன்லைன் பகிர்வு பயன்முறையை இயக்க இணையத்துடன் இணைக்கவும்"
},
"bleError": {
- "title": "இடமாற்றம் செய்ய முடியவில்லை",
- "message": "அட்டை ஐ மாற்றும்போது ஏதோ தவறு ஏற்பட்டது. தயவு செய்து மீண்டும் முயற்சிக்கவும்.",
- "hint": "பிழை: {{code}}"
+ "title": "இடமாற்றம் செய்ய முடியவில்லை!",
+ "message": "அட்டை ஐ மாற்றும்போது ஏதோ தவறு ஏற்பட்டது. தயவு செய்து மீண்டும் முயற்சிக்கவும்."
}
},
"online": "நிகழ்நிலை",
@@ -329,53 +363,49 @@
"gotoSettings": "அமைப்புகளுக்குச் செல்லவும்"
},
"ScanScreen": {
- "header": "QR குறியீட்டை ஸ்கேன் செய்",
- "noShareableVcs": "பகிரக்கூடிய அட்டைகள் எதுவும் இல்லை.",
- "bluetoothStateAndroid": "உள்ளூர் பகிர்வை ஆதரிக்க விரைவான அமைப்புகளிலிருந்து புளூடூத்தை இயக்கவும்",
- "bluetoothStateIos": "உள்ளூர் பகிர்வை ஆதரிக்க, கட்டுப்பாட்டு மையத்திலிருந்து புளூடூத்தை இயக்கவும்",
- "enableBluetoothMessage": "உள்ளூர் பகிர்வை ஆதரிக்க புளூடூத் அனுமதிகளை இயக்கவும்",
- "enableBluetoothButtonText": "புளூடூத் அனுமதிகளை அனுமதிக்கவும்",
- "sharingVc": "பகிர்தல் அட்டை",
+ "header": "QR குறியீட்டை ஸ்கேன் செய்யவும்",
+ "noShareableVcs": "பகிரக்கூடிய அட்டை எதுவும் இல்லை.",
+ "sharingVc": "பகிர்கிறது அட்டை",
+ "bluetoothStateIos": "புளூடூத் முடக்கப்பட்டுள்ளது, கட்டுப்பாட்டு மையத்திலிருந்து அதை இயக்கவும்",
+ "bluetoothStateAndroid": "புளூடூத் முடக்கப்பட்டுள்ளது, விரைவு அமைப்புகள் மெனுவிலிருந்து அதை இயக்கவும்",
"errors": {
"locationDisabled": {
- "message": "கார்டைப் பகிர இருப்பிடச் சேவைகள் இயக்கப்பட்டிருக்க வேண்டும்",
+ "message": "ஸ்கேனிங் செயல்பாட்டிற்கு இருப்பிடச் சேவைகள் இயக்கப்பட வேண்டும்",
"button": "இருப்பிட சேவைகளை இயக்கு"
},
"locationDenied": {
- "message": "கார்டைப் பகிர இருப்பிட அனுமதி தேவை",
+ "message": "ஸ்கேனிங் செயல்பாட்டிற்கு இருப்பிட அனுமதி தேவை",
"button": "இருப்பிடம் அணுகலை அனுமதி"
- },
- "nearbyDevicesPermissionDenied": {
- "message": "கார்டைப் பகிர, அருகிலுள்ள சாதனங்களின் அனுமதி தேவை",
- "button": "அனுமதி அனுமதி"
}
},
"status": {
- "connecting": "இணைக்கிறது...",
+ "inProgress": "செயல்பாட்டில் உள்ளது",
+ "establishingConnection": "இணைப்பை நிறுவுதல்",
+ "sharingInProgress": "பகிர்தல் செயல்பாட்டில் உள்ளது",
"connectingTimeout": "இணைப்பை ஏற்படுத்த சிறிது நேரம் ஆகும். மற்ற சாதனம் இணைப்புகளுக்குத் திறந்திருக்கிறதா?",
- "exchangingDeviceInfo": "சாதன தகவல் பரிமாற்றம்...",
+ "exchangingDeviceInfo": "சாதனத் தகவலைப் பரிமாறிக் கொள்கிறது...",
"exchangingDeviceInfoTimeout": "சாதனத் தகவலைப் பரிமாறிக்கொள்ள சிறிது நேரம் ஆகும். நீங்கள் மீண்டும் இணைக்க வேண்டியிருக்கலாம்.",
"invalid": "தவறான QR குறியீடு",
"offline": "ஆன்லைன் பகிர்வு பயன்முறையைப் பயன்படுத்தி QR குறியீடுகளை ஸ்கேன் செய்ய இணையத்துடன் இணைக்கவும்",
- "sent": "அட்டை அனுப்பப்பட்டது...",
- "sentHint": "ரிசீவர் உங்கள் அட்டை ஐ சேமிக்க அல்லது நிராகரிக்க காத்திருக்கிறது",
+ "sent": "{{ vcLabel }} அனுப்பப்பட்டது...",
+ "sentHint": "ரிசீவர் உங்கள் {{ vcLabel }} ஐ சேமிக்க அல்லது நிராகரிக்க காத்திருக்கிறது",
"sharing": {
- "title": "பகிர்கிறது...",
+ "title": "பகிர்தல்...",
"hint": "பெறும் சாதனம் பங்கை ஏற்க அல்லது நிராகரிக்க காத்திருக்கவும்.",
"timeoutHint": "பகிர்வதற்கு எதிர்பார்த்ததை விட அதிக நேரம் எடுக்கிறது. இணைப்பில் சிக்கல் இருக்கலாம்."
},
"accepted": {
- "title": "வெற்றி!",
- "message": "உங்கள் அட்டை வெற்றிகரமாக சரிபார்ப்பவர் உடன் பகிரப்பட்டது"
+ "title": "ஐடி வெற்றிகரமாகப் பகிரப்பட்டது",
+ "message": "உங்கள் அட்டை வெற்றிகரமாக சரிபார்ப்பவர் உடன் பகிரப்பட்டது",
+ "gotohome": "வீட்டிற்கு போ"
},
"rejected": {
"title": "கவனிக்கவும்",
"message": "உங்கள் அட்டை, சரிபார்ப்பவர் ஆல் நிராகரிக்கப்பட்டது"
},
"bleError": {
- "title": "இடமாற்றம் செய்ய முடியவில்லை",
- "message": "அட்டை ஐ மாற்றும்போது ஏதோ தவறு ஏற்பட்டது. தயவு செய்து மீண்டும் முயற்சிக்கவும்.",
- "hint": "பிழை: {{code}}"
+ "title": "இடமாற்றம் செய்ய முடியவில்லை!",
+ "message": "அட்டை ஐ மாற்றும்போது ஏதோ தவறு ஏற்பட்டது. தயவு செய்து மீண்டும் முயற்சிக்கவும்."
}
}
},
@@ -390,6 +420,8 @@
"acceptRequest": "பகிர்",
"acceptRequestAndVerify": "செல்ஃபியுடன் பகிரவும்",
"reject": "நிராகரிக்கவும்",
+ "consentToPhotoVerification": "அங்கீகாரத்திற்காக எனது புகைப்படத்தை எடுக்க நான் ஒப்புதல் அளிக்கிறேன்",
+ "pleaseSelectAnId": "ஐடியைத் தேர்ந்தெடுக்கவும்",
"status": {
"sharing": {
"title": "பகிர்தல்...",
@@ -398,14 +430,13 @@
},
"accepted": {
"title": "வெற்றி!",
- "message": "உங்கள் அட்டை வெற்றிகரமாக {{receiver}} உடன் பகிரப்பட்டது"
+ "message": "உங்கள் அட்டை வெற்றிகரமாக சரிபார்ப்பவர் உடன் பகிரப்பட்டது"
},
"rejected": {
"title": "கவனிக்கவும்",
- "message": "உங்கள் அட்டை, {{receiver}} ஆல் நிராகரிக்கப்பட்டது"
+ "message": "உங்கள் அட்டை, சரிபார்ப்பவர் ஆல் நிராகரிக்கப்பட்டது"
}
- },
- "consentToPhotoVerification": "அங்கீகாரத்திற்காக எனது புகைப்படத்தை எடுக்க நான் ஒப்புதல் அளிக்கிறேன்"
+ }
},
"VerifyIdentityOverlay": {
"status": {
@@ -430,11 +461,11 @@
},
"statusAccepted": {
"title": "வெற்றி!",
- "message": "உங்கள் அட்டை வெற்றிகரமாக {{receiver}} உடன் பகிரப்பட்டது"
+ "message": "உங்கள் அட்டை வெற்றிகரமாக சரிபார்ப்பவர் உடன் பகிரப்பட்டது"
},
"statusRejected": {
"title": "அறிவிப்பு",
- "message": "உங்கள் அட்டை ஆனது {{receiver}} ஆல் நிராகரிக்கப்பட்டது"
+ "message": "உங்கள் அட்டை ஆனது சரிபார்ப்பவர் ஆல் நிராகரிக்கப்பட்டது"
}
},
"WelcomeScreen": {
@@ -442,6 +473,11 @@
"getStarted": "தொடங்கு",
"unlockApp": "பயன்பாட்டைத் திற"
},
+ "SetupLanguage": {
+ "header": "மொழியைத் தேர்ந்தெடுக்கவும்",
+ "description": "உங்களுக்கு விருப்பமான மொழியைத் தேர்ந்தெடுக்கவும்",
+ "save": "விருப்பத்தை சேமிக்கவும்"
+ },
"common": {
"cancel": "ரத்துசெய்",
"save": "சேமி",
diff --git a/machines/activityLog.ts b/machines/activityLog.ts
index 0ba376c04..cc3fda5ae 100644
--- a/machines/activityLog.ts
+++ b/machines/activityLog.ts
@@ -124,6 +124,7 @@ export type ActivityLogType =
| 'VC_RECEIVED_NOT_SAVED'
| 'VC_DELETED'
| 'VC_DOWNLOADED'
+ | 'VC_UPDATED'
| 'VC_REVOKED'
| 'VC_SHARED_WITH_VERIFICATION_CONSENT'
| 'VC_RECEIVED_WITH_PRESENCE_VERIFIED'
diff --git a/machines/app.ts b/machines/app.ts
index 9e3ed95fa..f0bee0e65 100644
--- a/machines/app.ts
+++ b/machines/app.ts
@@ -18,7 +18,6 @@ import {
} from './bleShare/request/requestMachine';
import { createScanMachine, scanMachine } from './bleShare/scan/scanMachine';
import { createRevokeMachine, revokeVidsMachine } from './revoke';
-
import { pure, respond } from 'xstate/lib/actions';
import { AppServices } from '../shared/GlobalContext';
import { request } from '../shared/request';
diff --git a/machines/auth.ts b/machines/auth.ts
index 9fd492256..f7e344e89 100644
--- a/machines/auth.ts
+++ b/machines/auth.ts
@@ -1,7 +1,9 @@
import { init } from 'mosip-inji-face-sdk';
-import { ContextFrom, EventFrom, send, StateFrom } from 'xstate';
+import { assign, ContextFrom, EventFrom, send, StateFrom } from 'xstate';
import { createModel } from 'xstate/lib/model';
-import { downloadModel } from '../shared/commonprops/commonProps';
+import getAllConfigurations, {
+ downloadModel,
+} from '../shared/commonprops/commonProps';
import { AppServices } from '../shared/GlobalContext';
import { StoreEvents, StoreResponseEvent } from './store';
@@ -11,6 +13,7 @@ const model = createModel(
passcode: '',
biometrics: '',
canUseBiometrics: false,
+ selectLanguage: false,
},
{
events: {
@@ -19,6 +22,8 @@ const model = createModel(
LOGOUT: () => ({}),
LOGIN: () => ({}),
STORE_RESPONSE: (response?: unknown) => ({ response }),
+ SELECT: () => ({}),
+ NEXT: () => ({}),
},
}
);
@@ -60,21 +65,36 @@ export const authMachine = model.createMachine(
},
checkingAuth: {
always: [
+ { cond: 'hasLanguageset', target: 'languagesetup' },
{ cond: 'hasPasscodeSet', target: 'unauthorized' },
{ cond: 'hasBiometricSet', target: 'unauthorized' },
{ target: 'settingUp' },
],
},
+ languagesetup: {
+ on: {
+ SELECT: {
+ target: 'introSlider',
+ },
+ },
+ },
+ introSlider: {
+ on: {
+ NEXT: {
+ target: 'settingUp',
+ },
+ },
+ },
settingUp: {
on: {
SETUP_PASSCODE: {
target: 'authorized',
- actions: ['setPasscode', 'storeContext'],
+ actions: ['setPasscode', 'storeContext', 'setLanguage'],
},
SETUP_BIOMETRICS: {
// Note! dont authorized yet we need to setup passcode too as discuss
// target: 'authorized',
- actions: ['setBiometrics', 'storeContext'],
+ actions: ['setBiometrics', 'storeContext', 'setLanguage'],
},
},
},
@@ -127,6 +147,10 @@ export const authMachine = model.createMachine(
setBiometrics: model.assign({
biometrics: (_, event: SetupBiometricsEvent) => event.biometrics,
}),
+
+ setLanguage: assign({
+ selectLanguage: (context) => !context.selectLanguage,
+ }),
},
services: {
@@ -144,6 +168,9 @@ export const authMachine = model.createMachine(
hasBiometricSet: (context) => {
return context.biometrics !== '' && context.passcode !== '';
},
+ hasLanguageset: (context) => {
+ return !context.selectLanguage;
+ },
},
}
);
@@ -180,3 +207,10 @@ export function selectUnauthorized(state: State) {
export function selectSettingUp(state: State) {
return state.matches('settingUp');
}
+
+export function selectLanguagesetup(state: State) {
+ return state.matches('languagesetup');
+}
+export function selectIntroSlider(state: State) {
+ return state.matches('introSlider');
+}
diff --git a/machines/auth.typegen.ts b/machines/auth.typegen.ts
index 33448776c..2f5d254e5 100644
--- a/machines/auth.typegen.ts
+++ b/machines/auth.typegen.ts
@@ -24,6 +24,7 @@ export interface Typegen0 {
requestStoredContext: 'xstate.init';
setBiometrics: 'SETUP_BIOMETRICS';
setContext: 'STORE_RESPONSE';
+ setLanguage: 'SETUP_BIOMETRICS' | 'SETUP_PASSCODE';
setPasscode: 'SETUP_PASSCODE';
storeContext:
| 'SETUP_BIOMETRICS'
@@ -35,6 +36,7 @@ export interface Typegen0 {
'eventsCausingGuards': {
hasBiometricSet: '';
hasData: 'STORE_RESPONSE';
+ hasLanguageset: '';
hasPasscodeSet: '';
};
'eventsCausingServices': {
@@ -44,6 +46,8 @@ export interface Typegen0 {
| 'authorized'
| 'checkingAuth'
| 'init'
+ | 'introSlider'
+ | 'languagesetup'
| 'savingDefaults'
| 'settingUp'
| 'unauthorized';
diff --git a/machines/bleShare/scan/scanMachine.typegen.ts b/machines/bleShare/scan/scanMachine.typegen.ts
index e194adce3..5d0509199 100644
--- a/machines/bleShare/scan/scanMachine.typegen.ts
+++ b/machines/bleShare/scan/scanMachine.typegen.ts
@@ -27,18 +27,23 @@ export interface Typegen0 {
'xstate.stop': { type: 'xstate.stop' };
};
'invokeSrcNameMap': {
- checkBluetoothPermission: 'done.invoke.scan.checkingBluetoothService.checking:invocation[0]';
+ checkBluetoothPermission: 'done.invoke.scan.checkBluetoothPermission.checking:invocation[0]';
+ checkBluetoothState:
+ | 'done.invoke.scan.checkBluetoothState.checking:invocation[0]'
+ | 'done.invoke.scan.recheckBluetoothState.checking:invocation[0]';
checkLocationPermission: 'done.invoke.scan.checkingLocationService.checkingPermission:invocation[0]';
checkLocationStatus: 'done.invoke.scan.checkingLocationService.checkingStatus:invocation[0]';
+ checkNearByDevicesPermission: 'done.invoke.scan.checkNearbyDevicesPermission.checking:invocation[0]';
createVp: 'done.invoke.scan.reviewing.creatingVp:invocation[0]';
disconnect: 'done.invoke.scan.clearingConnection:invocation[0]';
monitorConnection: 'done.invoke.scan:invocation[0]';
- requestBluetooth: 'done.invoke.scan.checkingBluetoothService.requesting:invocation[0]';
+ requestBluetooth: 'done.invoke.scan.checkBluetoothState.requesting:invocation[0]';
+ requestNearByDevicesPermission: 'done.invoke.scan.checkNearbyDevicesPermission.requesting:invocation[0]';
sendVc: 'done.invoke.scan.reviewing.sendingVc:invocation[0]';
startConnection: 'done.invoke.scan.connecting:invocation[0]';
};
'missingImplementations': {
- actions: never;
+ actions: 'setBleError';
delays: never;
guards: never;
services: never;
@@ -66,6 +71,7 @@ export interface Typegen0 {
| 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection';
logFailedVerification: 'FACE_INVALID';
logShared: 'VC_ACCEPTED';
+ openAppPermission: 'GOTO_SETTINGS';
openBluetoothSettings: 'GOTO_SETTINGS';
openSettings: 'LOCATION_REQUEST';
registerLoggers:
@@ -81,12 +87,14 @@ export interface Typegen0 {
requestToEnableLocation: 'LOCATION_DISABLED' | 'LOCATION_REQUEST';
resetShouldVerifyPresence: 'CANCEL' | 'CONNECTED';
sendScanData: 'SCAN';
+ setBleError: 'BLE_ERROR';
setChildRef:
| 'DISCONNECT'
| 'DISMISS'
| 'xstate.after(DESTROY_TIMEOUT)#scan.clearingConnection';
setCreatedVp: 'done.invoke.scan.reviewing.creatingVp:invocation[0]';
setLinkCode: 'SCAN';
+ setReadyForBluetoothStateCheck: 'BLUETOOTH_PERMISSION_ENABLED';
setReason: 'UPDATE_REASON';
setReceiverInfo: 'CONNECTED';
setSelectedVc: 'SELECT_VC';
@@ -107,18 +115,27 @@ export interface Typegen0 {
| 'done.invoke.scan.reviewing.creatingVp:invocation[0]';
};
'eventsCausingGuards': {
+ isIOS: 'BLUETOOTH_STATE_DISABLED' | 'START_PERMISSION_CHECK';
isOpenIdQr: 'SCAN';
isQrLogin: 'SCAN';
+ uptoAndroid11: '' | 'START_PERMISSION_CHECK';
};
'eventsCausingServices': {
QrLogin: 'SCAN';
- checkBluetoothPermission: 'APP_ACTIVE' | 'SCREEN_FOCUS';
+ checkBluetoothPermission:
+ | ''
+ | 'BLUETOOTH_STATE_DISABLED'
+ | 'NEARBY_ENABLED'
+ | 'START_PERMISSION_CHECK';
+ checkBluetoothState: '' | 'APP_ACTIVE';
checkLocationPermission: 'APP_ACTIVE' | 'LOCATION_ENABLED';
checkLocationStatus: '';
+ checkNearByDevicesPermission: 'APP_ACTIVE' | 'START_PERMISSION_CHECK';
createVp: never;
disconnect: '' | 'DISMISS' | 'LOCATION_ENABLED';
monitorConnection: 'xstate.init';
- requestBluetooth: never;
+ requestBluetooth: 'BLUETOOTH_STATE_DISABLED';
+ requestNearByDevicesPermission: 'NEARBY_DISABLED';
sendVc:
| 'ACCEPT_REQUEST'
| 'FACE_VALID'
@@ -127,10 +144,18 @@ export interface Typegen0 {
};
'matchesStates':
| 'bluetoothDenied'
- | 'checkingBluetoothService'
- | 'checkingBluetoothService.checking'
- | 'checkingBluetoothService.enabled'
- | 'checkingBluetoothService.requesting'
+ | 'bluetoothPermissionDenied'
+ | 'checkBluetoothPermission'
+ | 'checkBluetoothPermission.checking'
+ | 'checkBluetoothPermission.enabled'
+ | 'checkBluetoothState'
+ | 'checkBluetoothState.checking'
+ | 'checkBluetoothState.enabled'
+ | 'checkBluetoothState.requesting'
+ | 'checkNearbyDevicesPermission'
+ | 'checkNearbyDevicesPermission.checking'
+ | 'checkNearbyDevicesPermission.enabled'
+ | 'checkNearbyDevicesPermission.requesting'
| 'checkingLocationService'
| 'checkingLocationService.checkingPermission'
| 'checkingLocationService.checkingStatus'
@@ -146,6 +171,10 @@ export interface Typegen0 {
| 'handlingBleError'
| 'inactive'
| 'invalid'
+ | 'nearByDevicesPermissionDenied'
+ | 'recheckBluetoothState'
+ | 'recheckBluetoothState.checking'
+ | 'recheckBluetoothState.enabled'
| 'reviewing'
| 'reviewing.accepted'
| 'reviewing.cancelling'
@@ -163,8 +192,11 @@ export interface Typegen0 {
| 'showQrLogin.idle'
| 'showQrLogin.navigatingToHome'
| 'showQrLogin.storing'
+ | 'startPermissionCheck'
| {
- checkingBluetoothService?: 'checking' | 'enabled' | 'requesting';
+ checkBluetoothPermission?: 'checking' | 'enabled';
+ checkBluetoothState?: 'checking' | 'enabled' | 'requesting';
+ checkNearbyDevicesPermission?: 'checking' | 'enabled' | 'requesting';
checkingLocationService?:
| 'checkingPermission'
| 'checkingStatus'
@@ -172,6 +204,7 @@ export interface Typegen0 {
| 'disabled'
| 'requestingToEnable';
connecting?: 'inProgress' | 'timeout';
+ recheckBluetoothState?: 'checking' | 'enabled';
reviewing?:
| 'accepted'
| 'cancelling'
diff --git a/machines/store.ts b/machines/store.ts
index 209f5a3bb..53b1276a8 100644
--- a/machines/store.ts
+++ b/machines/store.ts
@@ -6,6 +6,7 @@ import { EventFrom, Receiver, sendParent, send, sendUpdate } from 'xstate';
import { createModel } from 'xstate/lib/model';
import { generateSecureRandom } from 'react-native-securerandom';
import { log } from 'xstate/lib/actions';
+import { VC_ITEM_STORE_KEY } from '../shared/constants';
const ENCRYPTION_ID = 'c7c22a6c-9759-4605-ac88-46f4041d863d';
@@ -21,6 +22,7 @@ const model = createModel(
SET: (key: string, value: unknown) => ({ key, value }),
APPEND: (key: string, value: unknown) => ({ key, value }),
PREPEND: (key: string, value: unknown) => ({ key, value }),
+ UPDATE: (key: string, value: string) => ({ key, value }),
REMOVE: (key: string, value: string) => ({ key, value }),
REMOVE_VC_METADATA: (key: string, value: string) => ({ key, value }),
REMOVE_ITEMS: (key: string, values: string[]) => ({ key, values }),
@@ -117,6 +119,9 @@ export const storeMachine =
PREPEND: {
actions: 'forwardStoreRequest',
},
+ UPDATE: {
+ actions: 'forwardStoreRequest',
+ },
REMOVE: {
actions: 'forwardStoreRequest',
},
@@ -209,6 +214,16 @@ export const storeMachine =
response = event.value;
break;
}
+ case 'UPDATE': {
+ await updateItem(
+ event.key,
+ event.value,
+ context.encryptionKey
+ );
+
+ response = event.value;
+ break;
+ }
case 'REMOVE': {
await removeItem(
event.key,
@@ -353,7 +368,30 @@ export async function prependItem(
throw e;
}
}
+export async function updateItem(
+ key: string,
+ value: string,
+ encryptionKey: string
+) {
+ try {
+ const list = await getItem(key, [], encryptionKey);
+ const newList = [
+ value,
+ ...list.map((item) => {
+ const vc = item.split(':');
+ if (vc[3] !== value.split(':')[3]) {
+ vc[4] = 'false';
+ return vc.join(':');
+ }
+ }),
+ ].filter((value) => value != undefined && value !== null);
+ await setItem(key, newList, encryptionKey);
+ } catch (e) {
+ console.error('error prependItem:', e);
+ throw e;
+ }
+}
export async function removeItem(
key: string,
value: string,
diff --git a/machines/store.typegen.ts b/machines/store.typegen.ts
index 071572c73..248bd390e 100644
--- a/machines/store.typegen.ts
+++ b/machines/store.typegen.ts
@@ -118,3 +118,64 @@ export interface Typegen0 {
| 'resettingStorage';
'tags': never;
}
+
+// This file was automatically generated. Edits will be overwritten
+
+export interface Typegen0 {
+ '@@xstate/typegen': true;
+ 'internalEvents': {
+ 'done.invoke._store': {
+ type: 'done.invoke._store';
+ data: unknown;
+ __tip: 'See the XState TS docs to learn how to strongly type this.';
+ };
+ 'done.invoke.store.resettingStorage:invocation[0]': {
+ type: 'done.invoke.store.resettingStorage:invocation[0]';
+ data: unknown;
+ __tip: 'See the XState TS docs to learn how to strongly type this.';
+ };
+ 'error.platform._store': { type: 'error.platform._store'; data: unknown };
+ 'xstate.init': { type: 'xstate.init' };
+ };
+ 'invokeSrcNameMap': {
+ clear: 'done.invoke.store.resettingStorage:invocation[0]';
+ generateEncryptionKey: 'done.invoke.store.generatingEncryptionKey:invocation[0]';
+ getEncryptionKey: 'done.invoke.store.gettingEncryptionKey:invocation[0]';
+ store: 'done.invoke._store';
+ };
+ 'missingImplementations': {
+ actions: never;
+ delays: never;
+ guards: never;
+ services: never;
+ };
+ 'eventsCausingActions': {
+ forwardStoreRequest:
+ | 'APPEND'
+ | 'CLEAR'
+ | 'GET'
+ | 'PREPEND'
+ | 'REMOVE'
+ | 'REMOVE_ITEMS'
+ | 'SET'
+ | 'UPDATE';
+ notifyParent:
+ | 'KEY_RECEIVED'
+ | 'done.invoke.store.resettingStorage:invocation[0]';
+ setEncryptionKey: 'KEY_RECEIVED';
+ };
+ 'eventsCausingDelays': {};
+ 'eventsCausingGuards': {};
+ 'eventsCausingServices': {
+ clear: 'KEY_RECEIVED';
+ generateEncryptionKey: 'ERROR';
+ getEncryptionKey: 'xstate.init';
+ store: 'KEY_RECEIVED' | 'done.invoke.store.resettingStorage:invocation[0]';
+ };
+ 'matchesStates':
+ | 'generatingEncryptionKey'
+ | 'gettingEncryptionKey'
+ | 'ready'
+ | 'resettingStorage';
+ 'tags': never;
+}
diff --git a/machines/vc.ts b/machines/vc.ts
index 741b9f806..24ceade4e 100644
--- a/machines/vc.ts
+++ b/machines/vc.ts
@@ -27,8 +27,10 @@ const model = createModel(
STORE_ERROR: (error: Error) => ({ error }),
VC_ADDED: (vcKey: string) => ({ vcKey }),
REMOVE_VC_FROM_CONTEXT: (vcKey: string) => ({ vcKey }),
+ VC_UPDATED: (vcKey: string) => ({ vcKey }),
VC_RECEIVED: (vcKey: string) => ({ vcKey }),
VC_DOWNLOADED: (vc: VC) => ({ vc }),
+ VC_UPDATE: (vc: VC) => ({ vc }),
REFRESH_MY_VCS: () => ({}),
REFRESH_MY_VCS_TWO: (vc: VC) => ({ vc }),
REFRESH_RECEIVED_VCS: () => ({}),
@@ -54,6 +56,11 @@ export const vcMachine =
initial: 'init',
states: {
init: {
+ on: {
+ REFRESH_MY_VCS: {
+ target: '#vc.ready.myVcs.refreshing',
+ },
+ },
initial: 'myVcs',
states: {
myVcs: {
@@ -137,9 +144,15 @@ export const vcMachine =
REMOVE_VC_FROM_CONTEXT: {
actions: 'removeVcFromMyVcs',
},
+ VC_UPDATED: {
+ actions: ['updateMyVcs', 'setUpdateVc'],
+ },
VC_DOWNLOADED: {
actions: 'setDownloadedVc',
},
+ VC_UPDATE: {
+ actions: 'setVcUpdate',
+ },
VC_RECEIVED: [
{
actions: 'moveExistingVcToTop',
@@ -185,6 +198,17 @@ export const vcMachine =
context.vcs[VC_ITEM_STORE_KEY(event.vc)] = event.vc;
},
+ setVcUpdate: (context, event) => {
+ context.vcs[VC_ITEM_STORE_KEY(event.vc)] = event.vc;
+ },
+
+ setUpdateVc: send(
+ (_context, event) => {
+ return StoreEvents.UPDATE(MY_VCS_STORE_KEY, event.vcKey);
+ },
+ { to: (context) => context.serviceRefs.store }
+ ),
+
prependToMyVcs: model.assign({
myVcs: (context, event) => [event.vcKey, ...context.myVcs],
}),
@@ -194,6 +218,20 @@ export const vcMachine =
context.myVcs.filter((vc: string) => !vc.includes(event.vcKey)),
}),
+ updateMyVcs: model.assign({
+ myVcs: (context, event) =>
+ [
+ event.vcKey,
+ ...context.myVcs.map((value) => {
+ const vc = value.split(':');
+ if (vc[3] !== event.vcKey.split(':')[3]) {
+ vc[4] = 'false';
+ return vc.join(':');
+ }
+ }),
+ ].filter((value) => value != undefined),
+ }),
+
prependToReceivedVcs: model.assign({
receivedVcs: (context, event) => [
event.vcKey,
diff --git a/machines/vc.typegen.ts b/machines/vc.typegen.ts
index e69de29bb..a6a4ef9ee 100644
--- a/machines/vc.typegen.ts
+++ b/machines/vc.typegen.ts
@@ -0,0 +1,58 @@
+// This file was automatically generated. Edits will be overwritten
+
+export interface Typegen0 {
+ '@@xstate/typegen': true;
+ 'internalEvents': {
+ 'xstate.init': { type: 'xstate.init' };
+ };
+ 'invokeSrcNameMap': {};
+ 'missingImplementations': {
+ actions: never;
+ delays: never;
+ guards: never;
+ services: never;
+ };
+ 'eventsCausingActions': {
+ getReceivedVcsResponse: 'GET_RECEIVED_VCS';
+ getVcItemResponse: 'GET_VC_ITEM';
+ loadMyVcs: 'REFRESH_MY_VCS' | 'xstate.init';
+ loadReceivedVcs: 'REFRESH_RECEIVED_VCS' | 'STORE_RESPONSE';
+ moveExistingVcToTop: 'VC_RECEIVED';
+ prependToMyVcs: 'VC_ADDED';
+ prependToReceivedVcs: 'VC_RECEIVED';
+ removeVcFromMyVcs: 'REMOVE_VC_FROM_CONTEXT';
+ setDownloadedVc: 'VC_DOWNLOADED';
+ setMyVcs: 'STORE_RESPONSE';
+ setReceivedVcs: 'STORE_RESPONSE';
+ setUpdateVc: 'VC_UPDATED';
+ setVcUpdate: 'VC_UPDATE';
+ updateMyVcs: 'VC_UPDATED';
+ };
+ 'eventsCausingDelays': {};
+ 'eventsCausingGuards': {
+ hasExistingReceivedVc: 'VC_RECEIVED';
+ };
+ 'eventsCausingServices': {};
+ 'matchesStates':
+ | 'init'
+ | 'init.myVcs'
+ | 'init.receivedVcs'
+ | 'ready'
+ | 'ready.myVcs'
+ | 'ready.myVcs.idle'
+ | 'ready.myVcs.refreshing'
+ | 'ready.receivedVcs'
+ | 'ready.receivedVcs.idle'
+ | 'ready.receivedVcs.refreshing'
+ | {
+ init?: 'myVcs' | 'receivedVcs';
+ ready?:
+ | 'myVcs'
+ | 'receivedVcs'
+ | {
+ myVcs?: 'idle' | 'refreshing';
+ receivedVcs?: 'idle' | 'refreshing';
+ };
+ };
+ 'tags': never;
+}
diff --git a/machines/vcItem.ts b/machines/vcItem.ts
index a61ef432f..4c8416669 100644
--- a/machines/vcItem.ts
+++ b/machines/vcItem.ts
@@ -25,6 +25,7 @@ import {
import getAllConfigurations, {
DownloadProps,
} from '../shared/commonprops/commonProps';
+import { VcEvents } from './vc';
import i18n from '../i18n';
const model = createModel(
@@ -33,12 +34,15 @@ const model = createModel(
id: '',
idType: '' as VcIdType,
tag: '',
+ vcKey: '' as string,
+ myVcs: [] as string[],
generatedOn: null as Date,
credential: null as DecodedCredential,
verifiableCredential: null as VerifiableCredential,
storeVerifiableCredential: null as VerifiableCredential,
requestId: '',
isVerified: false,
+ isPinned: false,
lastVerifiedOn: null,
locked: false,
otp: '',
@@ -78,6 +82,10 @@ const model = createModel(
CANCEL: () => ({}),
CONFIRM: () => ({}),
STORE_ERROR: (error: Error) => ({ error }),
+ PIN_CARD: () => ({}),
+ KEBAB_POPUP: () => ({}),
+ SHOW_ACTIVITY: () => ({}),
+ REMOVE: (vcKey: string) => ({ vcKey }),
},
}
);
@@ -235,6 +243,172 @@ export const vcItemMachine =
ADD_WALLET_BINDING_ID: {
target: 'showBindingWarning',
},
+ PIN_CARD: {
+ target: 'pinCard',
+ actions: 'setPinCard',
+ },
+ KEBAB_POPUP: {
+ target: 'kebabPopUp',
+ },
+ DISMISS: {
+ target: 'checkingVc',
+ },
+ },
+ },
+ pinCard: {
+ entry: 'storeContext',
+ on: {
+ STORE_RESPONSE: {
+ actions: 'sendVcUpdated',
+ target: 'idle',
+ },
+ },
+ },
+ kebabPopUp: {
+ on: {
+ DISMISS: {
+ target: 'idle',
+ },
+ ADD_WALLET_BINDING_ID: {
+ target: '#vc-item.kebabPopUp.showBindingWarning',
+ },
+ PIN_CARD: {
+ target: '#vc-item.pinCard',
+ actions: 'setPinCard',
+ },
+ SHOW_ACTIVITY: {
+ target: '#vc-item.kebabPopUp.showActivities',
+ },
+ REMOVE: {
+ actions: 'setVcKey',
+ target: '#vc-item.kebabPopUp.removeWallet',
+ },
+ },
+ initial: 'idle',
+ states: {
+ idle: {},
+ showBindingWarning: {
+ on: {
+ CONFIRM: {
+ target: '#vc-item.kebabPopUp.requestingBindingOtp',
+ },
+ CANCEL: {
+ target: '#vc-item.kebabPopUp',
+ },
+ },
+ },
+ requestingBindingOtp: {
+ invoke: {
+ src: 'requestBindingOtp',
+ onDone: [
+ {
+ target: '#vc-item.kebabPopUp.acceptingBindingOtp',
+ },
+ ],
+ onError: [
+ {
+ actions: 'setWalletBindingError',
+ target: '#vc-item.kebabPopUp.showingWalletBindingError',
+ },
+ ],
+ },
+ },
+ showingWalletBindingError: {
+ on: {
+ CANCEL: {
+ target: '#vc-item.kebabPopUp',
+ actions: 'setWalletBindingErrorEmpty',
+ },
+ },
+ },
+ acceptingBindingOtp: {
+ entry: ['clearOtp'],
+ on: {
+ INPUT_OTP: {
+ target: '#vc-item.kebabPopUp.addKeyPair',
+ actions: ['setOtp'],
+ },
+ DISMISS: {
+ target: '#vc-item.kebabPopUp',
+ actions: ['clearOtp', 'clearTransactionId'],
+ },
+ },
+ },
+ addKeyPair: {
+ invoke: {
+ src: 'generateKeyPair',
+ onDone: {
+ target: '#vc-item.kebabPopUp.addingWalletBindingId',
+ actions: ['setPublicKey', 'setPrivateKey'],
+ },
+ onError: [
+ {
+ actions: 'setWalletBindingError',
+ target: '#vc-item.kebabPopUp.showingWalletBindingError',
+ },
+ ],
+ },
+ },
+ addingWalletBindingId: {
+ invoke: {
+ src: 'addWalletBindnigId',
+ onDone: [
+ {
+ target: '#vc-item.kebabPopUp.updatingPrivateKey',
+ actions: ['setWalletBindingId'],
+ },
+ ],
+ onError: [
+ {
+ actions: 'setWalletBindingError',
+ target: '#vc-item.kebabPopUp.showingWalletBindingError',
+ },
+ ],
+ },
+ },
+ updatingPrivateKey: {
+ invoke: {
+ src: 'updatePrivateKey',
+ onDone: {
+ actions: [
+ 'storeContext',
+ 'updatePrivateKey',
+ 'updateVc',
+ 'setWalletBindingErrorEmpty',
+ 'logWalletBindingSuccess',
+ ],
+ target: '#vc-item.kebabPopUp',
+ },
+ onError: {
+ actions: 'setWalletBindingError',
+ target: '#vc-item.kebabPopUp.showingWalletBindingError',
+ },
+ },
+ },
+ showActivities: {
+ on: {
+ DISMISS: '#vc-item.kebabPopUp',
+ },
+ },
+ removeWallet: {
+ on: {
+ CONFIRM: {
+ target: 'removingVc',
+ },
+ CANCEL: {
+ target: 'idle',
+ },
+ },
+ },
+ removingVc: {
+ entry: 'removeVcItem',
+ on: {
+ STORE_RESPONSE: {
+ actions: ['removedVc', log('removing Vc')],
+ target: '#vc-item',
+ },
+ },
+ },
},
},
editingTag: {
@@ -504,7 +678,6 @@ export const vcItemMachine =
invoke: {
src: 'updatePrivateKey',
onDone: {
- target: 'idle',
actions: [
'storeContext',
'updatePrivateKey',
@@ -512,6 +685,7 @@ export const vcItemMachine =
'setWalletBindingErrorEmpty',
'logWalletBindingSuccess',
],
+ target: 'idle',
},
onError: {
actions: ['setWalletBindingError', 'logWalletBindingFailure'],
@@ -602,6 +776,21 @@ export const vcItemMachine =
event.data as WalletBindingResponse,
}),
+ setPinCard: assign((context) => {
+ return {
+ ...context,
+ isPinned: !context.isPinned,
+ };
+ }),
+
+ sendVcUpdated: send(
+ (_context, event) =>
+ VcEvents.VC_UPDATED(VC_ITEM_STORE_KEY(event.response) as string),
+ {
+ to: (context) => context.serviceRefs.vc,
+ }
+ ),
+
updateVc: send(
(context) => {
const { serviceRefs, ...vc } = context;
@@ -627,6 +816,15 @@ export const vcItemMachine =
}
),
+ removedVc: send(
+ () => ({
+ type: 'REFRESH_MY_VCS',
+ }),
+ {
+ to: (context) => context.serviceRefs.vc,
+ }
+ ),
+
requestVcContext: send(
(context) => ({
type: 'GET_VC_ITEM',
@@ -779,6 +977,10 @@ export const vcItemMachine =
otp: (_, event) => event.otp,
}),
+ setVcKey: model.assign({
+ vcKey: (_, event) => event.vcKey,
+ }),
+
setOtpError: assign({
otpError: (_context, event) =>
(event as ErrorPlatformEvent).data.message,
@@ -801,6 +1003,17 @@ export const vcItemMachine =
},
{ to: (context) => context.serviceRefs.store }
),
+
+ loadMyVcs: send(StoreEvents.GET(MY_VCS_STORE_KEY), {
+ to: (context) => context.serviceRefs.store,
+ }),
+
+ removeVcItem: send(
+ (_context, event) => {
+ return StoreEvents.REMOVE(MY_VCS_STORE_KEY, _context.vcKey);
+ },
+ { to: (context) => context.serviceRefs.store }
+ ),
},
services: {
@@ -833,7 +1046,7 @@ export const vcItemMachine =
authFactorType: 'WLA',
format: 'jwt',
individualId: context.id,
- transactionId: context.bindingTransactionId,
+ transactionId: context.transactionId,
publicKey: context.publicKey,
challengeList: [
{
@@ -946,9 +1159,11 @@ export const vcItemMachine =
tag: '',
requestId: context.requestId,
isVerified: false,
+ isPinned: context.isPinned,
lastVerifiedOn: null,
locked: context.locked,
walletBindingResponse: null,
+ credentialRegistry: '',
})
);
}
@@ -1099,6 +1314,9 @@ export function selectIsOtpError(state: State) {
export function selectOtpError(state: State) {
return state.context.otpError;
}
+export function selectIsPinned(state: State) {
+ return state.context.isPinned;
+}
export function selectIsLockingVc(state: State) {
return state.matches('lockingVc');
@@ -1120,25 +1338,21 @@ export function selectIsAcceptingRevokeInput(state: State) {
return state.matches('acceptingRevokeInput');
}
-export function selectIsRequestBindingOtp(state: State) {
- return state.matches('requestingBindingOtp');
-}
-
-export function selectWalletBindingId(state: State) {
- return state.context.walletBindingResponse;
-}
-
export function selectEmptyWalletBindingId(state: State) {
var val = state.context.walletBindingResponse
? state.context.walletBindingResponse.walletBindingId
: undefined;
- return val === undefined || val == null || val.length <= 0 ? true : false;
+ return val == undefined || val == null || val.length <= 0 ? true : false;
}
export function selectWalletBindingError(state: State) {
return state.context.walletBindingError;
}
+export function selectRequestBindingOtp(state: State) {
+ return state.matches('requestingBindingOtp');
+}
+
export function selectAcceptingBindingOtp(state: State) {
return state.matches('acceptingBindingOtp');
}
@@ -1147,7 +1361,7 @@ export function selectShowWalletBindingError(state: State) {
return state.matches('showingWalletBindingError');
}
-export function isWalletBindingInProgress(state: State) {
+export function selectWalletBindingInProgress(state: State) {
return state.matches('requestingBindingOtp') ||
state.matches('addingWalletBindingId') ||
state.matches('addKeyPair') ||
@@ -1156,9 +1370,45 @@ export function isWalletBindingInProgress(state: State) {
: false;
}
-export function isShowingBindingWarning(state: State) {
+export function selectBindingWarning(state: State) {
return state.matches('showBindingWarning');
}
+export function selectKebabPopUp(state: State) {
+ return state.matches('kebabPopUp');
+}
+
+export function selectKebabPopUpRequestBindingOtp(state: State) {
+ return state.matches('kebabPopUp.requestingBindingOtp');
+}
+
+export function selectKebabPopUpAcceptingBindingOtp(state: State) {
+ return state.matches('kebabPopUp.acceptingBindingOtp');
+}
+
+export function selectKebabPopUpShowWalletBindingError(state: State) {
+ return state.matches('kebabPopUp.showingWalletBindingError');
+}
+
+export function selectKebabPopUpWalletBindingInProgress(state: State) {
+ return state.matches('kebabPopUp.requestingBindingOtp') ||
+ state.matches('kebabPopUp.addingWalletBindingId') ||
+ state.matches('kebabPopUp.addKeyPair') ||
+ state.matches('kebabPopUp.updatingPrivateKey')
+ ? true
+ : false;
+}
+
+export function selectKebabPopUpBindingWarning(state: State) {
+ return state.matches('kebabPopUp.showBindingWarning');
+}
+
+export function selectRemoveWalletWarning(state: State) {
+ return state.matches('kebabPopUp.removeWallet');
+}
+
+export function selectShowActivities(state: State) {
+ return state.matches('kebabPopUp.showActivities');
+}
export function selectStoreError(state: State) {
return state.context.storeError;
diff --git a/machines/vcItem.typegen.ts b/machines/vcItem.typegen.ts
index 23f9867e8..4b2f47891 100644
--- a/machines/vcItem.typegen.ts
+++ b/machines/vcItem.typegen.ts
@@ -29,6 +29,26 @@ export interface Typegen0 {
data: unknown;
__tip: 'See the XState TS docs to learn how to strongly type this.';
};
+ 'done.invoke.vc-item.kebabPopUp.addKeyPair:invocation[0]': {
+ type: 'done.invoke.vc-item.kebabPopUp.addKeyPair:invocation[0]';
+ data: unknown;
+ __tip: 'See the XState TS docs to learn how to strongly type this.';
+ };
+ 'done.invoke.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]': {
+ type: 'done.invoke.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]';
+ data: unknown;
+ __tip: 'See the XState TS docs to learn how to strongly type this.';
+ };
+ 'done.invoke.vc-item.kebabPopUp.requestingBindingOtp:invocation[0]': {
+ type: 'done.invoke.vc-item.kebabPopUp.requestingBindingOtp:invocation[0]';
+ data: unknown;
+ __tip: 'See the XState TS docs to learn how to strongly type this.';
+ };
+ 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]': {
+ type: 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]';
+ data: unknown;
+ __tip: 'See the XState TS docs to learn how to strongly type this.';
+ };
'done.invoke.vc-item.requestingBindingOtp:invocation[0]': {
type: 'done.invoke.vc-item.requestingBindingOtp:invocation[0]';
data: unknown;
@@ -79,6 +99,22 @@ export interface Typegen0 {
type: 'error.platform.vc-item.checkingServerData.verifyingDownloadLimitExpiry:invocation[0]';
data: unknown;
};
+ 'error.platform.vc-item.kebabPopUp.addKeyPair:invocation[0]': {
+ type: 'error.platform.vc-item.kebabPopUp.addKeyPair:invocation[0]';
+ data: unknown;
+ };
+ 'error.platform.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]': {
+ type: 'error.platform.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]';
+ data: unknown;
+ };
+ 'error.platform.vc-item.kebabPopUp.requestingBindingOtp:invocation[0]': {
+ type: 'error.platform.vc-item.kebabPopUp.requestingBindingOtp:invocation[0]';
+ data: unknown;
+ };
+ 'error.platform.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]': {
+ type: 'error.platform.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]';
+ data: unknown;
+ };
'error.platform.vc-item.requestingBindingOtp:invocation[0]': {
type: 'error.platform.vc-item.requestingBindingOtp:invocation[0]';
data: unknown;
@@ -102,16 +138,24 @@ export interface Typegen0 {
'xstate.init': { type: 'xstate.init' };
};
'invokeSrcNameMap': {
- addWalletBindnigId: 'done.invoke.vc-item.addingWalletBindingId:invocation[0]';
+ addWalletBindnigId:
+ | 'done.invoke.vc-item.addingWalletBindingId:invocation[0]'
+ | 'done.invoke.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]';
checkDownloadExpiryLimit: 'done.invoke.vc-item.checkingServerData.verifyingDownloadLimitExpiry:invocation[0]';
checkStatus: 'done.invoke.checkStatus';
downloadCredential: 'done.invoke.downloadCredential';
- generateKeyPair: 'done.invoke.vc-item.addKeyPair:invocation[0]';
- requestBindingOtp: 'done.invoke.vc-item.requestingBindingOtp:invocation[0]';
+ generateKeyPair:
+ | 'done.invoke.vc-item.addKeyPair:invocation[0]'
+ | 'done.invoke.vc-item.kebabPopUp.addKeyPair:invocation[0]';
+ requestBindingOtp:
+ | 'done.invoke.vc-item.kebabPopUp.requestingBindingOtp:invocation[0]'
+ | 'done.invoke.vc-item.requestingBindingOtp:invocation[0]';
requestLock: 'done.invoke.vc-item.requestingLock:invocation[0]';
requestOtp: 'done.invoke.vc-item.requestingOtp:invocation[0]';
requestRevoke: 'done.invoke.vc-item.requestingRevoke:invocation[0]';
- updatePrivateKey: 'done.invoke.vc-item.updatingPrivateKey:invocation[0]';
+ updatePrivateKey:
+ | 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]'
+ | 'done.invoke.vc-item.updatingPrivateKey:invocation[0]';
verifyCredential: 'done.invoke.vc-item.verifyingCredential:invocation[0]';
};
'missingImplementations': {
@@ -127,6 +171,7 @@ export interface Typegen0 {
| 'DISMISS'
| 'REVOKE_VC'
| 'STORE_RESPONSE'
+ | 'done.invoke.vc-item.kebabPopUp.requestingBindingOtp:invocation[0]'
| 'done.invoke.vc-item.requestingBindingOtp:invocation[0]'
| 'done.invoke.vc-item.requestingOtp:invocation[0]'
| 'done.invoke.vc-item.updatingPrivateKey:invocation[0]'
@@ -150,13 +195,18 @@ export interface Typegen0 {
| 'error.platform.vc-item.addingWalletBindingId:invocation[0]'
| 'error.platform.vc-item.requestingBindingOtp:invocation[0]'
| 'error.platform.vc-item.updatingPrivateKey:invocation[0]';
- logWalletBindingSuccess: 'done.invoke.vc-item.updatingPrivateKey:invocation[0]';
+ logWalletBindingSuccess:
+ | 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]'
+ | 'done.invoke.vc-item.updatingPrivateKey:invocation[0]';
markVcValid: 'done.invoke.vc-item.verifyingCredential:invocation[0]';
+ removeVcItem: 'CONFIRM';
removeVcMetaDataFromStorage: 'STORE_ERROR';
removeVcMetaDataFromVcMachine: 'DISMISS';
+ removedVc: 'STORE_RESPONSE';
requestStoredContext: 'GET_VC_RESPONSE' | 'REFRESH';
- requestVcContext: 'xstate.init';
+ requestVcContext: 'DISMISS' | 'xstate.init';
revokeVID: 'done.invoke.vc-item.requestingRevoke:invocation[0]';
+ sendVcUpdated: 'STORE_RESPONSE';
setCredential: 'GET_VC_RESPONSE' | 'STORE_RESPONSE';
setDownloadInterval: 'done.invoke.vc-item.checkingServerData.verifyingDownloadLimitExpiry:invocation[0]';
setLock: 'done.invoke.vc-item.requestingLock:invocation[0]';
@@ -165,8 +215,13 @@ export interface Typegen0 {
setOtpError:
| 'error.platform.vc-item.requestingLock:invocation[0]'
| 'error.platform.vc-item.requestingRevoke:invocation[0]';
- setPrivateKey: 'done.invoke.vc-item.addKeyPair:invocation[0]';
- setPublicKey: 'done.invoke.vc-item.addKeyPair:invocation[0]';
+ setPinCard: 'PIN_CARD';
+ setPrivateKey:
+ | 'done.invoke.vc-item.addKeyPair:invocation[0]'
+ | 'done.invoke.vc-item.kebabPopUp.addKeyPair:invocation[0]';
+ setPublicKey:
+ | 'done.invoke.vc-item.addKeyPair:invocation[0]'
+ | 'done.invoke.vc-item.kebabPopUp.addKeyPair:invocation[0]';
setRevoke: 'done.invoke.vc-item.requestingRevoke:invocation[0]';
setStoreError: 'STORE_ERROR';
setStoreVerifiableCredential: 'CREDENTIAL_DOWNLOADED';
@@ -178,25 +233,38 @@ export interface Typegen0 {
| 'done.invoke.vc-item.requestingOtp:invocation[0]'
| 'error.platform.vc-item.requestingLock:invocation[0]'
| 'error.platform.vc-item.requestingRevoke:invocation[0]';
+ setVcKey: 'REMOVE';
setVerifiableCredential: 'STORE_RESPONSE';
setWalletBindingError:
| 'error.platform.vc-item.addKeyPair:invocation[0]'
| 'error.platform.vc-item.addingWalletBindingId:invocation[0]'
+ | 'error.platform.vc-item.kebabPopUp.addKeyPair:invocation[0]'
+ | 'error.platform.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]'
+ | 'error.platform.vc-item.kebabPopUp.requestingBindingOtp:invocation[0]'
+ | 'error.platform.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]'
| 'error.platform.vc-item.requestingBindingOtp:invocation[0]'
| 'error.platform.vc-item.updatingPrivateKey:invocation[0]';
setWalletBindingErrorEmpty:
| 'CANCEL'
+ | 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]'
| 'done.invoke.vc-item.updatingPrivateKey:invocation[0]';
- setWalletBindingId: 'done.invoke.vc-item.addingWalletBindingId:invocation[0]';
+ setWalletBindingId:
+ | 'done.invoke.vc-item.addingWalletBindingId:invocation[0]'
+ | 'done.invoke.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]';
storeContext:
| 'CREDENTIAL_DOWNLOADED'
+ | 'PIN_CARD'
+ | 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]'
| 'done.invoke.vc-item.updatingPrivateKey:invocation[0]'
| 'done.invoke.vc-item.verifyingCredential:invocation[0]';
storeLock: 'done.invoke.vc-item.requestingLock:invocation[0]';
storeTag: 'SAVE_TAG';
- updatePrivateKey: 'done.invoke.vc-item.updatingPrivateKey:invocation[0]';
+ updatePrivateKey:
+ | 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]'
+ | 'done.invoke.vc-item.updatingPrivateKey:invocation[0]';
updateVc:
| 'STORE_RESPONSE'
+ | 'done.invoke.vc-item.kebabPopUp.updatingPrivateKey:invocation[0]'
| 'done.invoke.vc-item.updatingPrivateKey:invocation[0]'
| 'done.invoke.vc-item.verifyingCredential:invocation[0]';
};
@@ -207,7 +275,9 @@ export interface Typegen0 {
isVcValid: '';
};
'eventsCausingServices': {
- addWalletBindnigId: 'done.invoke.vc-item.addKeyPair:invocation[0]';
+ addWalletBindnigId:
+ | 'done.invoke.vc-item.addKeyPair:invocation[0]'
+ | 'done.invoke.vc-item.kebabPopUp.addKeyPair:invocation[0]';
checkDownloadExpiryLimit: 'STORE_RESPONSE';
checkStatus:
| 'done.invoke.vc-item.checkingServerData.verifyingDownloadLimitExpiry:invocation[0]'
@@ -218,7 +288,9 @@ export interface Typegen0 {
requestLock: 'INPUT_OTP';
requestOtp: 'LOCK_VC';
requestRevoke: 'INPUT_OTP';
- updatePrivateKey: 'done.invoke.vc-item.addingWalletBindingId:invocation[0]';
+ updatePrivateKey:
+ | 'done.invoke.vc-item.addingWalletBindingId:invocation[0]'
+ | 'done.invoke.vc-item.kebabPopUp.addingWalletBindingId:invocation[0]';
verifyCredential: '' | 'VERIFY';
};
'matchesStates':
@@ -242,8 +314,21 @@ export interface Typegen0 {
| 'invalid'
| 'invalid.backend'
| 'invalid.otp'
+ | 'kebabPopUp'
+ | 'kebabPopUp.acceptingBindingOtp'
+ | 'kebabPopUp.addKeyPair'
+ | 'kebabPopUp.addingWalletBindingId'
+ | 'kebabPopUp.idle'
+ | 'kebabPopUp.removeWallet'
+ | 'kebabPopUp.removingVc'
+ | 'kebabPopUp.requestingBindingOtp'
+ | 'kebabPopUp.showActivities'
+ | 'kebabPopUp.showBindingWarning'
+ | 'kebabPopUp.showingWalletBindingError'
+ | 'kebabPopUp.updatingPrivateKey'
| 'lockingVc'
| 'loggingRevoke'
+ | 'pinCard'
| 'requestingBindingOtp'
| 'requestingLock'
| 'requestingOtp'
@@ -262,6 +347,18 @@ export interface Typegen0 {
| 'verifyingDownloadLimitExpiry'
| { savingFailed?: 'idle' | 'viewingVc' };
invalid?: 'backend' | 'otp';
+ kebabPopUp?:
+ | 'acceptingBindingOtp'
+ | 'addKeyPair'
+ | 'addingWalletBindingId'
+ | 'idle'
+ | 'removeWallet'
+ | 'removingVc'
+ | 'requestingBindingOtp'
+ | 'showActivities'
+ | 'showBindingWarning'
+ | 'showingWalletBindingError'
+ | 'updatingPrivateKey';
};
'tags': never;
}
diff --git a/package-lock.json b/package-lock.json
index a59bd0019..158bc0cd1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,6 +14,7 @@
"@digitalbazaar/rsa-signature-2018": "digitalbazaar/rsa-signature-2018#initial",
"@digitalbazaar/rsa-verification-key-2018": "digitalbazaar/rsa-verification-key-2018#initial",
"@digitalcredentials/vc": "^1.1.2",
+ "@expo-google-fonts/inter": "^0.2.3",
"@expo-google-fonts/poppins": "^0.2.0",
"@expo/metro-config": "^0.3.12",
"@idpass/smartshare-react-native": "0.2.3-beta.2",
@@ -47,15 +48,18 @@
"react": "17.0.1",
"react-i18next": "^11.16.6",
"react-native": "0.64.4",
+ "react-native-animated-pagination-dot": "^0.4.0",
"react-native-app-intro-slider": "^4.0.4",
"react-native-biometrics-changed": "^1.1.8",
"react-native-bluetooth-state-manager": "^1.3.2",
+ "react-native-cli": "^2.0.1",
"react-native-device-info": "^8.4.8",
"react-native-dotenv": "^3.3.1",
"react-native-elements": "3.4.2",
"react-native-fs": "^2.20.0",
"react-native-gesture-handler": "~2.1.0",
"react-native-keychain": "^8.0.0",
+ "react-native-linear-gradient": "^2.6.2",
"react-native-location-enabler": "^4.1.0",
"react-native-mmkv-storage": "0.8.0",
"react-native-permissions": "^3.6.0",
@@ -94,6 +98,14 @@
"typescript": "~4.3.5"
}
},
+ ".yalc/react-native-tuvali": {
+ "version": "0.4.1",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/@ampproject/remapping": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
@@ -2145,6 +2157,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@expo-google-fonts/inter": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@expo-google-fonts/inter/-/inter-0.2.3.tgz",
+ "integrity": "sha512-iHK9FI+dnE45X5c2Z5hSFwNH4zUWethizpbv3XUn0FIGw5jwvzriENz0a6wCdkI4/d+1QkurnHo5XHti7TbNJA=="
+ },
"node_modules/@expo-google-fonts/poppins": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@expo-google-fonts/poppins/-/poppins-0.2.2.tgz",
@@ -5465,6 +5482,11 @@
"@types/istanbul-lib-report": "*"
}
},
+ "node_modules/@types/js-cookie": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
+ "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
+ },
"node_modules/@types/json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
@@ -6047,6 +6069,11 @@
"node": ">=10.0.0"
}
},
+ "node_modules/@xobotyi/scrollbar-width": {
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
+ "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
+ },
"node_modules/@xstate/react": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@xstate/react/-/react-3.0.1.tgz",
@@ -8657,6 +8684,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/copy-to-clipboard": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+ "dependencies": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
"node_modules/copy-webpack-plugin": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.4.tgz",
@@ -9044,6 +9079,14 @@
"node": ">4"
}
},
+ "node_modules/css-in-js-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz",
+ "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==",
+ "dependencies": {
+ "hyphenate-style-name": "^1.0.3"
+ }
+ },
"node_modules/css-loader": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
@@ -9300,6 +9343,14 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
"integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
},
+ "node_modules/cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/cyclist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
@@ -9418,7 +9469,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
"integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
- "dev": true,
"dependencies": {
"is-arguments": "^1.0.4",
"is-date-object": "^1.0.1",
@@ -12799,6 +12849,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==",
+ "engines": {
+ "node": "> 0.1.90"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -12842,11 +12900,26 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "node_modules/fast-loops": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz",
+ "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g=="
+ },
+ "node_modules/fast-shallow-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
+ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
+ },
"node_modules/fast-text-encoding": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
"integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
},
+ "node_modules/fastest-stable-stringify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
+ "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
+ },
"node_modules/fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -13487,7 +13560,6 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz",
"integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -13782,6 +13854,25 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/has-bigints": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
@@ -13825,7 +13916,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
"dependencies": {
"has-symbols": "^1.0.2"
},
@@ -14522,6 +14612,19 @@
"url": "https://github.com/sponsors/typicode"
}
},
+ "node_modules/hyphenate-style-name": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
+ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
+ },
+ "node_modules/i": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz",
+ "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
"node_modules/i18next": {
"version": "21.6.16",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz",
@@ -14713,6 +14816,15 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
+ "node_modules/inline-style-prefixer": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz",
+ "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==",
+ "dependencies": {
+ "css-in-js-utils": "^3.1.0",
+ "fast-loops": "^1.1.3"
+ }
+ },
"node_modules/internal-ip": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
@@ -14803,7 +14915,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
"integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
@@ -14929,7 +15040,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
"integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
"dependencies": {
"has-tostringtag": "^1.0.0"
},
@@ -15342,7 +15452,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
@@ -15549,6 +15658,11 @@
"react-native": "*"
}
},
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+ },
"node_modules/iterall": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz",
@@ -15834,6 +15948,11 @@
"integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==",
"dev": true
},
+ "node_modules/js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -17821,6 +17940,11 @@
"integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==",
"dev": true
},
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+ },
"node_modules/mv": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
@@ -17892,6 +18016,25 @@
"dev": true,
"optional": true
},
+ "node_modules/nano-css": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz",
+ "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==",
+ "dependencies": {
+ "css-tree": "^1.1.2",
+ "csstype": "^3.0.6",
+ "fastest-stable-stringify": "^2.0.2",
+ "inline-style-prefixer": "^6.0.0",
+ "rtl-css-js": "^1.14.0",
+ "sourcemap-codec": "^1.4.8",
+ "stacktrace-js": "^2.0.2",
+ "stylis": "^4.0.6"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
@@ -18317,7 +18460,6 @@
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
"integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
@@ -19670,6 +19812,14 @@
"node": ">=6"
}
},
+ "node_modules/pkginfo": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
+ "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
"node_modules/plist": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz",
@@ -20550,6 +20700,21 @@
"integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
"dev": true
},
+ "node_modules/prompt": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz",
+ "integrity": "sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA==",
+ "dependencies": {
+ "pkginfo": "0.x.x",
+ "read": "1.0.x",
+ "revalidator": "0.1.x",
+ "utile": "0.2.x",
+ "winston": "0.8.x"
+ },
+ "engines": {
+ "node": ">= 0.6.6"
+ }
+ },
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -21263,6 +21428,18 @@
"react": "17.0.1"
}
},
+ "node_modules/react-native-animated-pagination-dot": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/react-native-animated-pagination-dot/-/react-native-animated-pagination-dot-0.4.0.tgz",
+ "integrity": "sha512-MiIPB6qe8lc6a+nhzvQHOi5x/bZlZ8hBH4HWiorPps3gTJZgxfX3abuYvVjN94egA8Z3HlE9pptz8OQfdL5IzQ==",
+ "dependencies": {
+ "react-use": "^17.3.1"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native-app-intro-slider": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/react-native-app-intro-slider/-/react-native-app-intro-slider-4.0.4.tgz",
@@ -21287,6 +21464,89 @@
"react-native": ">= 0.44"
}
},
+ "node_modules/react-native-cli": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/react-native-cli/-/react-native-cli-2.0.1.tgz",
+ "integrity": "sha512-QgkB1urUhGe9q1vcqQLIfNdCd/Qf3MdNQe19QO6lVjhIVKljlVMKtaK8RaZ8PCNB/cdXlO/G3tKUGk+ghMXE6w==",
+ "dependencies": {
+ "chalk": "^1.1.1",
+ "minimist": "^1.2.0",
+ "prompt": "^0.2.14",
+ "semver": "^5.0.3"
+ },
+ "bin": {
+ "react-native": "index.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/react-native-cli/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-native-cli/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-native-cli/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-native-cli/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/react-native-cli/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/react-native-cli/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-native-cli/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/react-native-codegen": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.6.tgz",
@@ -21376,6 +21636,15 @@
"resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-8.0.0.tgz",
"integrity": "sha512-c7Cs+YQN26UaQsRG1dmlXL7VL2ctnXwH/dl0IOMEQ7ZaL2NdN313YSAI8ZEZZjrVhNmPsyWEuvTFqWrdpItqQg=="
},
+ "node_modules/react-native-linear-gradient": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.6.2.tgz",
+ "integrity": "sha512-Z8Xxvupsex+9BBFoSYS87bilNPWcRfRsGC0cpJk72Nxb5p2nEkGSBv73xZbEHnW2mUFvP+huYxrVvjZkr/gRjQ==",
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native-location-enabler": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/react-native-location-enabler/-/react-native-location-enabler-4.1.1.tgz",
@@ -21537,13 +21806,8 @@
"integrity": "sha512-Ns7Bn9H/Tyw278+5SQx9oAblDZ7JixyzeOczcBK8dipQk2pD7Djkcfnf1nB/8RErAmMLL9iXgW0QHqiII8AhKw=="
},
"node_modules/react-native-tuvali": {
- "version": "0.4.1",
- "resolved": "git+ssh://git@github.com/mosip/tuvali.git#e1e466204a08a841053a28f32ca32e7613b8d084",
- "license": "MIT",
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- }
+ "resolved": ".yalc/react-native-tuvali",
+ "link": true
},
"node_modules/react-native-uuid": {
"version": "2.0.1",
@@ -21645,6 +21909,56 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-universal-interface": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
+ "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==",
+ "peerDependencies": {
+ "react": "*",
+ "tslib": "*"
+ }
+ },
+ "node_modules/react-use": {
+ "version": "17.4.0",
+ "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz",
+ "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==",
+ "dependencies": {
+ "@types/js-cookie": "^2.2.6",
+ "@xobotyi/scrollbar-width": "^1.9.5",
+ "copy-to-clipboard": "^3.3.1",
+ "fast-deep-equal": "^3.1.3",
+ "fast-shallow-equal": "^1.0.0",
+ "js-cookie": "^2.2.1",
+ "nano-css": "^5.3.1",
+ "react-universal-interface": "^0.6.2",
+ "resize-observer-polyfill": "^1.5.1",
+ "screenfull": "^5.1.0",
+ "set-harmonic-interval": "^1.0.1",
+ "throttle-debounce": "^3.0.1",
+ "ts-easing": "^0.2.0",
+ "tslib": "^2.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react-use/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ },
+ "node_modules/read": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+ "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
+ "dependencies": {
+ "mute-stream": "~0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/read-chunk": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz",
@@ -21806,7 +22120,6 @@
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
"integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
@@ -22140,6 +22453,11 @@
"resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.5.tgz",
"integrity": "sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ=="
},
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
"node_modules/resolve": {
"version": "1.22.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
@@ -22245,6 +22563,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/revalidator": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
+ "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
"node_modules/rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
@@ -22325,6 +22651,14 @@
"node": "6.* || >= 7.*"
}
},
+ "node_modules/rtl-css-js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz",
+ "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==",
+ "dependencies": {
+ "@babel/runtime": "^7.1.2"
+ }
+ },
"node_modules/rtl-detect": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz",
@@ -22719,6 +23053,17 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/screenfull": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
+ "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/security-context": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/security-context/-/security-context-4.0.0.tgz",
@@ -23037,6 +23382,14 @@
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
+ "node_modules/set-harmonic-interval": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
+ "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==",
+ "engines": {
+ "node": ">=6.9"
+ }
+ },
"node_modules/set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -23557,6 +23910,12 @@
"integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
"deprecated": "See https://github.com/lydell/source-map-url#deprecated"
},
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead"
+ },
"node_modules/spdy": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
@@ -23656,10 +24015,53 @@
"deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
"dev": true
},
+ "node_modules/stack-generator": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
+ "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/stackframe": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz",
- "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg=="
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
+ },
+ "node_modules/stacktrace-gps": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
+ "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
+ "dependencies": {
+ "source-map": "0.5.6",
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/stacktrace-gps/node_modules/source-map": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stacktrace-js": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
+ "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
+ "dependencies": {
+ "error-stack-parser": "^2.0.6",
+ "stack-generator": "^2.0.5",
+ "stacktrace-gps": "^3.0.4"
+ }
},
"node_modules/stacktrace-parser": {
"version": "0.1.10",
@@ -24057,6 +24459,11 @@
"node": ">=8"
}
},
+ "node_modules/stylis": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
+ "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="
+ },
"node_modules/subscriptions-transport-ws": {
"version": "0.9.8",
"resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.8.tgz",
@@ -24630,6 +25037,14 @@
"resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
"integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="
},
+ "node_modules/throttle-debounce": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
+ "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -24755,6 +25170,11 @@
"node": ">=8.0"
}
},
+ "node_modules/toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ },
"node_modules/toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
@@ -24784,6 +25204,11 @@
"tree-kill": "cli.js"
}
},
+ "node_modules/ts-easing": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
+ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
+ },
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
@@ -24815,8 +25240,7 @@
"node_modules/tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/tsutils": {
"version": "3.21.0",
@@ -25364,6 +25788,76 @@
"integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
"dev": true
},
+ "node_modules/utile": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz",
+ "integrity": "sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg==",
+ "dependencies": {
+ "async": "~0.2.9",
+ "deep-equal": "*",
+ "i": "0.3.x",
+ "mkdirp": "0.x.x",
+ "ncp": "0.4.x",
+ "rimraf": "2.x.x"
+ },
+ "engines": {
+ "node": ">= 0.6.4"
+ }
+ },
+ "node_modules/utile/node_modules/async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ=="
+ },
+ "node_modules/utile/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/utile/node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/utile/node_modules/ncp": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz",
+ "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA==",
+ "bin": {
+ "ncp": "bin/ncp"
+ }
+ },
+ "node_modules/utile/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -25477,6 +25971,274 @@
"node": "<8.10.0"
}
},
+ "node_modules/watchpack/chokidar2/node_modules/chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ },
+ "optionalDependencies": {
+ "fsevents": "^1.2.7"
+ }
+ },
+ "node_modules/watchpack/node_modules/anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "node_modules/watchpack/node_modules/anymatch/node_modules/normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "remove-trailing-separator": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/braces/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/fill-range/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/glob-parent/node_modules/is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-extglob": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "binary-extensions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/watchpack/node_modules/to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wbuf": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
@@ -27102,6 +27864,44 @@
"node": ">=8"
}
},
+ "node_modules/winston": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz",
+ "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==",
+ "dependencies": {
+ "async": "0.2.x",
+ "colors": "0.6.x",
+ "cycle": "1.0.x",
+ "eyes": "0.1.x",
+ "isstream": "0.1.x",
+ "pkginfo": "0.3.x",
+ "stack-trace": "0.0.x"
+ },
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/winston/node_modules/async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ=="
+ },
+ "node_modules/winston/node_modules/colors": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+ "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/winston/node_modules/pkginfo": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
+ "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
"node_modules/with-open-file": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz",
@@ -29200,6 +30000,11 @@
}
}
},
+ "@expo-google-fonts/inter": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@expo-google-fonts/inter/-/inter-0.2.3.tgz",
+ "integrity": "sha512-iHK9FI+dnE45X5c2Z5hSFwNH4zUWethizpbv3XUn0FIGw5jwvzriENz0a6wCdkI4/d+1QkurnHo5XHti7TbNJA=="
+ },
"@expo-google-fonts/poppins": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@expo-google-fonts/poppins/-/poppins-0.2.2.tgz",
@@ -31845,6 +32650,11 @@
"@types/istanbul-lib-report": "*"
}
},
+ "@types/js-cookie": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz",
+ "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA=="
+ },
"@types/json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
@@ -32324,6 +33134,11 @@
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.8.tgz",
"integrity": "sha512-PrJx38EfpitFhwmILRl37jAdBlsww6AZ6rRVK4QS7T7RHLhX7mSs647sTmgr9GIxe3qjXdesmomEgbgaokrVFg=="
},
+ "@xobotyi/scrollbar-width": {
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
+ "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
+ },
"@xstate/react": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/@xstate/react/-/react-3.0.1.tgz",
@@ -33755,6 +34570,29 @@
"version": "file:node_modules/watchpack/chokidar2",
"requires": {
"chokidar": "^2.1.8"
+ },
+ "dependencies": {
+ "chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ }
+ }
}
},
"chownr": {
@@ -34419,6 +35257,14 @@
"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
},
+ "copy-to-clipboard": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
+ "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
+ "requires": {
+ "toggle-selection": "^1.0.6"
+ }
+ },
"copy-webpack-plugin": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.4.tgz",
@@ -34722,6 +35568,14 @@
"timsort": "^0.3.0"
}
},
+ "css-in-js-utils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz",
+ "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==",
+ "requires": {
+ "hyphenate-style-name": "^1.0.3"
+ }
+ },
"css-loader": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz",
@@ -34917,6 +35771,11 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
"integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw=="
},
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA=="
+ },
"cyclist": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
@@ -34998,7 +35857,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
"integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
- "dev": true,
"requires": {
"is-arguments": "^1.0.4",
"is-date-object": "^1.0.1",
@@ -37711,6 +38569,11 @@
}
}
},
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ=="
+ },
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -37750,11 +38613,26 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fast-loops": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz",
+ "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g=="
+ },
+ "fast-shallow-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz",
+ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw=="
+ },
"fast-text-encoding": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
"integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig=="
},
+ "fastest-stable-stringify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz",
+ "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="
+ },
"fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -38255,8 +39133,7 @@
"functions-have-names": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz",
- "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==",
- "dev": true
+ "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA=="
},
"gensync": {
"version": "1.0.0-beta.2",
@@ -38476,6 +39353,21 @@
"function-bind": "^1.1.1"
}
},
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ }
+ }
+ },
"has-bigints": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
@@ -38504,7 +39396,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
"requires": {
"has-symbols": "^1.0.2"
}
@@ -39080,6 +39971,16 @@
"integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==",
"dev": true
},
+ "hyphenate-style-name": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
+ "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ=="
+ },
+ "i": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz",
+ "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q=="
+ },
"i18next": {
"version": "21.6.16",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz",
@@ -39205,6 +40106,15 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
+ "inline-style-prefixer": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz",
+ "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==",
+ "requires": {
+ "css-in-js-utils": "^3.1.0",
+ "fast-loops": "^1.1.3"
+ }
+ },
"internal-ip": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
@@ -39274,7 +40184,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
"integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
@@ -39367,7 +40276,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
"integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
"requires": {
"has-tostringtag": "^1.0.0"
}
@@ -39673,7 +40581,6 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
@@ -39827,6 +40734,11 @@
}
}
},
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+ },
"iterall": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz",
@@ -40042,6 +40954,11 @@
"integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==",
"dev": true
},
+ "js-cookie": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
+ "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
+ },
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -41649,6 +42566,11 @@
"integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==",
"dev": true
},
+ "mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
+ },
"mv": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
@@ -41710,6 +42632,21 @@
"dev": true,
"optional": true
},
+ "nano-css": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz",
+ "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==",
+ "requires": {
+ "css-tree": "^1.1.2",
+ "csstype": "^3.0.6",
+ "fastest-stable-stringify": "^2.0.2",
+ "inline-style-prefixer": "^6.0.0",
+ "rtl-css-js": "^1.14.0",
+ "sourcemap-codec": "^1.4.8",
+ "stacktrace-js": "^2.0.2",
+ "stylis": "^4.0.6"
+ }
+ },
"nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
@@ -42052,7 +42989,6 @@
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
"integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
- "dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
@@ -43071,6 +44007,11 @@
}
}
},
+ "pkginfo": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz",
+ "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ=="
+ },
"plist": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz",
@@ -43823,6 +44764,18 @@
"integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
"dev": true
},
+ "prompt": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz",
+ "integrity": "sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA==",
+ "requires": {
+ "pkginfo": "0.x.x",
+ "read": "1.0.x",
+ "revalidator": "0.1.x",
+ "utile": "0.2.x",
+ "winston": "0.8.x"
+ }
+ },
"prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -44395,6 +45348,14 @@
}
}
},
+ "react-native-animated-pagination-dot": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/react-native-animated-pagination-dot/-/react-native-animated-pagination-dot-0.4.0.tgz",
+ "integrity": "sha512-MiIPB6qe8lc6a+nhzvQHOi5x/bZlZ8hBH4HWiorPps3gTJZgxfX3abuYvVjN94egA8Z3HlE9pptz8OQfdL5IzQ==",
+ "requires": {
+ "react-use": "^17.3.1"
+ }
+ },
"react-native-app-intro-slider": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/react-native-app-intro-slider/-/react-native-app-intro-slider-4.0.4.tgz",
@@ -44412,6 +45373,64 @@
"integrity": "sha512-aPSoNYoz1lRC5UorRajzAzME8UUanrEIIbvzdnPFrMDrKiJNCdjwcsyEZlNBKPdDAUrSSWyGaCZ4jHVGnd4bwA==",
"requires": {}
},
+ "react-native-cli": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/react-native-cli/-/react-native-cli-2.0.1.tgz",
+ "integrity": "sha512-QgkB1urUhGe9q1vcqQLIfNdCd/Qf3MdNQe19QO6lVjhIVKljlVMKtaK8RaZ8PCNB/cdXlO/G3tKUGk+ghMXE6w==",
+ "requires": {
+ "chalk": "^1.1.1",
+ "minimist": "^1.2.0",
+ "prompt": "^0.2.14",
+ "semver": "^5.0.3"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="
+ }
+ }
+ },
"react-native-codegen": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.6.tgz",
@@ -44484,6 +45503,12 @@
"resolved": "https://registry.npmjs.org/react-native-keychain/-/react-native-keychain-8.0.0.tgz",
"integrity": "sha512-c7Cs+YQN26UaQsRG1dmlXL7VL2ctnXwH/dl0IOMEQ7ZaL2NdN313YSAI8ZEZZjrVhNmPsyWEuvTFqWrdpItqQg=="
},
+ "react-native-linear-gradient": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.6.2.tgz",
+ "integrity": "sha512-Z8Xxvupsex+9BBFoSYS87bilNPWcRfRsGC0cpJk72Nxb5p2nEkGSBv73xZbEHnW2mUFvP+huYxrVvjZkr/gRjQ==",
+ "requires": {}
+ },
"react-native-location-enabler": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/react-native-location-enabler/-/react-native-location-enabler-4.1.1.tgz",
@@ -44594,8 +45619,7 @@
"integrity": "sha512-Ns7Bn9H/Tyw278+5SQx9oAblDZ7JixyzeOczcBK8dipQk2pD7Djkcfnf1nB/8RErAmMLL9iXgW0QHqiII8AhKw=="
},
"react-native-tuvali": {
- "version": "git+ssh://git@github.com/mosip/tuvali.git#e1e466204a08a841053a28f32ca32e7613b8d084",
- "from": "react-native-tuvali@github:mosip/tuvali#v0.4.1",
+ "version": "file:.yalc/react-native-tuvali",
"requires": {}
},
"react-native-uuid": {
@@ -44659,6 +45683,48 @@
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz",
"integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA=="
},
+ "react-universal-interface": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz",
+ "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==",
+ "requires": {}
+ },
+ "react-use": {
+ "version": "17.4.0",
+ "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz",
+ "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==",
+ "requires": {
+ "@types/js-cookie": "^2.2.6",
+ "@xobotyi/scrollbar-width": "^1.9.5",
+ "copy-to-clipboard": "^3.3.1",
+ "fast-deep-equal": "^3.1.3",
+ "fast-shallow-equal": "^1.0.0",
+ "js-cookie": "^2.2.1",
+ "nano-css": "^5.3.1",
+ "react-universal-interface": "^0.6.2",
+ "resize-observer-polyfill": "^1.5.1",
+ "screenfull": "^5.1.0",
+ "set-harmonic-interval": "^1.0.1",
+ "throttle-debounce": "^3.0.1",
+ "ts-easing": "^0.2.0",
+ "tslib": "^2.1.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
+ }
+ }
+ },
+ "read": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+ "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
+ "requires": {
+ "mute-stream": "~0.0.4"
+ }
+ },
"read-chunk": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz",
@@ -44799,7 +45865,6 @@
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
"integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
- "dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
@@ -45054,6 +46119,11 @@
"resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.5.tgz",
"integrity": "sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ=="
},
+ "resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
+ },
"resolve": {
"version": "1.22.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
@@ -45132,6 +46202,11 @@
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
},
+ "revalidator": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz",
+ "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg=="
+ },
"rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
@@ -45196,6 +46271,14 @@
"resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
"integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA=="
},
+ "rtl-css-js": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz",
+ "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==",
+ "requires": {
+ "@babel/runtime": "^7.1.2"
+ }
+ },
"rtl-detect": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz",
@@ -45498,6 +46581,11 @@
"ajv-keywords": "^3.5.2"
}
},
+ "screenfull": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz",
+ "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="
+ },
"security-context": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/security-context/-/security-context-4.0.0.tgz",
@@ -45768,6 +46856,11 @@
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
+ "set-harmonic-interval": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz",
+ "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g=="
+ },
"set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -46200,6 +47293,11 @@
"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
"integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
},
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+ },
"spdy": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
@@ -46282,10 +47380,49 @@
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"dev": true
},
+ "stack-generator": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
+ "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
+ "requires": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="
+ },
"stackframe": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz",
- "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg=="
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
+ },
+ "stacktrace-gps": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
+ "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
+ "requires": {
+ "source-map": "0.5.6",
+ "stackframe": "^1.3.4"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA=="
+ }
+ }
+ },
+ "stacktrace-js": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
+ "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
+ "requires": {
+ "error-stack-parser": "^2.0.6",
+ "stack-generator": "^2.0.5",
+ "stacktrace-gps": "^3.0.4"
+ }
},
"stacktrace-parser": {
"version": "0.1.10",
@@ -46606,6 +47743,11 @@
}
}
},
+ "stylis": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
+ "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="
+ },
"subscriptions-transport-ws": {
"version": "0.9.8",
"resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.8.tgz",
@@ -47039,6 +48181,11 @@
"resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
"integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="
},
+ "throttle-debounce": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz",
+ "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg=="
+ },
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -47142,6 +48289,11 @@
"is-number": "^7.0.0"
}
},
+ "toggle-selection": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
+ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ },
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
@@ -47165,6 +48317,11 @@
"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
"dev": true
},
+ "ts-easing": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
+ "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
+ },
"ts-interface-checker": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
@@ -47188,8 +48345,7 @@
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"tsutils": {
"version": "3.21.0",
@@ -47616,6 +48772,60 @@
"integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
"dev": true
},
+ "utile": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz",
+ "integrity": "sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg==",
+ "requires": {
+ "async": "~0.2.9",
+ "deep-equal": "*",
+ "i": "0.3.x",
+ "mkdirp": "0.x.x",
+ "ncp": "0.4.x",
+ "rimraf": "2.x.x"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ=="
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "requires": {
+ "minimist": "^1.2.6"
+ }
+ },
+ "ncp": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz",
+ "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA=="
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -47697,6 +48907,212 @@
"chokidar2": "file:chokidar2",
"graceful-fs": "^4.1.2",
"neo-async": "^2.5.0"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true,
+ "optional": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "binary-extensions": "^1.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "optional": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
}
},
"wbuf": {
@@ -49033,6 +50449,37 @@
"string-width": "^4.0.0"
}
},
+ "winston": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz",
+ "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==",
+ "requires": {
+ "async": "0.2.x",
+ "colors": "0.6.x",
+ "cycle": "1.0.x",
+ "eyes": "0.1.x",
+ "isstream": "0.1.x",
+ "pkginfo": "0.3.x",
+ "stack-trace": "0.0.x"
+ },
+ "dependencies": {
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ=="
+ },
+ "colors": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+ "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw=="
+ },
+ "pkginfo": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
+ "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A=="
+ }
+ }
+ },
"with-open-file": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz",
diff --git a/package.json b/package.json
index 7519d977a..14eb6527c 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"@digitalbazaar/rsa-signature-2018": "digitalbazaar/rsa-signature-2018#initial",
"@digitalbazaar/rsa-verification-key-2018": "digitalbazaar/rsa-verification-key-2018#initial",
"@digitalcredentials/vc": "^1.1.2",
+ "@expo-google-fonts/inter": "^0.2.3",
"@expo-google-fonts/poppins": "^0.2.0",
"@expo/metro-config": "^0.3.12",
"@idpass/smartshare-react-native": "0.2.3-beta.2",
@@ -52,15 +53,18 @@
"react": "17.0.1",
"react-i18next": "^11.16.6",
"react-native": "0.64.4",
+ "react-native-animated-pagination-dot": "^0.4.0",
"react-native-app-intro-slider": "^4.0.4",
"react-native-biometrics-changed": "^1.1.8",
"react-native-bluetooth-state-manager": "^1.3.2",
+ "react-native-cli": "^2.0.1",
"react-native-device-info": "^8.4.8",
"react-native-dotenv": "^3.3.1",
"react-native-elements": "3.4.2",
"react-native-fs": "^2.20.0",
"react-native-gesture-handler": "~2.1.0",
"react-native-keychain": "^8.0.0",
+ "react-native-linear-gradient": "^2.6.2",
"react-native-location-enabler": "^4.1.0",
"react-native-mmkv-storage": "0.8.0",
"react-native-permissions": "^3.6.0",
diff --git a/routes/index.ts b/routes/index.ts
index 72fe507e2..d44f6d83b 100644
--- a/routes/index.ts
+++ b/routes/index.ts
@@ -9,9 +9,21 @@ import { WelcomeScreen } from '../screens/WelcomeScreen';
import { PasscodeScreen } from '../screens/PasscodeScreen';
import { MainLayout } from '../screens/MainLayout';
import { NotificationsScreen } from '../screens/NotificationsScreen';
-import { Image } from 'react-native';
+import { SetupLanguageScreen } from '../screens/SetupLanguageScreen';
+import { IntroSlidersScreen } from '../screens/Home/IntroSlidersScreen';
export const baseRoutes: Screen[] = [
+ {
+ name: 'Language',
+ component: SetupLanguageScreen,
+ },
+ {
+ name: 'IntroSliders',
+ component: IntroSlidersScreen,
+ options: {
+ headerShown: false,
+ },
+ },
{
name: 'Welcome',
component: WelcomeScreen,
@@ -45,6 +57,8 @@ export const authRoutes: Screen[] = [
];
export type RootStackParamList = {
+ Language: undefined;
+ IntroSliders: undefined;
Welcome: undefined;
Auth: undefined;
Passcode: {
diff --git a/routes/main.ts b/routes/main.ts
index 7036e2643..26548add0 100644
--- a/routes/main.ts
+++ b/routes/main.ts
@@ -3,11 +3,12 @@ import {
BottomTabNavigationOptions,
BottomTabScreenProps,
} from '@react-navigation/bottom-tabs';
+import { Image } from 'react-native';
import { HomeScreen } from '../screens/Home/HomeScreen';
-import { ProfileScreen } from '../screens/Profile/ProfileScreen';
import { RootStackParamList } from './index';
import { RequestLayout } from '../screens/Request/RequestLayout';
import { ScanLayout } from '../screens/Scan/ScanLayout';
+import { HistoryScreen } from '../screens/History/HistoryScreen';
import i18n from '../i18n';
import { Platform } from 'react-native';
@@ -16,7 +17,12 @@ const home: TabScreen = {
component: HomeScreen,
icon: 'home',
options: {
- title: i18n.t('MainLayout:home'),
+ headerTitle: '',
+ headerLeft: () =>
+ React.createElement(Image, {
+ source: require('../assets/inji-home-logo.png'),
+ style: { width: 124, height: 27, resizeMode: 'contain' },
+ }),
},
};
const scan: TabScreen = {
@@ -37,12 +43,13 @@ const request: TabScreen = {
headerShown: false,
},
};
-const settings: TabScreen = {
- name: 'Settings',
- component: ProfileScreen,
- icon: 'settings',
+const history: TabScreen = {
+ name: 'History',
+ component: HistoryScreen,
+ icon: 'history',
options: {
- title: i18n.t('MainLayout:Settings'),
+ title: i18n.t('MainLayout:history'),
+ headerRight: null,
},
};
@@ -54,7 +61,7 @@ if (Platform.OS !== 'ios') {
mainRoutes.push(request);
}
-mainRoutes.push(settings);
+mainRoutes.push(history);
export type MainBottomTabParamList = {
Home: {
@@ -62,7 +69,7 @@ export type MainBottomTabParamList = {
};
Scan: undefined;
Request: undefined;
- Settings: undefined;
+ History: undefined;
};
export interface TabScreen {
diff --git a/screens/AppLayout.tsx b/screens/AppLayout.tsx
index f01b648e6..bde8d6e85 100644
--- a/screens/AppLayout.tsx
+++ b/screens/AppLayout.tsx
@@ -6,8 +6,6 @@ import {
} from '@react-navigation/native-stack';
import { authRoutes, baseRoutes } from '../routes';
import { useAppLayout } from './AppLayoutController';
-import { Icon } from 'react-native-elements';
-import { Theme } from '../components/ui/styleUtils';
import { StatusBar } from 'react-native';
const { Navigator, Screen } = createNativeStackNavigator();
@@ -25,7 +23,15 @@ export const AppLayout: React.FC = () => {
return (
-
+
{baseRoutes.map((route) => (
))}
diff --git a/screens/AppLayoutController.ts b/screens/AppLayoutController.ts
index 2f693dc7e..85e2469f7 100644
--- a/screens/AppLayoutController.ts
+++ b/screens/AppLayoutController.ts
@@ -1,13 +1,19 @@
import { useSelector } from '@xstate/react';
import { useContext } from 'react';
-import { selectAuthorized } from '../machines/auth';
+import {
+ selectAuthorized,
+ selectLanguagesetup,
+ selectUnauthorized,
+} from '../machines/auth';
import { GlobalContext } from '../shared/GlobalContext';
export function useAppLayout() {
const { appService } = useContext(GlobalContext);
const authService = appService.children.get('auth');
-
+ const isLanguagesetup = useSelector(authService, selectLanguagesetup);
return {
isAuthorized: useSelector(authService, selectAuthorized),
+ isUnAuthorized: useSelector(authService, selectUnauthorized),
+ isLanguagesetup,
};
}
diff --git a/screens/AuthScreen.tsx b/screens/AuthScreen.tsx
index 6913a276f..a2beedf3a 100644
--- a/screens/AuthScreen.tsx
+++ b/screens/AuthScreen.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import { useTranslation } from 'react-i18next';
import { Icon } from 'react-native-elements';
import { MessageOverlay } from '../components/MessageOverlay';
-import { Button, Centered, Column, Text } from '../components/ui';
+import { Button, Column, Text } from '../components/ui';
import { Theme } from '../components/ui/styleUtils';
import { RootRouteProps } from '../routes';
import { useAuthScreen } from './AuthScreenController';
@@ -15,21 +15,33 @@ export const AuthScreen: React.FC = (props) => {
+ backgroundColor={Theme.Colors.whiteBackgroundColor}
+ align="space-between">
- {t('header')}
+
+
+
+ {t('header')}
+
+
+ {t('Description')}
+
+
-
-
-
+
= (props) => {
- const { t } = useTranslation('HistoryTab');
+export const HistoryScreen: React.FC = () => {
+ const { t } = useTranslation('HistoryScreen');
const controller = useHistoryTab();
return (
-
+
= (props) => {
return (
-
- {TabItem(t('myVcsTab'))}
- {TabItem(t('receivedVcsTab'))}
- {TabItem(t('historyTab'))}
-
{controller.haveTabsLoaded && (
= (props) => {
service={controller.tabRefs.receivedVcs}
vcItemActor={controller.selectedVc}
/>
-
)}
diff --git a/screens/Home/HomeScreenMachine.ts b/screens/Home/HomeScreenMachine.ts
index 285d05e5d..ef35b8a47 100644
--- a/screens/Home/HomeScreenMachine.ts
+++ b/screens/Home/HomeScreenMachine.ts
@@ -9,10 +9,6 @@ import {
import { createModel } from 'xstate/lib/model';
import { vcItemMachine } from '../../machines/vcItem';
import { AppServices } from '../../shared/GlobalContext';
-import {
- createHistoryTabMachine,
- HistoryTabMachine,
-} from './HistoryTabMachine';
import { createMyVcsTabMachine, MyVcsTabMachine } from './MyVcsTabMachine';
import {
createReceivedVcsTabMachine,
@@ -25,7 +21,6 @@ const model = createModel(
tabRefs: {
myVcs: {} as ActorRefFrom,
receivedVcs: {} as ActorRefFrom,
- history: {} as ActorRefFrom,
},
selectedVc: null as ActorRefFrom,
activeTab: 0,
@@ -45,14 +40,12 @@ const model = createModel(
const MY_VCS_TAB_REF_ID = 'myVcsTab';
const RECEIVED_VCS_TAB_REF_ID = 'receivedVcsTab';
-const HISTORY_TAB_REF_ID = 'historyTab';
export const HomeScreenEvents = model.events;
export type TabRef =
| ActorRefFrom
- | ActorRefFrom
- | ActorRefFrom;
+ | ActorRefFrom;
export const HomeScreenMachine = model.createMachine(
{
@@ -143,10 +136,6 @@ export const HomeScreenMachine = model.createMachine(
createReceivedVcsTabMachine(context.serviceRefs),
RECEIVED_VCS_TAB_REF_ID
),
- history: spawn(
- createHistoryTabMachine(context.serviceRefs),
- HISTORY_TAB_REF_ID
- ),
}),
}),
diff --git a/screens/Home/IntroSlidersScreen.tsx b/screens/Home/IntroSlidersScreen.tsx
new file mode 100644
index 000000000..d9316d98f
--- /dev/null
+++ b/screens/Home/IntroSlidersScreen.tsx
@@ -0,0 +1,151 @@
+import React, { useRef, useContext } from 'react';
+import AppIntroSlider from 'react-native-app-intro-slider';
+import { Dimensions, Image, StatusBar, View } from 'react-native';
+import { Centered, Column, Row, Text, Button } from '../../components/ui';
+import { Theme } from '../../components/ui/styleUtils';
+import { useSelector } from '@xstate/react';
+import { GlobalContext } from '../../shared/GlobalContext';
+import { selectVcLabel } from '../../machines/settings';
+import { useTranslation } from 'react-i18next';
+import { RootRouteProps } from '../../routes';
+import { useWelcomeScreen } from '../WelcomeScreenController';
+import LinearGradient from 'react-native-linear-gradient';
+
+export const IntroSlidersScreen: React.FC = (props) => {
+ const slider = useRef();
+
+ const { t } = useTranslation('OnboardingOverlay');
+ const { appService } = useContext(GlobalContext);
+ const settingsService = appService.children.get('settings');
+ const controller = useWelcomeScreen(props);
+
+ const slides = [
+ {
+ key: 'one',
+ title: t('stepOneTitle'),
+ text: t('stepOneText'),
+ image: Theme.protectPrivacy,
+ },
+ {
+ key: 'two',
+ title: t('stepTwoTitle'),
+ text: t('stepTwoText'),
+ image: Theme.sharingIntro,
+ },
+ {
+ key: 'three',
+ title: t('stepThreeTitle'),
+ text: t('stepThreeText'),
+ image: Theme.walletIntro,
+ },
+ {
+ key: 'four',
+ title: t('stepFourTitle'),
+ text: t('stepFourText'),
+ image: Theme.IntroScanner,
+ },
+ ];
+
+ const renderItem = ({ item }) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {item.title}
+
+
+ {item.text}
+
+ {item.footer}
+
+
+
+ );
+ };
+
+ const renderNextButton = () => {
+ return (
+
+
+
+ {t('next')}
+
+
+
+ );
+ };
+ const renderDoneButton = () => {
+ return (
+
+
+
+ {t('stepFourButton')}
+
+
+
+ );
+ };
+ return (
+
+
+ controller.NEXT()}
+ />
+
+ );
+};
diff --git a/screens/Home/MyVcs/AddVcModal.tsx b/screens/Home/MyVcs/AddVcModal.tsx
index 4ff7268f5..f67824bbb 100644
--- a/screens/Home/MyVcs/AddVcModal.tsx
+++ b/screens/Home/MyVcs/AddVcModal.tsx
@@ -25,6 +25,7 @@ export const AddVcModal: React.FC = (props) => {
onDismiss={controller.DISMISS}
onInputDone={controller.INPUT_OTP}
error={controller.otpError}
+ resend={controller.RESEND_OTP}
/>
service.send(AddVcModalEvents.INPUT_OTP(otp)),
+ RESEND_OTP: () => service.send(AddVcModalEvents.RESEND_OTP()),
+
DISMISS: () => service.send(AddVcModalEvents.DISMISS()),
};
}
diff --git a/screens/Home/MyVcs/AddVcModalMachine.ts b/screens/Home/MyVcs/AddVcModalMachine.ts
index a522180ca..d150d3b22 100644
--- a/screens/Home/MyVcs/AddVcModalMachine.ts
+++ b/screens/Home/MyVcs/AddVcModalMachine.ts
@@ -23,11 +23,13 @@ const model = createModel(
otpError: '',
transactionId: '',
requestId: '',
+ isPinned: false,
},
{
events: {
INPUT_ID: (id: string) => ({ id }),
INPUT_OTP: (otp: string) => ({ otp }),
+ RESEND_OTP: () => ({}),
VALIDATE_INPUT: () => ({}),
READY: (idInputRef: TextInput) => ({ idInputRef }),
DISMISS: () => ({}),
@@ -99,7 +101,7 @@ export const AddVcModalMachine =
},
],
SELECT_ID_TYPE: {
- actions: ['setIdType', 'clearId'],
+ actions: ['clearIdError', 'setIdType', 'clearId'],
},
},
},
@@ -134,7 +136,7 @@ export const AddVcModalMachine =
},
],
SELECT_ID_TYPE: {
- actions: ['setIdType', 'clearId'],
+ actions: ['clearIdError', 'setIdType', 'clearId'],
target: 'idle',
},
},
@@ -173,6 +175,29 @@ export const AddVcModalMachine =
actions: 'resetIdInputRef',
target: 'acceptingIdInput',
},
+ RESEND_OTP: {
+ target: '.resendOTP',
+ },
+ },
+ initial: 'idle',
+ states: {
+ idle: {},
+ resendOTP: {
+ invoke: {
+ src: 'requestOtp',
+ onDone: [
+ {
+ target: 'idle',
+ },
+ ],
+ onError: [
+ {
+ actions: 'setIdBackendError',
+ target: '#AddVcModal.acceptingIdInput.invalid.backend',
+ },
+ ],
+ },
+ },
},
},
requestingCredential: {
diff --git a/screens/Home/MyVcs/AddVcModalMachine.typegen.ts b/screens/Home/MyVcs/AddVcModalMachine.typegen.ts
index 86cf20fb9..7cd1289ce 100644
--- a/screens/Home/MyVcs/AddVcModalMachine.typegen.ts
+++ b/screens/Home/MyVcs/AddVcModalMachine.typegen.ts
@@ -17,6 +17,10 @@ export interface Typegen0 {
type: 'error.platform.AddVcModal.acceptingIdInput.requestingOtp:invocation[0]';
data: unknown;
};
+ 'error.platform.AddVcModal.acceptingOtpInput.resendOTP:invocation[0]': {
+ type: 'error.platform.AddVcModal.acceptingOtpInput.resendOTP:invocation[0]';
+ data: unknown;
+ };
'error.platform.AddVcModal.requestingCredential:invocation[0]': {
type: 'error.platform.AddVcModal.requestingCredential:invocation[0]';
data: unknown;
@@ -28,7 +32,9 @@ export interface Typegen0 {
};
'invokeSrcNameMap': {
requestCredential: 'done.invoke.AddVcModal.requestingCredential:invocation[0]';
- requestOtp: 'done.invoke.AddVcModal.acceptingIdInput.requestingOtp:invocation[0]';
+ requestOtp:
+ | 'done.invoke.AddVcModal.acceptingIdInput.requestingOtp:invocation[0]'
+ | 'done.invoke.AddVcModal.acceptingOtpInput.resendOTP:invocation[0]';
};
'missingImplementations': {
actions: never;
@@ -38,10 +44,11 @@ export interface Typegen0 {
};
'eventsCausingActions': {
clearId: 'SELECT_ID_TYPE';
- clearIdError: 'INPUT_ID' | 'VALIDATE_INPUT';
+ clearIdError: 'INPUT_ID' | 'SELECT_ID_TYPE' | 'VALIDATE_INPUT';
clearOtp:
| 'DISMISS'
| 'done.invoke.AddVcModal.acceptingIdInput.requestingOtp:invocation[0]'
+ | 'error.platform.AddVcModal.acceptingOtpInput.resendOTP:invocation[0]'
| 'error.platform.AddVcModal.requestingCredential:invocation[0]'
| 'xstate.init';
focusInput:
@@ -49,6 +56,7 @@ export interface Typegen0 {
| 'SELECT_ID_TYPE'
| 'VALIDATE_INPUT'
| 'error.platform.AddVcModal.acceptingIdInput.requestingOtp:invocation[0]'
+ | 'error.platform.AddVcModal.acceptingOtpInput.resendOTP:invocation[0]'
| 'error.platform.AddVcModal.requestingCredential:invocation[0]'
| 'xstate.after(100)#AddVcModal.acceptingIdInput.focusing';
forwardToParent: 'DISMISS';
@@ -56,6 +64,7 @@ export interface Typegen0 {
setId: 'INPUT_ID';
setIdBackendError:
| 'error.platform.AddVcModal.acceptingIdInput.requestingOtp:invocation[0]'
+ | 'error.platform.AddVcModal.acceptingOtpInput.resendOTP:invocation[0]'
| 'error.platform.AddVcModal.requestingCredential:invocation[0]';
setIdErrorEmpty: 'VALIDATE_INPUT';
setIdErrorWrongFormat: 'VALIDATE_INPUT';
@@ -66,6 +75,7 @@ export interface Typegen0 {
setRequestId: 'done.invoke.AddVcModal.requestingCredential:invocation[0]';
setTransactionId:
| 'DISMISS'
+ | 'error.platform.AddVcModal.acceptingOtpInput.resendOTP:invocation[0]'
| 'error.platform.AddVcModal.requestingCredential:invocation[0]'
| 'xstate.init';
};
@@ -77,7 +87,7 @@ export interface Typegen0 {
};
'eventsCausingServices': {
requestCredential: 'INPUT_OTP';
- requestOtp: 'VALIDATE_INPUT';
+ requestOtp: 'RESEND_OTP' | 'VALIDATE_INPUT';
};
'matchesStates':
| 'acceptingIdInput'
@@ -90,6 +100,8 @@ export interface Typegen0 {
| 'acceptingIdInput.rendering'
| 'acceptingIdInput.requestingOtp'
| 'acceptingOtpInput'
+ | 'acceptingOtpInput.idle'
+ | 'acceptingOtpInput.resendOTP'
| 'done'
| 'requestingCredential'
| {
@@ -100,6 +112,7 @@ export interface Typegen0 {
| 'rendering'
| 'requestingOtp'
| { invalid?: 'backend' | 'empty' | 'format' };
+ acceptingOtpInput?: 'idle' | 'resendOTP';
};
'tags': never;
}
diff --git a/screens/Home/MyVcs/BindingVcWarningOverlay.tsx b/screens/Home/MyVcs/BindingVcWarningOverlay.tsx
index 4003873c6..e802a87cc 100644
--- a/screens/Home/MyVcs/BindingVcWarningOverlay.tsx
+++ b/screens/Home/MyVcs/BindingVcWarningOverlay.tsx
@@ -8,7 +8,7 @@ import { Theme } from '../../../components/ui/styleUtils';
export const BindingVcWarningOverlay: React.FC = (
props
) => {
- const { t } = useTranslation('VcDetails');
+ const { t } = useTranslation('BindingVcWarningOverlay');
return (
= (
align="space-between"
crossAlign="center"
padding={'10'}
- width={Dimensions.get('screen').width * 0.8}>
-
+ width={Dimensions.get('screen').width * 0.8}
+ height={Dimensions.get('screen').height * 0}>
+
= (
-
- {t('Alert')}
-
+
+ {t('alert')}
-
- {t('BindingWarning')}
-
+
+ {t('BindingWarning')}
+
+
diff --git a/screens/Home/MyVcs/GetIdInputModal.tsx b/screens/Home/MyVcs/GetIdInputModal.tsx
index 3519d1710..2cda584f2 100644
--- a/screens/Home/MyVcs/GetIdInputModal.tsx
+++ b/screens/Home/MyVcs/GetIdInputModal.tsx
@@ -12,84 +12,93 @@ import { KeyboardAvoidingView, Platform } from 'react-native';
import { useTranslation } from 'react-i18next';
import { MessageOverlay } from '../../../components/MessageOverlay';
import Tooltip from '../../../lib/react-native-elements/tooltip/Tooltip';
+import { color } from 'react-native-elements/dist/helpers';
export const GetIdInputModal: React.FC = (props) => {
const { t } = useTranslation('GetIdInputModal');
const controller = useGetIdInputModal(props);
- const inputLabel = t('applicationId');
+ const inputLabel = t('enterApplicationId');
return (
-
+
- {t('header')}
+
+ {t('applicationIdLabel')}
+
-
- {t('qstnMarkToolTip')}}
- width={Dimensions.get('screen').width * 0.8}
- height={Dimensions.get('screen').height * 0.2}
- backgroundColor={'lightgray'}
- withPointer={true}
- skipAndroidStatusBar={true}
- onOpen={controller.ACTIVATE_ICON_COLOR}
- onClose={controller.DEACTIVATE_ICON_COLOR}>
-
- {controller.isInvalid ? (
-
- ) : (
-
- )}
-
-
- }
- errorStyle={{ color: Theme.Colors.errorMessage }}
- errorMessage={controller.idError}
- onChangeText={controller.INPUT_ID}
- ref={(node) =>
- !controller.idInputRef && controller.READY(node)
- }
- />
-
+ {t('qstnMarkToolTip')}}
+ width={Dimensions.get('screen').width * 0.8}
+ height={Dimensions.get('screen').height * 0.2}
+ backgroundColor={'lightgray'}
+ withPointer={true}
+ skipAndroidStatusBar={true}
+ onOpen={controller.ACTIVATE_ICON_COLOR}
+ onClose={controller.DEACTIVATE_ICON_COLOR}>
+
+ {controller.isInvalid ? (
+
+ ) : (
+
+ )}
+
+
+ }
+ errorStyle={{ color: Theme.Colors.errorMessage }}
+ errorMessage={controller.idError}
+ onChangeText={controller.INPUT_ID}
+ ref={(node) => !controller.idInputRef && controller.READY(node)}
+ />
+
+
diff --git a/screens/Home/MyVcs/GetVcModalMachine.typegen.ts b/screens/Home/MyVcs/GetVcModalMachine.typegen.ts
index f8aea9658..a01a7cf85 100644
--- a/screens/Home/MyVcs/GetVcModalMachine.typegen.ts
+++ b/screens/Home/MyVcs/GetVcModalMachine.typegen.ts
@@ -34,7 +34,7 @@ export interface Typegen0 {
actions: never;
delays: never;
guards: never;
- services: 'AddVcModal';
+ services: never;
};
'eventsCausingActions': {
clearIdError: 'INPUT_ID';
diff --git a/screens/Home/MyVcs/HistoryTab.tsx b/screens/Home/MyVcs/HistoryTab.tsx
new file mode 100644
index 000000000..d4ae4cc0c
--- /dev/null
+++ b/screens/Home/MyVcs/HistoryTab.tsx
@@ -0,0 +1,64 @@
+import React from 'react';
+import { Icon, ListItem } from 'react-native-elements';
+import { useTranslation } from 'react-i18next';
+import { Modal } from '../../../components/ui/Modal';
+import { Centered, Column, Text } from '../../../components/ui';
+import { ActivityLogText } from '../../../components/ActivityLogText';
+import { ActorRefFrom } from 'xstate';
+import { vcItemMachine } from '../../../machines/vcItem';
+import { useKebabPopUp } from '../../../components/KebabPopUpController';
+import { Theme } from '../../../components/ui/styleUtils';
+
+export const HistoryTab: React.FC = (props) => {
+ const { t } = useTranslation('HistoryTab');
+ const controller = useKebabPopUp(props);
+ return (
+
+
+
+
+ {props.label}
+
+
+
+
+
+ {controller.activities.map((activity) => {
+ if (activity._vcKey == props.vcKey) {
+ return (
+
+ );
+ }
+ })}
+ {controller.activities.length === 0 && (
+
+
+
+ {t('noHistory')}
+
+
+ )}
+
+
+
+ );
+};
+
+export interface HistoryTabProps {
+ label: string;
+ vcKey: string;
+ service: ActorRefFrom;
+}
diff --git a/screens/Home/MyVcs/IdInputModal.tsx b/screens/Home/MyVcs/IdInputModal.tsx
index 1bf9d502e..0b1def7ef 100644
--- a/screens/Home/MyVcs/IdInputModal.tsx
+++ b/screens/Home/MyVcs/IdInputModal.tsx
@@ -39,18 +39,26 @@ export const IdInputModal: React.FC = (props) => {
+ onShow={setIndividualID}
+ headerTitle={t('header')}
+ headerElevation={2}>
- {t('header')}
-
+
+ {t('guideLabel')}
+
+
= (props) => {
- ) : null
- }
- errorStyle={{ color: Theme.Colors.errorMessage }}
+ errorStyle={Theme.TextStyles.error}
errorMessage={controller.idError}
onChangeText={controller.INPUT_ID}
ref={setIdInputRef}
/>
+
+
{!controller.id && (
-
- {t('noUIN/VID')}
-
+
+
+ {t('noUIN/VID')}
+
+
+
+ {t('getItHere')}
+
+
+
)}
diff --git a/screens/Home/MyVcs/OtpVerification.tsx b/screens/Home/MyVcs/OtpVerification.tsx
deleted file mode 100644
index 89e83c331..000000000
--- a/screens/Home/MyVcs/OtpVerification.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react';
-import { useTranslation } from 'react-i18next';
-import { PinInput } from '../../../components/PinInput';
-import { Column, Text } from '../../../components/ui';
-import { ModalProps, Modal } from '../../../components/ui/Modal';
-import { Theme } from '../../../components/ui/styleUtils';
-import { Image } from 'react-native';
-import { Icon } from 'react-native-elements';
-
-export const OtpVerification: React.FC = (props) => {
- const { t } = useTranslation('OtpVerificationModal');
-
- return (
- }>
-
-
- {t('enterOtp')}
-
-
- {props.error}
-
-
-
-
-
-
- );
-};
-
-interface OtpVerificationModalProps extends ModalProps {
- onInputDone: (otp: string) => void;
- error?: string;
-}
diff --git a/screens/Home/MyVcs/OtpVerificationModal.strings.json b/screens/Home/MyVcs/OtpVerificationModal.strings.json
index ca64aba1d..a378016e0 100644
--- a/screens/Home/MyVcs/OtpVerificationModal.strings.json
+++ b/screens/Home/MyVcs/OtpVerificationModal.strings.json
@@ -1,3 +1,6 @@
{
- "enterOtp": "Enter the 6-digit verification code we sent you"
+ "title": "OTP Verification",
+ "otpSentMessage": "We've sent the 6 digit code to your registered mobile number!",
+ "resendTheCode": "You can resend the code in ",
+ "resendCode": "Resend Code"
}
\ No newline at end of file
diff --git a/screens/Home/MyVcs/OtpVerificationModal.tsx b/screens/Home/MyVcs/OtpVerificationModal.tsx
index 22509f8a0..e2dedf322 100644
--- a/screens/Home/MyVcs/OtpVerificationModal.tsx
+++ b/screens/Home/MyVcs/OtpVerificationModal.tsx
@@ -1,22 +1,64 @@
-import React from 'react';
+import React, { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
-import { Icon } from 'react-native-elements';
import { PinInput } from '../../../components/PinInput';
import { Column, Text } from '../../../components/ui';
-import { Modal, ModalProps } from '../../../components/ui/Modal';
+import { ModalProps, Modal } from '../../../components/ui/Modal';
import { Theme } from '../../../components/ui/styleUtils';
+import { Image, TouchableOpacity } from 'react-native';
export const OtpVerificationModal: React.FC = (
props
) => {
const { t } = useTranslation('OtpVerificationModal');
+ const [timer, setTimer] = useState(180); // 30 seconds
+
+ useEffect(() => {
+ if (timer === 0) return;
+
+ const intervalId = setInterval(() => {
+ setTimer(timer - 1);
+ }, 1000);
+
+ return () => clearInterval(intervalId);
+ }, [timer]);
+
+ const formatTime = (seconds) => {
+ const minutes = Math.floor(seconds / 60);
+ const Seconds = seconds % 60;
+ return `${minutes < 10 ? '0' + minutes : minutes}:${
+ Seconds < 10 ? '0' + Seconds : Seconds
+ }`;
+ };
+
return (
-
-
-
-
- {t('enterOtp')}
+ setTimer(180)}>
+
+
+
+
+
+ {t('title')}
+
+
+ {t('otpSentMessage')}
+
+
+
= (
{props.error}
+
+
+ {` ${t('resendTheCode')} : ${formatTime(timer)}`}
+
+
+ 0
+ ? null
+ : () => {
+ props.resend();
+ setTimer(180);
+ }
+ }>
+ 0 ? Theme.Colors.GrayText : Theme.Colors.AddIdBtnBg
+ }
+ margin="10 0 0 0"
+ weight="semibold">
+ {t('resendCode')}
+
+
@@ -34,4 +103,5 @@ export const OtpVerificationModal: React.FC = (
interface OtpVerificationModalProps extends ModalProps {
onInputDone: (otp: string) => void;
error?: string;
+ resend?: () => void;
}
diff --git a/screens/Home/MyVcs/RemoveVcWarningOverlay.tsx b/screens/Home/MyVcs/RemoveVcWarningOverlay.tsx
new file mode 100644
index 000000000..a5d6ee332
--- /dev/null
+++ b/screens/Home/MyVcs/RemoveVcWarningOverlay.tsx
@@ -0,0 +1,67 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { Dimensions, Image } from 'react-native';
+import { Overlay } from 'react-native-elements';
+import { Button, Column, Text, Row } from '../../../components/ui';
+import { Theme } from '../../../components/ui/styleUtils';
+
+export const RemoveVcWarningOverlay: React.FC = (
+ props
+) => {
+ const { t } = useTranslation('RemoveVcWarningOverlay');
+
+ return (
+
+
+
+
+
+ !
+
+
+
+
+ {t('alert')}
+
+
+ {t('RemoveWarning')}
+
+
+
+
+
+
+
+
+ );
+};
+
+interface RemoveVcWarningOverlayProps {
+ isVisible: boolean;
+ onConfirm: () => void;
+ onCancel: () => void;
+}
diff --git a/screens/Home/MyVcs/WalletBinding.tsx b/screens/Home/MyVcs/WalletBinding.tsx
new file mode 100644
index 000000000..4eb48e712
--- /dev/null
+++ b/screens/Home/MyVcs/WalletBinding.tsx
@@ -0,0 +1,102 @@
+import React from 'react';
+import { Icon, ListItem } from 'react-native-elements';
+import { Row, Text } from '../../../components/ui';
+import { Theme } from '../../../components/ui/styleUtils';
+import { useTranslation } from 'react-i18next';
+import { BindingVcWarningOverlay } from './BindingVcWarningOverlay';
+import { OtpVerificationModal } from './OtpVerificationModal';
+import { MessageOverlay } from '../../../components/MessageOverlay';
+import { useKebabPopUp } from '../../../components/KebabPopUpController';
+import { Dimensions } from 'react-native';
+import { ActorRefFrom } from 'xstate';
+import { vcItemMachine } from '../../../machines/vcItem';
+
+export const WalletBinding: React.FC = (props) => {
+ const controller = useKebabPopUp(props);
+
+ const WalletVerified: React.FC = () => {
+ return (
+
+ );
+ };
+ const { t } = useTranslation('WalletBinding');
+
+ return controller.emptyWalletBindingId ? (
+
+ {props.Icon && (
+
+ )}
+
+
+
+ {props.label}
+
+
+
+ {props.content}
+
+
+
+
+
+
+
+
+
+ ) : (
+
+
+
+
+
+
+
+
+ );
+};
+
+interface WalletBindingProps {
+ label: string;
+ content?: string;
+ Icon?: string;
+ service: ActorRefFrom;
+}
diff --git a/screens/Home/MyVcs/WalletBindingController.ts b/screens/Home/MyVcs/WalletBindingController.ts
new file mode 100644
index 000000000..70b0ec12a
--- /dev/null
+++ b/screens/Home/MyVcs/WalletBindingController.ts
@@ -0,0 +1,86 @@
+import { useSelector, useInterpret } from '@xstate/react';
+import { useContext, useRef, useState } from 'react';
+import { GlobalContext } from '../../../shared/GlobalContext';
+import { selectMyVcs, VcEvents } from '../../../machines/vc';
+import {
+ createVcItemMachine,
+ isShowingBindingWarning,
+ selectAcceptingBindingOtp,
+ isWalletBindingInProgress,
+ VcItemEvents,
+ selectIsAcceptingOtpInput,
+ selectOtpError,
+ selectShowWalletBindingError,
+ selectWalletBindingError,
+} from '../../../machines/vcItem';
+import { useTranslation } from 'react-i18next';
+
+import { ActorRefFrom } from 'xstate';
+
+export function useWalletBinding(props) {
+ const { t } = useTranslation('ProfileScreen');
+ const { appService } = useContext(GlobalContext);
+
+ const machine = useRef(
+ createVcItemMachine(
+ appService.getSnapshot().context.serviceRefs,
+ props.vcKey
+ )
+ );
+
+ const bindingService = useInterpret(machine.current, { devTools: __DEV__ });
+
+ const vcService = appService.children.get('vc');
+
+ const vcKeys = useSelector(vcService, selectMyVcs);
+
+ const otpError = useSelector(bindingService, selectOtpError);
+ const [isRevoking, setRevoking] = useState(false);
+ const [isAuthenticating, setAuthenticating] = useState(false);
+ const [isViewing, setIsViewing] = useState(false);
+ const [isBindingWarning, setisBindingWarning] = useState(false);
+ const [toastVisible, setToastVisible] = useState(false);
+ const [message, setMessage] = useState('');
+ const [selectedIndex, setSelectedIndex] = useState(null);
+ const [selectedVidKeys, setSelectedVidKeys] = useState([]);
+
+ const selectVcItem = (index: number, vcKey: string) => {
+ return () => {
+ setSelectedIndex(index);
+ };
+ };
+
+ const WalletBindingInProgress = useSelector(
+ bindingService,
+ isWalletBindingInProgress
+ );
+
+ return {
+ isBindingWarning,
+ setisBindingWarning,
+ otpError,
+ message,
+ toastVisible,
+ WalletBindingInProgress,
+
+ isAcceptingOtpInput: useSelector(bindingService, selectIsAcceptingOtpInput),
+ isAcceptingBindingOtp: useSelector(
+ bindingService,
+ selectAcceptingBindingOtp
+ ),
+ isBindingError: useSelector(bindingService, selectShowWalletBindingError),
+ walletBindingError: useSelector(bindingService, selectWalletBindingError),
+
+ DISMISS: () => bindingService.send(VcItemEvents.DISMISS()),
+
+ CONFIRM: () => bindingService.send(VcItemEvents.CONFIRM()),
+
+ CANCEL: () => bindingService.send(VcItemEvents.CANCEL()),
+
+ REFRESH: () => vcService.send(VcEvents.REFRESH_MY_VCS()),
+ setAuthenticating,
+ selectVcItem,
+ setIsViewing,
+ setRevoking,
+ };
+}
diff --git a/screens/Home/MyVcsTab.tsx b/screens/Home/MyVcsTab.tsx
index 0511a4f61..5989ec05d 100644
--- a/screens/Home/MyVcsTab.tsx
+++ b/screens/Home/MyVcsTab.tsx
@@ -1,18 +1,16 @@
import React from 'react';
-import { Button, Column, Text, Centered } from '../../components/ui';
-import { Icon } from 'react-native-elements';
+import { Button, Column, Row, Text } from '../../components/ui';
import { Theme } from '../../components/ui/styleUtils';
-import { RefreshControl } from 'react-native';
+import { RefreshControl, Image, View } from 'react-native';
import { useMyVcsTab } from './MyVcsTabController';
import { HomeScreenTabProps } from './HomeScreen';
import { AddVcModal } from './MyVcs/AddVcModal';
import { GetVcModal } from './MyVcs/GetVcModal';
-import { DownloadingVcModal } from './MyVcs/DownloadingVcModal';
-import { OnboardingOverlay } from './OnboardingOverlay';
import { useTranslation } from 'react-i18next';
import { VcItem } from '../../components/VcItem';
import { GET_INDIVIDUAL_ID } from '../../shared/constants';
import { ErrorMessageOverlay } from '../../components/MessageOverlay';
+import { Icon } from 'react-native-elements';
export const MyVcsTab: React.FC = (props) => {
const { t } = useTranslation('MyVcsTab');
@@ -36,62 +34,114 @@ export const MyVcsTab: React.FC = (props) => {
GET_INDIVIDUAL_ID('');
};
+ {
+ controller.isRequestSuccessful
+ ? setTimeout(() => {
+ controller.DISMISS();
+ }, 6000)
+ : null;
+ }
+
+ const DownloadingIdPopUp: React.FC = () => {
+ return (
+
+
+
+ {t('downloadingYourId')}
+
+ {
+ controller.DISMISS();
+ clearIndividualId();
+ }}
+ color={Theme.Colors.whiteText}
+ size={19}
+ />
+
+
+ );
+ };
+
return (
-
+
+
{controller.vcKeys.length > 0 && (
}>
- {controller.vcKeys.map((vcKey, index) => (
-
- ))}
-
-
-
+ {controller.vcKeys.map((vcKey, index) => {
+ if (vcKey.split(':')[4] === 'true') {
+ return (
+
+ );
+ }
+ })}
+ {controller.vcKeys.map((vcKey, index) => {
+ if (vcKey.split(':')[4] === 'false') {
+ return (
+
+ );
+ }
+ })}
+
)}
{controller.vcKeys.length === 0 && (
-
-
- {t('generateVc')}
+
+
+
+ {t('bringYourDigitalID')}
-
+
{t('generateVcDescription')}
-
-
-
-
+
)}
@@ -104,20 +154,6 @@ export const MyVcsTab: React.FC = (props) => {
{controller.GetVcModalService && (
)}
-
- {controller.isRequestSuccessful && (
-
- )}
-
-
service.send(MyVcsTabEvents.DISMISS()),
- ADD_VC: () => service.send(MyVcsTabEvents.ADD_VC()),
+ DOWNLOAD_ID: () => service.send(MyVcsTabEvents.ADD_VC()),
GET_VC: () => service.send(MyVcsTabEvents.GET_VC()),
diff --git a/screens/Home/MyVcsTabMachine.typegen.ts b/screens/Home/MyVcsTabMachine.typegen.ts
index cf2435374..aedf6278e 100644
--- a/screens/Home/MyVcsTabMachine.typegen.ts
+++ b/screens/Home/MyVcsTabMachine.typegen.ts
@@ -20,7 +20,7 @@ export interface Typegen0 {
actions: never;
delays: never;
guards: never;
- services: never;
+ services: 'AddVcModal' | 'GetVcModal';
};
'eventsCausingActions': {
completeOnboarding: 'ADD_VC' | 'ONBOARDING_DONE';
diff --git a/screens/Home/ReceivedVcsTabController.ts b/screens/Home/ReceivedVcsTabController.ts
index 9598a55b5..337aa47b7 100644
--- a/screens/Home/ReceivedVcsTabController.ts
+++ b/screens/Home/ReceivedVcsTabController.ts
@@ -1,5 +1,5 @@
import { useSelector } from '@xstate/react';
-import { useContext } from 'react';
+import { useContext, useState } from 'react';
import { ActorRefFrom } from 'xstate';
import {
selectIsRefreshingReceivedVcs,
@@ -16,13 +16,18 @@ import {
export function useReceivedVcsTab(props: HomeScreenTabProps) {
const service = props.service as ActorRefFrom;
const { appService } = useContext(GlobalContext);
+ const [isVisible, setIsVisible] = useState(false);
+ const settingsService = appService.children.get('settings');
const vcService = appService.children.get('vc');
return {
+ isVisible,
vcKeys: useSelector(vcService, selectReceivedVcs),
isRefreshingVcs: useSelector(vcService, selectIsRefreshingReceivedVcs),
+ TOGGLE_RECEIVED_CARDS: () => setIsVisible(!isVisible),
+
VIEW_VC: (vcItemActor: ActorRefFrom) =>
service.send(ReceivedVcsTabEvents.VIEW_VC(vcItemActor)),
REFRESH: () => service.send(ReceivedVcsTabEvents.REFRESH()),
diff --git a/screens/Home/ViewVcModal.tsx b/screens/Home/ViewVcModal.tsx
index c3caa813a..62690f38f 100644
--- a/screens/Home/ViewVcModal.tsx
+++ b/screens/Home/ViewVcModal.tsx
@@ -10,7 +10,7 @@ import { OIDcAuthenticationModal } from '../../components/OIDcAuth';
import { useViewVcModal, ViewVcModalProps } from './ViewVcModalController';
import { useTranslation } from 'react-i18next';
import { VcDetails } from '../../components/VcDetails';
-import { OtpVerification } from './MyVcs/OtpVerification';
+import { OtpVerificationModal } from './MyVcs/OtpVerificationModal';
import { BindingVcWarningOverlay } from './MyVcs/BindingVcWarningOverlay';
export const ViewVcModal: React.FC = (props) => {
@@ -22,12 +22,12 @@ export const ViewVcModal: React.FC = (props) => {
idType: 'VID',
label: t('revoke'),
icon: 'close-circle-outline',
- onPress: () => controller.CONFIRM_REVOKE_VC(),
+ onPress: controller.CONFIRM_REVOKE_VC,
},
{
label: t('editTag'),
icon: 'pencil',
- onPress: () => controller.EDIT_TAG(),
+ onPress: controller.EDIT_TAG,
},
];
@@ -35,19 +35,8 @@ export const ViewVcModal: React.FC = (props) => {
- }>
+ headerTitle={t('title')}
+ headerElevation={2}>
= (props) => {
)}
{controller.isAcceptingOtpInput && (
- = (props) => {
)}
{controller.isAcceptingBindingOtp && (
- {
setRevoking(true);
diff --git a/screens/MainLayout.tsx b/screens/MainLayout.tsx
index 19d041c8b..0a7af74fe 100644
--- a/screens/MainLayout.tsx
+++ b/screens/MainLayout.tsx
@@ -8,6 +8,10 @@ import { mainRoutes } from '../routes/main';
import { RootRouteProps } from '../routes';
import { Theme } from '../components/ui/styleUtils';
import { useTranslation } from 'react-i18next';
+import { Row } from '../components/ui';
+import { Image } from 'react-native';
+import { SettingScreen } from './Settings/SettingScreen';
+import { HelpScreen } from '../components/HelpScreen';
const { Navigator, Screen } = createBottomTabNavigator();
@@ -15,17 +19,54 @@ export const MainLayout: React.FC = () => {
const { t } = useTranslation('MainLayout');
const options: BottomTabNavigationOptions = {
- headerLeft: () => ,
- headerLeftContainerStyle: { paddingStart: 16 },
- headerRightContainerStyle: { paddingEnd: 16 },
- headerTitleAlign: 'center',
- tabBarShowLabel: false,
+ headerRight: () => (
+
+
+ }
+ navigation={undefined}
+ route={undefined}
+ />
+
+
+ }
+ navigation={undefined}
+ route={undefined}
+ />
+
+ ),
+ headerTitleStyle: {
+ fontFamily: 'Inter_600SemiBold',
+ fontSize: 30,
+ margin: 8,
+ },
+ headerRightContainerStyle: { paddingEnd: 13 },
+ headerLeftContainerStyle: { paddingEnd: 13 },
+ tabBarShowLabel: true,
+ tabBarActiveTintColor: Theme.Colors.IconBg,
+ tabBarLabelStyle: {
+ fontSize: 12,
+ fontFamily: 'Inter_600SemiBold',
+ },
tabBarStyle: {
- height: 86,
- paddingHorizontal: 36,
+ height: 82,
+ paddingHorizontal: 10,
},
tabBarItemStyle: {
- height: 86,
+ height: 83,
+ padding: 11,
},
};
@@ -38,12 +79,12 @@ export const MainLayout: React.FC = () => {
component={route.component}
options={{
...route.options,
- title: t(route.name.toLowerCase()).toUpperCase(),
+ title: t(route.name),
tabBarIcon: ({ focused }) => (
),
}}
diff --git a/screens/PasscodeScreen.tsx b/screens/PasscodeScreen.tsx
index 655996f09..6d28ab1eb 100644
--- a/screens/PasscodeScreen.tsx
+++ b/screens/PasscodeScreen.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
-import { Icon } from 'react-native-elements';
+import { Image } from 'react-native';
import { MAX_PIN, PasscodeVerify } from '../components/PasscodeVerify';
import { PinInput } from '../components/PinInput';
import { Column, Text } from '../components/ui';
@@ -15,12 +15,35 @@ export const PasscodeScreen: React.FC = (props) => {
const passcodeSetup =
controller.passcode === '' ? (
- {t('header')}
+
+
+ {t('header')}
+
+
+ {t('enterNewPassword')}
+
+
+
) : (
- {t('confirmPasscode')}
+
+
+ {t('confirmPasscode')}
+
+
+ {t('reEnterPassword')}
+
+
= (props) => {
fill
padding="32"
backgroundColor={Theme.Colors.whiteBackgroundColor}>
-
+
{props.route.params?.setup ? (
-
+
{passcodeSetup}
) : (
-
- {t('enterPasscode')}
+
+
+ {t('enterPasscode')}
+
{
@@ -61,7 +61,8 @@ export const ProfileScreen: React.FC = (props) => {
label={t('name')}
value={controller.name}
onEdit={controller.UPDATE_NAME}
- Icon="user"
+ Icon=""
+ credentialRegistryResponse={''}
/>
{/* Intentionally hidden using {display='none'} - Refer mosip/inji/issue#607 */}
= (props) => {
onEdit={controller.UPDATE_VC_LABEL}
Icon="star"
display="none"
+ credentialRegistryResponse={''}
/>
@@ -78,8 +80,8 @@ export const ProfileScreen: React.FC = (props) => {
@@ -106,7 +108,7 @@ export const ProfileScreen: React.FC = (props) => {
name="unlock"
size={20}
type="antdesign"
- style={Theme.Styles.profileIconBg}
+ style={Theme.Styles.IconContainer}
color={Theme.Colors.Icon}
/>
@@ -135,7 +137,7 @@ export const ProfileScreen: React.FC = (props) => {
name="logout"
type="fontawesome"
size={20}
- style={Theme.Styles.profileIconBg}
+ style={Theme.Styles.IconContainer}
color={Theme.Colors.Icon}
/>
diff --git a/screens/Request/RequestLayout.tsx b/screens/Request/RequestLayout.tsx
index 6f5b603cf..46ae84959 100644
--- a/screens/Request/RequestLayout.tsx
+++ b/screens/Request/RequestLayout.tsx
@@ -1,7 +1,6 @@
import React from 'react';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { useTranslation } from 'react-i18next';
-
import { RequestScreen } from './RequestScreen';
import { useRequestLayout } from './RequestLayoutController';
import { Message } from '../../components/Message';
diff --git a/screens/Request/RequestScreen.strings.json b/screens/Request/RequestScreen.strings.json
index 2b94fed7a..ca53289c1 100644
--- a/screens/Request/RequestScreen.strings.json
+++ b/screens/Request/RequestScreen.strings.json
@@ -1,5 +1,7 @@
{
"bluetoothDenied": "Please enable Bluetooth to be able to request Card",
+ "bluetoothStateIos": "Bluetooth is turned OFF, please turn it ON from Control center",
+ "bluetoothStateAndroid": "Bluetooth is turned OFF, please turn it ON from Quick settings menu",
"nearbyDevicesPermissionDenied": "Please enable Nearby Devices Permission to be able to request card",
"showQrCode": "Display this QR code to request resident Card",
"incomingVc": "Incoming Card",
diff --git a/screens/Scan/ScanLayout.tsx b/screens/Scan/ScanLayout.tsx
index d3bbc85ed..0395ad956 100644
--- a/screens/Scan/ScanLayout.tsx
+++ b/screens/Scan/ScanLayout.tsx
@@ -1,15 +1,11 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
-import { Icon } from 'react-native-elements';
-
-import { Theme } from '../../components/ui/styleUtils';
import { SendVcScreen } from './SendVcScreen';
-import { MessageOverlay } from '../../components/MessageOverlay';
import { useScanLayout } from './ScanLayoutController';
import { ScanScreen } from './ScanScreen';
-import { I18nManager, Platform } from 'react-native';
-import { Message } from '../../components/Message';
+import { ProgressingModal } from '../../components/ProgressingModal';
+import { MessageOverlay } from '../../components/MessageOverlay';
const ScanStack = createNativeStackNavigator();
@@ -19,11 +15,7 @@ export const ScanLayout: React.FC = () => {
return (
-
+
{!controller.isDone && (
{
name="ScanScreen"
component={ScanScreen}
options={{
- title: t('MainLayout:scan').toUpperCase(),
+ headerTitleStyle: { fontSize: 30, fontFamily: 'Inter_600SemiBold' },
+ title: t('MainLayout:scan'),
}}
/>
-
{controller.isDisconnected && (
- scanService.send(ScanEvents.CANCEL());
let statusOverlay: Pick<
MessageOverlayProps,
- 'title' | 'message' | 'hint' | 'onCancel' | 'progress' | 'onBackdropPress'
+ | 'title'
+ | 'message'
+ | 'hint'
+ | 'onCancel'
+ | 'progress'
+ | 'onBackdropPress'
+ | 'requester'
> = null;
if (isConnecting) {
statusOverlay = {
- message: t('status.connecting'),
+ title: t('status.inProgress'),
+ message: t('status.establishingConnection'),
progress: true,
};
} else if (isConnectingTimeout) {
statusOverlay = {
- message: t('status.connecting'),
+ title: t('status.sharingInProgress'),
+ requester: t('status.sharingInProgress'),
hint: t('status.connectingTimeout'),
onCancel,
progress: true,
diff --git a/screens/Scan/ScanScreen.tsx b/screens/Scan/ScanScreen.tsx
index b4a9805fd..e863abf87 100644
--- a/screens/Scan/ScanScreen.tsx
+++ b/screens/Scan/ScanScreen.tsx
@@ -140,12 +140,25 @@ export const ScanScreen: React.FC = () => {
+ backgroundColor={Theme.Colors.whiteBackgroundColor}>
- {t('header')}
+ backgroundColor={Theme.Colors.whiteBackgroundColor}>
+ {controller.isLocationDisabled || controller.isLocationDenied ? (
+
+
+
+ {controller.locationError.message}
+
+
+
+
+
+ ) : null}
{loadQRScanner()}
{controller.isQrLogin && (
{
const { t } = useTranslation('SendVcScreen');
@@ -55,51 +54,61 @@ export const SendVcScreen: React.FC = () => {
return (
-
-
-
-
+
+
+
+
-
- {controller.vcKeys.map((vcKey, index) => (
-
- ))}
-
+
+ {t('pleaseSelectAnId')}
+
+
+
+ {controller.vcKeys.map((vcKey, index) => (
+
+ ))}
-
+
+
{!controller.selectedVc.shouldVerifyPresence && (
diff --git a/screens/Scan/SuccessfullySharedModal.tsx b/screens/Scan/SuccessfullySharedModal.tsx
new file mode 100644
index 000000000..f32e4ec16
--- /dev/null
+++ b/screens/Scan/SuccessfullySharedModal.tsx
@@ -0,0 +1,54 @@
+import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Theme } from '../../components/ui/styleUtils';
+import { Modal } from '../../components/ui/Modal';
+import { Image } from 'react-native';
+import { Column, Text } from '../../components/ui';
+import { DeviceInfoList } from '../../components/DeviceInfoList';
+import { Button } from '../../components/ui';
+import { useScanLayout } from './ScanLayoutController';
+import { useSendVcScreen } from './SendVcScreenController';
+
+export const SharingSuccessModal: React.FC = (
+ props
+) => {
+ const { t } = useTranslation('ScanScreen');
+ const controller = useScanLayout();
+ const controller1 = useSendVcScreen();
+
+ return (
+
+
+
+
+
+ {t('ScanScreen:status.accepted.title')}
+
+
+ {t('ScanScreen:status.accepted.message')}
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+interface SharingSuccessModalProps {
+ isVisible: boolean;
+}
diff --git a/screens/Settings/AboutInji.tsx b/screens/Settings/AboutInji.tsx
new file mode 100644
index 000000000..7f29f3c5c
--- /dev/null
+++ b/screens/Settings/AboutInji.tsx
@@ -0,0 +1,118 @@
+import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import Markdown from 'react-native-simple-markdown';
+import appMetaData from '../../AppMetaData.md';
+
+import { Pressable, TouchableOpacity } from 'react-native';
+import { Modal } from '../../components/ui/Modal';
+import { Column, Row, Text } from '../../components/ui';
+import { Theme } from '../../components/ui/styleUtils';
+import { Icon, ListItem } from 'react-native-elements';
+import { Image } from 'react-native';
+import { Linking } from 'react-native';
+import getAllConfigurations from '../../shared/commonprops/commonProps';
+import { getVersion } from 'react-native-device-info';
+
+export const AboutInji: React.FC = (props) => {
+ const { t } = useTranslation('AboutInji');
+ let aboutInjiUrl = '';
+
+ const helpLink = getAllConfigurations().then((response) => {
+ aboutInjiUrl = response.aboutInjiUrl;
+ });
+
+ const [showAboutInji, setShowAboutInji] = useState(false);
+
+ const dependencies = require('../../package-lock.json').dependencies;
+ let packageVersion, packageCommitId;
+
+ Object.keys(dependencies).forEach((dependencyName) => {
+ const dependencyData = dependencies[dependencyName];
+
+ if (dependencyName == 'react-native-tuvali') {
+ packageVersion = dependencyData.from
+ ? dependencyData.from.split('#')[1]
+ : 'unknown';
+ if (packageVersion != 'unknown') {
+ packageCommitId = dependencyData.version.split('#')[1].substring(0, 7);
+ }
+ }
+ });
+
+ return (
+
+ {
+ setShowAboutInji(!showAboutInji);
+ }}>
+
+
+
+
+
+ {t('aboutInji')}
+
+
+
+
+
+ }
+ onDismiss={() => {
+ setShowAboutInji(!showAboutInji);
+ }}>
+
+
+
+ {t('aboutDetailes')}
+
+
+
+ {t('forMoreDetailes')}
+
+ Linking.openURL(aboutInjiUrl)}>
+
+ {t('clickHere')}
+
+
+
+
+
+
+
+ {t('version')}: {getVersion()}
+
+ {packageVersion != 'unknown' && (
+
+ {t('tuvaliVersion')}: {packageVersion + '-' + packageCommitId}
+
+ )}
+
+
+
+
+ );
+};
+
+interface AboutInjiProps {
+ isVisible?: boolean;
+}
diff --git a/screens/Profile/AppMetaData.strings.json b/screens/Settings/AppMetaData.strings.json
similarity index 100%
rename from screens/Profile/AppMetaData.strings.json
rename to screens/Settings/AppMetaData.strings.json
diff --git a/screens/Profile/AppMetaData.tsx b/screens/Settings/AppMetaData.tsx
similarity index 100%
rename from screens/Profile/AppMetaData.tsx
rename to screens/Settings/AppMetaData.tsx
diff --git a/screens/Settings/Credits.strings.json b/screens/Settings/Credits.strings.json
new file mode 100644
index 000000000..159deaaa4
--- /dev/null
+++ b/screens/Settings/Credits.strings.json
@@ -0,0 +1,4 @@
+{
+ "header": "Credits and legal notices",
+ "back": "Back"
+}
\ No newline at end of file
diff --git a/screens/Settings/Credits.tsx b/screens/Settings/Credits.tsx
new file mode 100644
index 000000000..a668c2f3b
--- /dev/null
+++ b/screens/Settings/Credits.tsx
@@ -0,0 +1,101 @@
+import React, { useState } from 'react';
+import Markdown from 'react-native-simple-markdown';
+import { useTranslation } from 'react-i18next';
+import { Image, SafeAreaView, View } from 'react-native';
+import { Divider, Icon, ListItem, Overlay } from 'react-native-elements';
+
+import { Button, Text, Row, Column } from '../../components/ui';
+import { Theme } from '../../components/ui/styleUtils';
+import creditsContent from '../../Credits.md';
+
+export const Credits: React.FC = (props) => {
+ const { t } = useTranslation('Credits');
+ const [isViewing, setIsViewing] = useState(false);
+ const images = {
+ 'docs/images/newlogic_logo.png': require('../../docs/images/newlogic_logo.png'),
+ 'docs/images/id_pass_logo.png': require('../../docs/images/id_pass_logo.png'),
+ };
+
+ const markdownStyles = {
+ heading1: {
+ fontSize: 24,
+ textAlign: 'left',
+ },
+ heading2: {
+ fontSize: 24,
+ textAlign: 'left',
+ },
+ image: {
+ maxWidth: 150,
+ margin: 0,
+ },
+ };
+
+ const rules = {
+ image: {
+ react: (node, output, state) => (
+
+
+
+ ),
+ },
+ };
+
+ return (
+ setIsViewing(true)}>
+
+
+
+
+ {props.label}
+
+
+
+
+ setIsViewing(false)}>
+
+
+
+
+ }
+ title=""
+ onPress={() => setIsViewing(false)}
+ />
+
+ {t('header')}
+
+
+
+
+ {creditsContent}
+
+
+
+
+
+
+ );
+};
+
+interface CreditsProps {
+ label: string;
+ color?: string;
+}
diff --git a/screens/Profile/Revoke.tsx b/screens/Settings/Revoke.tsx
similarity index 98%
rename from screens/Profile/Revoke.tsx
rename to screens/Settings/Revoke.tsx
index 00917b272..6213ba680 100644
--- a/screens/Profile/Revoke.tsx
+++ b/screens/Settings/Revoke.tsx
@@ -29,12 +29,11 @@ export const Revoke: React.FC = (props) => {
name={props.Icon}
type="font-awesome"
size={20}
- style={Theme.Styles.profileIconBg}
color={Theme.Colors.Icon}
/>
- {props.label}
+ {props.label}
{
+ const { t } = useTranslation('SettingScreen');
+
+ return (
+
+
+
+
+ {t('language')}
+
+
+
+
+ }
+ />
+ );
+};
+
+let helpUrl = '';
+
+let helpPage = getAllConfigurations().then((response) => {
+ helpUrl = response.helpUrl;
+});
+
+export const SettingScreen: React.FC = (
+ props
+) => {
+ const { t } = useTranslation('SettingScreen');
+ const controller = useSettingsScreen(props);
+
+ return (
+
+
+ {props.triggerComponent}
+
+ }
+ headerTitle={t('header')}
+ headerElevation={2}
+ onDismiss={controller.TOGGLE_SETTINGS}>
+
+
+
+
+
+
+
+
+
+
+
+ {t('bioUnlock')}
+
+
+
+
+
+
+
+
+ {CREDENTIAL_REGISTRY_EDIT === 'true' && (
+
+ )}
+
+ {
+ Linking.openURL(helpUrl);
+ }}>
+
+
+
+
+ {t('injiTourGuide')}
+
+
+
+
+
+
+
+
+
+
+ {t('logout')}
+
+
+
+
+ {controller.backendInfo.application.name !== '' ? (
+
+
+ {controller.backendInfo.application.name}:{' '}
+ {controller.backendInfo.application.version}
+
+
+ MOSIP: {controller.backendInfo.config['mosip.host']}
+
+
+ ) : null}
+
+
+
+
+ );
+};
+
+interface SettingProps {
+ triggerComponent: React.ReactElement;
+}
diff --git a/screens/Settings/SettingScreenController.ts b/screens/Settings/SettingScreenController.ts
new file mode 100644
index 000000000..8b9e23619
--- /dev/null
+++ b/screens/Settings/SettingScreenController.ts
@@ -0,0 +1,144 @@
+import { useMachine, useSelector } from '@xstate/react';
+import { useContext, useEffect, useState } from 'react';
+import * as LocalAuthentication from 'expo-local-authentication';
+import { selectBackendInfo } from '../../machines/app';
+import {
+ AuthEvents,
+ selectBiometrics,
+ selectCanUseBiometrics,
+} from '../../machines/auth';
+import {
+ selectBiometricUnlockEnabled,
+ selectName,
+ selectCredentialRegistryResponse,
+ selectVcLabel,
+ selectCredentialRegistry,
+ SettingsEvents,
+} from '../../machines/settings';
+
+import {
+ biometricsMachine,
+ selectError,
+ selectIsSuccess,
+ selectUnenrolledNotice,
+} from '../../machines/biometrics';
+import { MainRouteProps } from '../../routes/main';
+import { GlobalContext } from '../../shared/GlobalContext';
+import { useTranslation } from 'react-i18next';
+
+export function useSettingsScreen({ navigation }: MainRouteProps) {
+ const { appService } = useContext(GlobalContext);
+ const authService = appService.children.get('auth');
+ const settingsService = appService.children.get('settings');
+
+ const [isVisible, setIsVisible] = useState(false);
+
+ const [alertMsg, setHasAlertMsg] = useState('');
+ const authBiometrics = useSelector(authService, selectBiometrics);
+ const [biometricState, biometricSend, bioService] =
+ useMachine(biometricsMachine);
+
+ const isSuccessBio: boolean = useSelector(bioService, selectIsSuccess);
+ const errorMsgBio: string = useSelector(bioService, selectError);
+ const unEnrolledNoticeBio: string = useSelector(
+ bioService,
+ selectUnenrolledNotice
+ );
+ const { t } = useTranslation('AuthScreen');
+
+ useEffect(() => {
+ setTimeout(async () => {
+ const hasEnrolledBiometrics = await LocalAuthentication.isEnrolledAsync();
+ if (!hasEnrolledBiometrics) {
+ authService.send(AuthEvents.SETUP_BIOMETRICS(''));
+ settingsService.send(SettingsEvents.TOGGLE_BIOMETRIC_UNLOCK(false));
+ }
+ }, 0);
+
+ // if biometic state is success then lets send auth service BIOMETRICS
+ if (isSuccessBio) {
+ authService.send(AuthEvents.SETUP_BIOMETRICS('true'));
+ settingsService.send(SettingsEvents.TOGGLE_BIOMETRIC_UNLOCK(true));
+
+ // handle biometric failure unknown error
+ } else {
+ const error: string = errorMsgBio ?? unEnrolledNoticeBio ?? '';
+ if (error != '') {
+ setHasAlertMsg(t(error));
+ }
+ }
+ }, [isSuccessBio, errorMsgBio, unEnrolledNoticeBio]);
+
+ const useBiometrics = (value: boolean) => {
+ if (value) {
+ // But check if we already enrolled biometrics
+ if (authBiometrics) {
+ authService.send(AuthEvents.SETUP_BIOMETRICS('true'));
+ settingsService.send(SettingsEvents.TOGGLE_BIOMETRIC_UNLOCK(true));
+
+ // but if device does not have any enrolled biometrics
+ } else if (biometricState.matches({ failure: 'unenrolled' })) {
+ biometricSend({ type: 'RETRY_AUTHENTICATE' });
+
+ // otherwise lets do a biometric auth
+ } else {
+ biometricSend({ type: 'AUTHENTICATE' });
+ }
+ } else {
+ authService.send(AuthEvents.SETUP_BIOMETRICS(''));
+ settingsService.send(SettingsEvents.TOGGLE_BIOMETRIC_UNLOCK(false));
+ }
+ };
+
+ const hideAlert = () => {
+ setHasAlertMsg('');
+ };
+
+ return {
+ isVisible,
+ alertMsg,
+ hideAlert,
+ backendInfo: useSelector(appService, selectBackendInfo),
+ name: useSelector(settingsService, selectName),
+ vcLabel: useSelector(settingsService, selectVcLabel),
+ credentialRegistry: useSelector(settingsService, selectCredentialRegistry),
+ credentialRegistryResponse: useSelector(
+ settingsService,
+ selectCredentialRegistryResponse
+ ),
+ isBiometricUnlockEnabled: useSelector(
+ settingsService,
+ selectBiometricUnlockEnabled
+ ),
+ canUseBiometrics: useSelector(authService, selectCanUseBiometrics),
+ useBiometrics,
+
+ UPDATE_NAME: (name: string) =>
+ settingsService.send(SettingsEvents.UPDATE_NAME(name)),
+
+ TOGGLE_SETTINGS: () => setIsVisible(!isVisible),
+
+ UPDATE_VC_LABEL: (label: string) =>
+ settingsService.send(SettingsEvents.UPDATE_VC_LABEL(label)),
+
+ UPDATE_CREDENTIAL_REGISTRY: (credentialRegistry: string) =>
+ settingsService.send(
+ SettingsEvents.UPDATE_CREDENTIAL_REGISTRY(credentialRegistry)
+ ),
+
+ UPDATE_CREDENTIAL_REGISTRY_RESPONSE: (credentialRegistryResponse: string) =>
+ settingsService.send(
+ SettingsEvents.UPDATE_CREDENTIAL_REGISTRY_RESPONSE(
+ credentialRegistryResponse
+ )
+ ),
+
+ TOGGLE_BIOMETRIC: (enable: boolean) =>
+ settingsService.send(SettingsEvents.TOGGLE_BIOMETRIC_UNLOCK(enable)),
+
+ LOGOUT: () => {
+ authService.send(AuthEvents.LOGOUT());
+ navigation.navigate('Welcome');
+ },
+ };
+}
diff --git a/screens/SetupLanguageScreen.tsx b/screens/SetupLanguageScreen.tsx
new file mode 100644
index 000000000..2e9dcf277
--- /dev/null
+++ b/screens/SetupLanguageScreen.tsx
@@ -0,0 +1,81 @@
+import React from 'react';
+import i18n, { SUPPORTED_LANGUAGES } from '../i18n';
+import { I18nManager, Dimensions } from 'react-native';
+import Storage from '../shared/storage';
+import { useTranslation } from 'react-i18next';
+import i18next from 'i18next';
+import RNRestart from 'react-native-restart';
+import { SetupPicker } from '../components/ui/SetupPicker';
+import { Button, Column, Text } from '../components/ui';
+import { Theme } from '../components/ui/styleUtils';
+import { Icon } from 'react-native-elements';
+import { RootRouteProps } from '../routes';
+import { useWelcomeScreen } from './WelcomeScreenController';
+
+export const SetupLanguageScreen: React.FC = (props) => {
+ const { t } = useTranslation('SetupLanguage');
+ const controller = useWelcomeScreen(props);
+ const languages = Object.entries(SUPPORTED_LANGUAGES).map(
+ ([value, label]) => ({ label, value })
+ );
+
+ const changeLanguage = async (language: string) => {
+ if (language !== i18n.language) {
+ await i18n.changeLanguage(language).then(async () => {
+ await Storage.setItem('language', i18n.language);
+ const isRTL = i18next.dir(language) === 'rtl' ? true : false;
+ if (isRTL !== I18nManager.isRTL) {
+ try {
+ I18nManager.forceRTL(isRTL);
+ setTimeout(() => {
+ RNRestart.Restart();
+ }, 150);
+ } catch (e) {
+ console.log('error', e);
+ }
+ }
+ });
+ }
+ };
+
+ return (
+
+
+
+
+ {t('header')}
+
+
+ {t('description')}
+
+
+
+
+
+ {
+ controller.SELECT(), controller.unlockPage;
+ }}
+ />
+
+ );
+};
diff --git a/screens/WelcomeScreenController.ts b/screens/WelcomeScreenController.ts
index 4ae92ac2e..a63bf8cb1 100644
--- a/screens/WelcomeScreenController.ts
+++ b/screens/WelcomeScreenController.ts
@@ -1,6 +1,12 @@
import { useSelector } from '@xstate/react';
import { useContext } from 'react';
-import { selectBiometrics, selectPasscode, selectSettingUp } from '../machines/auth';
+import {
+ AuthEvents,
+ selectBiometrics,
+ selectLanguagesetup,
+ selectPasscode,
+ selectSettingUp,
+} from '../machines/auth';
import { selectBiometricUnlockEnabled } from '../machines/settings';
import { RootRouteProps } from '../routes';
import { GlobalContext } from '../shared/GlobalContext';
@@ -13,11 +19,22 @@ export function useWelcomeScreen(props: RootRouteProps) {
const isSettingUp = useSelector(authService, selectSettingUp);
const passcode = useSelector(authService, selectPasscode);
const biometrics = useSelector(authService, selectBiometrics);
- const isBiometricUnlockEnabled = useSelector(settingsService, selectBiometricUnlockEnabled);
+ const isLanguagesetup = useSelector(authService, selectLanguagesetup);
+ const isBiometricUnlockEnabled = useSelector(
+ settingsService,
+ selectBiometricUnlockEnabled
+ );
return {
isSettingUp,
-
+ isLanguagesetup,
+ NEXT: () => {
+ authService.send(AuthEvents.NEXT()), props.navigation.navigate('Auth');
+ },
+ SELECT: () => {
+ authService.send(AuthEvents.SELECT()),
+ props.navigation.navigate('IntroSliders');
+ },
unlockPage: () => {
// prioritize biometrics
if (!isSettingUp && isBiometricUnlockEnabled && biometrics !== '') {
diff --git a/shared/GlobalContext.ts b/shared/GlobalContext.ts
index b35f92106..d93dca3af 100644
--- a/shared/GlobalContext.ts
+++ b/shared/GlobalContext.ts
@@ -3,8 +3,8 @@ import { ActorRefFrom, InterpreterFrom } from 'xstate';
import { activityLogMachine } from '../machines/activityLog';
import { appMachine } from '../machines/app';
import { authMachine } from '../machines/auth';
-import { requestMachine } from '../machines/openIdBle/request/requestMachine';
-import { scanMachine } from '../machines/openIdBle/scan/scanMachine';
+import { requestMachine } from '../machines/bleShare/request/requestMachine';
+import { scanMachine } from '../machines/bleShare/scan/scanMachine';
import { settingsMachine } from '../machines/settings';
import { storeMachine } from '../machines/store';
import { vcMachine } from '../machines/vc';
diff --git a/shared/constants.ts b/shared/constants.ts
index f46084a9b..c5f1ea00c 100644
--- a/shared/constants.ts
+++ b/shared/constants.ts
@@ -15,7 +15,7 @@ export const RECEIVED_VCS_STORE_KEY = 'receivedVCs';
export const MY_LOGIN_STORE_KEY = 'myLogins';
export const VC_ITEM_STORE_KEY = (vc: Partial) =>
- `vc:${vc.idType}:${vc.id}:${vc.requestId}`;
+ `vc:${vc.idType}:${vc.id}:${vc.requestId}:${vc.isPinned}`;
//Regex expression to evaluate if the key is for a VC
export const VC_ITEM_STORE_KEY_REGEX = '^vc:(UIN|VID):[0-9]+:[a-z0-9-]+$';
diff --git a/shared/hooks/useFont.ts b/shared/hooks/useFont.ts
index 9dd7cd2ba..898ea849c 100644
--- a/shared/hooks/useFont.ts
+++ b/shared/hooks/useFont.ts
@@ -1,15 +1,15 @@
import {
- Poppins_400Regular,
- Poppins_600SemiBold,
- Poppins_700Bold,
+ Inter_400Regular,
+ Inter_600SemiBold,
+ Inter_700Bold,
useFonts,
-} from '@expo-google-fonts/poppins';
+} from '@expo-google-fonts/inter';
export function useFont() {
const [hasFontsLoaded] = useFonts({
- Poppins_400Regular,
- Poppins_600SemiBold,
- Poppins_700Bold,
+ Inter_400Regular,
+ Inter_600SemiBold,
+ Inter_700Bold,
});
return hasFontsLoaded;
diff --git a/types/react-native-dotenv/index.d.ts b/types/react-native-dotenv/index.d.ts
index c57951246..1396640f9 100644
--- a/types/react-native-dotenv/index.d.ts
+++ b/types/react-native-dotenv/index.d.ts
@@ -18,4 +18,9 @@ declare module 'react-native-dotenv' {
* Flag for Toggling environment url
*/
export const CREDENTIAL_REGISTRY_EDIT: string;
+
+ /**
+ * LANGUAGE for the unsupported device languages
+ */
+ export const APPLICATION_LANGUAGE: string;
}
diff --git a/types/vc.ts b/types/vc.ts
index e7a09f2da..fdf7a915c 100644
--- a/types/vc.ts
+++ b/types/vc.ts
@@ -16,6 +16,7 @@ export interface VC {
shouldVerifyPresence?: boolean;
walletBindingResponse?: WalletBindingResponse;
credentialRegistry: string;
+ isPinned?: boolean;
}
export interface VCSharingReason {