diff --git a/package.json b/package.json index 8618915..cb9432d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "type": "module", "devDependencies": { - "@types/node": "^18.16.3", + "@types/node": "^18.16.4", "@typescript-eslint/eslint-plugin": "^5.59.2", "@typescript-eslint/parser": "^5.59.2", "autoprefixer": "^10.4.14", @@ -23,7 +23,7 @@ "solid-start-node": "^0.2.26", "tailwindcss": "^3.3.2", "typescript": "^4.9.5", - "vite": "^4.3.4", + "vite": "^4.3.5", "vite-plugin-pwa": "^0.14.7", "vite-plugin-wasm": "^3.2.2", "workbox-window": "^6.5.4" @@ -34,6 +34,7 @@ "@modular-forms/solid": "^0.13.1", "@mutinywallet/mutiny-wasm": "^0.2.8", "@mutinywallet/waila-wasm": "^0.1.5", + "@solid-primitives/upload": "^0.0.111", "@solidjs/meta": "^0.28.4", "@solidjs/router": "^0.8.2", "@thisbeyond/solid-select": "^0.14.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b7890b4..c94ddc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,9 @@ dependencies: '@mutinywallet/waila-wasm': specifier: ^0.1.5 version: 0.1.5 + '@solid-primitives/upload': + specifier: ^0.0.111 + version: 0.0.111(solid-js@1.7.4) '@solidjs/meta': specifier: ^0.28.4 version: 0.28.4(solid-js@1.7.4) @@ -42,15 +45,15 @@ dependencies: version: 0.0.8(qr.js@0.0.0)(solid-js@1.7.4) solid-start: specifier: ^0.2.26 - version: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.4)(solid-start-node@0.2.26)(vite@4.3.4) + version: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.4)(solid-start-node@0.2.26)(vite@4.3.5) undici: specifier: ^5.22.0 version: 5.22.0 devDependencies: '@types/node': - specifier: ^18.16.3 - version: 18.16.3 + specifier: ^18.16.4 + version: 18.16.4 '@typescript-eslint/eslint-plugin': specifier: ^5.59.2 version: 5.59.2(@typescript-eslint/parser@5.59.2)(eslint@8.39.0)(typescript@4.9.5) @@ -83,7 +86,7 @@ devDependencies: version: 8.4.23 solid-start-node: specifier: ^0.2.26 - version: 0.2.26(solid-start@0.2.26)(undici@5.22.0)(vite@4.3.4) + version: 0.2.26(solid-start@0.2.26)(undici@5.22.0)(vite@4.3.5) tailwindcss: specifier: ^3.3.2 version: 3.3.2 @@ -91,14 +94,14 @@ devDependencies: specifier: ^4.9.5 version: 4.9.5 vite: - specifier: ^4.3.4 - version: 4.3.4(@types/node@18.16.3) + specifier: ^4.3.5 + version: 4.3.5(@types/node@18.16.4) vite-plugin-pwa: specifier: ^0.14.7 - version: 0.14.7(vite@4.3.4)(workbox-build@6.5.4)(workbox-window@6.5.4) + version: 0.14.7(vite@4.3.5)(workbox-build@6.5.4)(workbox-window@6.5.4) vite-plugin-wasm: specifier: ^3.2.2 - version: 3.2.2(vite@4.3.4) + version: 3.2.2(vite@4.3.5) workbox-window: specifier: ^6.5.4 version: 6.5.4 @@ -1641,7 +1644,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/plugin-commonjs@24.1.0(rollup@3.21.4): + /@rollup/plugin-commonjs@24.1.0(rollup@3.21.5): resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1650,15 +1653,15 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.21.4) + '@rollup/pluginutils': 5.0.2(rollup@3.21.5) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - rollup: 3.21.4 + rollup: 3.21.5 - /@rollup/plugin-json@6.0.0(rollup@3.21.4): + /@rollup/plugin-json@6.0.0(rollup@3.21.5): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1667,8 +1670,8 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.21.4) - rollup: 3.21.4 + '@rollup/pluginutils': 5.0.2(rollup@3.21.5) + rollup: 3.21.5 /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} @@ -1685,7 +1688,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/plugin-node-resolve@15.0.2(rollup@3.21.4): + /@rollup/plugin-node-resolve@15.0.2(rollup@3.21.5): resolution: {integrity: sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1694,13 +1697,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.21.4) + '@rollup/pluginutils': 5.0.2(rollup@3.21.5) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.2 - rollup: 3.21.4 + rollup: 3.21.5 /@rollup/plugin-replace@2.4.2(rollup@2.79.1): resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} @@ -1712,7 +1715,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/plugin-replace@5.0.2(rollup@3.21.4): + /@rollup/plugin-replace@5.0.2(rollup@3.21.5): resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1721,9 +1724,9 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.21.4) + '@rollup/pluginutils': 5.0.2(rollup@3.21.5) magic-string: 0.27.0 - rollup: 3.21.4 + rollup: 3.21.5 dev: true /@rollup/pluginutils@3.1.0(rollup@2.79.1): @@ -1738,7 +1741,7 @@ packages: rollup: 2.79.1 dev: true - /@rollup/pluginutils@5.0.2(rollup@3.21.4): + /@rollup/pluginutils@5.0.2(rollup@3.21.5): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1750,7 +1753,7 @@ packages: '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.21.4 + rollup: 3.21.5 /@scure/base@1.1.1: resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} @@ -1847,6 +1850,15 @@ packages: solid-js: 1.7.4 dev: false + /@solid-primitives/upload@0.0.111(solid-js@1.7.4): + resolution: {integrity: sha512-Bxe2W5oJu7kRurmxr+ftvOojKhy5JUM91md2nBcedwrq1EspqWggV2ZOHauGcn8hg86W8p9Y+N8dmv16QHNRxQ==} + peerDependencies: + solid-js: ^1.6.12 + dependencies: + '@solid-primitives/utils': 6.1.0(solid-js@1.7.4) + solid-js: 1.7.4 + dev: false + /@solid-primitives/utils@5.5.2(solid-js@1.7.4): resolution: {integrity: sha512-L52ig3eHKU6CqbPCKJIb4lweBuINHBOERcE1duApyKozEN8+zCqEKwD1Qo9ljKeEzJTBGWClxNpwEiNTUWTGvg==} peerDependencies: @@ -1943,8 +1955,8 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/node@18.16.3: - resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==} + /@types/node@18.16.4: + resolution: {integrity: sha512-LUhvPmAKAbgm+p/K11IWszLZVoZDlMF4NRmqbhEzDz/CnCuehPkZXwZbBCKGJsgjnuVejotBwM7B3Scrq4EqDw==} /@types/offscreencanvas@2019.7.0: resolution: {integrity: sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==} @@ -1953,7 +1965,7 @@ packages: /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 18.16.3 + '@types/node': 18.16.4 dev: true /@types/resolve@1.20.2: @@ -2331,7 +2343,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001482 - electron-to-chromium: 1.4.382 + electron-to-chromium: 1.4.384 node-releases: 2.0.10 update-browserslist-db: 1.0.11(browserslist@4.21.5) @@ -2614,8 +2626,8 @@ packages: jake: 10.8.5 dev: true - /electron-to-chromium@1.4.382: - resolution: {integrity: sha512-czMavlW52VIPgutbVL9JnZIZuFijzsG1ww/1z2Otu1r1q+9Qe2bTsH3My3sZarlvwyqHM6+mnZfEnt2Vr4dsIg==} + /electron-to-chromium@1.4.384: + resolution: {integrity: sha512-I97q0MmRAAqj53+a8vZsDkEXBZki+ehYAOPzwtQzALip52aEp2+BJqHFtTlsfjoqVZYwPpHC8wM6MbsSZQ/Eqw==} /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3755,7 +3767,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.16.3 + '@types/node': 18.16.4 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -4388,7 +4400,7 @@ packages: terser: 5.17.1 dev: true - /rollup-plugin-visualizer@5.9.0(rollup@3.21.4): + /rollup-plugin-visualizer@5.9.0(rollup@3.21.5): resolution: {integrity: sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==} engines: {node: '>=14'} hasBin: true @@ -4400,17 +4412,17 @@ packages: dependencies: open: 8.4.2 picomatch: 2.3.1 - rollup: 3.21.4 + rollup: 3.21.5 source-map: 0.7.4 yargs: 17.7.2 - /rollup-route-manifest@1.0.0(rollup@3.21.4): + /rollup-route-manifest@1.0.0(rollup@3.21.5): resolution: {integrity: sha512-3CmcMmCLAzJDUXiO3z6386/Pt8/k9xTZv8gIHyXI8hYGoAInnYdOsFXiGGzQRMy6TXR1jUZme2qbdwjH2nFMjg==} engines: {node: '>=8'} peerDependencies: rollup: '>=2.0.0' dependencies: - rollup: 3.21.4 + rollup: 3.21.5 route-sort: 1.0.0 /rollup@2.79.1: @@ -4421,8 +4433,8 @@ packages: fsevents: 2.3.2 dev: true - /rollup@3.21.4: - resolution: {integrity: sha512-N5LxpvDolOm9ueiCp4NfB80omMDqb45ShtsQw2+OT3f11uJ197dv703NZvznYHP6RWR85wfxanXurXKG3ux2GQ==} + /rollup@3.21.5: + resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -4548,28 +4560,28 @@ packages: '@babel/types': 7.21.5 solid-js: 1.7.4 - /solid-start-node@0.2.26(solid-start@0.2.26)(undici@5.22.0)(vite@4.3.4): + /solid-start-node@0.2.26(solid-start@0.2.26)(undici@5.22.0)(vite@4.3.5): resolution: {integrity: sha512-8vciTGoQV+lIlCUSVHJPazlaoKDRfBowDkPeBr/EZdmtbcMOKoJYf/APPQWFspylF+nhzunMf0+zJP90VtMEYg==} peerDependencies: solid-start: '*' undici: ^5.8.0 vite: '*' dependencies: - '@rollup/plugin-commonjs': 24.1.0(rollup@3.21.4) - '@rollup/plugin-json': 6.0.0(rollup@3.21.4) - '@rollup/plugin-node-resolve': 15.0.2(rollup@3.21.4) + '@rollup/plugin-commonjs': 24.1.0(rollup@3.21.5) + '@rollup/plugin-json': 6.0.0(rollup@3.21.5) + '@rollup/plugin-node-resolve': 15.0.2(rollup@3.21.5) compression: 1.7.4 polka: 1.0.0-next.22 - rollup: 3.21.4 + rollup: 3.21.5 sirv: 2.0.3 - solid-start: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.4)(solid-start-node@0.2.26)(vite@4.3.4) + solid-start: 0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.4)(solid-start-node@0.2.26)(vite@4.3.5) terser: 5.17.1 undici: 5.22.0 - vite: 4.3.4(@types/node@18.16.3) + vite: 4.3.5(@types/node@18.16.4) transitivePeerDependencies: - supports-color - /solid-start@0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.4)(solid-start-node@0.2.26)(vite@4.3.4): + /solid-start@0.2.26(@solidjs/meta@0.28.4)(@solidjs/router@0.8.2)(solid-js@1.7.4)(solid-start-node@0.2.26)(vite@4.3.5): resolution: {integrity: sha512-kne2HZlnSMzsirdnvNs1CsDqBl0L0uvKKt1t4de1CH7JIngyqoMcER97jTE0Ejr84KknANaKAdvJAzZcL7Ueng==} hasBin: true peerDependencies: @@ -4625,19 +4637,19 @@ packages: get-port: 6.1.2 parse-multipart-data: 1.5.0 picocolors: 1.0.0 - rollup: 3.21.4 - rollup-plugin-visualizer: 5.9.0(rollup@3.21.4) - rollup-route-manifest: 1.0.0(rollup@3.21.4) + rollup: 3.21.5 + rollup-plugin-visualizer: 5.9.0(rollup@3.21.5) + rollup-route-manifest: 1.0.0(rollup@3.21.5) sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 2.0.3 solid-js: 1.7.4 - solid-start-node: 0.2.26(solid-start@0.2.26)(undici@5.22.0)(vite@4.3.4) + solid-start-node: 0.2.26(solid-start@0.2.26)(undici@5.22.0)(vite@4.3.5) terser: 5.17.1 undici: 5.22.0 - vite: 4.3.4(@types/node@18.16.3) - vite-plugin-inspect: 0.7.25(rollup@3.21.4)(vite@4.3.4) - vite-plugin-solid: 2.7.0(solid-js@1.7.4)(vite@4.3.4) + vite: 4.3.5(@types/node@18.16.4) + vite-plugin-inspect: 0.7.25(rollup@3.21.5)(vite@4.3.5) + vite-plugin-solid: 2.7.0(solid-js@1.7.4)(vite@4.3.5) wait-on: 6.0.1(debug@4.3.4) transitivePeerDependencies: - supports-color @@ -5032,43 +5044,43 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite-plugin-inspect@0.7.25(rollup@3.21.4)(vite@4.3.4): + /vite-plugin-inspect@0.7.25(rollup@3.21.5)(vite@4.3.5): resolution: {integrity: sha512-11j3hG3stRfFkoI+adIDX+KvZueWNgd9lFGdh7lgm0IjGqpP6luCQAMSSnHHV7AZXaTE06X+bUG3M68diz8ZyA==} engines: {node: '>=14'} peerDependencies: vite: ^3.1.0 || ^4.0.0 dependencies: '@antfu/utils': 0.7.2 - '@rollup/pluginutils': 5.0.2(rollup@3.21.4) + '@rollup/pluginutils': 5.0.2(rollup@3.21.5) debug: 4.3.4 fs-extra: 11.1.1 picocolors: 1.0.0 sirv: 2.0.3 - vite: 4.3.4(@types/node@18.16.3) + vite: 4.3.5(@types/node@18.16.4) transitivePeerDependencies: - rollup - supports-color - /vite-plugin-pwa@0.14.7(vite@4.3.4)(workbox-build@6.5.4)(workbox-window@6.5.4): + /vite-plugin-pwa@0.14.7(vite@4.3.5)(workbox-build@6.5.4)(workbox-window@6.5.4): resolution: {integrity: sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==} peerDependencies: vite: ^3.1.0 || ^4.0.0 workbox-build: ^6.5.4 workbox-window: ^6.5.4 dependencies: - '@rollup/plugin-replace': 5.0.2(rollup@3.21.4) + '@rollup/plugin-replace': 5.0.2(rollup@3.21.5) debug: 4.3.4 fast-glob: 3.2.12 pretty-bytes: 6.1.0 - rollup: 3.21.4 - vite: 4.3.4(@types/node@18.16.3) + rollup: 3.21.5 + vite: 4.3.5(@types/node@18.16.4) workbox-build: 6.5.4 workbox-window: 6.5.4 transitivePeerDependencies: - supports-color dev: true - /vite-plugin-solid@2.7.0(solid-js@1.7.4)(vite@4.3.4): + /vite-plugin-solid@2.7.0(solid-js@1.7.4)(vite@4.3.5): resolution: {integrity: sha512-avp/Jl5zOp/Itfo67xtDB2O61U7idviaIp4mLsjhCa13PjKNasz+IID0jYTyqUp9SFx6/PmBr6v4KgDppqompg==} peerDependencies: solid-js: ^1.7.2 @@ -5081,21 +5093,21 @@ packages: merge-anything: 5.1.5 solid-js: 1.7.4 solid-refresh: 0.5.2(solid-js@1.7.4) - vite: 4.3.4(@types/node@18.16.3) - vitefu: 0.2.4(vite@4.3.4) + vite: 4.3.5(@types/node@18.16.4) + vitefu: 0.2.4(vite@4.3.5) transitivePeerDependencies: - supports-color - /vite-plugin-wasm@3.2.2(vite@4.3.4): + /vite-plugin-wasm@3.2.2(vite@4.3.5): resolution: {integrity: sha512-cdbBUNR850AEoMd5nvLmnyeq63CSfoP1ctD/L2vLk/5+wsgAPlAVAzUK5nGKWO/jtehNlrSSHLteN+gFQw7VOA==} peerDependencies: vite: ^2 || ^3 || ^4 dependencies: - vite: 4.3.4(@types/node@18.16.3) + vite: 4.3.5(@types/node@18.16.4) dev: true - /vite@4.3.4(@types/node@18.16.3): - resolution: {integrity: sha512-f90aqGBoxSFxWph2b39ae2uHAxm5jFBBdnfueNxZAT1FTpM13ccFQExCaKbR2xFW5atowjleRniQ7onjJ22QEg==} + /vite@4.3.5(@types/node@18.16.4): + resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -5119,14 +5131,14 @@ packages: terser: optional: true dependencies: - '@types/node': 18.16.3 + '@types/node': 18.16.4 esbuild: 0.17.18 postcss: 8.4.23 - rollup: 3.21.4 + rollup: 3.21.5 optionalDependencies: fsevents: 2.3.2 - /vitefu@0.2.4(vite@4.3.4): + /vitefu@0.2.4(vite@4.3.5): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: vite: ^3.0.0 || ^4.0.0 @@ -5134,7 +5146,7 @@ packages: vite: optional: true dependencies: - vite: 4.3.4(@types/node@18.16.3) + vite: 4.3.5(@types/node@18.16.4) /wait-on@6.0.1(debug@4.3.4): resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} diff --git a/src/components/ImportExport.tsx b/src/components/ImportExport.tsx new file mode 100644 index 0000000..6550e32 --- /dev/null +++ b/src/components/ImportExport.tsx @@ -0,0 +1,75 @@ +import { useMegaStore } from "~/state/megaStore"; +import { Button, InnerCard, VStack } from "~/components/layout"; +import { createSignal } from "solid-js"; +import eify from "~/utils/eify"; +import { showToast } from "./Toaster"; +import { downloadTextFile } from "~/utils/download"; +import { createFileUploader } from "@solid-primitives/upload" +import { ConfirmDialog } from "./Dialog"; +import { NodeManager } from "@mutinywallet/mutiny-wasm"; + +export function ImportExport() { + const [state, _] = useMegaStore() + + async function handleSave() { + let json = await state.node_manager?.export_json() + downloadTextFile(json || "", "mutiny-state.json") + } + + const { files, selectFiles } = createFileUploader(); + + async function importJson() { + setConfirmLoading(true); + const fileReader = new FileReader(); + + try { + const file: File = files()[0].file; + fileReader.readAsText(file, "UTF-8"); + fileReader.onload = e => { + const text = e.target?.result?.toString(); + + if (text) { + // This should throw if there's a parse error, so we won't end up clearing + JSON.parse(text); + + NodeManager.import_json(text); + + window.location.href = "/" + + } else { + throw new Error("No text found in file") + } + } + } catch (e) { + showToast(eify(e)); + } + setConfirmOpen(false); + setConfirmLoading(false); + } + + async function uploadFile() { + selectFiles(async files => { + if (files.length) { + setConfirmOpen(true); + return; + } + }) + } + + const [confirmOpen, setConfirmOpen] = createSignal(false); + const [confirmLoading, setConfirmLoading] = createSignal(false); + + return ( + <> + + + + + + + setConfirmOpen(false)}> + Do you want to replace your state with {files()[0].name}? + + + ) +} \ No newline at end of file diff --git a/src/components/KitchenSink.tsx b/src/components/KitchenSink.tsx index 0f2f21f..518e05a 100644 --- a/src/components/KitchenSink.tsx +++ b/src/components/KitchenSink.tsx @@ -6,8 +6,9 @@ import { MutinyChannel, MutinyPeer } from "@mutinywallet/mutiny-wasm"; import { Collapsible, TextField } from "@kobalte/core"; import mempoolTxUrl from "~/utils/mempoolTxUrl"; import eify from "~/utils/eify"; -import { ConfirmDialog } from "./Dialog"; -import { showToast } from "./Toaster"; +import { ConfirmDialog } from "~/components/Dialog"; +import { showToast } from "~/components/Toaster"; +import { ImportExport } from "~/components/ImportExport"; // TODO: hopefully I don't have to maintain this type forever but I don't know how to pass it around otherwise type RefetchPeersType = (info?: unknown) => MutinyPeer[] | Promise | null | undefined @@ -326,6 +327,8 @@ function LnUrlAuth() { ) } + + export default function KitchenSink() { return ( @@ -336,6 +339,8 @@ export default function KitchenSink() {
+
+
) } \ No newline at end of file diff --git a/src/utils/download.ts b/src/utils/download.ts new file mode 100644 index 0000000..5f4db7f --- /dev/null +++ b/src/utils/download.ts @@ -0,0 +1,10 @@ +// https://stackoverflow.com/questions/34156282/how-do-i-save-json-to-local-text-file + +export function downloadTextFile(content: string, fileName: string) { + const contentType = "application/json"; + var a = document.createElement("a"); + var file = new Blob([content], { type: contentType }); + a.href = URL.createObjectURL(file); + a.download = fileName; + a.click(); +} \ No newline at end of file