Skip to content

Commit 6f280a2

Browse files
committed
Added local storage support for uploaded files
1 parent e4653b0 commit 6f280a2

1 file changed

Lines changed: 62 additions & 14 deletions

File tree

src/components/home/TimeTable.tsx

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
"use client";
2-
import { useState } from "react";
2+
import { useEffect, useState } from "react";
33
import { TimeTableSlider } from "./TimeTableSlider";
44
import Papa from "papaparse";
55
import { DocumentUpload, NoteRemove } from "iconsax-react";
66

7+
function dataURLtoFile(dataurl: string, filename: string): File {
8+
const arr = dataurl.split(",");
9+
const mime = arr[0]?.match(/:(.*?);/)?.[1] || "";
10+
const bstr = atob(arr[1]!);
11+
let n = bstr.length;
12+
const u8arr = new Uint8Array(n);
13+
while (n--) u8arr[n] = bstr.charCodeAt(n);
14+
return new File([u8arr], filename, { type: mime });
15+
}
16+
717
const TimeTableBlock = () => {
818
const [uploadedFile, setUploadedFile] = useState<File | null>(null);
919
const [csvData, setCsvData] = useState<string[][] | null>(null);
@@ -15,23 +25,58 @@ const TimeTableBlock = () => {
1525
const nextDay = () => setCurrentDay((prev) => (prev === 4 ? 0 : prev + 1));
1626
const prevDay = () => setCurrentDay((prev) => (prev === 0 ? 4 : prev - 1));
1727

28+
useEffect(() => {
29+
const type = localStorage.getItem("timetableType");
30+
31+
if (type === "csv") {
32+
const csv = localStorage.getItem("timetableCSV");
33+
if (csv) {
34+
setCsvData(JSON.parse(csv));
35+
}
36+
}
37+
38+
if (type === "image") {
39+
const imageData = localStorage.getItem("timetableImage");
40+
if (imageData) {
41+
const file = dataURLtoFile(imageData, "saved-image.png");
42+
setUploadedFile(file);
43+
}
44+
}
45+
}, []);
46+
1847
const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
1948
const file = e.target.files?.[0];
2049
if (!file) return;
2150

22-
setUploadedFile(file);
23-
24-
if (file.type === "text/csv" || file.name.endsWith(".csv")) {
25-
Papa.parse(file, {
26-
complete: (result) => {
27-
setCsvData(result.data as string[][]);
28-
},
29-
error: (error) => {
30-
console.error("Error parsing CSV:", error);
31-
},
32-
});
33-
} else {
34-
setCsvData(null); // reset if not CSV
51+
const reader = new FileReader();
52+
reader.onload = () => {
53+
const base64 = reader.result as string;
54+
if (file.type === "text/csv" || file.name.endsWith(".csv")) {
55+
Papa.parse(file, {
56+
complete: (result) => {
57+
setUploadedFile(file);
58+
setCsvData(result.data as string[][]);
59+
60+
localStorage.setItem("timetableType", "csv");
61+
localStorage.setItem("timetableCSV", JSON.stringify(result.data));
62+
},
63+
error: (error) => {
64+
console.error("Error parsing CSV:", error);
65+
},
66+
});
67+
} else if (file.type.startsWith("image/")) {
68+
setUploadedFile(file);
69+
setCsvData(null);
70+
71+
localStorage.setItem("timetableType", "image");
72+
localStorage.setItem("timetableImage", base64);
73+
}
74+
};
75+
76+
if (file.type.startsWith("image/")) {
77+
reader.readAsDataURL(file);
78+
} else if (file.type === "text/csv") {
79+
reader.readAsText(file);
3580
}
3681
};
3782

@@ -76,6 +121,9 @@ const TimeTableBlock = () => {
76121
onClick={() => {
77122
setUploadedFile(null);
78123
setCsvData(null);
124+
localStorage.removeItem("timetableCSV");
125+
localStorage.removeItem("timetableImage");
126+
localStorage.removeItem("timetableType");
79127
}}
80128
className="flex items-center border border-[var(--text)] space-x-1 px-2 py-1 text-[var(--text)] rounded-lg text-sm"
81129
>

0 commit comments

Comments
 (0)