Current File : /home/jeconsul/public_html/wp-content/plugins/suremails/src/screens/dashboard/recent-logs.js |
import { Label, Badge, Button, Table } from '@bsf/force-ui';
import { useNavigate } from 'react-router-dom';
import Title from '@components/title/title';
import { __ } from '@wordpress/i18n';
import { ArrowUpRight, Mails, Plus } from 'lucide-react';
import { formatDate, getStatusLabel, getStatusVariant } from '@utils/utils';
const RecentLogs = ( { recentLogs, hasConnections = true } ) => {
const navigate = useNavigate();
// Helper function to extract emails using regex
const extractEmails = ( str ) => {
if ( typeof str !== 'string' ) {
return [];
}
// Regular expression to match email addresses
const emailRegex = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi;
const matches = str.match( emailRegex );
return matches || [];
};
// Helper functions: truncateText, formatEmailTo
const truncateText = ( text, maxLength = 30 ) =>
text?.length > maxLength
? `${ text.substring( 0, maxLength ) }...`
: text || '';
const formatEmailTo = ( email_to ) => {
const emails = extractEmails( email_to );
if ( ! emails.length ) {
return '';
}
const visibleEmails = emails
.slice( 0, 2 )
.map( ( email ) => truncateText( email ) );
const remainingEmails = emails.length - visibleEmails.length;
return remainingEmails > 0
? `${ visibleEmails.join( ', ' ) }... (${ remainingEmails } more)`
: visibleEmails.join( ', ' );
};
return (
<>
{ /* Header Section with Title and "Vieww All" Button */ }
<div className="flex items-center justify-between p-1">
<Title
title={ __( 'Recent Email Logs', 'suremails' ) }
tag="h3"
/>
{ recentLogs.length > 0 && (
<Button
variant="ghost"
icon={ <ArrowUpRight /> }
iconPosition="right"
size="sm"
type="button"
onClick={ () => navigate( '/logs' ) }
className="text-xs font-medium"
>
{ __( 'View all', 'suremails' ) }
</Button>
) }
</div>
{ /* Table Section */ }
<div className="overflow-hidden">
<Table className="bg-background-primary">
{ /* Table Header */ }
<Table.Head className="bg-background-secondary">
<Table.HeadCell className="px-3 py-2 text-sm font-medium text-left text-text-secondary">
{ __( 'Email To', 'suremails' ) }
</Table.HeadCell>
<Table.HeadCell className="px-3 py-2 text-sm font-medium text-left text-text-secondary">
{ __( 'Status', 'suremails' ) }
</Table.HeadCell>
<Table.HeadCell className="px-3 py-2 text-sm font-medium text-left text-text-secondary">
{ __( 'Subject', 'suremails' ) }
</Table.HeadCell>
<Table.HeadCell className="px-3 py-2 text-sm font-medium text-left text-text-secondary">
{ __( 'Date', 'suremails' ) }
</Table.HeadCell>
</Table.Head>
{ /* Table Body */ }
<Table.Body>
{ recentLogs.length === 0 ? (
<Table.Row className="bg-background-primary">
<Table.Cell
colSpan="4"
className="py-10 bg-background-primary"
>
<div className="flex flex-col items-center justify-center h-full gap-3 bg-background-primary">
<div className="flex flex-col items-center justify-center w-[29.375rem]">
<Mails className="mb-3" />
<div className="flex flex-col items-center space-y-1">
<Label
tag="p"
className="text-sm font-medium text-center text-text-primary"
>
{ __(
'No Email Logs Available',
'suremails'
) }
</Label>
<Label
tag="p"
className="text-sm font-normal text-center text-text-secondary"
>
{ __(
'Once your emails start sending, you’ll see detailed stats here to help you monitor and manage your email activity.',
'suremails'
) }
</Label>
</div>
</div>
<div>
{ ! hasConnections && (
<Button
variant="primary"
size="sm"
icon={ <Plus /> }
iconPosition="left"
onClick={ () =>
navigate(
'/connections',
{
state: {
openDrawer: true,
},
}
)
}
className="font-medium"
>
{ __(
'Add Connection',
'suremails'
) }
</Button>
) }
</div>
</div>
</Table.Cell>
</Table.Row>
) : (
recentLogs.map( ( log ) => (
<Table.Row
key={ log.id }
className="border-b border-border-subtle"
>
<Table.Cell className="px-3 py-3 text-sm font-normal text-text-secondary">
{ formatEmailTo( log.email_to ) }
</Table.Cell>
<Table.Cell className="px-3 py-3 text-text-secondary">
<Badge
className="inline-block"
label={ getStatusLabel(
log.status,
log?.response
) }
variant={ getStatusVariant(
log.status,
log?.response
) }
size="sm"
type="pill"
/>
</Table.Cell>
<Table.Cell className="px-3 py-3 text-sm font-normal text-text-secondary">
{ truncateText( log.subject, 30 ) }
</Table.Cell>
<Table.Cell className="px-3 py-3 text-sm font-normal text-text-secondary">
{ formatDate( log.updated_at, {
day: true,
month: true,
} ) }
</Table.Cell>
</Table.Row>
) )
) }
</Table.Body>
</Table>
</div>
</>
);
};
export default RecentLogs;