@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.
Files changed (196) hide show
  1. package/lib/commonjs/components/entity/entity-attributes.js +14 -1
  2. package/lib/commonjs/components/entity/entity-attributes.js.map +1 -1
  3. package/lib/commonjs/components/entity/entity-details-with-buttons.js +9 -42
  4. package/lib/commonjs/components/entity/entity-details-with-buttons.js.map +1 -1
  5. package/lib/commonjs/components/entity/entity-details.js +60 -32
  6. package/lib/commonjs/components/entity/entity-details.js.map +1 -1
  7. package/lib/commonjs/components/entity/index.js +2 -15
  8. package/lib/commonjs/components/entity/index.js.map +1 -1
  9. package/lib/commonjs/components/history/history-list-item.js +14 -12
  10. package/lib/commonjs/components/history/history-list-item.js.map +1 -1
  11. package/lib/commonjs/components/proof-request/share-credential.js +1 -2
  12. package/lib/commonjs/components/proof-request/share-credential.js.map +1 -1
  13. package/lib/commonjs/ui-components/blur/index.js +2 -9
  14. package/lib/commonjs/ui-components/blur/index.js.map +1 -1
  15. package/lib/commonjs/ui-components/buttons/hold-button.js +3 -2
  16. package/lib/commonjs/ui-components/buttons/hold-button.js.map +1 -1
  17. package/lib/commonjs/ui-components/camera/index.js +2 -9
  18. package/lib/commonjs/ui-components/camera/index.js.map +1 -1
  19. package/lib/commonjs/ui-components/control/index.js +0 -12
  20. package/lib/commonjs/ui-components/control/index.js.map +1 -1
  21. package/lib/commonjs/ui-components/credential/card/credential-details-card.js +1 -1
  22. package/lib/commonjs/ui-components/credential/card/credential-details-card.js.map +1 -1
  23. package/lib/commonjs/ui-components/credential/credential-carousel-images.js +15 -8
  24. package/lib/commonjs/ui-components/credential/credential-carousel-images.js.map +1 -1
  25. package/lib/commonjs/ui-components/entity/entity-cluster.js +50 -2
  26. package/lib/commonjs/ui-components/entity/entity-cluster.js.map +1 -1
  27. package/lib/commonjs/ui-components/entity/index.js +3 -16
  28. package/lib/commonjs/ui-components/entity/index.js.map +1 -1
  29. package/lib/commonjs/ui-components/history/history-details.js +1 -1
  30. package/lib/commonjs/ui-components/history/history-details.js.map +1 -1
  31. package/lib/commonjs/ui-components/history/index.js +4 -27
  32. package/lib/commonjs/ui-components/history/index.js.map +1 -1
  33. package/lib/commonjs/ui-components/icons/entity.js +10 -13
  34. package/lib/commonjs/ui-components/icons/entity.js.map +1 -1
  35. package/lib/commonjs/ui-components/input/index.js +3 -32
  36. package/lib/commonjs/ui-components/input/index.js.map +1 -1
  37. package/lib/commonjs/ui-components/list/index.js +4 -19
  38. package/lib/commonjs/ui-components/list/index.js.map +1 -1
  39. package/lib/commonjs/ui-components/loader/index.js +2 -13
  40. package/lib/commonjs/ui-components/loader/index.js.map +1 -1
  41. package/lib/commonjs/ui-components/pin/index.js +2 -21
  42. package/lib/commonjs/ui-components/pin/index.js.map +1 -1
  43. package/lib/commonjs/ui-components/screens/nerd-mode-screen.js.map +1 -1
  44. package/lib/commonjs/ui-components/searchbar/index.js +3 -16
  45. package/lib/commonjs/ui-components/searchbar/index.js.map +1 -1
  46. package/lib/commonjs/ui-components/settings/index.js +6 -37
  47. package/lib/commonjs/ui-components/settings/index.js.map +1 -1
  48. package/lib/commonjs/ui-components/state/index.js +2 -15
  49. package/lib/commonjs/ui-components/state/index.js.map +1 -1
  50. package/lib/commonjs/utils/date.js +1 -1
  51. package/lib/commonjs/utils/date.js.map +1 -1
  52. package/lib/commonjs/utils/hooks/connectivity/connectivity.test.js +4 -0
  53. package/lib/commonjs/utils/hooks/connectivity/connectivity.test.js.map +1 -1
  54. package/lib/commonjs/utils/hooks/core/backup.js +22 -66
  55. package/lib/commonjs/utils/hooks/core/backup.js.map +1 -1
  56. package/lib/commonjs/utils/hooks/core/core-init.js +6 -2
  57. package/lib/commonjs/utils/hooks/core/core-init.js.map +1 -1
  58. package/lib/commonjs/utils/hooks/core/identifiers.js +23 -1
  59. package/lib/commonjs/utils/hooks/core/identifiers.js.map +1 -1
  60. package/lib/commonjs/utils/hooks/core/proofs.js +24 -14
  61. package/lib/commonjs/utils/hooks/core/proofs.js.map +1 -1
  62. package/lib/commonjs/utils/hooks/core/trust-entity.js +55 -14
  63. package/lib/commonjs/utils/hooks/core/trust-entity.js.map +1 -1
  64. package/lib/commonjs/utils/parsers/credential-sharing.js +6 -15
  65. package/lib/commonjs/utils/parsers/credential-sharing.js.map +1 -1
  66. package/lib/commonjs/utils/parsers/query.js +21 -3
  67. package/lib/commonjs/utils/parsers/query.js.map +1 -1
  68. package/lib/module/components/entity/entity-attributes.js +15 -2
  69. package/lib/module/components/entity/entity-attributes.js.map +1 -1
  70. package/lib/module/components/entity/entity-details-with-buttons.js +11 -44
  71. package/lib/module/components/entity/entity-details-with-buttons.js.map +1 -1
  72. package/lib/module/components/entity/entity-details.js +60 -32
  73. package/lib/module/components/entity/entity-details.js.map +1 -1
  74. package/lib/module/components/entity/index.js +2 -2
  75. package/lib/module/components/entity/index.js.map +1 -1
  76. package/lib/module/components/history/history-list-item.js +15 -13
  77. package/lib/module/components/history/history-list-item.js.map +1 -1
  78. package/lib/module/components/proof-request/share-credential.js +1 -2
  79. package/lib/module/components/proof-request/share-credential.js.map +1 -1
  80. package/lib/module/ui-components/blur/index.js +2 -2
  81. package/lib/module/ui-components/blur/index.js.map +1 -1
  82. package/lib/module/ui-components/buttons/hold-button.js +4 -3
  83. package/lib/module/ui-components/buttons/hold-button.js.map +1 -1
  84. package/lib/module/ui-components/camera/index.js +2 -2
  85. package/lib/module/ui-components/camera/index.js.map +1 -1
  86. package/lib/module/ui-components/control/index.js +3 -3
  87. package/lib/module/ui-components/control/index.js.map +1 -1
  88. package/lib/module/ui-components/credential/card/credential-details-card.js +1 -1
  89. package/lib/module/ui-components/credential/card/credential-details-card.js.map +1 -1
  90. package/lib/module/ui-components/credential/credential-carousel-images.js +15 -8
  91. package/lib/module/ui-components/credential/credential-carousel-images.js.map +1 -1
  92. package/lib/module/ui-components/entity/entity-cluster.js +51 -3
  93. package/lib/module/ui-components/entity/entity-cluster.js.map +1 -1
  94. package/lib/module/ui-components/entity/index.js +4 -4
  95. package/lib/module/ui-components/entity/index.js.map +1 -1
  96. package/lib/module/ui-components/history/history-details.js +1 -1
  97. package/lib/module/ui-components/history/history-details.js.map +1 -1
  98. package/lib/module/ui-components/history/index.js +6 -6
  99. package/lib/module/ui-components/history/index.js.map +1 -1
  100. package/lib/module/ui-components/icons/entity.js +10 -13
  101. package/lib/module/ui-components/icons/entity.js.map +1 -1
  102. package/lib/module/ui-components/input/index.js +6 -6
  103. package/lib/module/ui-components/input/index.js.map +1 -1
  104. package/lib/module/ui-components/list/index.js +4 -4
  105. package/lib/module/ui-components/list/index.js.map +1 -1
  106. package/lib/module/ui-components/loader/index.js +4 -4
  107. package/lib/module/ui-components/loader/index.js.map +1 -1
  108. package/lib/module/ui-components/pin/index.js +3 -3
  109. package/lib/module/ui-components/pin/index.js.map +1 -1
  110. package/lib/module/ui-components/screens/nerd-mode-screen.js.map +1 -1
  111. package/lib/module/ui-components/searchbar/index.js +4 -4
  112. package/lib/module/ui-components/searchbar/index.js.map +1 -1
  113. package/lib/module/ui-components/settings/index.js +10 -10
  114. package/lib/module/ui-components/settings/index.js.map +1 -1
  115. package/lib/module/ui-components/state/index.js +2 -2
  116. package/lib/module/ui-components/state/index.js.map +1 -1
  117. package/lib/module/utils/date.js +1 -1
  118. package/lib/module/utils/date.js.map +1 -1
  119. package/lib/module/utils/hooks/connectivity/connectivity.test.js +4 -0
  120. package/lib/module/utils/hooks/connectivity/connectivity.test.js.map +1 -1
  121. package/lib/module/utils/hooks/core/backup.js +24 -68
  122. package/lib/module/utils/hooks/core/backup.js.map +1 -1
  123. package/lib/module/utils/hooks/core/core-init.js +5 -3
  124. package/lib/module/utils/hooks/core/core-init.js.map +1 -1
  125. package/lib/module/utils/hooks/core/identifiers.js +21 -0
  126. package/lib/module/utils/hooks/core/identifiers.js.map +1 -1
  127. package/lib/module/utils/hooks/core/proofs.js +24 -14
  128. package/lib/module/utils/hooks/core/proofs.js.map +1 -1
  129. package/lib/module/utils/hooks/core/trust-entity.js +55 -14
  130. package/lib/module/utils/hooks/core/trust-entity.js.map +1 -1
  131. package/lib/module/utils/parsers/credential-sharing.js +6 -15
  132. package/lib/module/utils/parsers/credential-sharing.js.map +1 -1
  133. package/lib/module/utils/parsers/query.js +19 -2
  134. package/lib/module/utils/parsers/query.js.map +1 -1
  135. package/lib/typescript/components/entity/entity-attributes.d.ts +1 -0
  136. package/lib/typescript/components/entity/entity-details-with-buttons.d.ts +1 -2
  137. package/lib/typescript/components/entity/entity-details.d.ts +3 -2
  138. package/lib/typescript/components/entity/index.d.ts +2 -1
  139. package/lib/typescript/ui-components/blur/index.d.ts +2 -1
  140. package/lib/typescript/ui-components/buttons/hold-button.d.ts +2 -2
  141. package/lib/typescript/ui-components/camera/index.d.ts +2 -1
  142. package/lib/typescript/ui-components/control/index.d.ts +4 -2
  143. package/lib/typescript/ui-components/credential/credential-carousel-images.d.ts +1 -0
  144. package/lib/typescript/ui-components/entity/entity-cluster.d.ts +1 -0
  145. package/lib/typescript/ui-components/entity/index.d.ts +4 -2
  146. package/lib/typescript/ui-components/history/history-details.d.ts +4 -1
  147. package/lib/typescript/ui-components/history/index.d.ts +6 -3
  148. package/lib/typescript/ui-components/input/index.d.ts +6 -3
  149. package/lib/typescript/ui-components/list/index.d.ts +4 -2
  150. package/lib/typescript/ui-components/loader/index.d.ts +4 -2
  151. package/lib/typescript/ui-components/pin/index.d.ts +4 -2
  152. package/lib/typescript/ui-components/screens/nerd-mode-screen.d.ts +1 -1
  153. package/lib/typescript/ui-components/searchbar/index.d.ts +4 -2
  154. package/lib/typescript/ui-components/settings/index.d.ts +10 -5
  155. package/lib/typescript/ui-components/state/index.d.ts +2 -1
  156. package/lib/typescript/utils/hooks/core/backup.d.ts +5 -0
  157. package/lib/typescript/utils/hooks/core/core-init.d.ts +4 -1
  158. package/lib/typescript/utils/hooks/core/identifiers.d.ts +4 -1
  159. package/lib/typescript/utils/hooks/core/proofs.d.ts +1 -0
  160. package/lib/typescript/utils/hooks/core/trust-entity.d.ts +9 -3
  161. package/lib/typescript/utils/parsers/query.d.ts +3 -2
  162. package/package.json +10 -5
  163. package/src/components/entity/entity-attributes.tsx +16 -2
  164. package/src/components/entity/entity-details-with-buttons.tsx +11 -42
  165. package/src/components/entity/entity-details.tsx +60 -30
  166. package/src/components/entity/index.ts +2 -1
  167. package/src/components/history/history-list-item.tsx +17 -13
  168. package/src/components/proof-request/share-credential.tsx +0 -1
  169. package/src/ui-components/blur/index.ts +2 -1
  170. package/src/ui-components/buttons/hold-button.tsx +6 -5
  171. package/src/ui-components/camera/index.tsx +2 -1
  172. package/src/ui-components/control/index.ts +4 -2
  173. package/src/ui-components/credential/card/credential-details-card.tsx +1 -1
  174. package/src/ui-components/credential/credential-carousel-images.tsx +15 -8
  175. package/src/ui-components/entity/entity-cluster.tsx +63 -10
  176. package/src/ui-components/entity/index.ts +4 -2
  177. package/src/ui-components/history/history-details.tsx +5 -2
  178. package/src/ui-components/history/index.ts +6 -3
  179. package/src/ui-components/icons/entity.tsx +8 -12
  180. package/src/ui-components/input/index.ts +6 -3
  181. package/src/ui-components/list/index.ts +4 -2
  182. package/src/ui-components/loader/index.ts +4 -2
  183. package/src/ui-components/pin/index.ts +4 -2
  184. package/src/ui-components/screens/nerd-mode-screen.tsx +1 -1
  185. package/src/ui-components/searchbar/index.ts +4 -2
  186. package/src/ui-components/settings/index.ts +10 -5
  187. package/src/ui-components/state/index.ts +2 -1
  188. package/src/utils/date.ts +1 -1
  189. package/src/utils/hooks/connectivity/connectivity.test.ts +7 -2
  190. package/src/utils/hooks/core/backup.ts +30 -72
  191. package/src/utils/hooks/core/core-init.ts +5 -3
  192. package/src/utils/hooks/core/identifiers.ts +22 -1
  193. package/src/utils/hooks/core/proofs.ts +27 -16
  194. package/src/utils/hooks/core/trust-entity.ts +45 -11
  195. package/src/utils/parsers/credential-sharing.tsx +8 -14
  196. package/src/utils/parsers/query.tsx +12 -2
@@ -1,15 +1,13 @@
1
- import { TrustEntityRoleEnum, TrustEntityStateEnum } from '@procivis/react-native-one-core';
2
- import { IdentifierListItem } from '@procivis/react-native-one-core/dist/src/identifier';
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, replaceBreakingHyphens, useIdentifierDetails } from '../../utils';
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
- <EntityCluster
80
- avatar={{
81
- avatar: trusted && trustEntity?.logo ? { imageSource: { uri: trustEntity.logo } } : undefined,
82
- placeholderText: trusted ? trustEntity?.name.substring(0, 1) : "U",
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
- entityName={trustEntityName}
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
- did={trustEntity?.did?.did}
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 EntityDetails: FC<EntityDetailsProps> = ({ labels, renderMore, role, style, testID, ...props }) => {
31
- const { data } = useTrustEntity('identifier' in props ? props.identifier?.id : undefined);
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 (!trusted) {
42
- if (identifierDetail?.did?.did) {
43
- return replaceBreakingHyphens(identifierDetail.did.did);
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
- return trustEntity.name;
48
- }, [labels.unknown, trustEntity, trusted, identifierDetail]);
49
-
50
- const trustEntityStatusIcon = useMemo(() => {
51
- if (!trusted) {
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
- return <EntityTrustedIcon testID={concatTestID(testID, 'statusIcon', 'trusted')} />;
55
- }, [testID, trusted]);
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 EntityDetails, { EntityDetailsLabels, EntityDetailsProps } from './entity-details';
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 { data: entity } = useTrustEntity(infoLabelMode === 'entity' ? item.target : undefined);
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
- let infoLabel;
38
- switch (infoLabelMode) {
39
- case 'entity':
40
- infoLabel = entity?.name;
41
- break;
42
- case 'associatedLabel':
43
- infoLabel = item.name;
44
- break;
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={infoLabel}
60
+ info={info}
57
61
  label={label}
58
62
  last={last}
59
63
  onPress={pressHandler}
@@ -70,7 +70,6 @@ export const ShareCredential: FunctionComponent<{
70
70
  credential
71
71
  ? {
72
72
  ...credential,
73
- issuerDid: credential?.issuerDid?.id,
74
73
  issuer: credential?.issuer?.id,
75
74
  }
76
75
  : undefined,
@@ -1,3 +1,4 @@
1
- import BlurView, { BlurViewProps } from './blur-view';
1
+ import type { BlurViewProps } from './blur-view';
2
+ import BlurView from './blur-view';
2
3
 
3
4
  export { BlurView, BlurViewProps };
@@ -11,7 +11,7 @@ import Animated, {
11
11
  withTiming,
12
12
  } from 'react-native-reanimated';
13
13
 
14
- import { TouchableWithoutFeedback, TouchableWithoutFeedbackRef } from '../accessibility/accessibilityHistoryWrappers';
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<TouchableWithoutFeedbackRef>;
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
- <TouchableWithoutFeedback
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
- </TouchableWithoutFeedback>
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<TouchableWithoutFeedbackRef, HoldButtonProps>(
206
+ const HoldButton = React.forwardRef<TouchableOpacityRef, HoldButtonProps>(
206
207
  ({ style, disabled, ...props }, ref) => {
207
208
  const colorScheme = useAppColorScheme();
208
209
 
@@ -1,3 +1,4 @@
1
- import QRCodeScanner, { QRCodeScannerProps } from './qr-code-scanner';
1
+ import type { QRCodeScannerProps } from './qr-code-scanner';
2
+ import QRCodeScanner from './qr-code-scanner';
2
3
 
3
4
  export { QRCodeScanner, QRCodeScannerProps };
@@ -1,4 +1,6 @@
1
- import { Checkbox, CheckboxProps } from './checkbox';
2
- import { Switch, SwitchProps } from './switch';
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
- return new QRCode({
72
- container: 'svg-viewbox',
73
- content,
74
- join: true,
75
- padding: padding ?? 1,
76
- }).svg();
77
- }, [content, padding]);
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
- <Typography
45
- testID={concatTestID(testID, 'entityName')}
46
- color={textColor ?? colorScheme.text}
47
- numberOfLines={1}
48
- preset="m"
49
- style={styles.entityName}>
50
- {entityName}
51
- </Typography>
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 Avatar, { AvatarProps } from './avatar';
2
- import EntityCluster, { EntityClusterProps } from './entity-cluster';
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 DataItem, { DataItemProps } from './data-item';
2
- import HistoryItemView, { HistoryItemViewProps } from './history-item';
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 HistorySectionListItem, { HistorySectionListItemProps } from './history-section-list-item';
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=prmu1s6PuABrPg0l-0
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={20} viewBox="0 0 22 20" fill="none" {...props}>
37
+ <Svg width={22} height={22} viewBox="0 0 22 22" fill="none" {...props}>
38
38
  <Path
39
- d="M4.35742 17.9673C3.87598 17.9673 3.45817 17.8621 3.104 17.6519C2.74984 17.4416 2.47591 17.1593 2.28223 16.8052C2.09408 16.451 2 16.0581 2 15.6265C2 15.2059 2.11068 14.8047 2.33203 14.4229L8.75684 3.2251C8.97266 2.83219 9.26318 2.53613 9.62842 2.33691C9.99365 2.1377 10.3755 2.03809 10.7739 2.03809C11.1724 2.03809 11.5514 2.1377 11.9111 2.33691C12.2708 2.5306 12.5641 2.82666 12.791 3.2251L19.2158 14.4229C19.3265 14.611 19.4095 14.8075 19.4648 15.0122C19.5202 15.217 19.5479 15.4217 19.5479 15.6265C19.5479 16.0581 19.451 16.451 19.2573 16.8052C19.0636 17.1593 18.7897 17.4416 18.4355 17.6519C18.0869 17.8621 17.6719 17.9673 17.1904 17.9673H4.35742Z"
40
- fill={colorScheme.warning}
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.7744 1.03809C11.3435 1.03817 11.884 1.18254 12.3838 1.45703L12.3848 1.45605C12.386 1.45672 12.3874 1.45831 12.3887 1.45898C12.3908 1.46017 12.3933 1.46072 12.3955 1.46191L12.3945 1.46289C12.9333 1.75557 13.3522 2.19115 13.6582 2.72754L20.0781 13.916L20.1865 14.1162C20.2888 14.3193 20.3712 14.5309 20.4307 14.751C20.5082 15.0377 20.5479 15.331 20.5479 15.627C20.5478 16.2141 20.4144 16.7738 20.1348 17.2852C19.8533 17.7998 19.4512 18.2119 18.9463 18.5117L18.9453 18.5107C18.4159 18.8284 17.818 18.9678 17.1904 18.9678H4.35742C3.72707 18.9678 3.12678 18.8281 2.59375 18.5117C2.08885 18.2119 1.68678 17.7998 1.40527 17.2852L1.39941 17.2744C1.1288 16.765 1.00007 16.2092 1 15.627C1 15.0214 1.16165 14.4473 1.4668 13.9209L7.88965 2.72754C8.1894 2.18833 8.60891 1.75383 9.14941 1.45898C9.65481 1.18331 10.2012 1.03809 10.7744 1.03809Z"
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="M11.5376 11.5093C11.5265 12.0239 11.2747 12.2812 10.7822 12.2812C10.2786 12.2812 10.0186 12.0267 10.002 11.5176L9.88574 7.33398C9.87467 7.08496 9.95215 6.88021 10.1182 6.71973C10.2842 6.55371 10.5028 6.4707 10.7739 6.4707C11.0396 6.4707 11.2581 6.55371 11.4297 6.71973C11.6012 6.88021 11.6815 7.08773 11.6704 7.34229L11.5376 11.5093Z"
50
- fill={colorScheme.black}
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 RadioGroup, { RadioGroupItem, RadioGroupProps } from './radio-group';
2
- import SelectionInput, { SelectionInputChoice, SelectionInputProps } from './selection-input';
3
- import TextInput, { TextInputAccessory, TextInputProps } from './text-input';
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 ListSectionHeader, { ListSectionHeaderProps } from './list-section-header';
2
- import ListTitleHeader, { ListTitleHeaderProps } from './list-title-header';
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 LoaderView, { LoaderViewProps, LoaderViewState } from './loader';
2
- import LoadingResultScreen, { LoadingResultScreenProps } from './loading-result';
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 };