Iniciativa Cidadã Independente · Transparência Parlamentar
TSX100 linhas3.825 bytes

apps/web/src/components/senador/AbaAutorias.tsx

SHA-256

717cbe3c831c4d153dcf51a786c25f0c8862509234a2fa60e80e4bd3005ff81d

Somente leiturafonte-acf635076da2
'use client'

import { useEffect, useState } from 'react'
import { getAutorias } from '@/lib/api'
import type { AutoriaItem, ListResultBase } from '@/lib/types'
import Pagination from './Pagination'

const PORPAGINA = 25

export default function AbaAutorias({ codigo }: { codigo: string }) {
  const [data, setData] = useState<ListResultBase<AutoriaItem> | null>(null)
  const [pagina, setPagina] = useState(1)
  const [ano, setAno] = useState<number | undefined>()
  const [loading, setLoading] = useState(true)

  useEffect(() => {
    setLoading(true)
    getAutorias(codigo, { pagina, porPagina: PORPAGINA, ano })
      .then(setData)
      .finally(() => setLoading(false))
  }, [codigo, pagina, ano])

  return (
    <div className="space-y-4">
      <div className="flex items-center gap-3 text-sm">
        <label className="text-muted">Ano:</label>
        <select
          value={ano ?? ''}
          onChange={(e) => {
            setAno(e.target.value ? Number(e.target.value) : undefined)
            setPagina(1)
          }}
          className="rounded-sm border border-border bg-surface px-2 py-1 text-sm"
        >
          <option value="">Todos</option>
          {[2026, 2025, 2024, 2023].map((a) => (
            <option key={a} value={a}>{a}</option>
          ))}
        </select>
        {data && <span className="text-muted">{data.total} autorias</span>}
      </div>

      {loading ? (
        <div className="space-y-2">
          {Array.from({ length: 5 }).map((_, i) => (
            <div key={i} className="h-20 rounded-sm bg-surface border border-border animate-pulse" />
          ))}
        </div>
      ) : data && data.data.length > 0 ? (
        <>
          <ul className="space-y-2">
            {data.data.map((a) => (
              <li key={a.idProcesso} className="rounded-sm border border-border bg-surface p-3 hover:border-primary/40 transition-colors">
                <div className="flex items-start justify-between gap-3">
                  <div className="min-w-0 flex-1">
                    <p className="flex items-baseline gap-2">
                      <span className="font-mono text-sm text-ink">{a.identificacao}</span>
                      {a.dataApresentacao && (
                        <span className="text-xs text-muted">{formatBR(a.dataApresentacao)}</span>
                      )}
                    </p>
                    <p className="mt-1 text-sm text-muted leading-snug line-clamp-3">{a.ementa}</p>
                    {a.autoriaTexto && a.autoriaTexto.includes(',') && (
                      <p className="mt-1.5 text-xs text-subtle">Coautoria com outros parlamentares</p>
                    )}
                    {a.situacao && (
                      <p className="mt-1.5 text-[11px] uppercase tracking-wider text-muted font-medium">
                        {a.situacao}
                      </p>
                    )}
                  </div>
                  {a.url && (
                    <a
                      href={a.url}
                      target="_blank"
                      rel="noopener noreferrer"
                      className="shrink-0 rounded-sm border border-border px-2 py-1 text-[10px] uppercase tracking-wider text-muted hover:border-primary/40 hover:text-primary"
                    >
                      Ver no Senado ↗
                    </a>
                  )}
                </div>
              </li>
            ))}
          </ul>
          <Pagination pagina={data.pagina} porPagina={data.porPagina} total={data.total} onChange={setPagina} />
        </>
      ) : (
        <p className="text-muted text-sm">Nenhuma autoria encontrada.</p>
      )}
    </div>
  )
}

function formatBR(d: string): string {
  if (!d) return ''
  const [y, m, day] = d.split('-')
  return `${day}/${m}/${y}`
}