Skip to content

Commit

Permalink
feat(web): add button to email certificate
Browse files Browse the repository at this point in the history
  • Loading branch information
losolio committed Feb 13, 2025
1 parent a640690 commit 20b2b2b
Showing 1 changed file with 67 additions and 7 deletions.
74 changes: 67 additions & 7 deletions apps/web/src/app/admin/events/LiveActionsMenu.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
'use client';

import { RegistrationDto, RegistrationStatus } from '@eventuras/sdk';
import { ApiError, RegistrationDto, RegistrationStatus } from '@eventuras/sdk';
import { Button } from '@eventuras/ui';
import { Logger } from '@eventuras/utils';
import { IconCircleX } from '@tabler/icons-react';
import { useState } from 'react';

import Link from '@/components/Link';
import { apiWrapper, createSDK } from '@/utils/api/EventurasApi';

import { statusPatchRequest } from '../registrations/Registration';

Expand All @@ -14,6 +17,10 @@ interface LiveActionsMenuProps {
}

const LiveActionsMenu = ({ registration, onStatusUpdate }: LiveActionsMenuProps) => {
const [emailLoading, setEmailLoading] = useState(false);
const [emailError, setEmailError] = useState<string | null>(null);
const [emailSuccess, setEmailSuccess] = useState(false);

const handleStatusUpdate = (newStatus: RegistrationStatus) => {
// Send PATCH request to update registration status
statusPatchRequest(registration.registrationId!, newStatus);
Expand All @@ -23,6 +30,47 @@ const LiveActionsMenu = ({ registration, onStatusUpdate }: LiveActionsMenuProps)
}
};

const handleEmailCertificate = async (registrationId: number) => {
try {
setEmailLoading(true);
setEmailError(null);
setEmailSuccess(false);

const eventuras = createSDK({ inferUrl: { enabled: true, requiresToken: true } });

const result = await apiWrapper(() =>
eventuras.registrationCertificate.postV3RegistrationsCertificateSend({
id: registrationId,
})
);

if (!result.ok) {
// Handle ApiError properly
const errorMessage =
typeof result.error === 'string'
? result.error
: (result.error as ApiError)?.message || 'Failed to send certificate';
throw new Error(errorMessage);
}

Logger.info(
{ namespace: 'certificates:email' },
`Certificate sent successfully for registration ${registrationId}`
);

setEmailSuccess(true);
} catch (err) {
const errorMessage = err instanceof Error ? err.message : 'Failed to send certificate';
setEmailError(errorMessage);
Logger.error(
{ namespace: 'certificates:email' },
`Failed to send certificate for registration ${registrationId}: ${errorMessage}`
);
} finally {
setEmailLoading(false);
}
};

function renderButtonBasedOnStatus() {
switch (registration.status) {
case 'Draft':
Expand All @@ -39,12 +87,24 @@ const LiveActionsMenu = ({ registration, onStatusUpdate }: LiveActionsMenuProps)
default:
if (registration.certificateId) {
return (
<Link
href={`/admin/certificates/${registration.certificateId}`}
variant="button-outline"
>
🏆
</Link>
<div className="flex items-center gap-2">
<Link
href={`/admin/certificates/${registration.certificateId}`}
variant="button-outline"
>
🏆
</Link>
<div className="flex items-center gap-1">
<Button
onClick={() => handleEmailCertificate(registration.registrationId!)}
disabled={emailLoading}
>
{emailLoading ? '📧...' : '✉️'}
{emailSuccess && '✅'}
</Button>
</div>
{emailError && <span className="text-red-500 text-sm">{emailError}</span>}
</div>
);
}
return (
Expand Down

0 comments on commit 20b2b2b

Please sign in to comment.