Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ type webhookDetails = {
payment_created_enabled: option<bool>,
payment_succeeded_enabled: option<bool>,
payment_failed_enabled: option<bool>,
payment_statuses_enabled: option<array<JSON.t>>,
refund_statuses_enabled: option<array<JSON.t>>,
payout_statuses_enabled: option<array<JSON.t>>,
}
type authConnectorDetailsType = {
authentication_connectors: option<array<JSON.t>>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ type webhookDetails_v1 = {
payment_created_enabled: option<bool>,
payment_succeeded_enabled: option<bool>,
payment_failed_enabled: option<bool>,
payment_statuses_enabled: option<array<JSON.t>>,
refund_statuses_enabled: option<array<JSON.t>>,
payout_statuses_enabled: option<array<JSON.t>>,
}
type authConnectorDetailsType_v1 = {
authentication_connectors: option<array<JSON.t>>,
Expand Down Expand Up @@ -44,7 +47,18 @@ type profileEntityRequestType_v1 = {
is_external_vault_enabled: option<string>,
external_vault_connector_details: option<externalVaultConnectorDetailsType_v1>,
}
type webhookDetailsRequest_v1 = {webhook_url: option<JSON.t>}
type webhookDetailsRequest_v1 = {
webhook_url: option<JSON.t>,
webhook_version: option<JSON.t>,
webhook_username: option<JSON.t>,
webhook_password: option<JSON.t>,
payment_created_enabled: option<JSON.t>,
payment_succeeded_enabled: option<JSON.t>,
payment_failed_enabled: option<JSON.t>,
payment_statuses_enabled: option<JSON.t>,
refund_statuses_enabled: option<JSON.t>,
payout_statuses_enabled: option<JSON.t>,
}

type backgroundImage_v1 = {
url: string,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ type webhookDetails_v2 = {
payment_created_enabled: option<bool>,
payment_succeeded_enabled: option<bool>,
payment_failed_enabled: option<bool>,
payment_statuses_enabled: option<array<JSON.t>>,
refund_statuses_enabled: option<array<JSON.t>>,
payout_statuses_enabled: option<array<JSON.t>>,
}
type authConnectorDetailsType_v2 = {
authentication_connectors: option<array<JSON.t>>,
Expand All @@ -32,7 +35,18 @@ type profileEntityRequestType_v2 = {
is_network_tokenization_enabled: option<JSON.t>,
split_txns_enabled: option<JSON.t>,
}
type webhookDetailsRequest_v2 = {webhook_url: option<JSON.t>}
type webhookDetailsRequest_v2 = {
webhook_url: option<JSON.t>,
webhook_version: option<JSON.t>,
webhook_username: option<JSON.t>,
webhook_password: option<JSON.t>,
payment_created_enabled: option<JSON.t>,
payment_succeeded_enabled: option<JSON.t>,
payment_failed_enabled: option<JSON.t>,
payment_statuses_enabled: option<JSON.t>,
refund_statuses_enabled: option<JSON.t>,
payout_statuses_enabled: option<JSON.t>,
}

type profileEntity_v2 = {
profile_id: string,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ let constructWebhookDetailsObject = webhookDetailsDict => {
payment_created_enabled: webhookDetailsDict->getOptionBool("payment_created_enabled"),
payment_succeeded_enabled: webhookDetailsDict->getOptionBool("payment_succeeded_enabled"),
payment_failed_enabled: webhookDetailsDict->getOptionBool("payment_failed_enabled"),
payment_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict(
"payment_statuses_enabled",
),
refund_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict("refund_statuses_enabled"),
payout_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict("payout_statuses_enabled"),
}

let constructAuthConnectorObject = authConnectorDict => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@ open BusinessProfileInterfaceTypesV1
open BusinessProfileInterfaceUtils
open LogicUtils

let constructWebhookDetailsObject = webhookDetailsDict => {
let constructWebhookDetailsObject = (webhookDetailsDict): webhookDetails_v1 => {
webhook_version: webhookDetailsDict->getOptionString("webhook_version"),
webhook_username: webhookDetailsDict->getOptionString("webhook_username"),
webhook_password: webhookDetailsDict->getOptionString("webhook_password"),
webhook_url: webhookDetailsDict->getOptionString("webhook_url"),
payment_created_enabled: webhookDetailsDict->getOptionBool("payment_created_enabled"),
payment_succeeded_enabled: webhookDetailsDict->getOptionBool("payment_succeeded_enabled"),
payment_failed_enabled: webhookDetailsDict->getOptionBool("payment_failed_enabled"),
payment_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict(
"payment_statuses_enabled",
),
refund_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict("refund_statuses_enabled"),
payout_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict("payout_statuses_enabled"),
}

let constructAuthConnectorObject = authConnectorDict => {
Expand All @@ -23,7 +28,34 @@ let constructAuthConnectorObject = authConnectorDict => {
let constructWebhookDetailsRequestObject: _ => webhookDetailsRequest_v1 = webhookDetailsDict => {
webhook_url: webhookDetailsDict
->getOptionString("webhook_url")
->BusinessProfileInterfaceUtils.convertOptionalStringToOptionalJson,
->convertOptionalStringToOptionalJson,
webhook_version: webhookDetailsDict
->getOptionString("webhook_version")
->convertOptionalStringToOptionalJson,
webhook_username: webhookDetailsDict
->getOptionString("webhook_username")
->convertOptionalStringToOptionalJson,
webhook_password: webhookDetailsDict
->getOptionString("webhook_password")
->convertOptionalStringToOptionalJson,
payment_created_enabled: webhookDetailsDict
->getOptionBool("payment_created_enabled")
->convertOptionalBoolToOptionalJson,
payment_succeeded_enabled: webhookDetailsDict
->getOptionBool("payment_succeeded_enabled")
->convertOptionalBoolToOptionalJson,
payment_failed_enabled: webhookDetailsDict
->getOptionBool("payment_failed_enabled")
->convertOptionalBoolToOptionalJson,
payment_statuses_enabled: webhookDetailsDict
->getOptionalArrayFromDict("payment_statuses_enabled")
->convertOptionalArrayToOptionalJson,
refund_statuses_enabled: webhookDetailsDict
->getOptionalArrayFromDict("refund_statuses_enabled")
->convertOptionalArrayToOptionalJson,
payout_statuses_enabled: webhookDetailsDict
->getOptionalArrayFromDict("payout_statuses_enabled")
->convertOptionalArrayToOptionalJson,
}

let mapV1WebhookDetailsToCommonType: webhookDetails_v1 => BusinessProfileInterfaceTypes.webhookDetails = webhookDetailsRecord => {
Expand All @@ -35,6 +67,9 @@ let mapV1WebhookDetailsToCommonType: webhookDetails_v1 => BusinessProfileInterfa
payment_created_enabled: webhookDetailsRecord.payment_created_enabled,
payment_succeeded_enabled: webhookDetailsRecord.payment_succeeded_enabled,
payment_failed_enabled: webhookDetailsRecord.payment_failed_enabled,
payment_statuses_enabled: webhookDetailsRecord.payment_statuses_enabled,
refund_statuses_enabled: webhookDetailsRecord.refund_statuses_enabled,
payout_statuses_enabled: webhookDetailsRecord.payout_statuses_enabled,
}
}

Expand Down Expand Up @@ -386,7 +421,7 @@ let commonTypeJsonToV1ForRequest: JSON.t => profileEntityRequestType_v1 = json =
->convertOptionalBoolToOptionalJson,
return_url: dict
->getOptionString("return_url")
->BusinessProfileInterfaceUtils.convertOptionalStringToOptionalJson,
->convertOptionalStringToOptionalJson,
webhook_details: !{webhookDetails->isEmptyDict}
? Some(
webhookDetails
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@ open LogicUtils
open BusinessProfileInterfaceTypesV2
open BusinessProfileInterfaceUtils

let constructWebhookDetailsObject = webhookDetailsDict => {
let constructWebhookDetailsObject = (webhookDetailsDict): webhookDetails_v2 => {
webhook_version: webhookDetailsDict->getOptionString("webhook_version"),
webhook_username: webhookDetailsDict->getOptionString("webhook_username"),
webhook_password: webhookDetailsDict->getOptionString("webhook_password"),
webhook_url: webhookDetailsDict->getOptionString("webhook_url"),
payment_created_enabled: webhookDetailsDict->getOptionBool("payment_created_enabled"),
payment_succeeded_enabled: webhookDetailsDict->getOptionBool("payment_succeeded_enabled"),
payment_failed_enabled: webhookDetailsDict->getOptionBool("payment_failed_enabled"),
payment_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict(
"payment_statuses_enabled",
),
refund_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict("refund_statuses_enabled"),
payout_statuses_enabled: webhookDetailsDict->getOptionalArrayFromDict("payout_statuses_enabled"),
}

let constructAuthConnectorObject = authConnectorDict => {
Expand All @@ -24,6 +29,33 @@ let constructWebhookDetailsRequestObject: _ => webhookDetailsRequest_v2 = webhoo
webhook_url: webhookDetailsDict
->getOptionString("webhook_url")
->convertOptionalStringToOptionalJson,
webhook_version: webhookDetailsDict
->getOptionString("webhook_version")
->convertOptionalStringToOptionalJson,
webhook_username: webhookDetailsDict
->getOptionString("webhook_username")
->convertOptionalStringToOptionalJson,
webhook_password: webhookDetailsDict
->getOptionString("webhook_password")
->convertOptionalStringToOptionalJson,
payment_created_enabled: webhookDetailsDict
->getOptionBool("payment_created_enabled")
->convertOptionalBoolToOptionalJson,
payment_succeeded_enabled: webhookDetailsDict
->getOptionBool("payment_succeeded_enabled")
->convertOptionalBoolToOptionalJson,
payment_failed_enabled: webhookDetailsDict
->getOptionBool("payment_failed_enabled")
->convertOptionalBoolToOptionalJson,
payment_statuses_enabled: webhookDetailsDict
->getOptionalArrayFromDict("payment_statuses_enabled")
->convertOptionalArrayToOptionalJson,
refund_statuses_enabled: webhookDetailsDict
->getOptionalArrayFromDict("refund_statuses_enabled")
->convertOptionalArrayToOptionalJson,
payout_statuses_enabled: webhookDetailsDict
->getOptionalArrayFromDict("payout_statuses_enabled")
->convertOptionalArrayToOptionalJson,
}
let mapV2AuthConnectorDetailsToCommonType: option<authConnectorDetailsType_v2> => option<
BusinessProfileInterfaceTypes.authConnectorDetailsType,
Expand Down Expand Up @@ -93,6 +125,9 @@ let mapV2WebhookDetailsToCommonType: webhookDetails_v2 => BusinessProfileInterfa
payment_created_enabled: webhookDetailsRecord.payment_created_enabled,
payment_succeeded_enabled: webhookDetailsRecord.payment_succeeded_enabled,
payment_failed_enabled: webhookDetailsRecord.payment_failed_enabled,
payment_statuses_enabled: webhookDetailsRecord.payment_statuses_enabled,
refund_statuses_enabled: webhookDetailsRecord.refund_statuses_enabled,
payout_statuses_enabled: webhookDetailsRecord.payout_statuses_enabled,
}
}

Expand Down Expand Up @@ -175,7 +210,7 @@ let commonTypeJsonToV2ForRequest: JSON.t => profileEntityRequestType_v2 = json =
->convertOptionalBoolToOptionalJson,
return_url: dict
->getOptionString("return_url")
->BusinessProfileInterfaceUtils.convertOptionalStringToOptionalJson,
->convertOptionalStringToOptionalJson,
webhook_details: !{webhookDetails->isEmptyDict}
? Some(
webhookDetails
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,21 +185,6 @@ module ClickToPaySection = {
}
}

module WebHook = {
@react.component
let make = () => {
open FormRenderer

<div className="ml-1 mt-4">
<FieldRenderer
field={webhookUrl}
labelClass={`!${body.lg.semibold} !text-nd-gray-700`}
fieldWrapperClass="max-w-xl "
/>
</div>
}
}

module ReturnUrl = {
@react.component
let make = () => {
Expand Down Expand Up @@ -499,7 +484,6 @@ let make = () => {
<ClickToPaySection />
<hr />
<ReturnUrl />
<WebHook />
<DesktopRow wrapperClass="mt-8">
<div className="flex justify-end mt-4 w-full">
<SubmitButton text="Update" buttonType=Button.Primary buttonSize=Button.Medium />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ let make = () => {
renderContent: () => <PaymentSettingsDomainName />,
}

let webhookConfigTab: Tabs.tab = {
title: "Webhook Configuration",
renderContent: () => <PaymentSettingsWebhookConfiguration />,
}

let additionalTabs: array<Tabs.tab> = [
{
title: "Custom Headers",
Expand All @@ -81,6 +86,8 @@ let make = () => {
let tabs = {
let baseTabs = [paymentBehaviourTab]

baseTabs->Array.push(webhookConfigTab)

if version == V1 || (version == V2 && isBusinessProfileHasThreeds) {
baseTabs->Array.push(threeDsTab)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,100 @@ let vaultTokenList = {
)
}

let webhookVersion = FormRenderer.makeFieldInfo(
~label="Webhook Version",
~name="webhook_details.webhook_version",
~placeholder="Enter Webhook Version",
~customInput=InputFields.textInput(~autoComplete="off", ~customStyle="rounded-xl"),
~isRequired=false,
)

let webhookUsername = FormRenderer.makeFieldInfo(
~label="Webhook Username",
~name="webhook_details.webhook_username",
~placeholder="Enter Webhook Username",
~customInput=InputFields.textInput(~autoComplete="off", ~customStyle="rounded-xl"),
~isRequired=false,
)

let webhookPassword = FormRenderer.makeFieldInfo(
~label="Webhook Password",
~name="webhook_details.webhook_password",
~placeholder="Enter Webhook Password",
~customInput=InputFields.textInput(~autoComplete="off", ~customStyle="rounded-xl"),
~isRequired=false,
)

let paymentStatusOptions = [
"succeeded",
"failed",
"cancelled",
"cancelled_post_capture",
"processing",
"partially_captured_and_processing",
"requires_customer_action",
"requires_merchant_action",
"requires_capture",
"partially_captured",
"partially_captured_and_capturable",
"partially_authorized_and_requires_capture",
"conflicted",
"expired",
]

let refundStatusOptions = ["failure", "success"]

let payoutStatusOptions = ["success", "failed", "cancelled", "initiated", "expired", "reversed"]

let makeDropdownOptions = options =>
options->Array.map((item): SelectBox.dropdownOption => {
{
label: item->LogicUtils.snakeToTitle,
value: item,
}
})

let paymentStatusesEnabled = FormRenderer.makeFieldInfo(
~label="Payment Statuses",
~name="webhook_details.payment_statuses_enabled",
~customInput=InputFields.multiSelectInput(
~options=paymentStatusOptions->makeDropdownOptions,
~buttonText="Select Payment Statuses",
~showSelectionAsChips=false,
~customButtonStyle="!rounded-lg",
~fixedDropDownDirection=BottomRight,
~dropdownClassName="!max-h-15-rem !overflow-auto",
),
~isRequired=false,
)

let refundStatusesEnabled = FormRenderer.makeFieldInfo(
~label="Refund Statuses",
~name="webhook_details.refund_statuses_enabled",
~customInput=InputFields.multiSelectInput(
~options=refundStatusOptions->makeDropdownOptions,
~buttonText="Select Refund Statuses",
~showSelectionAsChips=false,
~customButtonStyle="!rounded-lg",
~fixedDropDownDirection=BottomRight,
~dropdownClassName="!max-h-15-rem !overflow-auto",
),
~isRequired=false,
)

let payoutStatusesEnabled = FormRenderer.makeFieldInfo(
~label="Payout Statuses",
~name="webhook_details.payout_statuses_enabled",
~customInput=InputFields.multiSelectInput(
~options=payoutStatusOptions->makeDropdownOptions,
~buttonText="Select Payout Statuses",
~showSelectionAsChips=false,
~customButtonStyle="!rounded-lg",
~dropdownClassName="!max-h-15-rem !overflow-auto",
),
~isRequired=false,
)

let customExternalVaultEnabled = (
~input: ReactFinalForm.fieldRenderPropsInput,
~placeholder as _,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,15 @@ let parseBusinessProfileForPaymentBehaviour = (
collect_shipping_details_from_wallet_connector,
)
webhookDict->setDictNull("webhook_url", webhook_details.webhook_url)
webhookDict->setDictNull("webhook_version", webhook_details.webhook_version)
webhookDict->setDictNull("webhook_username", webhook_details.webhook_username)
webhookDict->setDictNull("webhook_password", webhook_details.webhook_password)
webhookDict->setOptionBool("payment_created_enabled", webhook_details.payment_created_enabled)
webhookDict->setOptionBool("payment_succeeded_enabled", webhook_details.payment_succeeded_enabled)
webhookDict->setOptionBool("payment_failed_enabled", webhook_details.payment_failed_enabled)
webhookDict->setOptionArray("payment_statuses_enabled", webhook_details.payment_statuses_enabled)
webhookDict->setOptionArray("refund_statuses_enabled", webhook_details.refund_statuses_enabled)
webhookDict->setOptionArray("payout_statuses_enabled", webhook_details.payout_statuses_enabled)
profileInfo->setOptionDict("webhook_details", Some(webhookDict))
profileInfo->setOptionBool(
"collect_billing_details_from_wallet_connector",
Expand Down
Loading
Loading