"use client" import { useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Alert, AlertDescription } from "@/components/ui/alert" import { Download, Search, Loader2 } from "lucide-react" const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:5000/api/v1" // Primeiro, vamos atualizar as interfaces para os diferentes tipos de dados // Substitua a interface TranscriptionData existente com estas interfaces: interface ClientTranscriptionData { uniqueid: string src: string dst: string start_call: string total_billsec: number total_min: string } interface HitTranscriptionData { uniqueid: string src: string dst: string start_call: string end_call: string total_billsec: number companyId: string custo_HIT: number price: number client_price: string } type TranscriptionData = ClientTranscriptionData | HitTranscriptionData // Primeiro, vamos atualizar as interfaces para refletir a nova estrutura da API: interface PaginationInfo { total: number page: number page_size: number total_pages: number } interface ApiResponse { success: boolean data: { data: TranscriptionData[] pagination: PaginationInfo } } export default function TranscriptionTable() { // Agora, atualize o estado para usar o tipo correto // Substitua a linha do useState por: const [data, setData] = useState([]) const [isLoading, setIsLoading] = useState(false) const [isExporting, setIsExporting] = useState(false) const [error, setError] = useState("") // Filtros const [companyId, setCompanyId] = useState("") const [startDate, setStartDate] = useState("") const [endDate, setEndDate] = useState("") // E atualize a definição do estado who: const [who, setWho] = useState<"client" | "hit">("client") // Adicionar estados para paginação após os estados existentes: const [pagination, setPagination] = useState({ total: 0, page: 1, page_size: 20, total_pages: 0, }) const [currentPage, setCurrentPage] = useState(1) const [pageSize, setPageSize] = useState(20) const getAuthHeaders = () => { const token = localStorage.getItem("access_token") return { Authorization: `Bearer ${token}`, "Content-Type": "application/json", } } // Atualizar a função fetchData para incluir parâmetros de paginação: const fetchData = async (page: number = currentPage) => { if (!companyId || !startDate || !endDate) { setError("Preencha todos os campos obrigatórios") return } setIsLoading(true) setError("") try { const params = new URLSearchParams({ companyId, startDate, endDate, who, page: page.toString(), page_size: pageSize.toString(), }) const response = await fetch(`${API_BASE_URL}/usage/data/trascription?${params}`, { headers: getAuthHeaders(), }) if (response.ok) { const result: ApiResponse = await response.json() if (result.success && result.data) { setData(result.data.data || []) setPagination(result.data.pagination) setCurrentPage(result.data.pagination.page) } else { setData([]) setPagination({ total: 0, page: 1, page_size: 20, total_pages: 0 }) } } else { const errorData = await response.json() setError(errorData.message || "Erro ao buscar dados") } } catch (err) { console.log("====> Erro de conexão com o servidor: ", err) setError("Erro de conexão com o servidor") } finally { setIsLoading(false) } } const exportToExcel = async () => { if (!companyId || !startDate || !endDate) { setError("Preencha todos os campos obrigatórios") return } setIsExporting(true) setError("") try { const params = new URLSearchParams({ companyId, startDate, endDate, who, }) const response = await fetch(`${API_BASE_URL}/usage/export/trascription?${params}`, { headers: getAuthHeaders(), }) if (response.ok) { const blob = await response.blob() const url = window.URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = `transcription-report-${who}-${startDate}-${endDate}.xlsx` document.body.appendChild(a) a.click() window.URL.revokeObjectURL(url) document.body.removeChild(a) } else { const errorData = await response.json() setError(errorData.message || "Erro ao exportar dados") } } catch (err) { console.log("====> Erro de conexão com o servidor: ", err) setError("Erro de conexão com o servidor") } finally { setIsExporting(false) } } // Adicionar funções de navegação de páginas: const goToPage = (page: number) => { if (page >= 1 && page <= pagination.total_pages) { setCurrentPage(page) fetchData(page) } } const goToFirstPage = () => goToPage(1) const goToPreviousPage = () => goToPage(currentPage - 1) const goToNextPage = () => goToPage(currentPage + 1) const goToLastPage = () => goToPage(pagination.total_pages) return (
{/* Filtros */} Filtros de Consulta
setCompanyId(e.target.value)} placeholder="123" />
setStartDate(e.target.value)} />
setEndDate(e.target.value)} />
{/* Também vamos atualizar o Select para usar "hit" em vez de "company" // Substitua o componente Select para o campo "who": */}
{/* Adicionar seletor de tamanho de página nos filtros: */}
{error && ( {error} )} {/* Tabela de Dados */} {/* Atualizar o título da tabela para mostrar informações de paginação: */} Resultados da Consulta {pagination.total > 0 && ( (Página {currentPage} de {pagination.total_pages} - {pagination.total} registros total) )} {/* Agora, atualize a parte da tabela para exibir colunas diferentes com base no valor de who // Substitua a seção da tabela com: */} {data.length > 0 ? (
ID Único Origem Destino Início {who === "hit" && Fim} Duração (s) {who === "client" ? ( Total (min) ) : ( <> Empresa Custo HIT Preço Preço Cliente )} {data.map((item, index) => ( {item.uniqueid || "-"} {item.src || "-"} {item.dst || "-"} {item.start_call || "-"} {who === "hit" && {(item as HitTranscriptionData).end_call || "-"}} {item.total_billsec || "-"} {who === "client" ? ( {(item as ClientTranscriptionData).total_min || "-"} ) : ( <> {(item as HitTranscriptionData).companyId || "-"} {(item as HitTranscriptionData).custo_HIT ? `$${(item as HitTranscriptionData).custo_HIT.toFixed(6)}` : "-"} {(item as HitTranscriptionData).price ? `$${(item as HitTranscriptionData).price.toFixed(4)}` : "-"} {(item as HitTranscriptionData).client_price ? `$${(item as HitTranscriptionData).client_price}` : "-"} )} ))}
) : (
Nenhum dado encontrado. Use os filtros acima para buscar dados.
)} {/* Componente de Paginação */} {pagination.total > 0 && (

Mostrando {(currentPage - 1) * pagination.page_size + 1} até{" "} {Math.min(currentPage * pagination.page_size, pagination.total)}{" "} de {pagination.total} resultados

{/* Páginas numeradas */} {Array.from({ length: Math.min(5, pagination.total_pages) }, (_, i) => { let pageNum if (pagination.total_pages <= 5) { pageNum = i + 1 } else if (currentPage <= 3) { pageNum = i + 1 } else if (currentPage >= pagination.total_pages - 2) { pageNum = pagination.total_pages - 4 + i } else { pageNum = currentPage - 2 + i } return ( ) })}
)}
) }