Files
NightSpire/web-next/components/ForumModActions.tsx
T
Inna 9b44af9675 Foro: botones con el estilo del tema y sin descuadres
Los botones del foro usaban un dorado propio; ahora comparten el lenguaje del
<button> del tema (fondo translúcido, texto crema en mayúsculas, aclara al hover),
el mismo que sale como «Editar» en el resto de la web.

Arreglos de maquetación:
- Altura fija (42px) con inline-flex en .nice_button: los <button> heredaban
  height:50px del tema y los <a> no, y en la misma fila quedaban a distinta altura
  (se notaba sobre todo en «Borrar», que es un <button>).
- Se quita el height:20px del <li> de post_controls, que aplastaba los botones.
- Texto de los enlaces-botón forzado a crema: el a:link/:visited del tema
  (más específico) pintaba de azul el texto de «Crear tema».
- «Editar», «Borrar» y «Desbloquear» pasan a .nice_button para que toda la fila
  de acciones sea homogénea.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 12:31:47 +00:00

67 lines
1.6 KiB
TypeScript

'use client'
import { useState } from 'react'
import { useTranslations } from 'next-intl'
import { useRouter } from '@/i18n/navigation'
/**
* Acciones de moderación de un post o tema (borrar/restaurar y, en temas,
* cerrar/abrir). Reemplaza los enlaces GET del forum.js original por POST a
* /api/forum/moderate, para no mutar estado con peticiones GET.
*/
export function ForumModActions({
kind,
id,
deleted = false,
locked = false,
}: {
kind: 'post' | 'topic'
id: number
deleted?: boolean
locked?: boolean
}) {
const t = useTranslations('Forum')
const router = useRouter()
const [busy, setBusy] = useState(false)
async function act(action: string) {
if (busy) return
setBusy(true)
try {
const res = await fetch('/api/forum/moderate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'same-origin',
body: JSON.stringify({ kind, id, action }),
})
const data: { success?: boolean } = await res.json()
if (data.success) router.refresh()
} finally {
setBusy(false)
}
}
return (
<>
<button
type="button"
className="nice_button"
onClick={() => act(deleted ? 'undelete' : 'delete')}
disabled={busy}
>
{deleted ? t('undelete') : t('delete')}
</button>
{kind === 'topic' && (
<button
type="button"
className="nice_button"
onClick={() => act(locked ? 'unlock' : 'lock')}
disabled={busy}
>
{locked ? t('unlock') : t('lock')}
</button>
)}
</>
)
}