Skip to content

Commit 8d6b2b3

Browse files
File Saver, Local Storage
1 parent b3476a4 commit 8d6b2b3

File tree

5 files changed

+55
-0
lines changed

5 files changed

+55
-0
lines changed

packages/utils/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"expo-file-system": "^18.0.7",
2525
"expo-sharing": "^13.0.1",
2626
"expo-updates": "^0.26.13",
27+
"file-saver": "^2.0.5",
2728
"many-keys-map": "^2.0.1",
2829
"psd": "^3.4.0",
2930
"react-hook-form": "^7.54.2",
@@ -43,6 +44,7 @@
4344
"@storybook/react": "^8.5.2",
4445
"@storybook/react-vite": "^8.5.2",
4546
"@storybook/test": "^8.5.2",
47+
"@types/file-saver": "^2",
4648
"@types/psd": "^3.4.3",
4749
"@vitest/coverage-v8": "^3.0.4",
4850
"@vitest/web-worker": "^3.0.5",

packages/utils/src/core/files.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { saveAs } from 'file-saver';
2+
3+
export const downloadFile = async (filename, text, type = 'application/json') => {
4+
//FIXME https://github.com/eligrey/FileSaver.js/issues/731
5+
saveAs(new Blob([text], { type }), filename);
6+
};
7+
8+
export const openFile = (): Promise<string> =>
9+
new Promise((res, rej) => {
10+
const input = document.createElement('input');
11+
input.type = 'file';
12+
input.addEventListener('change', function readFile(e) {
13+
input.removeEventListener('change', readFile);
14+
// @ts-expect-error file is always there
15+
const [file] = e.target.files;
16+
if (!file) return;
17+
const reader = new FileReader();
18+
reader.onload = (e) => res(e.target?.result as string);
19+
reader.onerror = rej;
20+
reader.onabort = rej;
21+
reader.readAsText(file);
22+
});
23+
input.click();
24+
});

packages/utils/src/core/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
export * from './cache';
22
export * from './errors';
3+
export * from './files';
4+
export * from './ls';
35
export * from './measure';
46
export * from './mutex';
57
export * from './worker';

packages/utils/src/core/ls.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export function getStorage(pref: string) {
2+
const prefix = (key) => `${pref}-${key}`;
3+
4+
const ls = (typeof window !== 'undefined' ? localStorage : null) as Storage;
5+
6+
const read = (key: string) => JSON.parse(ls?.getItem(prefix(key)) || 'null');
7+
const write = (key: string, value: any) => ls?.setItem(prefix(key), JSON.stringify(value));
8+
const remove = (key: string) => ls?.removeItem(prefix(key));
9+
10+
return { read, write, remove };
11+
}

yarn.lock

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3732,6 +3732,7 @@ __metadata:
37323732
"@storybook/react": "npm:^8.5.2"
37333733
"@storybook/react-vite": "npm:^8.5.2"
37343734
"@storybook/test": "npm:^8.5.2"
3735+
"@types/file-saver": "npm:^2"
37353736
"@types/psd": "npm:^3.4.3"
37363737
"@vitest/coverage-v8": "npm:^3.0.4"
37373738
"@vitest/web-worker": "npm:^3.0.5"
@@ -3748,6 +3749,7 @@ __metadata:
37483749
expo-file-system: "npm:^18.0.7"
37493750
expo-sharing: "npm:^13.0.1"
37503751
expo-updates: "npm:^0.26.13"
3752+
file-saver: "npm:^2.0.5"
37513753
glob: "npm:^11.0.1"
37523754
many-keys-map: "npm:^2.0.1"
37533755
next: "npm:^15.1.6"
@@ -5680,6 +5682,13 @@ __metadata:
56805682
languageName: node
56815683
linkType: hard
56825684

5685+
"@types/file-saver@npm:^2":
5686+
version: 2.0.7
5687+
resolution: "@types/file-saver@npm:2.0.7"
5688+
checksum: 10c0/c6b88a1aea8eec58469da2a90828fef6e9d5d590c7094fb959783d7c32878af80d39439734f3d41b78355dadb507f606e3d04a29a160c85411c65251e58df847
5689+
languageName: node
5690+
linkType: hard
5691+
56835692
"@types/fs-extra@npm:9.0.13, @types/fs-extra@npm:^9.0.11":
56845693
version: 9.0.13
56855694
resolution: "@types/fs-extra@npm:9.0.13"
@@ -11186,6 +11195,13 @@ __metadata:
1118611195
languageName: node
1118711196
linkType: hard
1118811197

11198+
"file-saver@npm:^2.0.5":
11199+
version: 2.0.5
11200+
resolution: "file-saver@npm:2.0.5"
11201+
checksum: 10c0/0a361f683786c34b2574aea53744cb70d0a6feb0fa5e3af00f2fcb6c9d40d3049cc1470e38c6c75df24219f247f6fb3076f86943958f580e62ee2ffe897af8b1
11202+
languageName: node
11203+
linkType: hard
11204+
1118911205
"filelist@npm:^1.0.4":
1119011206
version: 1.0.4
1119111207
resolution: "filelist@npm:1.0.4"

0 commit comments

Comments
 (0)