All files / src/pages/flowsheet-page/pinch-analysis OpenPinch.ts

15.38% Statements 6/39
0% Branches 0/4
16.66% Functions 1/6
16.21% Lines 6/37

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102                        146x 146x 146x   146x                                                                                                                                             146x                       146x    
import * as xlsx from "node-xlsx";
import { toast } from "sonner";
import {
  CreateSegment,
  PinchUtilityRead,
  SegmentRead,
  usePinchPinchutilityBulkCreateCreateMutation,
  usePinchSegmentBulkCreateCreateMutation,
} from "@/api/apiStore.gen";
import { useCurrentStreamDataProjectID } from "@/hooks/PinchHooks";
 
export function useParseExcel() {
  const project = useCurrentStreamDataProjectID();
  const [bulkCreateStreams] = usePinchSegmentBulkCreateCreateMutation();
  const [bulkCreateUtilities] = usePinchPinchutilityBulkCreateCreateMutation();
 
  const handleExcelUpload = (file: File) => {
    const parsingToastId = toast.loading("Parsing file...");
    const reader = new FileReader();
    reader.onload = async (e) => {
      try {
        const data = new Uint8Array(e.target!.result as ArrayBuffer);
        const workbook = xlsx.parse(data);
 
        // Get rows from stream data sheet
        const streamSheet = workbook.find(
          (sheet) => sheet.name === "Stream Data",
        );
        Iif (!streamSheet) {
          throw new Error("Streams Sheet Doesn't Exist");
        }
 
        const streamData = streamSheet.data.slice(2); // Skip header row
        const parsedStreams: Partial<CreateSegment>[] = [];
        for (const row of streamData) {
          Iif (!row[0]) break; // Break if row is blank
          // Serialize from cell index
          parsedStreams.push({
            name: row[1],
            parentZone: row[0],
            t_supply: parseFloat(row[2]),
            t_target: parseFloat(row[3]),
            heat_flow: parseFloat(row[4]),
            dt_cont: parseFloat(row[5]),
            htc: parseFloat(row[6]),
          });
        }
 
        // Get rows from utility data sheet
        const utilitySheet = workbook.find(
          (sheet) => sheet.name === "Utility Data",
        );
        Iif (!utilitySheet) {
          throw new Error("Utility Sheet Doesn't Exist");
        }
 
        const utilityData = utilitySheet.data.slice(2); // Skip header rows
        const parsedUtilities: Partial<PinchUtilityRead>[] = [];
        for (const row of utilityData) {
          Iif (!row[0]) break; // Break if row is blank
          // Serialize from cell index
          parsedUtilities.push({
            name: row[0],
            type: row[1],
            t_supply: parseFloat(row[2]),
            t_target: parseFloat(row[3]),
            dt_cont: parseFloat(row[4]),
            price: parseFloat(row[5]),
            htc: parseFloat(row[6]),
          });
        }
 
        // Create objects on backend
        await bulkCreateStreamsAndUtilities(parsedStreams, parsedUtilities);
        toast.success("File parsed!");
      } catch (error) {
        toast.error(`Error processing file: ${error}`);
      } finally {
        // Dismiss the loading toast
        toast.dismiss(parsingToastId);
      }
    };
 
    reader.readAsArrayBuffer(file);
  };
 
  // Add objects on backend
  const bulkCreateStreamsAndUtilities = (
    streams: Partial<SegmentRead>[],
    utilities: Partial<PinchUtilityRead>[],
  ) => {
    bulkCreateStreams({
      bulkCreateStreams: { projectID: +project, streams: streams },
    });
    bulkCreateUtilities({
      bulkCreateUtilities: { projectID: +project, utilities: utilities },
    });
  };
 
  return handleExcelUpload;
}