@procivis/one-react-native-components 0.3.27 → 0.3.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/components/entity/entity-attributes.js +14 -1
- package/lib/commonjs/components/entity/entity-attributes.js.map +1 -1
- package/lib/commonjs/components/entity/entity-details-with-buttons.js +9 -42
- package/lib/commonjs/components/entity/entity-details-with-buttons.js.map +1 -1
- package/lib/commonjs/components/entity/entity-details.js +60 -32
- package/lib/commonjs/components/entity/entity-details.js.map +1 -1
- package/lib/commonjs/components/entity/index.js +2 -15
- package/lib/commonjs/components/entity/index.js.map +1 -1
- package/lib/commonjs/components/history/history-list-item.js +14 -12
- package/lib/commonjs/components/history/history-list-item.js.map +1 -1
- package/lib/commonjs/components/proof-request/share-credential.js +1 -2
- package/lib/commonjs/components/proof-request/share-credential.js.map +1 -1
- package/lib/commonjs/ui-components/blur/index.js +2 -9
- package/lib/commonjs/ui-components/blur/index.js.map +1 -1
- package/lib/commonjs/ui-components/buttons/hold-button.js +3 -2
- package/lib/commonjs/ui-components/buttons/hold-button.js.map +1 -1
- package/lib/commonjs/ui-components/camera/index.js +2 -9
- package/lib/commonjs/ui-components/camera/index.js.map +1 -1
- package/lib/commonjs/ui-components/control/index.js +0 -12
- package/lib/commonjs/ui-components/control/index.js.map +1 -1
- package/lib/commonjs/ui-components/credential/card/credential-details-card.js +1 -1
- package/lib/commonjs/ui-components/credential/card/credential-details-card.js.map +1 -1
- package/lib/commonjs/ui-components/credential/credential-carousel-images.js +15 -8
- package/lib/commonjs/ui-components/credential/credential-carousel-images.js.map +1 -1
- package/lib/commonjs/ui-components/entity/entity-cluster.js +50 -2
- package/lib/commonjs/ui-components/entity/entity-cluster.js.map +1 -1
- package/lib/commonjs/ui-components/entity/index.js +3 -16
- package/lib/commonjs/ui-components/entity/index.js.map +1 -1
- package/lib/commonjs/ui-components/history/history-details.js +1 -1
- package/lib/commonjs/ui-components/history/history-details.js.map +1 -1
- package/lib/commonjs/ui-components/history/index.js +4 -27
- package/lib/commonjs/ui-components/history/index.js.map +1 -1
- package/lib/commonjs/ui-components/icons/entity.js +10 -13
- package/lib/commonjs/ui-components/icons/entity.js.map +1 -1
- package/lib/commonjs/ui-components/input/index.js +3 -32
- package/lib/commonjs/ui-components/input/index.js.map +1 -1
- package/lib/commonjs/ui-components/list/index.js +4 -19
- package/lib/commonjs/ui-components/list/index.js.map +1 -1
- package/lib/commonjs/ui-components/loader/index.js +2 -13
- package/lib/commonjs/ui-components/loader/index.js.map +1 -1
- package/lib/commonjs/ui-components/pin/index.js +2 -21
- package/lib/commonjs/ui-components/pin/index.js.map +1 -1
- package/lib/commonjs/ui-components/screens/nerd-mode-screen.js.map +1 -1
- package/lib/commonjs/ui-components/searchbar/index.js +3 -16
- package/lib/commonjs/ui-components/searchbar/index.js.map +1 -1
- package/lib/commonjs/ui-components/settings/index.js +6 -37
- package/lib/commonjs/ui-components/settings/index.js.map +1 -1
- package/lib/commonjs/ui-components/state/index.js +2 -15
- package/lib/commonjs/ui-components/state/index.js.map +1 -1
- package/lib/commonjs/utils/date.js +1 -1
- package/lib/commonjs/utils/date.js.map +1 -1
- package/lib/commonjs/utils/hooks/connectivity/connectivity.test.js +4 -0
- package/lib/commonjs/utils/hooks/connectivity/connectivity.test.js.map +1 -1
- package/lib/commonjs/utils/hooks/core/backup.js +22 -66
- package/lib/commonjs/utils/hooks/core/backup.js.map +1 -1
- package/lib/commonjs/utils/hooks/core/core-init.js +6 -2
- package/lib/commonjs/utils/hooks/core/core-init.js.map +1 -1
- package/lib/commonjs/utils/hooks/core/identifiers.js +23 -1
- package/lib/commonjs/utils/hooks/core/identifiers.js.map +1 -1
- package/lib/commonjs/utils/hooks/core/proofs.js +24 -14
- package/lib/commonjs/utils/hooks/core/proofs.js.map +1 -1
- package/lib/commonjs/utils/hooks/core/trust-entity.js +55 -14
- package/lib/commonjs/utils/hooks/core/trust-entity.js.map +1 -1
- package/lib/commonjs/utils/parsers/credential-sharing.js +6 -15
- package/lib/commonjs/utils/parsers/credential-sharing.js.map +1 -1
- package/lib/commonjs/utils/parsers/query.js +21 -3
- package/lib/commonjs/utils/parsers/query.js.map +1 -1
- package/lib/module/components/entity/entity-attributes.js +15 -2
- package/lib/module/components/entity/entity-attributes.js.map +1 -1
- package/lib/module/components/entity/entity-details-with-buttons.js +11 -44
- package/lib/module/components/entity/entity-details-with-buttons.js.map +1 -1
- package/lib/module/components/entity/entity-details.js +60 -32
- package/lib/module/components/entity/entity-details.js.map +1 -1
- package/lib/module/components/entity/index.js +2 -2
- package/lib/module/components/entity/index.js.map +1 -1
- package/lib/module/components/history/history-list-item.js +15 -13
- package/lib/module/components/history/history-list-item.js.map +1 -1
- package/lib/module/components/proof-request/share-credential.js +1 -2
- package/lib/module/components/proof-request/share-credential.js.map +1 -1
- package/lib/module/ui-components/blur/index.js +2 -2
- package/lib/module/ui-components/blur/index.js.map +1 -1
- package/lib/module/ui-components/buttons/hold-button.js +4 -3
- package/lib/module/ui-components/buttons/hold-button.js.map +1 -1
- package/lib/module/ui-components/camera/index.js +2 -2
- package/lib/module/ui-components/camera/index.js.map +1 -1
- package/lib/module/ui-components/control/index.js +3 -3
- package/lib/module/ui-components/control/index.js.map +1 -1
- package/lib/module/ui-components/credential/card/credential-details-card.js +1 -1
- package/lib/module/ui-components/credential/card/credential-details-card.js.map +1 -1
- package/lib/module/ui-components/credential/credential-carousel-images.js +15 -8
- package/lib/module/ui-components/credential/credential-carousel-images.js.map +1 -1
- package/lib/module/ui-components/entity/entity-cluster.js +51 -3
- package/lib/module/ui-components/entity/entity-cluster.js.map +1 -1
- package/lib/module/ui-components/entity/index.js +4 -4
- package/lib/module/ui-components/entity/index.js.map +1 -1
- package/lib/module/ui-components/history/history-details.js +1 -1
- package/lib/module/ui-components/history/history-details.js.map +1 -1
- package/lib/module/ui-components/history/index.js +6 -6
- package/lib/module/ui-components/history/index.js.map +1 -1
- package/lib/module/ui-components/icons/entity.js +10 -13
- package/lib/module/ui-components/icons/entity.js.map +1 -1
- package/lib/module/ui-components/input/index.js +6 -6
- package/lib/module/ui-components/input/index.js.map +1 -1
- package/lib/module/ui-components/list/index.js +4 -4
- package/lib/module/ui-components/list/index.js.map +1 -1
- package/lib/module/ui-components/loader/index.js +4 -4
- package/lib/module/ui-components/loader/index.js.map +1 -1
- package/lib/module/ui-components/pin/index.js +3 -3
- package/lib/module/ui-components/pin/index.js.map +1 -1
- package/lib/module/ui-components/screens/nerd-mode-screen.js.map +1 -1
- package/lib/module/ui-components/searchbar/index.js +4 -4
- package/lib/module/ui-components/searchbar/index.js.map +1 -1
- package/lib/module/ui-components/settings/index.js +10 -10
- package/lib/module/ui-components/settings/index.js.map +1 -1
- package/lib/module/ui-components/state/index.js +2 -2
- package/lib/module/ui-components/state/index.js.map +1 -1
- package/lib/module/utils/date.js +1 -1
- package/lib/module/utils/date.js.map +1 -1
- package/lib/module/utils/hooks/connectivity/connectivity.test.js +4 -0
- package/lib/module/utils/hooks/connectivity/connectivity.test.js.map +1 -1
- package/lib/module/utils/hooks/core/backup.js +24 -68
- package/lib/module/utils/hooks/core/backup.js.map +1 -1
- package/lib/module/utils/hooks/core/core-init.js +5 -3
- package/lib/module/utils/hooks/core/core-init.js.map +1 -1
- package/lib/module/utils/hooks/core/identifiers.js +21 -0
- package/lib/module/utils/hooks/core/identifiers.js.map +1 -1
- package/lib/module/utils/hooks/core/proofs.js +24 -14
- package/lib/module/utils/hooks/core/proofs.js.map +1 -1
- package/lib/module/utils/hooks/core/trust-entity.js +55 -14
- package/lib/module/utils/hooks/core/trust-entity.js.map +1 -1
- package/lib/module/utils/parsers/credential-sharing.js +6 -15
- package/lib/module/utils/parsers/credential-sharing.js.map +1 -1
- package/lib/module/utils/parsers/query.js +19 -2
- package/lib/module/utils/parsers/query.js.map +1 -1
- package/lib/typescript/components/entity/entity-attributes.d.ts +1 -0
- package/lib/typescript/components/entity/entity-details-with-buttons.d.ts +1 -2
- package/lib/typescript/components/entity/entity-details.d.ts +3 -2
- package/lib/typescript/components/entity/index.d.ts +2 -1
- package/lib/typescript/ui-components/blur/index.d.ts +2 -1
- package/lib/typescript/ui-components/buttons/hold-button.d.ts +2 -2
- package/lib/typescript/ui-components/camera/index.d.ts +2 -1
- package/lib/typescript/ui-components/control/index.d.ts +4 -2
- package/lib/typescript/ui-components/credential/credential-carousel-images.d.ts +1 -0
- package/lib/typescript/ui-components/entity/entity-cluster.d.ts +1 -0
- package/lib/typescript/ui-components/entity/index.d.ts +4 -2
- package/lib/typescript/ui-components/history/history-details.d.ts +4 -1
- package/lib/typescript/ui-components/history/index.d.ts +6 -3
- package/lib/typescript/ui-components/input/index.d.ts +6 -3
- package/lib/typescript/ui-components/list/index.d.ts +4 -2
- package/lib/typescript/ui-components/loader/index.d.ts +4 -2
- package/lib/typescript/ui-components/pin/index.d.ts +4 -2
- package/lib/typescript/ui-components/screens/nerd-mode-screen.d.ts +1 -1
- package/lib/typescript/ui-components/searchbar/index.d.ts +4 -2
- package/lib/typescript/ui-components/settings/index.d.ts +10 -5
- package/lib/typescript/ui-components/state/index.d.ts +2 -1
- package/lib/typescript/utils/hooks/core/backup.d.ts +5 -0
- package/lib/typescript/utils/hooks/core/core-init.d.ts +4 -1
- package/lib/typescript/utils/hooks/core/identifiers.d.ts +4 -1
- package/lib/typescript/utils/hooks/core/proofs.d.ts +1 -0
- package/lib/typescript/utils/hooks/core/trust-entity.d.ts +9 -3
- package/lib/typescript/utils/parsers/query.d.ts +3 -2
- package/package.json +10 -5
- package/src/components/entity/entity-attributes.tsx +16 -2
- package/src/components/entity/entity-details-with-buttons.tsx +11 -42
- package/src/components/entity/entity-details.tsx +60 -30
- package/src/components/entity/index.ts +2 -1
- package/src/components/history/history-list-item.tsx +17 -13
- package/src/components/proof-request/share-credential.tsx +0 -1
- package/src/ui-components/blur/index.ts +2 -1
- package/src/ui-components/buttons/hold-button.tsx +6 -5
- package/src/ui-components/camera/index.tsx +2 -1
- package/src/ui-components/control/index.ts +4 -2
- package/src/ui-components/credential/card/credential-details-card.tsx +1 -1
- package/src/ui-components/credential/credential-carousel-images.tsx +15 -8
- package/src/ui-components/entity/entity-cluster.tsx +63 -10
- package/src/ui-components/entity/index.ts +4 -2
- package/src/ui-components/history/history-details.tsx +5 -2
- package/src/ui-components/history/index.ts +6 -3
- package/src/ui-components/icons/entity.tsx +8 -12
- package/src/ui-components/input/index.ts +6 -3
- package/src/ui-components/list/index.ts +4 -2
- package/src/ui-components/loader/index.ts +4 -2
- package/src/ui-components/pin/index.ts +4 -2
- package/src/ui-components/screens/nerd-mode-screen.tsx +1 -1
- package/src/ui-components/searchbar/index.ts +4 -2
- package/src/ui-components/settings/index.ts +10 -5
- package/src/ui-components/state/index.ts +2 -1
- package/src/utils/date.ts +1 -1
- package/src/utils/hooks/connectivity/connectivity.test.ts +7 -2
- package/src/utils/hooks/core/backup.ts +30 -72
- package/src/utils/hooks/core/core-init.ts +5 -3
- package/src/utils/hooks/core/identifiers.ts +22 -1
- package/src/utils/hooks/core/proofs.ts +27 -16
- package/src/utils/hooks/core/trust-entity.ts +45 -11
- package/src/utils/parsers/credential-sharing.tsx +8 -14
- package/src/utils/parsers/query.tsx +12 -2
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import { TrustEntityRoleEnum, TrustEntityStateEnum } from '@procivis/react-native-one-core';
|
|
2
|
-
import {
|
|
3
|
-
import React, { FC, memo, useMemo } from 'react';
|
|
1
|
+
import { IdentifierListItem, TrustEntityRoleEnum, TrustEntityStateEnum } from '@procivis/react-native-one-core';
|
|
2
|
+
import React, { FC, memo } from 'react';
|
|
4
3
|
import { StyleProp, View, ViewStyle } from 'react-native';
|
|
5
4
|
|
|
6
|
-
import EntityCluster from '../../ui-components/entity/entity-cluster';
|
|
7
|
-
import { EntityNotTrustedIcon, EntityTrustedIcon } from '../../ui-components/icons';
|
|
8
5
|
import { AttributesLabels, EntityLabels, EntityType } from '../../ui-components/screens/nerd-mode-screen';
|
|
9
6
|
import { useAppColorScheme } from '../../ui-components/theme/color-scheme-context';
|
|
10
|
-
import { concatTestID,
|
|
7
|
+
import { concatTestID, useIdentifierDetails } from '../../utils';
|
|
11
8
|
import { useTrustEntity } from '../../utils/hooks/core/trust-entity';
|
|
12
9
|
import EntityAttributes from './entity-attributes';
|
|
10
|
+
import EntityDetails from './entity-details';
|
|
13
11
|
import EntityButtons from './EntityButtons';
|
|
14
12
|
|
|
15
13
|
export type ContextRole = Exclude<TrustEntityRoleEnum, TrustEntityRoleEnum.BOTH>;
|
|
@@ -48,50 +46,21 @@ const EntityDetailsWithButtons: FC<EntityDetailsWithButtonsProps> = ({
|
|
|
48
46
|
(trustEntity.role === TrustEntityRoleEnum.BOTH || trustEntity.role === role),
|
|
49
47
|
);
|
|
50
48
|
|
|
51
|
-
const trustEntityName = useMemo(() => {
|
|
52
|
-
if (!trustEntity || !trusted) {
|
|
53
|
-
if (identifierDetail?.did) {
|
|
54
|
-
return replaceBreakingHyphens(identifierDetail.did.did);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return role === TrustEntityRoleEnum.ISSUER ? entityLabels.unknownIssuer : entityLabels.unknownVerifier;
|
|
58
|
-
}
|
|
59
|
-
return trustEntity.name;
|
|
60
|
-
}, [entityLabels, role, trustEntity, trusted, identifierDetail]);
|
|
61
|
-
|
|
62
|
-
const trustEntitySubline = useMemo(() => {
|
|
63
|
-
if (!trusted) {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return `${entityLabels.trusted} • ${trustEntity?.trustAnchor.name}`;
|
|
68
|
-
}, [trustEntity, trusted, entityLabels.trusted]);
|
|
69
|
-
|
|
70
|
-
const trustEntityStatusIcon = useMemo(() => {
|
|
71
|
-
if (!trusted) {
|
|
72
|
-
return <EntityNotTrustedIcon testID={concatTestID(testID, 'statusIcon', 'notTrusted')} />;
|
|
73
|
-
}
|
|
74
|
-
return <EntityTrustedIcon testID={concatTestID(testID, 'statusIcon', 'trusted')} />;
|
|
75
|
-
}, [testID, trusted]);
|
|
76
|
-
|
|
77
49
|
return (
|
|
78
50
|
<View style={{ backgroundColor: colorScheme.nerdView.background }}>
|
|
79
|
-
<
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
statusIcon: trustEntityStatusIcon,
|
|
84
|
-
testID: concatTestID(testID, 'avatar'),
|
|
51
|
+
<EntityDetails
|
|
52
|
+
identifier={identifier}
|
|
53
|
+
labels={{
|
|
54
|
+
unknown: role === TrustEntityRoleEnum.ISSUER ? entityLabels.unknownIssuer : entityLabels.unknownVerifier,
|
|
85
55
|
}}
|
|
86
|
-
|
|
87
|
-
subline={trustEntitySubline}
|
|
88
|
-
sublineColor={trusted ? colorScheme.success : colorScheme.white}
|
|
56
|
+
role={role}
|
|
89
57
|
testID={testID}
|
|
90
58
|
{...props}
|
|
91
59
|
/>
|
|
92
60
|
{trusted && <EntityButtons entity={trustEntity} labels={entityLabels} testID={concatTestID(testID, 'links')} />}
|
|
93
61
|
<EntityAttributes
|
|
94
|
-
|
|
62
|
+
certificate={identifierDetail?.certificates?.[0]?.chain}
|
|
63
|
+
did={identifierDetail?.did?.did}
|
|
95
64
|
trustEntity={trustEntity}
|
|
96
65
|
trusted={trusted}
|
|
97
66
|
labels={attributesLabels}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { TrustEntity, TrustEntityRoleEnum, TrustEntityStateEnum } from '@procivis/react-native-one-core';
|
|
2
|
-
import { IdentifierListItem } from '@procivis/react-native-one-core/dist/src/identifier';
|
|
1
|
+
import { IdentifierCertificateDetail, IdentifierListItem,TrustEntity, TrustEntityRoleEnum, TrustEntityStateEnum } from '@procivis/react-native-one-core';
|
|
3
2
|
import React, { FC, ReactNode, useMemo } from 'react';
|
|
4
3
|
import { StyleProp, ViewStyle } from 'react-native';
|
|
5
4
|
|
|
5
|
+
import { AvatarProps } from '../../ui-components';
|
|
6
6
|
import EntityCluster from '../../ui-components/entity/entity-cluster';
|
|
7
7
|
import { EntityNotTrustedIcon, EntityTrustedIcon } from '../../ui-components/icons';
|
|
8
8
|
import { concatTestID, replaceBreakingHyphens, useIdentifierDetails } from '../../utils';
|
|
@@ -17,6 +17,8 @@ export type EntityDetailsProps = {
|
|
|
17
17
|
renderMore?: (trustEntity: TrustEntity) => ReactNode;
|
|
18
18
|
role: Exclude<TrustEntityRoleEnum, TrustEntityRoleEnum.BOTH>;
|
|
19
19
|
style?: StyleProp<ViewStyle>;
|
|
20
|
+
sublineColor?: string;
|
|
21
|
+
textColor?: string;
|
|
20
22
|
testID?: string;
|
|
21
23
|
} & (
|
|
22
24
|
| {
|
|
@@ -27,52 +29,80 @@ export type EntityDetailsProps = {
|
|
|
27
29
|
}
|
|
28
30
|
);
|
|
29
31
|
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
+
const getCertificateCommonName = (certificate: IdentifierCertificateDetail): string | undefined => {
|
|
33
|
+
return certificate.x509Attributes.subject.split(', ').find((s) => s.startsWith('CN'))?.split('=')?.pop();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const EntityDetails: FC<EntityDetailsProps> = ({ labels, renderMore, role, style, testID, sublineColor, textColor, ...props }) => {
|
|
37
|
+
const { data, isLoading: isLoadingTrustEntity } = useTrustEntity('identifier' in props ? props.identifier?.id : undefined);
|
|
32
38
|
const trustEntity: TrustEntity | undefined = 'entity' in props ? props.entity : data ?? undefined;
|
|
33
|
-
const { data: identifierDetail } = useIdentifierDetails('identifier' in props ? props.identifier?.id : undefined);
|
|
39
|
+
const { data: identifierDetail, isLoading: isLoadingIdentifier } = useIdentifierDetails('identifier' in props ? props.identifier?.id : undefined);
|
|
34
40
|
|
|
35
41
|
const trusted =
|
|
36
42
|
trustEntity &&
|
|
37
43
|
trustEntity.state === TrustEntityStateEnum.ACTIVE &&
|
|
38
44
|
(trustEntity.role === TrustEntityRoleEnum.BOTH || trustEntity.role === role);
|
|
39
45
|
|
|
46
|
+
const isLoading = isLoadingIdentifier || isLoadingTrustEntity;
|
|
47
|
+
|
|
48
|
+
const avatarProps: AvatarProps | undefined = useMemo(() => {
|
|
49
|
+
if (isLoading) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const avatar = trusted && identifierDetail?.type === 'DID' && trustEntity.logo ? { imageSource: { uri: trustEntity.logo } } : undefined;
|
|
54
|
+
|
|
55
|
+
const placeholderText = identifierDetail?.type === 'CERTIFICATE' && identifierDetail.certificates?.[0] ? getCertificateCommonName(identifierDetail.certificates[0])?.substring(0, 1) : 'D';
|
|
56
|
+
|
|
57
|
+
const statusIcon = trusted ?
|
|
58
|
+
<EntityTrustedIcon testID={concatTestID(testID, 'statusIcon', 'trusted')} /> :
|
|
59
|
+
<EntityNotTrustedIcon testID={concatTestID(testID, 'statusIcon', 'notTrusted')} />;
|
|
60
|
+
|
|
61
|
+
if (trustEntity) {
|
|
62
|
+
return {
|
|
63
|
+
avatar,
|
|
64
|
+
placeholderText: trusted && identifierDetail?.type === 'DID' ? trustEntity.name.substring(0, 1) : placeholderText,
|
|
65
|
+
statusIcon,
|
|
66
|
+
testID: concatTestID(testID, 'avatar'),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
placeholderText,
|
|
72
|
+
statusIcon,
|
|
73
|
+
}
|
|
74
|
+
}, [trustEntity, trusted, identifierDetail, isLoading, testID]);
|
|
75
|
+
|
|
40
76
|
const trustEntityName = useMemo(() => {
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
77
|
+
if (isLoading) {
|
|
78
|
+
return '';
|
|
79
|
+
}
|
|
80
|
+
if (identifierDetail?.type === 'CERTIFICATE' && identifierDetail.certificates?.[0]) {
|
|
81
|
+
const commonName = getCertificateCommonName(identifierDetail.certificates[0]);
|
|
82
|
+
if (commonName) {
|
|
83
|
+
return commonName;
|
|
44
84
|
}
|
|
45
|
-
return labels.unknown;
|
|
46
85
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return <EntityNotTrustedIcon testID={concatTestID(testID, 'statusIcon', 'notTrusted')} />;
|
|
86
|
+
if (trustEntity) {
|
|
87
|
+
return trustEntity.name;
|
|
88
|
+
}
|
|
89
|
+
if (identifierDetail?.did?.did) {
|
|
90
|
+
return replaceBreakingHyphens(identifierDetail.did.did);
|
|
53
91
|
}
|
|
54
|
-
|
|
55
|
-
|
|
92
|
+
|
|
93
|
+
return labels.unknown;
|
|
94
|
+
}, [labels.unknown, trustEntity, identifierDetail, isLoading]);
|
|
56
95
|
|
|
57
96
|
return (
|
|
58
97
|
<>
|
|
59
98
|
<EntityCluster
|
|
60
|
-
avatar={
|
|
61
|
-
trustEntity
|
|
62
|
-
? {
|
|
63
|
-
avatar: trusted && trustEntity.logo ? { imageSource: { uri: trustEntity.logo } } : undefined,
|
|
64
|
-
placeholderText: trusted ? trustEntity.name.substring(0, 1) : "U",
|
|
65
|
-
statusIcon: trustEntityStatusIcon,
|
|
66
|
-
testID: concatTestID(testID, 'avatar'),
|
|
67
|
-
}
|
|
68
|
-
: {
|
|
69
|
-
statusIcon: trustEntityStatusIcon,
|
|
70
|
-
placeholderText: "U",
|
|
71
|
-
}
|
|
72
|
-
}
|
|
99
|
+
avatar={avatarProps}
|
|
73
100
|
entityName={trustEntityName}
|
|
74
101
|
style={style}
|
|
75
102
|
testID={testID}
|
|
103
|
+
textColor={textColor}
|
|
104
|
+
sublineColor={sublineColor}
|
|
105
|
+
isLoading={isLoading}
|
|
76
106
|
/>
|
|
77
107
|
{trustEntity && renderMore && renderMore(trustEntity)}
|
|
78
108
|
</>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { EntityDetailsLabels, EntityDetailsProps } from './entity-details';
|
|
2
|
+
import EntityDetails from './entity-details';
|
|
2
3
|
|
|
3
4
|
export { EntityDetails, EntityDetailsLabels, EntityDetailsProps };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HistoryActionEnum, HistoryEntityTypeEnum, HistoryListItem } from '@procivis/react-native-one-core';
|
|
2
|
-
import React, { FC, useCallback } from 'react';
|
|
2
|
+
import React, { FC, useCallback, useMemo } from 'react';
|
|
3
3
|
|
|
4
4
|
import { HistoryItemView } from '../../ui-components';
|
|
5
5
|
import { formatTime, useTrustEntity } from '../../utils';
|
|
@@ -29,20 +29,24 @@ export const HistoryListItemView: FC<HistoryListItemViewProps> = ({
|
|
|
29
29
|
labels,
|
|
30
30
|
last,
|
|
31
31
|
onPress,
|
|
32
|
-
testID
|
|
32
|
+
testID,
|
|
33
33
|
}) => {
|
|
34
|
-
const
|
|
34
|
+
const identifierId = infoLabelMode === 'entity' ? item.target : undefined;
|
|
35
|
+
const { data: trustEntity } = useTrustEntity(identifierId);
|
|
35
36
|
|
|
36
37
|
const label = `${labels.entityTypes[item.entityType]} ${labels.actions[item.action]}`;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
|
|
39
|
+
const info = useMemo(() => {
|
|
40
|
+
switch (infoLabelMode) {
|
|
41
|
+
case 'entity':
|
|
42
|
+
return trustEntity?.name;
|
|
43
|
+
case 'associatedLabel':
|
|
44
|
+
return item.name;
|
|
45
|
+
case 'none':
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}, [infoLabelMode, item, trustEntity]);
|
|
49
|
+
|
|
46
50
|
const icon = <HistoryListItemIcon item={item} />;
|
|
47
51
|
|
|
48
52
|
const pressHandler = useCallback(() => {
|
|
@@ -53,7 +57,7 @@ export const HistoryListItemView: FC<HistoryListItemViewProps> = ({
|
|
|
53
57
|
<HistoryItemView
|
|
54
58
|
first={first}
|
|
55
59
|
icon={icon}
|
|
56
|
-
info={
|
|
60
|
+
info={info}
|
|
57
61
|
label={label}
|
|
58
62
|
last={last}
|
|
59
63
|
onPress={pressHandler}
|
|
@@ -11,7 +11,7 @@ import Animated, {
|
|
|
11
11
|
withTiming,
|
|
12
12
|
} from 'react-native-reanimated';
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { TouchableOpacity, TouchableOpacityRef } from '../accessibility/accessibilityHistoryWrappers';
|
|
15
15
|
import { Typography } from '../text';
|
|
16
16
|
import { useAppColorScheme } from '../theme';
|
|
17
17
|
|
|
@@ -96,7 +96,7 @@ const Content = ({
|
|
|
96
96
|
};
|
|
97
97
|
|
|
98
98
|
interface HoldButtonLayoutedProps extends Omit<HoldButtonProps, 'style'> {
|
|
99
|
-
ref: React.ForwardedRef<
|
|
99
|
+
ref: React.ForwardedRef<TouchableOpacityRef>;
|
|
100
100
|
width: number;
|
|
101
101
|
height: number;
|
|
102
102
|
}
|
|
@@ -182,16 +182,17 @@ const HoldButtonLayouted = ({
|
|
|
182
182
|
</Animated.View>
|
|
183
183
|
)}
|
|
184
184
|
<View style={styles.pressableLayer}>
|
|
185
|
-
<
|
|
185
|
+
<TouchableOpacity
|
|
186
186
|
accessibilityRole="button"
|
|
187
187
|
ref={ref}
|
|
188
188
|
disabled={isFinished || disabled}
|
|
189
189
|
onLongPress={onLongPress}
|
|
190
190
|
onPressIn={isFinished ? undefined : onPressIn}
|
|
191
191
|
onPressOut={isFinished ? undefined : onPressOut}
|
|
192
|
+
activeOpacity={1}
|
|
192
193
|
{...props}>
|
|
193
194
|
<View style={{ width, height }} />
|
|
194
|
-
</
|
|
195
|
+
</TouchableOpacity>
|
|
195
196
|
</View>
|
|
196
197
|
</>
|
|
197
198
|
);
|
|
@@ -202,7 +203,7 @@ const HoldButtonLayouted = ({
|
|
|
202
203
|
*
|
|
203
204
|
* follows design: https://www.figma.com/design/cCmAyBQrQWCQZuDi85pJfe/Procivis-One-Wallet-Developments-2025?node-id=1-871
|
|
204
205
|
*/
|
|
205
|
-
const HoldButton = React.forwardRef<
|
|
206
|
+
const HoldButton = React.forwardRef<TouchableOpacityRef, HoldButtonProps>(
|
|
206
207
|
({ style, disabled, ...props }, ref) => {
|
|
207
208
|
const colorScheme = useAppColorScheme();
|
|
208
209
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { CheckboxProps } from './checkbox';
|
|
2
|
+
import { Checkbox } from './checkbox';
|
|
3
|
+
import type { SwitchProps } from './switch';
|
|
4
|
+
import { Switch } from './switch';
|
|
3
5
|
|
|
4
6
|
export { Checkbox, CheckboxProps, Switch, SwitchProps };
|
|
@@ -154,7 +154,7 @@ const CredentialDetailsCard: FC<CredentialDetailsCardProps> = ({
|
|
|
154
154
|
testID={concatTestID(card.testID, expanded ? 'expanded' : 'collapsed')}>
|
|
155
155
|
<CredentialCard
|
|
156
156
|
{...cardProps}
|
|
157
|
-
header={{ ...header, accessory: header.accessory ?? CaretIcon }}
|
|
157
|
+
header={{ ...header, accessory: header.accessory ?? (cardProps.onHeaderPress ? CaretIcon : undefined) }}
|
|
158
158
|
style={[styles.card, cardProps.style]}
|
|
159
159
|
/>
|
|
160
160
|
{previewAttributes.length > 0 && (
|
|
@@ -64,17 +64,24 @@ type QrCodeProps = {
|
|
|
64
64
|
content: string;
|
|
65
65
|
padding?: number;
|
|
66
66
|
testID?: string;
|
|
67
|
+
onError?: (err: string) => void;
|
|
67
68
|
};
|
|
68
69
|
|
|
69
|
-
export const QrCode: FC<QrCodeProps> = ({ content, padding, testID }) => {
|
|
70
|
+
export const QrCode: FC<QrCodeProps> = ({ content, padding, testID, onError }) => {
|
|
70
71
|
const qrCodeXml = useMemo(() => {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
try {
|
|
73
|
+
return new QRCode({
|
|
74
|
+
container: 'svg-viewbox',
|
|
75
|
+
content,
|
|
76
|
+
ecl: 'L',
|
|
77
|
+
join: true,
|
|
78
|
+
padding: padding ?? 1,
|
|
79
|
+
}).svg();
|
|
80
|
+
} catch (err) {
|
|
81
|
+
onError && onError(err instanceof Error ? err.message : 'Unknown error occurred.');
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}, [content, onError, padding]);
|
|
78
85
|
return <SvgXml height={'100%'} testID={testID} width={'100%'} xml={qrCodeXml} />;
|
|
79
86
|
};
|
|
80
87
|
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import React, { FunctionComponent, useMemo } from 'react';
|
|
1
|
+
import React, { FunctionComponent, useEffect, useMemo } from 'react';
|
|
2
2
|
import { Platform, StyleSheet, View, ViewProps } from 'react-native';
|
|
3
|
+
import Animated, {
|
|
4
|
+
useAnimatedStyle,
|
|
5
|
+
useSharedValue,
|
|
6
|
+
withRepeat,
|
|
7
|
+
withTiming,
|
|
8
|
+
} from 'react-native-reanimated';
|
|
3
9
|
|
|
10
|
+
import { LoaderView, LoaderViewState } from '../../ui-components/loader';
|
|
4
11
|
import { concatTestID } from '../../utils';
|
|
5
12
|
import Typography from '../text/typography';
|
|
6
13
|
import { useAppColorScheme } from '../theme/color-scheme-context';
|
|
@@ -13,6 +20,7 @@ export type EntityClusterProps = ViewProps & {
|
|
|
13
20
|
textColor?: string;
|
|
14
21
|
sublineColor?: string;
|
|
15
22
|
testID?: string;
|
|
23
|
+
isLoading?: boolean;
|
|
16
24
|
};
|
|
17
25
|
|
|
18
26
|
// https://www.figma.com/file/52qDYWUMjXAGre1dcnz5bz/Procivis-One-Wallet?type=design&node-id=426-25595&mode=design&t=YI1oD2BfBie5HcvJ-0
|
|
@@ -24,31 +32,67 @@ const EntityCluster: FunctionComponent<EntityClusterProps> = ({
|
|
|
24
32
|
style,
|
|
25
33
|
sublineColor,
|
|
26
34
|
testID,
|
|
35
|
+
isLoading,
|
|
27
36
|
...viewProps
|
|
28
37
|
}) => {
|
|
29
38
|
const colorScheme = useAppColorScheme();
|
|
39
|
+
|
|
40
|
+
const opacity = useSharedValue<number>(1);
|
|
41
|
+
|
|
42
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
43
|
+
opacity: opacity.value,
|
|
44
|
+
}));
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (!isLoading) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
opacity.value = withRepeat(
|
|
51
|
+
withTiming(0.3, { duration: 1000 }),
|
|
52
|
+
0,
|
|
53
|
+
true
|
|
54
|
+
);
|
|
55
|
+
}, [opacity, isLoading]);
|
|
30
56
|
|
|
31
57
|
const avatarProps = useMemo<AvatarProps>(() => {
|
|
58
|
+
if (isLoading) {
|
|
59
|
+
return {
|
|
60
|
+
avatar: {
|
|
61
|
+
component:
|
|
62
|
+
<View style={[styles.loaderWrapper, { backgroundColor: colorScheme.grayDark }]}>
|
|
63
|
+
<View style={styles.loader}>
|
|
64
|
+
<LoaderView animate={true} state={LoaderViewState.InProgress} />
|
|
65
|
+
</View>
|
|
66
|
+
</View>
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
32
70
|
const initials = entityName.split(' ', 3).map((word: string) => word[0]);
|
|
33
71
|
const placeholderText = initials.length > 0 ? initials.join('') : '';
|
|
34
72
|
return {
|
|
35
73
|
...avatar,
|
|
36
74
|
placeholderText: avatar?.placeholderText ?? placeholderText,
|
|
37
75
|
};
|
|
38
|
-
}, [avatar, entityName]);
|
|
76
|
+
}, [avatar, entityName, colorScheme.grayDark, isLoading]);
|
|
39
77
|
|
|
40
78
|
return (
|
|
41
79
|
<View style={[styles.entity, style]} testID={testID} {...viewProps}>
|
|
42
80
|
<Avatar testID={concatTestID(testID, 'avatar')} {...avatarProps} />
|
|
43
81
|
<View style={styles.labels}>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
82
|
+
{isLoading ? (
|
|
83
|
+
<Animated.View style={[{ backgroundColor: colorScheme.grayDark }, animatedStyle]}>
|
|
84
|
+
<Typography color={colorScheme.grayDark} />
|
|
85
|
+
</Animated.View>
|
|
86
|
+
) : (
|
|
87
|
+
<Typography
|
|
88
|
+
testID={concatTestID(testID, 'entityName')}
|
|
89
|
+
color={textColor ?? colorScheme.text}
|
|
90
|
+
numberOfLines={1}
|
|
91
|
+
preset="m"
|
|
92
|
+
style={styles.entityName}>
|
|
93
|
+
{!isLoading ? entityName : undefined}
|
|
94
|
+
</Typography>
|
|
95
|
+
)}
|
|
52
96
|
{subline && (
|
|
53
97
|
<View>
|
|
54
98
|
<Typography
|
|
@@ -77,6 +121,15 @@ const styles = StyleSheet.create({
|
|
|
77
121
|
flex: 1,
|
|
78
122
|
marginLeft: 12,
|
|
79
123
|
},
|
|
124
|
+
loader: {
|
|
125
|
+
transform: [{scale: 0.5}],
|
|
126
|
+
},
|
|
127
|
+
loaderWrapper: {
|
|
128
|
+
height: 72,
|
|
129
|
+
paddingLeft: 3,
|
|
130
|
+
paddingTop: 4,
|
|
131
|
+
width: 72,
|
|
132
|
+
}
|
|
80
133
|
});
|
|
81
134
|
|
|
82
135
|
export default EntityCluster;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import type { AvatarProps } from './avatar';
|
|
2
|
+
import Avatar from './avatar';
|
|
3
|
+
import type { EntityClusterProps } from './entity-cluster';
|
|
4
|
+
import EntityCluster from './entity-cluster';
|
|
3
5
|
|
|
4
6
|
export { Avatar, AvatarProps };
|
|
5
7
|
export { EntityCluster, EntityClusterProps };
|
|
@@ -37,7 +37,10 @@ type CredentialDetails = Omit<
|
|
|
37
37
|
type CredentialCard = Omit<
|
|
38
38
|
CredentialDetailsCardListItemProps,
|
|
39
39
|
'expanded' | 'labels' | 'lastItem' | 'onHeaderPress' | 'onImagePreview'
|
|
40
|
-
|
|
40
|
+
> & {
|
|
41
|
+
/** default: true */
|
|
42
|
+
headerPressable?: boolean;
|
|
43
|
+
};
|
|
41
44
|
|
|
42
45
|
export type HistoryDetailsViewProps = {
|
|
43
46
|
assets?: {
|
|
@@ -195,7 +198,7 @@ export const HistoryDetailsView: FC<HistoryDetailsViewProps> = ({
|
|
|
195
198
|
...props.credentialCard,
|
|
196
199
|
card: {
|
|
197
200
|
...props.credentialCard.card,
|
|
198
|
-
onHeaderPress,
|
|
201
|
+
onHeaderPress: props.credentialCard.headerPressable === false ? undefined : onHeaderPress,
|
|
199
202
|
},
|
|
200
203
|
};
|
|
201
204
|
return (
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import type { DataItemProps } from './data-item';
|
|
2
|
+
import DataItem from './data-item';
|
|
3
|
+
import type { HistoryItemViewProps } from './history-item';
|
|
4
|
+
import HistoryItemView from './history-item';
|
|
3
5
|
import HistorySectionHeaderView from './history-section-header';
|
|
4
|
-
import
|
|
6
|
+
import type { HistorySectionListItemProps } from './history-section-list-item';
|
|
7
|
+
import HistorySectionListItem from './history-section-list-item';
|
|
5
8
|
|
|
6
9
|
export * from './history-details';
|
|
7
10
|
export { DataItem, DataItemProps };
|
|
@@ -30,28 +30,24 @@ export const EntityTrustedIcon: FC<SvgProps> = ({ ...props }) => {
|
|
|
30
30
|
);
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
// https://www.figma.com/design/52qDYWUMjXAGre1dcnz5bz/Procivis-One-Wallet?node-id=415-5402&t=
|
|
33
|
+
// https://www.figma.com/design/52qDYWUMjXAGre1dcnz5bz/Procivis-One-Wallet?node-id=415-5402&t=8jP7yF4eYj70Gm9A-0
|
|
34
34
|
export const EntityNotTrustedIcon: FC<SvgProps> = ({ ...props }) => {
|
|
35
35
|
const colorScheme = useAppColorScheme();
|
|
36
36
|
return (
|
|
37
|
-
<Svg width={22} height={
|
|
37
|
+
<Svg width={22} height={22} viewBox="0 0 22 22" fill="none" {...props}>
|
|
38
38
|
<Path
|
|
39
|
-
d="
|
|
40
|
-
fill={colorScheme.
|
|
39
|
+
d="M10.575 20a8.241 8.241 0 01-3.312-.672 8.649 8.649 0 01-2.74-1.851 8.837 8.837 0 01-1.85-2.74A8.242 8.242 0 012 11.425c0-1.173.224-2.277.672-3.312a8.793 8.793 0 014.582-4.59 8.243 8.243 0 013.312-.672c1.18 0 2.286.224 3.32.672a8.766 8.766 0 012.74 1.86 8.667 8.667 0 011.86 2.73 8.243 8.243 0 01.672 3.312 8.243 8.243 0 01-.673 3.312 8.768 8.768 0 01-4.598 4.59 8.241 8.241 0 01-3.312.673z"
|
|
40
|
+
fill={colorScheme.error}
|
|
41
41
|
/>
|
|
42
42
|
<Path
|
|
43
|
-
d="M10.
|
|
43
|
+
d="M10.566 1.85c1.31 0 2.552.25 3.718.755a9.765 9.765 0 013.047 2.068l.321.335a9.671 9.671 0 011.751 2.708 9.244 9.244 0 01.755 3.71c0 1.304-.25 2.544-.755 3.709a9.766 9.766 0 01-5.123 5.112h0a9.242 9.242 0 01-3.705.753 9.244 9.244 0 01-3.706-.754 9.648 9.648 0 01-3.053-2.062l-.003-.002a9.836 9.836 0 01-2.058-3.047A9.242 9.242 0 011 11.425c0-1.304.25-2.544.755-3.71a9.793 9.793 0 015.1-5.11h.001a9.244 9.244 0 013.71-.754z"
|
|
44
44
|
stroke={colorScheme.white}
|
|
45
|
-
strokeWidth={2}
|
|
46
45
|
strokeOpacity={0.2}
|
|
46
|
+
strokeWidth={2}
|
|
47
47
|
/>
|
|
48
48
|
<Path
|
|
49
|
-
d="
|
|
50
|
-
fill={colorScheme.
|
|
51
|
-
/>
|
|
52
|
-
<Path
|
|
53
|
-
d="M11.4961 14.8711C11.2969 15.0482 11.0589 15.1367 10.7822 15.1367C10.5055 15.1367 10.2648 15.0482 10.0601 14.8711C9.86084 14.694 9.76123 14.4671 9.76123 14.1904C9.76123 13.9193 9.86084 13.6924 10.0601 13.5098C10.2593 13.3271 10.5 13.2358 10.7822 13.2358C11.0589 13.2358 11.2969 13.3271 11.4961 13.5098C11.6953 13.6924 11.7949 13.9193 11.7949 14.1904C11.7949 14.4671 11.6953 14.694 11.4961 14.8711Z"
|
|
54
|
-
fill={colorScheme.black}
|
|
49
|
+
d="M8.433 14.712a.822.822 0 01-.58.225.773.773 0 01-.557-.225.773.773 0 01-.224-.556c0-.216.077-.398.232-.548l2.167-2.174-2.167-2.159a.768.768 0 01-.232-.547c0-.227.074-.413.224-.557a.773.773 0 01.556-.224c.216 0 .401.072.556.216l2.175 2.167 2.183-2.167a.759.759 0 01.556-.232c.216 0 .399.077.548.232.155.15.232.332.232.548 0 .21-.077.396-.232.556l-2.175 2.167 2.167 2.166c.155.144.232.33.232.556a.759.759 0 01-.232.556.755.755 0 01-.556.225.765.765 0 01-.565-.225l-2.158-2.166-2.15 2.166z"
|
|
50
|
+
fill={colorScheme.white}
|
|
55
51
|
/>
|
|
56
52
|
</Svg>
|
|
57
53
|
)
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
1
|
+
import type { RadioGroupItem, RadioGroupProps } from './radio-group';
|
|
2
|
+
import RadioGroup from './radio-group';
|
|
3
|
+
import type { SelectionInputChoice, SelectionInputProps } from './selection-input';
|
|
4
|
+
import SelectionInput from './selection-input';
|
|
5
|
+
import type { TextInputProps } from './text-input';
|
|
6
|
+
import TextInput, { TextInputAccessory } from './text-input';
|
|
4
7
|
|
|
5
8
|
export { RadioGroup, RadioGroupItem, RadioGroupProps };
|
|
6
9
|
export { SelectionInput, SelectionInputChoice, SelectionInputProps };
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import type { ListSectionHeaderProps } from './list-section-header';
|
|
2
|
+
import ListSectionHeader from './list-section-header';
|
|
3
|
+
import type { ListTitleHeaderProps } from './list-title-header';
|
|
4
|
+
import ListTitleHeader from './list-title-header';
|
|
3
5
|
|
|
4
6
|
export { ListSectionHeader, ListSectionHeaderProps };
|
|
5
7
|
export { ListTitleHeader, ListTitleHeaderProps };
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import type { LoaderViewProps } from './loader';
|
|
2
|
+
import LoaderView, { LoaderViewState } from './loader';
|
|
3
|
+
import type { LoadingResultScreenProps } from './loading-result';
|
|
4
|
+
import LoadingResultScreen from './loading-result';
|
|
3
5
|
|
|
4
6
|
export { LoaderView, LoaderViewProps, LoaderViewState };
|
|
5
7
|
export { LoadingResultScreen, LoadingResultScreenProps };
|