Skip to content

Commit b3f456d

Browse files
committed
Add PredefinedContentHelper
1 parent f94c4b5 commit b3f456d

File tree

3 files changed

+151
-0
lines changed

3 files changed

+151
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { PredefinedContentHelper, DisplayNotificationEvent } from "../typings/terminal/predefinedContentHelper";
2+
3+
describe("PredefinedContentHelper", () => {
4+
it("should extract a valid event", () => {
5+
6+
const ReferenceID = "TransactionID=oLkO001517998574000&TimeStamp=2018-02-07T10%3a16%3a14.000Z&event=PIN_ENTERED";
7+
8+
const helper = new PredefinedContentHelper(ReferenceID);
9+
expect(helper.getEvent()).toBe(DisplayNotificationEvent.PIN_ENTERED);
10+
});
11+
12+
it("should return null for an invalid event", () => {
13+
const helper = new PredefinedContentHelper("event=INVALID_EVENT");
14+
expect(helper.getEvent()).toBeNull();
15+
});
16+
17+
it("should extract TransactionID", () => {
18+
const helper = new PredefinedContentHelper("TransactionID=12345&TimeStamp=2018-02-07T10%3a16%3a14.000Z&event=PIN_ENTERED");
19+
expect(helper.getTransactionId()).toBe("12345");
20+
});
21+
22+
it("should extract TimeStamp", () => {
23+
const helper = new PredefinedContentHelper("TimeStamp=2024-07-11T12:00:00Z");
24+
expect(helper.getTimeStamp()).toBe("2024-07-11T12:00:00Z");
25+
});
26+
27+
it("should extract arbitrary key", () => {
28+
const helper = new PredefinedContentHelper("foo=bar&baz=qux");
29+
expect(helper.get("foo")).toBe("bar");
30+
expect(helper.get("baz")).toBe("qux");
31+
expect(helper.get("missing")).toBeNull();
32+
});
33+
34+
it("should convert params to object", () => {
35+
const helper = new PredefinedContentHelper("a=1&b=2&event=WAIT_FOR_PIN");
36+
expect(helper.toObject()).toEqual({ a: "1", b: "2", event: "WAIT_FOR_PIN" });
37+
});
38+
39+
it("should handle empty referenceId", () => {
40+
const helper = new PredefinedContentHelper("");
41+
expect(helper.getEvent()).toBeNull();
42+
expect(helper.getTransactionId()).toBeNull();
43+
expect(helper.getTimeStamp()).toBeNull();
44+
expect(helper.toObject()).toEqual({});
45+
});
46+
});

src/typings/terminal/models.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,8 @@ export * from "./transmitResponse";
265265
export * from "./uTMCoordinates";
266266
export * from "./unitOfMeasureType";
267267
export * from "./versionType";
268+
// helpers
269+
export * from "./predefinedContentHelper";
268270

269271
import { AbortRequest } from "./abortRequest";
270272
import { AccountType } from "./accountType";
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
/**
2+
* PredefinedContentHelper class to parse and manage predefined content reference IDs.
3+
*/
4+
export class PredefinedContentHelper {
5+
private params: URLSearchParams;
6+
7+
constructor(referenceId: string) {
8+
this.params = new URLSearchParams(referenceId);
9+
}
10+
11+
/**
12+
* Extracts and validates the `event` value from the ReferenceID.
13+
*
14+
* @returns A valid `DisplayNotificationEvent`, otherwise `null`.
15+
*
16+
* @example
17+
* const helper = new PredefinedContentHelper("...&event=PIN_ENTERED");
18+
* const event = helper.getEvent(); // DisplayNotificationEvent.PIN_ENTERED or null
19+
*/
20+
getEvent(): DisplayNotificationEvent | null {
21+
const event = this.params.get("event");
22+
23+
switch (event) {
24+
case "TENDER_CREATED":
25+
case "CARD_INSERTED":
26+
case "CARD_PRESENTED":
27+
case "CARD_SWIPED":
28+
case "WAIT_FOR_APP_SELECTION":
29+
case "APPLICATION_SELECTED":
30+
case "ASK_SIGNATURE":
31+
case "CHECK_SIGNATURE":
32+
case "SIGNATURE_CHECKED":
33+
case "WAIT_FOR_PIN":
34+
case "PIN_ENTERED":
35+
case "PRINT_RECEIPT":
36+
case "RECEIPT_PRINTED":
37+
case "CARD_REMOVED":
38+
case "TENDER_FINAL":
39+
case "ASK_DCC":
40+
case "DCC_ACCEPTED":
41+
case "DCC_REJECTED":
42+
case "ASK_GRATUITY":
43+
case "GRATUITY_ENTERED":
44+
case "BALANCE_QUERY_STARTED":
45+
case "BALANCE_QUERY_COMPLETED":
46+
case "LOAD_STARTED":
47+
case "LOAD_COMPLETED":
48+
case "PROVIDE_CARD_DETAILS":
49+
case "CARD_DETAILS_PROVIDED":
50+
return event as DisplayNotificationEvent;
51+
default:
52+
return null;
53+
}
54+
}
55+
getTransactionId(): string | null {
56+
return this.params.get("TransactionID");
57+
}
58+
59+
getTimeStamp(): string | null {
60+
return this.params.get("TimeStamp");
61+
}
62+
63+
get(key: string): string | null {
64+
return this.params.get(key);
65+
}
66+
67+
toObject(): Record<string, string> {
68+
const result: Record<string, string> = {};
69+
for (const [key, value] of this.params.entries()) {
70+
result[key] = value;
71+
}
72+
return result;
73+
}
74+
}
75+
76+
export enum DisplayNotificationEvent {
77+
TENDER_CREATED = "TENDER_CREATED",
78+
CARD_INSERTED = "CARD_INSERTED",
79+
CARD_PRESENTED = "CARD_PRESENTED",
80+
CARD_SWIPED = "CARD_SWIPED",
81+
WAIT_FOR_APP_SELECTION = "WAIT_FOR_APP_SELECTION",
82+
APPLICATION_SELECTED = "APPLICATION_SELECTED",
83+
ASK_SIGNATURE = "ASK_SIGNATURE",
84+
CHECK_SIGNATURE = "CHECK_SIGNATURE",
85+
SIGNATURE_CHECKED = "SIGNATURE_CHECKED",
86+
WAIT_FOR_PIN = "WAIT_FOR_PIN",
87+
PIN_ENTERED = "PIN_ENTERED",
88+
PRINT_RECEIPT = "PRINT_RECEIPT",
89+
RECEIPT_PRINTED = "RECEIPT_PRINTED",
90+
CARD_REMOVED = "CARD_REMOVED",
91+
TENDER_FINAL = "TENDER_FINAL",
92+
ASK_DCC = "ASK_DCC",
93+
DCC_ACCEPTED = "DCC_ACCEPTED",
94+
DCC_REJECTED = "DCC_REJECTED",
95+
ASK_GRATUITY = "ASK_GRATUITY",
96+
GRATUITY_ENTERED = "GRATUITY_ENTERED",
97+
BALANCE_QUERY_STARTED = "BALANCE_QUERY_STARTED",
98+
BALANCE_QUERY_COMPLETED = "BALANCE_QUERY_COMPLETED",
99+
LOAD_STARTED = "LOAD_STARTED",
100+
LOAD_COMPLETED = "LOAD_COMPLETED",
101+
PROVIDE_CARD_DETAILS = "PROVIDE_CARD_DETAILS",
102+
CARD_DETAILS_PROVIDED = "CARD_DETAILS_PROVIDED",
103+
}

0 commit comments

Comments
 (0)