import { ctw } from '@/common/utils/ctw/ctw';
import { toTitleCase, toUpperCase } from 'string-ts';
import * as React from 'react';
import { ComponentProps, useMemo } from 'react';
import { Badge, WarningFilledSvg } from '@ballerine/ui';
import { includesValues } from '@/common/utils/includes-values/includes-values';
import { isNullish } from '@ballerine/common';
import { createBlocksTyped } from '@/lib/blocks/create-blocks-typed/create-blocks-typed';
import { TWorkflowById } from '@/domains/workflows/fetchers';
export const useWebsiteMonitoringBlock = ({
pluginsOutput,
workflow,
}: {
pluginsOutput: TWorkflowById['context']['pluginsOutput'];
workflow: TWorkflowById;
}) => {
const websiteMonitoringAdapter = ({
lsAction,
merchantDetails,
merchantDomains,
createdAt: checkCreatedAt,
}: {
lsAction: {
reason: string;
contentLabels: Array<{
label: string;
}>;
actions: Array<{
warning: string;
}>;
};
merchantDetails: {
merchantCountry: string;
merchantRegion: string;
merchantCity: string;
merchantStreet: string;
merchantPostalCode: string;
businessOwnerCountry: string;
businessOwnerRegion: string;
businessOwnerCity: string;
businessOwnerStreet: string;
businessOwnerPostalCode: string;
dbaCountry: string;
dbaRegion: string;
dbaCity: string;
dbaStreet: string;
dbaPostalCode: string;
status: string;
};
merchantDomains: Array<{
merchantUrl: string;
websiteRegistrar: {
ianaNumber: string;
riskLevel: string;
name: string;
};
}>;
createdAt: string;
}) => {
const { reason, contentLabels, actions } = lsAction ?? {};
const labels = contentLabels?.map(({ label: contentLabel }) => ({ contentLabel })) ?? [];
const {
// Merchant address
merchantCountry,
merchantRegion,
merchantCity,
merchantStreet,
merchantPostalCode,
// Business Owner address
businessOwnerCountry,
businessOwnerRegion,
businessOwnerCity,
businessOwnerStreet,
businessOwnerPostalCode,
// DBA address
dbaCountry,
dbaRegion,
dbaCity,
dbaStreet,
dbaPostalCode,
status,
...details
} = merchantDetails ?? {};
const domains = merchantDomains?.map(({ merchantUrl: domain, websiteRegistrar }) => {
const { ianaNumber, riskLevel, name } = websiteRegistrar;
return {
domain,
websiteRegistrar: name,
ianaNumber,
riskLevel,
};
});
const addresses = [
{
entity: 'Merchant',
country: merchantCountry,
region: merchantRegion,
city: merchantCity,
street: merchantStreet,
postalCode: merchantPostalCode,
},
{
entity: 'Business Owner',
country: businessOwnerCountry,
region: businessOwnerRegion,
city: businessOwnerCity,
street: businessOwnerStreet,
postalCode: businessOwnerPostalCode,
},
{
entity: 'DBA',
country: dbaCountry,
region: dbaRegion,
city: dbaCity,
street: dbaStreet,
postalCode: dbaPostalCode,
},
];
const checkResult = {
checkCreatedAt,
status,
};
const warnings = actions?.map(warning => ({ warning })) ?? [];
return {
reason,
labels,
addresses,
domains,
details,
checkResult,
warnings,
};
};
const websiteMonitoring = websiteMonitoringAdapter(pluginsOutput?.website_monitoring?.data ?? {});
return useMemo(() => {
if (Object.keys(pluginsOutput?.website_monitoring?.data ?? {}).length === 0) {
return [];
}
return createBlocksTyped()
.addBlock()
.addCell({
type: 'block',
value: createBlocksTyped()
.addBlock()
.addCell({
type: 'container',
value: createBlocksTyped()
.addBlock()
.addCell({
type: 'heading',
value: 'Website monitoring',
})
.addCell({
type: 'subheading',
value: '3rd Party Provided Data',
props: {
className: 'mb-4',
},
})
.build()
.flat(1),
})
.addCell({
id: 'visible-title',
type: 'table',
hideSeparator: true,
value: {
title: 'Result',
columns: [
{
accessorKey: 'status',
header: 'Status',
cell: props => {
const value = props.getValue();
const isCompleted = value === 'completed';
return (
{toTitleCase(websiteMonitoring?.checkResult?.status ?? '')}
);
},
},
{
accessorKey: 'checkCreatedAt',
header: 'Check Created at',
},
],
data: [websiteMonitoring?.checkResult],
},
})
.addCell({
type: 'table',
value: {
props: {
table: {
className: 'my-8',
},
},
columns: [
{
accessorKey: 'warning',
header: 'Warning',
cell: props => {
let value = props.getValue();
if (value === 'gbpp') {
value = 'virp';
}
const pickWarningVariant = (): ComponentProps['variant'] => {
const warnings = websiteMonitoring?.warnings?.map(({ warning }) => warning);
const isHighRisk =
(warnings?.includes('high_risk') &&
websiteMonitoring?.warnings?.length > 1) ||
includesValues(['gbpp', 'bram', 'tl_confirmed'], warnings);
const isDestructive = ['virp', 'bram'].includes(value) || isHighRisk;
const isWarning = [
'high_risk',
'tc_moderate_risk',
'tl_suspected',
'offline_domain_moderate_risk',
'parked_domain_moderate_risk',
].includes(value);
const isSlate = ['low_risk'].includes(value);
const isSuccess = ['cleared'].includes(value);
if (isDestructive) return 'destructive';
if (isWarning) return 'warning';
if (isSlate) return 'secondary';
if (isSuccess) return 'success';
return 'secondary';
};
const variant = pickWarningVariant();
if (isNullish(value) || value === '') {
return N/A;
}
return (
{toUpperCase(toTitleCase(value))}
);
},
},
],
data: websiteMonitoring?.warnings,
},
})
.addCell({
type: 'table',
value: {
props: {
table: {
className: 'mb-8',
},
},
columns: [
{
accessorKey: 'contentLabel',
header: 'Content Labels',
cell: props => {
const value = props.getValue();
return (
{value}
);
},
},
],
data: websiteMonitoring?.labels,
},
})
.addCell({
type: 'container',
value: createBlocksTyped()
.addBlock()
.addCell({
type: 'subheading',
value: 'Reason',
props: {
className: 'mb-2',
},
})
.addCell({
type: 'paragraph',
value:
isNullish(websiteMonitoring?.reason) || websiteMonitoring?.reason === ''
? 'N/A'
: websiteMonitoring?.reason,
props: {
className: ctw({
'text-slate-400':
isNullish(websiteMonitoring?.reason) || websiteMonitoring?.reason === '',
}),
},
})
.build()
.flat(1),
})
.addCell({
type: 'container',
value: createBlocksTyped()
.addBlock()
.addCell({
type: 'heading',
value: 'Merchant Domains',
})
.addCell({
type: 'table',
value: {
props: {
table: {
className: 'my-8',
},
},
columns: [
{
accessorKey: 'entity',
header: 'Entity',
},
{
accessorKey: 'country',
header: 'Country',
},
{
accessorKey: 'region',
header: 'Region',
},
{
accessorKey: 'city',
header: 'City',
},
{
accessorKey: 'street',
header: 'Street',
},
{
accessorKey: 'postalCode',
header: 'Postal Code',
},
],
data: websiteMonitoring?.addresses,
},
})
.build()
.flat(1),
})
.addCell({
type: 'container',
value: createBlocksTyped()
.addBlock()
.addCell({
type: 'heading',
value: 'Merchant Details',
props: {
className: 'mb-6',
},
})
.addCell({
type: 'details',
hideSeparator: true,
value: {
data: Object.entries(websiteMonitoring?.details ?? {})?.map(([title, value]) => ({
title,
value,
})),
},
workflowId: workflow?.id,
documents: workflow?.context?.documents?.map(
({ details: _details, ...document }) => document,
),
isDocumentsV2: !!workflow?.workflowDefinition?.config?.isDocumentsV2,
})
.build()
.flat(1),
})
.build()
.flat(1),
})
.build();
}, [
pluginsOutput?.website_monitoring?.data,
websiteMonitoring?.addresses,
websiteMonitoring?.checkResult,
websiteMonitoring?.details,
websiteMonitoring?.labels,
websiteMonitoring?.reason,
websiteMonitoring?.warnings,
workflow?.context?.documents,
workflow?.id,
]);
};