my table and DataTableFetcher

PHOTO EMBED

Wed Jan 24 2024 10:57:44 GMT+0000 (Coordinated Universal Time)

Saved by @taharjt

import React, { useEffect, useState } from 'react';

const MyTable = ({ intradata }) => {
  const [data, setData] = useState(null);
  const [selectedGroup, setSelectedGroup] = useState('summary');
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);
  const [columns, setColumns] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch('http://5.34.198.87:8000/api/options/intradatacols');

        if (!response.ok) {
          throw new Error(`HTTP error! Status: ${response.status}`);
        }

        const contentType = response.headers.get('content-type');
        if (!contentType || !contentType.includes('application/json')) {
          throw new Error('Invalid content type. Expected JSON.');
        }

        const jsonData = await response.json();
        console.log('API Response for intradatacols:', jsonData);
        setData(jsonData);

        const validGroups = Object.keys(jsonData.groups);
        const initialColumns = jsonData.groupscolumn[selectedGroup] || [];
        setColumns(initialColumns);

        if (!validGroups.includes(selectedGroup)) {
          console.error(`Invalid selectedGroup: ${selectedGroup}`);
          return;
        }
      } catch (error) {
        console.error('Error fetching data:', error);
        setError(error.message || 'An error occurred while fetching data.');
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, [selectedGroup]);

  useEffect(() => {
    console.log('intradata:', intradata);
    console.log('columns:', columns);
    console.log('data:', data);
  }, [intradata, columns, data]);

  if (loading) {
    return <div>Loading...</div>;
  }

  if (error) {
    return <div>Error: {error}</div>;
  }

  if (!data || !data.groups || !data.groupscolumn) {
    return <div>No data available</div>;
  }

  const validGroups = Object.keys(data.groups);

  if (!validGroups.includes(selectedGroup)) {
    console.error(`Invalid selectedGroup: ${selectedGroup}`);
    return <div>No data available</div>;
  }

  return (
    <div className="container mt-4">
      <div className="btn-group mb-3">
        {validGroups.map((groupKey) => (
          <button
            key={groupKey}
            type="button"
            className={`btn ${selectedGroup === groupKey ? 'btn-primary' : 'btn-secondary'}`}
            onClick={() => setSelectedGroup(groupKey)}
          >
            {data.groups[groupKey]}
          </button>
        ))}
      </div>

      <div className="table-container" style={{ overflowY: 'auto', maxHeight: '500px' }}>
        <table className="table table-bordered table-striped">
          <thead className="thead-dark">
            <tr>
              {columns.map((column, index) => (
                <th key={index}>{data.fields[column]}</th>
              ))}
            </tr>
          </thead>
          <tbody>
            {intradata && Array.isArray(intradata) ? (
              intradata.map((item, itemIndex) => (
                <tr key={itemIndex}>
                  {columns.map((column, columnIndex) => (
                    <td key={columnIndex}>{item[column]}</td>
                  ))}
                </tr>
              ))
            ) : (
              <tr>
                <td colSpan={columns.length}>{intradata === null ? 'Loading...' : 'No data available'}</td>
              </tr>
            )}
          </tbody>
        </table>
      </div>
    </div>
  );
};

export default MyTable;




import React, { useEffect, useState } from 'react';
import MyTable from './MyTable';

const DataTableFetcher = () => {
  const [intradata, setIntradata] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch('http://5.34.198.87:8000/api/options/intradata');

        if (!response.ok) {
          throw new Error(`HTTP error! Status: ${response.status}`);
        }

        const contentType = response.headers.get('content-type');
        if (!contentType || !contentType.includes('application/json')) {
          throw new Error('Invalid content type. Expected JSON.');
        }

        const jsonData = await response.json();
        console.log('API Response:', jsonData);
        setIntradata(jsonData.data);
      } catch (error) {
        console.error('Error fetching intradata:', error);
        setError(error.message || 'An error occurred while fetching intradata.');
      } finally {
        setLoading(false);
      }
    };

    fetchData();
  }, []);

  if (loading) {
    return <div>Loading...</div>;
  }

  if (error) {
    return <div>Error: {error}</div>;
  }

  return <MyTable intradata={intradata} />;
};

export default DataTableFetcher;
content_copyCOPY