@@ -15,6 +15,7 @@ export default function Home() {
1515 const [ hasProcessedFollowers , setHasProcessedFollowers ] = useState ( false ) ;
1616 const [ hasProcessedFollowing , setHasProcessedFollowing ] = useState ( false ) ;
1717 const [ hasProcessedDifference , setHasProcessedDifference ] = useState ( false ) ;
18+ const [ errorFlag , setErrorFlag ] = useState ( false ) ;
1819
1920 // This function exists to compete the user life cycle on the page
2021 function handleReset ( ) {
@@ -26,37 +27,49 @@ export default function Home() {
2627 setUserDifference ( [ ] ) ;
2728 }
2829
29- // On Drop reads files then checks them against the schemas and throws an error if broke
30- // Extremely Robust for wrong json
31- function onDrop ( acceptedFiles : File [ ] ) {
32- acceptedFiles . forEach ( ( file ) => {
30+ // Helper function for onDrop
31+ const readFileAsText = ( file : File ) : Promise < string > => {
32+ return new Promise ( ( resolve , reject ) => {
3333 const reader = new FileReader ( ) ;
34+ reader . onload = ( ) => resolve ( reader . result as string ) ;
35+ reader . onerror = ( ) => reject ( reader . error ) ;
36+ reader . onabort = ( ) => reject ( new Error ( "File reading was aborted." ) ) ;
37+ reader . readAsText ( file ) ;
38+ } ) ;
39+ } ;
3440
35- reader . onabort = ( ) => console . log ( "file reading was aborted" ) ;
36- reader . onerror = ( ) => console . log ( "file reading has failed" ) ;
37- reader . onload = ( ) => {
38- try {
39- const input = JSON . parse ( reader . result as string ) ;
41+ // On Drop reads files then checks them against the schemas and throws an error if broke
42+ // Extremely Robust for wrong json
43+ async function onDrop ( acceptedFiles : File [ ] ) {
44+ let foundAtLeastOneValidFile = false ;
45+
46+ for ( const file of acceptedFiles ) {
47+ try {
48+ const fileContent = await readFileAsText ( file ) ;
4049
41- const followingResult = FollowingListSchema . safeParse ( input ) ;
42- if ( followingResult . success ) {
43- setFollowing ( ExtractNamesFromJson ( followingResult . data . relationships_following ) ) ;
44- setHasProcessedFollowing ( true ) ;
45- return ;
46- }
50+ const input = JSON . parse ( fileContent ) ;
4751
48- const followerResult = FollowerListSchema . safeParse ( input ) ;
49- if ( followerResult . success ) {
50- setFollowers ( ExtractNamesFromJson ( followerResult . data ) ) ;
51- setHasProcessedFollowers ( true ) ;
52- return ;
53- }
54- } catch ( error ) {
55- console . error ( "File is not a valid followers or following JSON:" , error ) ;
52+ const followingResult = FollowingListSchema . safeParse ( input ) ;
53+ if ( followingResult . success ) {
54+ setFollowing ( ExtractNamesFromJson ( followingResult . data . relationships_following ) ) ;
55+ setHasProcessedFollowing ( true ) ;
56+ foundAtLeastOneValidFile = true ;
57+ continue ;
5658 }
57- } ;
58- reader . readAsText ( file ) ;
59- } ) ;
59+
60+ const followerResult = FollowerListSchema . safeParse ( input ) ;
61+ if ( followerResult . success ) {
62+ setFollowers ( ExtractNamesFromJson ( followerResult . data ) ) ;
63+ setHasProcessedFollowers ( true ) ;
64+ foundAtLeastOneValidFile = true ;
65+ continue ;
66+ }
67+ } catch { /* The file failed to parse, which is fine. We do nothing and let the loop continue */ }
68+ }
69+
70+ if ( ! foundAtLeastOneValidFile ) {
71+ setErrorFlag ( true ) ;
72+ }
6073 }
6174
6275 // Calculate Diff
@@ -75,9 +88,18 @@ export default function Home() {
7588 </ h1 >
7689
7790 { ! hasProcessedDifference ? (
78- < HeroSection onDrop = { onDrop } hasProcessedFollowers = { hasProcessedFollowers } hasProcessedFollowing = { hasProcessedFollowing } > </ HeroSection >
91+ < HeroSection
92+ onDrop = { onDrop }
93+ errorFlag = { errorFlag }
94+ setErrorFlag = { setErrorFlag }
95+ hasProcessedFollowers = { hasProcessedFollowers }
96+ hasProcessedFollowing = { hasProcessedFollowing }
97+ > </ HeroSection >
7998 ) : (
80- < ResultsSection handleReset = { handleReset } userDifference = { userDifference } > </ ResultsSection >
99+ < ResultsSection
100+ handleReset = { handleReset }
101+ userDifference = { userDifference }
102+ > </ ResultsSection >
81103 ) }
82104 </ main >
83105
0 commit comments