First, run npm i @paycargo/js-react
in your Command Line Interface. Afterwards, the following dependency will be found in the package.json
. The ellipses (...) represent the presence of other possible code.
. . .
{
"dependencies": {
. . .
"@paycargo/js-react": "^0.0.2"
. . .
}
. . .
Next, import React into the file, set up the useState
, and define handleOnClick
. We have included some dummy transaction information to fully illustrate what this implementation would look like.
import React, { useState, ChangeEvent} from "react";
import "./styles.css";
export default function App() {
const [selectedTransactions, setSelectedTransactions] = useState<any[]>([]);
const transactions = [
{
number: "2123190692",
departureDate: "2023-11-17T00:00:00.000Z",
arrivalDate: "2023-11-29T00:00:00.000Z",
paymentDueDate: "2023-11-22T00:00:00.000Z",
hasArrived: "N",
total: 45.38,
direction: "Inbound",
customerRefNumber: "29338586",
parent: "HLCUDUB231004840",
notes: "4716747",
type: "Invoice",
index: 0,
vendorId: 281573,
},
{
number: "2123190470",
departureDate: "2023-10-10T00:00:00.000Z",
arrivalDate: "2023-11-26T00:00:00.000Z",
paymentDueDate: "2023-11-22T00:00:00.000Z",
total: 6395.04,
direction: "Inbound",
customerRefNumber: "23686246",
parent: "HLCUBKK231007945",
batchId: 344788,
notes: "4716734",
type: "Invoice",
index: 1,
vendorId: 281573,
},
{
number: "2123190469",
departureDate: "2023-10-10T00:00:00.000Z",
arrivalDate: "2023-11-26T00:00:00.000Z",
paymentDueDate: "2023-11-22T00:00:00.000Z",
hasArrived: "N",
total: 6595.04,
customerRefNumber: "23686246",
parent: "HLCUBKK231007945",
notes: "4716733",
type: "Invoice",
index: 2,
vendorId: 281573,
},
];
function handleOnClick(event: ChangeEvent<HTMLInputElement>) {
const { target } = event;
const { value, checked } = target;
if (checked) {
setSelectedTransactions((state) => [
...state,
transactions[Number(value)],
]);
} else {
setSelectedTransactions((state) => {
const newState = state.filter((trans) => trans.index !== Number(value));
return newState;
});
}
}
Now, the PayCargo Checkout button must be loaded by importing and defining defineCustomElements
as well as importing the PayCargo Checkout component itself and passing Options into it.
import React, { useState, ChangeEvent, useEffect, useRef } from "react";
import { defineCustomElements, PaycargoCheckout } from "@paycargo/js-react";
import "./styles.css";
defineCustomElements();
// OPTIONS that will be passed as a prop to the PaycargoCheckout Component
const options = {
env: "dev", // PROD , TEST, DEV
code: "odex", // Provied by PayCargo
brand: "odex", // Provied By PayCargo
originURL: "https://d566dp.csb.app", // URL to whitelist
};
. . .
<div style={{ border: "1px solid black", marginBottom: "10px" }} />
<div id="paycargo-button-container" className="text-center">
<PaycargoCheckout
options={options}
pcTransactions={selectedTransactions}
/>
</div>
We want to listen to two types of events: (1) when the transaction is being closed to see if any action was taken, and (2) when a payment has been attempted or successfully approved. To do this, we need to implement useEffect
and add event listeners to the PayCargo Checkout component.
import React, { useState, ChangeEvent, useEffect, useRef } from "react";
. . .
export default function App() {
. . .
const paycargoRef = useRef<HTMLPaycargoCheckoutElement | null>(null);
. . .
. . .
useEffect(() => {
const listener = (event: any) => {
console.log("PaycargoCheckout Event", event.detail);
};
paycargoRef?.current?.addEventListener("close", listener);
paycargoRef?.current?.addEventListener("paymentResponse", listener);
return () => {
paycargoRef?.current?.removeEventListener("close", listener);
paycargoRef?.current?.removeEventListener("paymentResponse", listener);
};
}, [paycargoRef]);
return ( . . .
<PaycargoCheckout
ref={paycargoRef}
options={options}
pcTransactions={selectedTransactions}
/>
. . .
Property Name | Values | Type | Required | Description |
---|---|---|---|---|
options | object |
✔️ | Passing necessary options into the component | |
env | string |
✔️ | Options: local , dev , test , prod
|
|
code | string |
✔️ | PayCargo integration code |
|
originURL | string |
✔️ | Host URL where component is loaded | |
brand | string |
|||
size | string |
Options: full , lg , md where the default size is md
|
||
visible | true / false | boolean |
✔️ | To make PayCargo Checkout component visible or hidden |
pcTransactions | object[] |
✔️ | PayCargo transaction object | |
type | string |
✔️ | Transaction type (example: Invoice , Terminal Fee , etc) |
|
vendorId |
number / null
|
✔️ | ||
number | string |
✔️ | ||
direction |
'Inbound' / 'Outbound'
|
✔️ | ||
total | number |
✔️ | Amount of total transaction. If transaction lines are present, then the total should equal the sum of all transaction line amounts | |
arrivalDate |
string / date
|
|||
hasArrived |
'Y' / 'N'
|
✔️ | ||
bolLink | string |
|||
parent | string |
|||
shipperRefNumber | string |
|||
customerRefNumber | string |
|||
subcategory | string |
|||
paymentDueDate | date |
|||
notes |
string / null
|
|||
transactionLines | array |
Property Name | Values | Type | Required | Description |
---|---|---|---|---|
transactionLines | object |
Passing necessary options into the component. Note: these property names are case sensitive | ||
AMOUNT | number |
✔️ | Amount for transaction line | |
DESCRIPTION | string |
✔️ | ||
START_DATE |
string / date
|
|||
END_DATE |
string / date
|
|||
QUANTITY | number |
|||
UNIT_PRICE | number |
|||
containerNumber | string |
OSRA: container number | ||
availabilityDate |
string / date
|
OSRA: first available date | ||
pod | string |
OSRA: port of discharge | ||
sfd | string |
OSRA: start free day | ||
lfd | string |
OSRA: last free day | ||
freeTimeDays | string |
OSRA: free time days | ||
ddr | string |
OSRA: demurrage detention rule | ||
feeContact | string |
OSRA: mitigation contact | ||
complianceStatement | string |
OSRA: compliance statement | ||
commonCarrierStatement | string |
OSRA: common carrier statement |