import React, { useState, useEffect, useMemo } from "react"; import { MaterialReactTable } from "material-react-table"; import { useDispatch, useSelector } from "react-redux"; import { useTranslation } from "react-i18next"; import { Card, CardHeader, CardTitle, Alert, Row, Col, Label, } from "reactstrap"; import { getVMEmissionSummary } from "../../redux/actions/mainDataTables/index"; import { getDataCenters } from "../../redux/actions/dataCenter"; import { editNumbers } from "../../components/edit-numbers"; import Select from "react-select"; function MainDataTables() { const { t } = useTranslation(); const dispatch = useDispatch(); const mainDataTablesStore = useSelector((state) => state.mainDataTables); const dataCenterStore = useSelector((state) => state.dataCenter); const [error, setError] = useState(null); const [selectedDataCenter, setSelectedDataCenter] = useState(null); const [dataCenterOptions, setDataCenterOptions] = useState([]); const [loading, setLoading] = useState(false); // Fetch datacenters on component mount useEffect(() => { dispatch(getDataCenters()); }, [dispatch]); // Update datacenter options when datacenters are loaded useEffect(() => { if (dataCenterStore?.dataCenters?.length > 0) { const options = dataCenterStore.dataCenters.map((dataCenter) => ({ value: dataCenter.id, label: dataCenter.dataCenter, externalId: dataCenter.externalId, })); setDataCenterOptions(options); } }, [dataCenterStore?.dataCenters]); // Fetch VM emission data when datacenter is selected useEffect(() => { if (selectedDataCenter?.value) { const fetchData = async () => { try { setLoading(true); setError(null); await dispatch(getVMEmissionSummary(selectedDataCenter.value)); } catch (err) { console.error("Error in MainDataTables:", err); setError(err.message); } finally { setLoading(false); } }; fetchData(); } }, [selectedDataCenter, dispatch]); // Memoize columns to prevent re-renders const columns = useMemo( () => [ { header: t("VM ID"), accessorKey: "vmId", size: 150, Cell: ({ cell }) => {cell.getValue() || "-"}, }, { header: t("VM Name"), accessorKey: "vmName", size: 200, Cell: ({ cell }) => {cell.getValue() || "-"}, }, { header: t("VM Power"), accessorKey: "vmPower", size: 120, Cell: ({ cell }) => {editNumbers(cell.getValue()) || "-"}, }, { header: t("VM Status"), accessorKey: "vmStatus", size: 100, Cell: ({ cell }) => {cell.getValue() || "-"}, }, { header: t("Total Emission"), accessorKey: "totalEmission", size: 150, Cell: ({ cell }) => {editNumbers(cell.getValue()) || "-"}, }, { header: t("Physical Machine"), accessorKey: "physicalMachine", size: 150, Cell: ({ cell }) => {cell.getValue() || "-"}, }, { header: t("Cloud System"), accessorKey: "cloudSystem", size: 150, Cell: ({ cell }) => {cell.getValue() || "-"}, }, { header: t("Data Center"), accessorKey: "dataCenter", size: 150, Cell: ({ cell }) => {cell.getValue() || "-"}, }, { header: "CO2", accessorKey: "co2", size: 100, Cell: ({ cell }) => {editNumbers(cell.getValue()) || "-"}, }, { header: "CH4", accessorKey: "ch4", size: 100, Cell: ({ cell }) => {editNumbers(cell.getValue()) || "-"}, }, { header: "N2O", accessorKey: "n2o", size: 100, Cell: ({ cell }) => {editNumbers(cell.getValue()) || "-"}, }, { header: t("Created Date"), accessorKey: "createdDate", size: 180, Cell: ({ cell }) => ( {cell.getValue() ? new Date(cell.getValue()).toLocaleString() : "-"} ), sortable: true, }, ], [t] ); // Memoize table data to prevent unnecessary re-renders const tableData = useMemo(() => { const data = mainDataTablesStore?.vmEmissionSummary || []; console.log("VM Emission data count:", data.length); return data; }, [mainDataTablesStore?.vmEmissionSummary]); if (error) { return ( Error loading data: {error} ); } return (
{t("Raw Data")} {tableData.length > 0 && ( {tableData.length} records loaded )} {/* Datacenter Selection */}