github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/ui/dashboard/src/hooks/useDownloadPanelData.ts (about)

     1  import { PanelDefinition } from "../types";
     2  import { saveAs } from "file-saver";
     3  import { timestampForFilename } from "../utils/date";
     4  import { useCallback, useState } from "react";
     5  import { useDashboard } from "./useDashboard";
     6  import { usePapaParse } from "react-papaparse";
     7  
     8  const useDownloadPanelData = (definition: PanelDefinition) => {
     9    const { selectedDashboard } = useDashboard();
    10    const { jsonToCSV } = usePapaParse();
    11    const [processing, setProcessing] = useState(false);
    12  
    13    const downloadQueryData = useCallback(async () => {
    14      if (!definition.data) {
    15        return;
    16      }
    17      setProcessing(true);
    18      const data = definition.data;
    19      const colNames = data.columns.map((c) => c.name);
    20      let csvRows: any[] = [];
    21  
    22      const jsonbColIndices = data.columns
    23        .filter((i) => i.data_type === "JSONB")
    24        .map((i) => data.columns.indexOf(i)); // would return e.g. [3,6,9]
    25  
    26      for (const row of data.rows) {
    27        // Deep copy the row or else it will update
    28        // the values in query output
    29        const csvRow: any[] = [];
    30        colNames.forEach((col, index) => {
    31          csvRow[index] = jsonbColIndices.includes(index)
    32            ? JSON.stringify(row[col])
    33            : row[col];
    34        });
    35        csvRows.push(csvRow);
    36      }
    37  
    38      const csv = jsonToCSV([colNames, ...csvRows]);
    39      const blob = new Blob([csv], { type: "text/csv;charset=utf-8" });
    40  
    41      saveAs(
    42        blob,
    43        `${(
    44          selectedDashboard?.full_name ||
    45          definition.dashboard ||
    46          ""
    47        ).replaceAll(".", "_")}_${definition.panel_type}_${timestampForFilename(
    48          Date.now()
    49        )}.csv`
    50      );
    51      setProcessing(false);
    52    }, [definition, jsonToCSV, selectedDashboard]);
    53  
    54    return { download: downloadQueryData, processing };
    55  };
    56  
    57  export default useDownloadPanelData;