11"use client" ;
2- import { useState } from "react" ;
2+ import { useEffect , useState } from "react" ;
33import { TimeTableSlider } from "./TimeTableSlider" ;
44import Papa from "papaparse" ;
55import { 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+
717const 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