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;
|
defaultEmail: string;
|
||||||
clientName: string;
|
clientName: string;
|
||||||
currentStatus: string;
|
currentStatus: string;
|
||||||
|
agentDownloadUrl?: string | null;
|
||||||
|
signedAt?: Date | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseEmails(raw: string | undefined): string[] {
|
function parseEmails(raw: string | undefined): string[] {
|
||||||
@@ -18,7 +20,7 @@ function isValidEmail(email: string): boolean {
|
|||||||
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
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 router = useRouter();
|
||||||
const [recipients, setRecipients] = useState(defaultEmail ?? '');
|
const [recipients, setRecipients] = useState(defaultEmail ?? '');
|
||||||
// Sync if defaultEmail arrives after initial render (streaming / hydration timing)
|
// 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 [loading, setLoading] = useState(false);
|
||||||
const [result, setResult] = useState<{ ok: boolean; message: string } | null>(null);
|
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') {
|
if (currentStatus !== 'Draft') {
|
||||||
return (
|
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.
|
Document status is <strong>{currentStatus}</strong> — preparation is only available for Draft documents.
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user