Skip to content

Commit 70ca6ad

Browse files
authored
Merge pull request #298 from avinxshKD/fix/localStorage-error-handling
fix: handle localStorage errors in private browsing
2 parents 8f64802 + 7445a6d commit 70ca6ad

2 files changed

Lines changed: 62 additions & 19 deletions

File tree

src/component/fileBrowser.jsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
/* eslint-disable react/state-in-constructor */
66
import React, { useEffect, useState } from 'react';
77
import FileBrowser, { FileRenderers, FolderRenderers } from 'react-keyed-file-browser';
8+
import { toast } from 'react-toastify';
89
import { readFile, readTextFile } from '../toolbarActions/toolbarFunctions';
910
import { actionType as T } from '../reducer';
1011
import ConfirmModal from './modals/ConfirmModal';
@@ -33,7 +34,11 @@ const LocalFileBrowser = ({ superState, dispatcher }) => {
3334
// const allFiles = window.localStorage.getItem('fileList');
3435
// setFileState({ files: allFiles });
3536
// }
36-
window.localStorage.setItem('fileList', JSON.stringify(fileState));
37+
try {
38+
window.localStorage.setItem('fileList', JSON.stringify(fileState));
39+
} catch (e) {
40+
toast.error(e.message);
41+
}
3742
}, [fileState]);
3843

3944
useEffect(() => {
@@ -235,7 +240,11 @@ const LocalFileBrowser = ({ superState, dispatcher }) => {
235240
}));
236241

237242
setFileState(filesArray);
238-
window.localStorage.setItem('fileList', JSON.stringify(filesArray));
243+
try {
244+
window.localStorage.setItem('fileList', JSON.stringify(filesArray));
245+
} catch (e) {
246+
toast.error(e.message);
247+
}
239248
if (filesArray.length > 0) {
240249
dispatcher({ type: T.SET_DIR_NAME, payload: filesArray[0].key.split('/')[0] });
241250
dispatcher({ type: T.SET_FILE_STATE, payload: filesArray });
Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,37 @@
1+
import { toast } from 'react-toastify';
2+
3+
const localStorageGet = (key) => {
4+
try {
5+
return window.localStorage.getItem(key);
6+
} catch (e) {
7+
toast.error(e.message);
8+
return null;
9+
}
10+
};
11+
12+
const localStorageSet = (key, value) => {
13+
try {
14+
window.localStorage.setItem(key, value);
15+
} catch (e) {
16+
toast.error(e.message);
17+
}
18+
};
19+
20+
const localStorageRemove = (key) => {
21+
try {
22+
window.localStorage.removeItem(key);
23+
} catch (e) {
24+
toast.error(e.message);
25+
}
26+
};
27+
128
const getSet = (ALL_GRAPHS) => {
2-
if (!window.localStorage.getItem(ALL_GRAPHS)) {
3-
window.localStorage.setItem(ALL_GRAPHS, window.btoa(JSON.stringify([])));
29+
if (!localStorageGet(ALL_GRAPHS)) {
30+
localStorageSet(ALL_GRAPHS, window.btoa(JSON.stringify([])));
431
}
5-
return new Set(JSON.parse(window.atob(window.localStorage.getItem(ALL_GRAPHS))));
32+
const raw = localStorageGet(ALL_GRAPHS);
33+
if (!raw) return new Set();
34+
return new Set(JSON.parse(window.atob(raw)));
635
};
736

837
const localStorageManager = {
@@ -12,54 +41,59 @@ const localStorageManager = {
1241
allgs: getSet(window.btoa('ALL_GRAPHS')),
1342

1443
saveAllgs() {
15-
window.localStorage.setItem(this.ALL_GRAPHS, window.btoa(JSON.stringify(Array.from(this.allgs))));
44+
localStorageSet(this.ALL_GRAPHS, window.btoa(JSON.stringify(Array.from(this.allgs))));
1645
},
1746

1847
addEmptyIfNot() {
19-
if (!window.localStorage.getItem(this.ALL_GRAPHS)) {
20-
window.localStorage.setItem(this.ALL_GRAPHS, window.btoa(JSON.stringify([])));
48+
if (!localStorageGet(this.ALL_GRAPHS)) {
49+
localStorageSet(this.ALL_GRAPHS, window.btoa(JSON.stringify([])));
2150
}
2251
},
2352

2453
get(id) {
25-
if (window.localStorage.getItem(id) === null) return null;
26-
return JSON.parse(window.atob(window.localStorage.getItem(id)));
54+
const raw = localStorageGet(id);
55+
if (raw === null) return null;
56+
return JSON.parse(window.atob(raw));
2757
},
2858
save(id, graphContent) {
2959
this.addGraph(id);
3060
const serializedJson = JSON.stringify(graphContent);
31-
window.localStorage.setItem(id, window.btoa(serializedJson));
61+
localStorageSet(id, window.btoa(serializedJson));
3262
},
3363
remove(id) {
3464
if (this.allgs.delete(id)) this.saveAllgs();
35-
localStorage.removeItem(id);
65+
localStorageRemove(id);
3666
},
3767
addGraph(id) {
3868
if (this.allgs.has(id)) return;
3969
this.allgs.add(id);
4070
this.saveAllgs();
4171
},
4272
getAllGraphs() {
43-
return JSON.parse(window.atob(window.localStorage.getItem(this.ALL_GRAPHS)));
73+
const raw = localStorageGet(this.ALL_GRAPHS);
74+
if (!raw) return [];
75+
return JSON.parse(window.atob(raw));
4476
},
4577
addToFront(id) {
4678
if (this.allgs.has(id)) return;
4779
this.allgs.add(id);
48-
const Garr = JSON.parse(window.atob(window.localStorage.getItem(this.ALL_GRAPHS)));
80+
const raw = localStorageGet(this.ALL_GRAPHS);
81+
if (!raw) return;
82+
const Garr = JSON.parse(window.atob(raw));
4983
Garr.unshift(id);
50-
window.localStorage.setItem(this.ALL_GRAPHS, window.btoa(JSON.stringify(Garr)));
84+
localStorageSet(this.ALL_GRAPHS, window.btoa(JSON.stringify(Garr)));
5185
},
5286
getAuthorName() {
53-
return localStorage.getItem(this.AUTHOR_NAME) || '';
87+
return localStorageGet(this.AUTHOR_NAME) || '';
5488
},
5589
setAuthorName(authorName) {
56-
localStorage.setItem(this.AUTHOR_NAME, authorName);
90+
localStorageSet(this.AUTHOR_NAME, authorName);
5791
},
5892
clearGraph(id) {
59-
window.localStorage.removeItem(id);
93+
localStorageRemove(id);
6094
},
6195
getFileList() {
62-
return localStorage.getItem('fileList') || '';
96+
return localStorageGet('fileList') || '';
6397
},
6498
};
6599
export default localStorageManager;

0 commit comments

Comments
 (0)