diff --git a/apps/frontend/src/app/(app)/bloqueio/page.tsx b/apps/frontend/src/app/(app)/bloqueio/page.tsx
index 393b758..9dfd8f9 100644
--- a/apps/frontend/src/app/(app)/bloqueio/page.tsx
+++ b/apps/frontend/src/app/(app)/bloqueio/page.tsx
@@ -95,7 +95,8 @@ function SuppressionContent() {
});
const remove = useMutation({
- mutationFn: (id: string) => suppressionService.remove(id),
+ mutationFn: ({ id, removalReason }: { id: string; removalReason: string }) =>
+ suppressionService.remove(id, removalReason),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['suppression'] });
toast({ title: 'Número desbloqueado', variant: 'success' });
@@ -131,7 +132,12 @@ function SuppressionContent() {
variant="ghost"
className="text-destructive"
onClick={() => {
- if (confirm(`Desbloquear ${r.phoneNormalized}?`)) remove.mutate(r.id);
+ const removalReason = window.prompt(
+ `Motivo para desbloquear ${r.phoneNormalized} (obrigatório):`,
+ );
+ if (removalReason && removalReason.trim().length > 0) {
+ remove.mutate({ id: r.id, removalReason: removalReason.trim() });
+ }
}}
>
diff --git a/apps/frontend/src/lib/api-client.ts b/apps/frontend/src/lib/api-client.ts
index 50c7b12..f8062ad 100644
--- a/apps/frontend/src/lib/api-client.ts
+++ b/apps/frontend/src/lib/api-client.ts
@@ -61,7 +61,11 @@ async function request(
const init: RequestInit = {
method,
credentials: 'include',
- headers: isForm ? undefined : { 'Content-Type': 'application/json' },
+ // Content-Type: application/json sem corpo faz o Fastify rejeitar a
+ // requisição ("Body cannot be empty when content-type is set to
+ // 'application/json'") — só envia o header quando há de fato um corpo
+ // (ex.: POST de ação sem payload, como reset-password/publish/start).
+ headers: isForm || body === undefined ? undefined : { 'Content-Type': 'application/json' },
body: isForm
? (body as FormData)
: body !== undefined
@@ -119,7 +123,7 @@ export const api = {
request('GET', path, { params }),
post: (path: string, body?: unknown) => request('POST', path, { body }),
patch: (path: string, body?: unknown) => request('PATCH', path, { body }),
- delete: (path: string) => request('DELETE', path),
+ delete: (path: string, body?: unknown) => request('DELETE', path, { body }),
upload: (path: string, form: FormData, params?: object) =>
request('POST', path, { body: form, isForm: true, params }),
download: (path: string, params?: object) =>
diff --git a/apps/frontend/src/services/suppression.ts b/apps/frontend/src/services/suppression.ts
index b5fb921..7915cb2 100644
--- a/apps/frontend/src/services/suppression.ts
+++ b/apps/frontend/src/services/suppression.ts
@@ -17,5 +17,6 @@ export const suppressionService = {
form.append('file', file);
return api.upload('/suppression/import', form);
},
- remove: (id: string) => api.delete(`/suppression/${id}`),
+ remove: (id: string, removalReason: string) =>
+ api.delete(`/suppression/${id}`, { removalReason }),
};