feat(07-02): extend PreparePanel with agentDownloadUrl/signedAt props and Signed download section
- Added agentDownloadUrl and signedAt to PreparePanelProps interface (optional, nullable) - Destructure new props in function signature - Added Signed status branch: green panel with signed timestamp and Download Signed PDF anchor - Kept Sent/Viewed branch: gray read-only message - Draft status: existing prepare form unchanged - Download is a plain <a href> anchor — no fetch/onClick; browser follows link directly
This commit is contained in:
@@ -8,6 +8,8 @@ interface PreparePanelProps {
|
||||
defaultEmail: string;
|
||||
clientName: string;
|
||||
currentStatus: string;
|
||||
agentDownloadUrl?: string | null;
|
||||
signedAt?: Date | null;
|
||||
}
|
||||
|
||||
function parseEmails(raw: string | undefined): string[] {
|
||||
@@ -18,7 +20,7 @@ function isValidEmail(email: string): boolean {
|
||||
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
||||
}
|
||||
|
||||
export function PreparePanel({ docId, defaultEmail, clientName, currentStatus }: PreparePanelProps) {
|
||||
export function PreparePanel({ docId, defaultEmail, clientName, currentStatus, agentDownloadUrl, signedAt }: PreparePanelProps) {
|
||||
const router = useRouter();
|
||||
const [recipients, setRecipients] = useState(defaultEmail ?? '');
|
||||
// Sync if defaultEmail arrives after initial render (streaming / hydration timing)
|
||||
@@ -29,9 +31,51 @@ export function PreparePanel({ docId, defaultEmail, clientName, currentStatus }:
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [result, setResult] = useState<{ ok: boolean; message: string } | null>(null);
|
||||
|
||||
if (currentStatus === 'Signed') {
|
||||
return (
|
||||
<div style={{ borderRadius: '0.5rem', border: '1px solid #D1FAE5', padding: '1rem', backgroundColor: '#F0FDF4' }}>
|
||||
<p style={{ fontSize: '0.875rem', color: '#065F46', fontWeight: 600, marginBottom: '0.5rem' }}>
|
||||
Document Signed
|
||||
</p>
|
||||
{signedAt && (
|
||||
<p style={{ fontSize: '0.75rem', color: '#6B7280', marginBottom: '0.75rem' }}>
|
||||
Signed on{' '}
|
||||
{new Date(signedAt).toLocaleString('en-US', {
|
||||
timeZone: 'America/Denver',
|
||||
month: 'short',
|
||||
day: 'numeric',
|
||||
year: 'numeric',
|
||||
hour: 'numeric',
|
||||
minute: '2-digit',
|
||||
})}
|
||||
</p>
|
||||
)}
|
||||
{agentDownloadUrl ? (
|
||||
<a
|
||||
href={agentDownloadUrl}
|
||||
style={{
|
||||
display: 'inline-block',
|
||||
padding: '0.5rem 1rem',
|
||||
backgroundColor: '#1B2B4B',
|
||||
color: '#FFFFFF',
|
||||
borderRadius: '0.375rem',
|
||||
fontSize: '0.875rem',
|
||||
fontWeight: 500,
|
||||
textDecoration: 'none',
|
||||
}}
|
||||
>
|
||||
Download Signed PDF
|
||||
</a>
|
||||
) : (
|
||||
<p style={{ fontSize: '0.75rem', color: '#9CA3AF' }}>Signed PDF not available.</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (currentStatus !== 'Draft') {
|
||||
return (
|
||||
<div className="rounded-lg border border-gray-200 p-4 bg-gray-50 text-sm text-gray-500">
|
||||
<div style={{ borderRadius: '0.5rem', border: '1px solid #E5E7EB', padding: '1rem', backgroundColor: '#F9FAFB', fontSize: '0.875rem', color: '#6B7280' }}>
|
||||
Document status is <strong>{currentStatus}</strong> — preparation is only available for Draft documents.
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user