Files
compras/resources/js/pages/candidate/entry.tsx
T
nala c6373365bf
tests / ci (push) Canceled after 0s
commit9
2026-10-30 20:02:30 +02:00

190 lines
8.2 KiB
TypeScript

import { Head, Link, useForm } from '@inertiajs/react';
import { FormErrors, controlClass } from '@/components/procurement';
import { Button } from '@/components/ui/button';
export default function Entry({
company,
portal,
}: {
company: { id: number; name: string };
portal: { version: number; registration_open: boolean; notice: string };
}) {
const login = useForm({ email: '', password: '' });
const register = useForm({
email: '',
password: '',
password_confirmation: '',
portal_version: portal.version,
notice_acknowledged: false,
});
const credentials = (form: typeof login, prefix: string) => (
<>
<label className="grid gap-2">
Email
<input
className={controlClass}
type="email"
required
autoComplete="email"
value={form.data.email}
onChange={(e) => form.setData('email', e.target.value)}
/>
</label>
<label className="grid gap-2">
Palavra-passe
<input
className={controlClass}
type="password"
required
autoComplete={
prefix === 'login' ? 'current-password' : 'new-password'
}
value={form.data.password}
onChange={(e) => form.setData('password', e.target.value)}
/>
</label>
</>
);
return (
<>
<Head title="Área do candidato" />
<Link
href={`/candidaturas/${company.id}/recuperar`}
className="m-5 inline-block underline"
>
Recuperar acesso
</Link>
<main className="mx-auto max-w-3xl space-y-6 p-6">
<p>SGC · Uma solução TEMPO</p>
<h1 className="text-3xl font-semibold">
Área do candidato · {company.name}
</h1>
<p>
Prepare o seu perfil e candidate-se às oportunidades
publicadas. O envio de anexos ainda está em desenvolvimento.
Criar um perfil não constitui candidatura ou contratação.
</p>
<section className="space-y-3">
<h2 className="text-xl font-semibold">Entrar</h2>
<form
className="space-y-3"
onSubmit={(e) => {
e.preventDefault();
login.post(`/candidaturas/${company.id}/entrar`, {
onFinish: () => login.reset('password'),
});
}}
>
<FormErrors errors={login.errors} />
{credentials(login, 'login')}
<Button disabled={login.processing}>
Entrar na minha área
</Button>
</form>
</section>
<section className="space-y-3">
<h2 className="text-xl font-semibold">Criar conta</h2>
<p className="whitespace-pre-wrap">{portal.notice}</p>
{portal.registration_open ? (
<form
className="space-y-3"
onSubmit={(e) => {
e.preventDefault();
register.post(
`/candidaturas/${company.id}/registar`,
{
onFinish: () =>
register.reset(
'password',
'password_confirmation',
),
},
);
}}
>
<FormErrors errors={register.errors} />
<label className="grid gap-2">
Email
<input
className={controlClass}
type="email"
autoComplete="email"
required
value={register.data.email}
onChange={(e) =>
register.setData(
'email',
e.target.value,
)
}
/>
</label>
<label className="grid gap-2">
Palavra-passe (mínimo 12 caracteres)
<input
className={controlClass}
type="password"
autoComplete="new-password"
minLength={12}
maxLength={128}
required
value={register.data.password}
onChange={(e) =>
register.setData(
'password',
e.target.value,
)
}
/>
</label>
<label className="grid gap-2">
Confirmar palavra-passe
<input
className={controlClass}
type="password"
autoComplete="new-password"
required
value={register.data.password_confirmation}
onChange={(e) =>
register.setData(
'password_confirmation',
e.target.value,
)
}
/>
</label>
<label className="flex gap-2">
<input
type="checkbox"
required
checked={register.data.notice_acknowledged}
onChange={(e) =>
register.setData(
'notice_acknowledged',
e.target.checked,
)
}
/>
Tomei conhecimento do aviso apresentado, versão{' '}
{portal.version}.
</label>
<p className="text-sm">
Este registo não autoriza a partilha do perfil
para outras finalidades ou empresas.
</p>
<Button disabled={register.processing}>
Criar a minha conta
</Button>
</form>
) : (
<p>
Novos registos estão encerrados. As contas
existentes podem continuar a entrar.
</p>
)}
</section>
</main>
</>
);
}