Receber documentos privados e locais de disponibilidade nas candidaturas
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-30 20:52:10 +02:00
parent 2134aa084b
commit bf84575d10
26 changed files with 2756 additions and 49 deletions
@@ -0,0 +1,34 @@
export type AvailabilityLocation = {
province: string;
district: string;
locality: string;
};
export function CandidateAvailability({
data,
}: {
data?: {
availability?: AvailabilityLocation;
additional_availability?: AvailabilityLocation[];
};
}) {
if (!data?.availability) return null;
return (
<section className="space-y-2">
<h3 className="font-semibold">
Locais de disponibilidade do perfil enviado
</h3>
<ul className="list-inside list-disc">
{[
data.availability,
...(data.additional_availability ?? []),
].map((location, index) => (
<li key={index}>
{location.province} · {location.district} ·{' '}
{location.locality}
</li>
))}
</ul>
</section>
);
}
@@ -0,0 +1,42 @@
export type ReceivedDocument = {
key: string;
name: string;
size: number;
sha256: string;
verification: string;
};
export function CandidateDocumentList({
documents,
baseUrl,
}: {
documents?: Record<string, ReceivedDocument> | [];
baseUrl: string;
}) {
if (!documents || Object.keys(documents).length === 0) return null;
return (
<section className="space-y-2">
<h3 className="font-semibold">Documentos recebidos</h3>
<ul className="space-y-2">
{Object.values(documents).map((document) => (
<li key={document.key}>
<a
className="underline"
href={`${baseUrl}/documentos/${document.key}`}
>
{document.name}
</a>{' '}
· {document.size} bytes
<p className="text-xs break-all">
SHA-256: {document.sha256}
</p>
</li>
))}
</ul>
<p className="text-sm">
Formato conferido na recepção. O conteúdo e a autenticidade
dependem da análise documental.
</p>
</section>
);
}