import { Backdrop, Box, Button, CircularProgress, Container, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material"; import React, { useContext, useEffect, useState } from "react"; import { TopicsContext } from "./UploadFileContext"; const bunkaDocs = "bunka_docs.json"; const bunkaTopics = "bunka_topics.json"; const { REACT_APP_API_ENDPOINT } = process.env; function DocsView() { const [docs, setDocs] = useState(null); const [topics, setTopics] = useState(null); const { data: apiData, isLoading } = useContext(TopicsContext); useEffect(() => { if (REACT_APP_API_ENDPOINT === "local" || apiData === undefined) { // Fetch the JSON data locally fetch(`/${bunkaDocs}`) .then((response) => response.json()) .then((localData) => { setDocs(localData); // Fetch the topics data and merge it with the existing data fetch(`/${bunkaTopics}`) .then((response) => response.json()) .then((topicsData) => { // Set the topics data with the existing data setTopics(topicsData); }) .catch((error) => { console.error("Error fetching topics data:", error); }); }) .catch((error) => { console.error("Error fetching JSON data:", error); }); } else { // Call the function to create the scatter plot with the data provided by TopicsContext setDocs(apiData.docs); setTopics(apiData.topics); } }, [apiData]); const docsWithTopics = docs && topics ? docs.map((doc) => ({ ...doc, topic_name: topics.find((topic) => topic.topic_id === doc.topic_id)?.name || "Unknown", })) : []; const downloadCSV = () => { // Create a CSV content string from the data const csvContent = `data:text/csv;charset=utf-8,${[ ["Doc ID", "Topic ID", "Topic Name", "Content"], // CSV header ...docsWithTopics.map((doc) => [doc.doc_id, doc.topic_id, doc.topic_name, doc.content]), // CSV data ] .map((row) => row.map((cell) => `"${cell}"`).join(",")) // Wrap cells in double quotes .join("\n")}`; // Join rows with newline // Create a Blob containing the CSV data const blob = new Blob([csvContent], { type: "text/csv" }); // Create a download URL for the Blob const url = URL.createObjectURL(blob); // Create a temporary anchor element to trigger the download const a = document.createElement("a"); a.href = url; a.download = "docs.csv"; // Set the filename for the downloaded file a.click(); // Revoke the URL to free up resources URL.revokeObjectURL(url); }; return ( <Container fixed> <div className="docs-view"> <h2>Data</h2> {isLoading ? ( <Backdrop open={isLoading} style={{ zIndex: 9999 }}> <CircularProgress color="primary" /> </Backdrop> ) : ( <div> <Button variant="contained" color="primary" onClick={downloadCSV} sx={{ marginBottom: "1em" }}> Download CSV </Button> <Box sx={{ height: "1000px", // Set the height of the table overflow: "auto", // Add scroll functionality }} > <TableContainer component={Paper}> <Table> <TableHead sx={{ backgroundColor: "lightblue", // Set background color position: "sticky", // Make the header sticky top: 0, // Stick to the top }} > <TableRow> <TableCell>Doc ID</TableCell> <TableCell>Topic ID</TableCell> <TableCell>Topic Name</TableCell> <TableCell>Content</TableCell> </TableRow> </TableHead> <TableBody> {docsWithTopics.map((doc, index) => ( <TableRow key={doc.doc_id} sx={{ borderBottom: "1px solid lightblue", // Add light blue border }} > <TableCell>{doc.doc_id}</TableCell> <TableCell>{doc.topic_id}</TableCell> <TableCell>{doc.topic_name}</TableCell> <TableCell>{doc.content}</TableCell> </TableRow> ))} </TableBody> </Table> </TableContainer> </Box> </div> )} </div> </Container> ); } export default DocsView;