Skip to content

Commit eba8a0f

Browse files
Merge pull request #64 from skyflowapi/release/23.10.2
SK-944, SK-1122, SK-562 Release/23.10.2 Signed Data tokens Reveal Support.
2 parents 5433c80 + e8759fe commit eba8a0f

11 files changed

Lines changed: 107 additions & 39 deletions

File tree

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [1.5.0] - 2023-10-10
6+
### Added
7+
- reveal support for signed data tokens.
8+
- `valueType` in reveal response.
9+
### Fixed
10+
- removed trimming of spaces in event listeners state value.
11+
## [1.4.0] - 2023-06-30
12+
### Added
13+
- Composable elements support.
514
## [1.3.0] - 2023-06-07
615
### Added
716
- `redaction` prop in reveal element component.

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,8 @@ export default App;
12081208
{
12091209
"success": [
12101210
{
1211-
"token": "b63ec4e0-bbad-4e43-96e6-6bd50f483f75"
1211+
"token": "b63ec4e0-bbad-4e43-96e6-6bd50f483f75",
1212+
"valueType": "STRING"
12121213
}
12131214
],
12141215
"errors": [

__tests__/core-utils/reveal.test.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import { RedactionType } from '../../src/utils/constants';
1313
describe('formatRecordsForClient fn test', () => {
1414
it('only success records', () => {
1515
const testInput = {
16-
records: [{ token: '7402-2242-2342-232', value: '231' }],
16+
records: [
17+
{ token: '7402-2242-2342-232', value: '231', valueType: 'STRING' },
18+
],
1719
};
1820
const fnResponse = formatRecordsForClient(testInput, {
1921
'7402-2242-2342-232': '231',
@@ -49,10 +51,12 @@ describe('formatRecordsForIframe fn test', () => {
4951

5052
it('with records should return token value object', () => {
5153
const testInput = {
52-
records: [{ token: '7823-323-242-2232', value: 'token_value' }],
54+
records: [
55+
{ token: '7823-323-242-2232', value: 'token_value', elementId: '7823' },
56+
],
5357
};
5458
const fnResponse = formatRecordsForIframe(testInput);
55-
expect(fnResponse).toStrictEqual({ '7823-323-242-2232': 'token_value' });
59+
expect(fnResponse).toStrictEqual({ 7823: 'token_value' });
5660
});
5761
});
5862

__tests__/core/RevealContainer.test.js

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,29 @@ describe('test RevealConatiner Class', () => {
5959
});
6060
});
6161
it('test reveal method partial success', (done) => {
62+
const setValueMock = jest.fn();
63+
const setErrorMock = jest.fn();
64+
const setValueMock2 = jest.fn();
65+
const setErrorMock2 = jest.fn();
66+
67+
const revealElement1 = revealContainer.create({
68+
token: 'random_token',
69+
elementId: '123',
70+
});
71+
revealElement1.setMethods(setValueMock, setErrorMock);
72+
const revealElement2 = revealContainer.create({
73+
token: 'invalid_token',
74+
elementId: '456',
75+
});
76+
revealElement2.setMethods(setValueMock2, setErrorMock2);
77+
6278
const revealFailedVaule = {
6379
records: [
6480
{
6581
token: 'random_token',
6682
value: 'test_value',
83+
valueType: 'STRING',
84+
elementId: revealElement1.elementId,
6785
},
6886
],
6987
errors: [
@@ -79,15 +97,7 @@ describe('test RevealConatiner Class', () => {
7997
jest
8098
.spyOn(revealUtils, 'fetchRecordsByTokenId')
8199
.mockRejectedValue(revealFailedVaule);
82-
const setValueMock = jest.fn();
83-
const setErrorMock = jest.fn();
84-
const setValueMock2 = jest.fn();
85-
const setErrorMock2 = jest.fn();
86100

87-
const revealElement1 = revealContainer.create({ token: 'random_token' });
88-
revealElement1.setMethods(setValueMock, setErrorMock);
89-
const revealElement2 = revealContainer.create({ token: 'invalid_token' });
90-
revealElement2.setMethods(setValueMock2, setErrorMock2);
91101
revealContainer
92102
.reveal()
93103
.then((res) => {
@@ -100,7 +110,7 @@ describe('test RevealConatiner Class', () => {
100110
expect(setErrorMock2).toHaveBeenCalledTimes(1);
101111
expect(setValueMock2).toBeCalledTimes(0);
102112
expect(err).toEqual({
103-
success: [{ token: 'random_token' }],
113+
success: [{ token: 'random_token', valueType: 'STRING' }],
104114
errors: revealFailedVaule.errors,
105115
});
106116
done();

__tests__/utils/helper.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,16 @@ describe('test getReturnValue function', () => {
116116
it('should return whole value when return value is true', () => {
117117
expect(getReturnValue('4111', true, ElementType.PIN)).toBe('4111');
118118
});
119+
120+
it('should return whole card number value when return value is true', () => {
121+
expect(
122+
getReturnValue('4111 1111 1111 1111', true, ElementType.CARD_NUMBER)
123+
).toBe('4111111111111111');
124+
});
125+
126+
it('should return non string value when return value is true', () => {
127+
expect(getReturnValue(1000, true, ElementType.INPUT_FIELD)).toBe(1000);
128+
});
119129
it('should return empty string when return value is false,not a card element', () => {
120130
expect(getReturnValue('4111', false, ElementType.PIN)).toBe('');
121131
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "skyflow-react-native",
3-
"version": "1.4.0",
3+
"version": "1.4.0-dev.96744de",
44
"description": "Skyflow React Native SDK",
55
"main": "lib/commonjs/index",
66
"module": "lib/module/index",

src/core-utils/reveal/index.ts

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,20 @@ interface IApiSuccessResponse {
2323
];
2424
}
2525

26-
const formatForPureJsSuccess = (response: IApiSuccessResponse) => {
26+
const formatForPureJsSuccess = (
27+
response: IApiSuccessResponse,
28+
elementId: string
29+
) => {
2730
const currentResponseRecords = response.records;
2831
return currentResponseRecords.map((record) => ({
2932
token: record.token,
3033
value: record.value,
34+
valueType: record?.valueType,
35+
elementId,
3136
}));
3237
};
3338

34-
const formatForPureJsFailure = (cause, tokenId: string) => ({
39+
const formatForPureJsFailure = (cause, tokenId: string, elementId: string) => ({
3540
token: tokenId,
3641
...new SkyflowError(
3742
{
@@ -41,6 +46,7 @@ const formatForPureJsFailure = (cause, tokenId: string) => ({
4146
[],
4247
true
4348
),
49+
elementId,
4450
});
4551

4652
const getTokenRecordsFromVault = (
@@ -86,13 +92,17 @@ export const fetchRecordsByTokenId = (
8692
)
8793
.then(
8894
(response: IApiSuccessResponse) => {
89-
const fieldsData = formatForPureJsSuccess(response);
95+
const fieldsData = formatForPureJsSuccess(
96+
response,
97+
tokenRecord.elementId
98+
);
9099
apiResponse.push(...fieldsData);
91100
},
92101
(cause: any) => {
93102
const errorData = formatForPureJsFailure(
94103
cause,
95-
tokenRecord.token
104+
tokenRecord.token,
105+
tokenRecord.elementId
96106
);
97107
printLog(
98108
errorData.error?.description || '',
@@ -142,20 +152,27 @@ export const formatRecordsForIframe = (response: IRevealResponseType) => {
142152
const result: Record<string, string> = {};
143153
if (response.records) {
144154
response.records.forEach((record) => {
145-
result[record.token] = record.value;
155+
result[record.elementId] = record.value;
146156
});
147157
}
148158
return result;
149159
};
150160

151161
export const formatRecordsForClient = (response: IRevealResponseType) => {
162+
let errorRecords;
163+
if (response?.errors) {
164+
errorRecords = response?.errors?.map((currentError) => ({
165+
token: currentError?.token,
166+
error: currentError?.error,
167+
}));
168+
}
152169
if (response.records) {
153170
const successRecords = response.records.map((record) => ({
154171
token: record.token,
172+
valueType: record.valueType,
155173
}));
156-
if (response.errors)
157-
return { success: successRecords, errors: response.errors };
174+
if (errorRecords) return { success: successRecords, errors: errorRecords };
158175
return { success: successRecords };
159176
}
160-
return { errors: response.errors };
177+
return { errors: errorRecords };
161178
};

src/core/RevealContainer/index.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { parameterizedString, printLog } from '../../utils/logs-helper';
2424
import Container from '../Container';
2525
import RevealSkyflowElement from '../RevealSkyflowElement';
2626
import Skyflow from '../Skyflow';
27+
import uuid from 'react-native-uuid';
2728

2829
const CLASS_NAME = 'RevealContainer';
2930

@@ -44,12 +45,17 @@ class RevealContainer extends Container {
4445
}
4546

4647
create(revealInput: RevealElementInput) {
48+
const revealElementId = uuid.v4() as string;
4749
this.#revealRecords.push(revealInput);
4850
this.#tokensList.push({
4951
token: revealInput.token,
5052
redaction: revealInput?.redaction,
53+
elementId: revealElementId,
54+
});
55+
const element = new RevealSkyflowElement({
56+
...revealInput,
57+
elementId: revealElementId,
5158
});
52-
const element = new RevealSkyflowElement(revealInput);
5359
this.#elementList.push(element);
5460
return element;
5561
}
@@ -105,9 +111,9 @@ class RevealContainer extends Container {
105111
private setRevealValuesInElements(revealedResult) {
106112
this.#elementList.forEach((current) => {
107113
if (
108-
Object.prototype.hasOwnProperty.call(revealedResult, current.getToken())
114+
Object.prototype.hasOwnProperty.call(revealedResult, current.elementId)
109115
) {
110-
const revealedValue = revealedResult[current.getToken()];
116+
const revealedValue = revealedResult[current.elementId];
111117
current.setRevealValue(revealedValue);
112118
} else {
113119
current.setError();

src/core/RevealSkyflowElement/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ class RevealSkyflowElement extends SkyflowElement {
1010
#token: string;
1111
setRevealValue: Function;
1212
#setErrorText: Function;
13+
elementId: string;
1314

1415
constructor(revealInput: RevealElementInput) {
1516
super();
1617
this.#token = revealInput.token;
18+
this.elementId = revealInput.elementId;
1719
}
1820

1921
setMethods(setValue, setErrorText) {

src/utils/constants/index.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ export interface RevealElementInput {
9797
token: string;
9898
label?: string;
9999
altText?: string;
100-
redaction?: RedactionType
100+
redaction?: RedactionType;
101+
elementId?: string;
101102
}
102103

103104
export interface RevealElementProps {
@@ -119,7 +120,8 @@ export enum MessageType {
119120

120121
export interface IRevealRecord {
121122
token: string;
122-
redaction?: RedactionType
123+
redaction?: RedactionType;
124+
elementId?: string;
123125
}
124126

125127
export interface IRevealResponseType {

0 commit comments

Comments
 (0)