remove solid-start and use solid router / meta instead

This commit is contained in:
Paul Miller
2023-11-08 18:43:22 -06:00
committed by Tony Giorgio
parent bfa48ccdb2
commit d38f0d61a2
57 changed files with 269 additions and 381 deletions

View File

@@ -1,7 +1,7 @@
<!doctype html>
<html>
<head>
<title>Mutiny Wallet</title>
<title data-sm="">Mutiny Wallet</title>
<meta charset="utf-8" />
<meta
name="viewport"
@@ -82,7 +82,8 @@
</p>
</div>
</noscript>
<script type="module" async src="./src/entry-client.tsx"></script>
<div id="root"></div>
<script type="module" src="/src/index.tsx"></script>
<script>
// Check for WebAssembly support
if (

View File

@@ -4,10 +4,8 @@
"license": "MIT",
"packageManager": "pnpm@8.6.6",
"scripts": {
"dev": "solid-start dev",
"host": "solid-start dev --host",
"build": "solid-start build",
"start": "solid-start start",
"dev": "vite",
"build": "tsc && vite build",
"check-types": "tsc --noemit",
"eslint": "eslint src",
"pre-commit": "pnpm run eslint && pnpm run check-types && pnpm run format",
@@ -33,11 +31,11 @@
"postcss": "^8.4.31",
"prettier": "^3.0.3",
"prettier-plugin-tailwindcss": "^0.5.6",
"solid-start-node": "^0.3.9",
"tailwindcss": "^3.3.5",
"typescript": "^5.2.2",
"vite": "^4.5.0",
"vite-plugin-pwa": "^0.14.7",
"vite-plugin-solid": "^2.7.0",
"vite-plugin-wasm": "^3.2.2",
"workbox-window": "^6.6.0"
},
@@ -61,16 +59,17 @@
"@mutinywallet/waila-wasm": "^0.2.4",
"@solid-primitives/upload": "^0.0.111",
"@solid-primitives/websocket": "^1.2.0",
"@solidjs/meta": "^0.29.1",
"@solidjs/router": "^0.9.0",
"@thisbeyond/solid-select": "^0.14.0",
"i18next": "^22.5.1",
"i18next-browser-languagedetector": "^7.1.0",
"qr-scanner": "^1.4.2",
"solid-js": "^1.8.5",
"solid-qr-code": "^0.0.8",
"solid-start": "^0.3.9",
"undici": "^5.27.1"
},
"engines": {
"node": ">=16.8"
"node": ">=18"
}
}

185
pnpm-lock.yaml generated
View File

@@ -65,6 +65,12 @@ importers:
'@solid-primitives/websocket':
specifier: ^1.2.0
version: 1.2.0(solid-js@1.8.5)
'@solidjs/meta':
specifier: ^0.29.1
version: 0.29.1(solid-js@1.8.5)
'@solidjs/router':
specifier: ^0.9.0
version: 0.9.0(solid-js@1.8.5)
'@thisbeyond/solid-select':
specifier: ^0.14.0
version: 0.14.0(solid-js@1.8.5)
@@ -73,7 +79,7 @@ importers:
version: 22.5.1
i18next-browser-languagedetector:
specifier: ^7.1.0
version: 7.1.0
version: 7.2.0
qr-scanner:
specifier: ^1.4.2
version: 1.4.2
@@ -83,9 +89,6 @@ importers:
solid-qr-code:
specifier: ^0.0.8
version: 0.0.8(qr.js@0.0.0)(solid-js@1.8.5)
solid-start:
specifier: ^0.3.9
version: 0.3.9(@solidjs/meta@0.29.1)(@solidjs/router@0.8.3)(solid-js@1.8.5)(solid-start-node@0.3.9)(vite@4.5.0)
undici:
specifier: ^5.27.1
version: 5.27.1
@@ -141,9 +144,6 @@ importers:
prettier-plugin-tailwindcss:
specifier: ^0.5.6
version: 0.5.6(@ianvs/prettier-plugin-sort-imports@4.1.1)(prettier@3.0.3)
solid-start-node:
specifier: ^0.3.9
version: 0.3.9(solid-start@0.3.9)(vite@4.5.0)
tailwindcss:
specifier: ^3.3.5
version: 3.3.5
@@ -156,6 +156,9 @@ importers:
vite-plugin-pwa:
specifier: ^0.14.7
version: 0.14.7(vite@4.5.0)(workbox-build@6.6.0)(workbox-window@6.6.0)
vite-plugin-solid:
specifier: ^2.7.0
version: 2.7.0(solid-js@1.8.5)(vite@4.5.0)
vite-plugin-wasm:
specifier: ^3.2.2
version: 3.2.2(vite@4.5.0)
@@ -1453,6 +1456,13 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.0
dev: true
/@babel/runtime@7.23.2:
resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.0
/@babel/template@7.22.5:
resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==}
@@ -2123,6 +2133,7 @@ packages:
/@fastify/busboy@2.0.0:
resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==}
engines: {node: '>=14'}
dev: false
/@floating-ui/core@1.4.1:
resolution: {integrity: sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==}
@@ -3516,6 +3527,7 @@ packages:
solid-js: '>=1.8.4'
dependencies:
solid-js: 1.8.5
dev: false
/@solidjs/router@0.8.3(solid-js@1.7.9):
resolution: {integrity: sha512-oJuqQo10rVTiQYhe1qXIG1NyZIZ2YOwHnlLc8Xx+g/iJhFCJo1saLOIrD/Dkh2fpIaIny5ZMkz1cYYqoTYGJbg==}
@@ -3524,12 +3536,13 @@ packages:
dependencies:
solid-js: 1.7.9
/@solidjs/router@0.8.3(solid-js@1.8.5):
resolution: {integrity: sha512-oJuqQo10rVTiQYhe1qXIG1NyZIZ2YOwHnlLc8Xx+g/iJhFCJo1saLOIrD/Dkh2fpIaIny5ZMkz1cYYqoTYGJbg==}
/@solidjs/router@0.9.0(solid-js@1.8.5):
resolution: {integrity: sha512-q1RxUhLa8lKdbhqEPkG+8RwBQKIH5f5AIWiOxVoUTK4UllgsR0C0FNT++ufnIAb9LNkx3ahE4WxAHZqH4l1vEQ==}
peerDependencies:
solid-js: ^1.5.3
dependencies:
solid-js: 1.8.5
dev: false
/@storybook/addon-actions@7.2.2(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Ev9oGlpxrt7tCpCmAYA04hsZYKnZIiksaQDCgKAf6I2+yUZBBkZh490yBPkMExpH5bLk7fAgjCMZP9gOyzaq3A==}
@@ -5039,6 +5052,7 @@ packages:
resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==}
dependencies:
undici-types: 5.26.5
dev: true
/@types/normalize-package-data@2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
@@ -7648,20 +7662,6 @@ packages:
transitivePeerDependencies:
- supports-color
/esbuild-plugin-solid@0.5.0(esbuild@0.17.19)(solid-js@1.8.5):
resolution: {integrity: sha512-ITK6n+0ayGFeDVUZWNMxX+vLsasEN1ILrg4pISsNOQ+mq4ljlJJiuXotInd+HE0MzwTcA9wExT1yzDE2hsqPsg==}
peerDependencies:
esbuild: '>=0.12'
solid-js: '>= 1.0'
dependencies:
'@babel/core': 7.22.10
'@babel/preset-typescript': 7.22.5(@babel/core@7.22.10)
babel-preset-solid: 1.7.7(@babel/core@7.22.10)
esbuild: 0.17.19
solid-js: 1.8.5
transitivePeerDependencies:
- supports-color
/esbuild-register@3.4.2(esbuild@0.18.20):
resolution: {integrity: sha512-kG/XyTDyz6+YDuyfB9ZoSIOOmgyFCH+xPRtsCa8W85HLRV5Csp+o3jWVbOSHgSLfyLc5DmP+KFDNwty4mEjC+Q==}
peerDependencies:
@@ -9049,16 +9049,16 @@ packages:
resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
engines: {node: '>=14.18.0'}
/i18next-browser-languagedetector@7.1.0:
resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==}
/i18next-browser-languagedetector@7.2.0:
resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==}
dependencies:
'@babel/runtime': 7.22.10
'@babel/runtime': 7.23.2
dev: false
/i18next@22.5.1:
resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==}
dependencies:
'@babel/runtime': 7.22.10
'@babel/runtime': 7.23.2
dev: false
/iconv-lite@0.4.24:
@@ -10100,9 +10100,6 @@ packages:
braces: 3.0.2
picomatch: 2.3.1
/micromorph@0.3.1:
resolution: {integrity: sha512-dbX4sz405e/QQtbHFMJj0SaVP+xuBBpSpR44AQYTjsrPek8oKyeRXkbtYN1XyFVdV7WjHp5DZMwxJOJiBfH1Jw==}
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
@@ -11531,7 +11528,7 @@ packages:
/regenerator-transform@0.15.2:
resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
dependencies:
'@babel/runtime': 7.22.10
'@babel/runtime': 7.23.2
/regex-parser@2.2.11:
resolution: {integrity: sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==}
@@ -12120,6 +12117,7 @@ packages:
'@babel/helper-module-imports': 7.22.5
'@babel/types': 7.22.10
solid-js: 1.8.5
dev: true
/solid-start-node@0.3.0(solid-start@0.2.29)(undici@5.22.1)(vite@4.4.7):
resolution: {integrity: sha512-kg0J6aTvnxGj3OnK4L6EQWY6O3y4dn0CB8Q+6e++Pbzw+VMs8uZg/H9/jg+Ul3fw9uitsnwgxQmieKviaSIxMQ==}
@@ -12142,25 +12140,6 @@ packages:
transitivePeerDependencies:
- supports-color
/solid-start-node@0.3.9(solid-start@0.3.9)(vite@4.5.0):
resolution: {integrity: sha512-BWE4g2CqTzq3L2e4TX7kfFC++YiOUqbNFuReLW0gji091qb2sVKqaCBLInfsoLDNAdNdU2Fj659ZZn33b2JqUQ==}
peerDependencies:
solid-start: '*'
vite: '*'
dependencies:
'@rollup/plugin-commonjs': 24.1.0(rollup@3.28.0)
'@rollup/plugin-json': 6.0.0(rollup@3.28.0)
'@rollup/plugin-node-resolve': 15.2.0(rollup@3.28.0)
compression: 1.7.4
polka: 1.0.0-next.22
rollup: 3.28.0
sirv: 2.0.3
solid-start: 0.3.9(@solidjs/meta@0.29.1)(@solidjs/router@0.8.3)(solid-js@1.8.5)(solid-start-node@0.3.9)(vite@4.5.0)
terser: 5.19.2
vite: 4.5.0(@types/node@20.8.10)
transitivePeerDependencies:
- supports-color
/solid-start@0.2.29(@solidjs/meta@0.28.6)(@solidjs/router@0.8.3)(solid-js@1.7.9)(solid-start-node@0.3.0)(vite@4.4.7):
resolution: {integrity: sha512-Lvov1rQSJGPsBAPh/ot4UGuxrMeb2PjRV/QXT3eoTPjbTjtLGfo9OJWtZHXHuCIrFgqiNQvX/K95jZgfR6jJ+w==}
hasBin: true
@@ -12236,82 +12215,6 @@ packages:
- '@nuxt/kit'
- supports-color
/solid-start@0.3.9(@solidjs/meta@0.29.1)(@solidjs/router@0.8.3)(solid-js@1.8.5)(solid-start-node@0.3.9)(vite@4.5.0):
resolution: {integrity: sha512-hh3JaoUW6prfnwuAaB/rF4zkM/8Z+vGLO+8iUosiqfBmYWdkCPCGRsKrc1UhBK9H4Z3b6wirqFfP/5aeq0cLGw==}
hasBin: true
peerDependencies:
'@solidjs/meta': ^0.29.1
'@solidjs/router': ^0.8.2
solid-js: ^1.8.4
solid-start-aws: '*'
solid-start-cloudflare-pages: '*'
solid-start-cloudflare-workers: '*'
solid-start-deno: '*'
solid-start-netlify: '*'
solid-start-node: '*'
solid-start-static: '*'
solid-start-vercel: '*'
vite: ^4.4.6
peerDependenciesMeta:
solid-start-aws:
optional: true
solid-start-cloudflare-pages:
optional: true
solid-start-cloudflare-workers:
optional: true
solid-start-deno:
optional: true
solid-start-netlify:
optional: true
solid-start-node:
optional: true
solid-start-static:
optional: true
solid-start-vercel:
optional: true
dependencies:
'@babel/core': 7.22.10
'@babel/generator': 7.22.10
'@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10)
'@babel/preset-env': 7.22.10(@babel/core@7.22.10)
'@babel/preset-typescript': 7.22.5(@babel/core@7.22.10)
'@babel/template': 7.22.5
'@solidjs/meta': 0.29.1(solid-js@1.8.5)
'@solidjs/router': 0.8.3(solid-js@1.8.5)
'@types/cookie': 0.5.1
'@types/debug': 4.1.8
chokidar: 3.5.3
compression: 1.7.4
connect: 3.7.0
debug: 4.3.4
dequal: 2.0.3
dotenv: 16.3.1
es-module-lexer: 1.3.0
esbuild: 0.17.19
esbuild-plugin-solid: 0.5.0(esbuild@0.17.19)(solid-js@1.8.5)
fast-glob: 3.3.1
get-port: 6.1.2
micromorph: 0.3.1
parse-multipart-data: 1.5.0
picocolors: 1.0.0
rollup: 3.28.0
rollup-plugin-visualizer: 5.9.2(rollup@3.28.0)
rollup-route-manifest: 1.0.0(rollup@3.28.0)
sade: 1.8.1
set-cookie-parser: 2.6.0
sirv: 2.0.3
solid-js: 1.8.5
solid-start-node: 0.3.9(solid-start@0.3.9)(vite@4.5.0)
terser: 5.19.2
undici: 5.27.1
vite: 4.5.0(@types/node@20.8.10)
vite-plugin-inspect: 0.7.38(rollup@3.28.0)(vite@4.5.0)
vite-plugin-solid: 2.7.0(solid-js@1.8.5)(vite@4.5.0)
wait-on: 6.0.1(debug@4.3.4)
transitivePeerDependencies:
- '@nuxt/kit'
- supports-color
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
@@ -13163,6 +13066,7 @@ packages:
/undici-types@5.26.5:
resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
dev: true
/undici@5.22.1:
resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==}
@@ -13175,6 +13079,7 @@ packages:
engines: {node: '>=14.0'}
dependencies:
'@fastify/busboy': 2.0.0
dev: false
/unicode-canonical-property-names-ecmascript@2.0.0:
resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
@@ -13371,29 +13276,6 @@ packages:
- rollup
- supports-color
/vite-plugin-inspect@0.7.38(rollup@3.28.0)(vite@4.5.0):
resolution: {integrity: sha512-+p6pJVtBOLGv+RBrcKAFUdx+euizg0bjL35HhPyM0MjtKlqoC5V9xkCmO9Ctc8JrTyXqODbHqiLWJKumu5zJ7g==}
engines: {node: '>=14'}
peerDependencies:
'@nuxt/kit': '*'
vite: ^3.1.0 || ^4.0.0
peerDependenciesMeta:
'@nuxt/kit':
optional: true
dependencies:
'@antfu/utils': 0.7.6
'@rollup/pluginutils': 5.0.3(rollup@3.28.0)
debug: 4.3.4
error-stack-parser-es: 0.1.1
fs-extra: 11.1.1
open: 9.1.0
picocolors: 1.0.0
sirv: 2.0.3
vite: 4.5.0(@types/node@20.8.10)
transitivePeerDependencies:
- rollup
- supports-color
/vite-plugin-pwa@0.14.7(vite@4.5.0)(workbox-build@6.6.0)(workbox-window@6.6.0):
resolution: {integrity: sha512-dNJaf0fYOWncmjxv9HiSa2xrSjipjff7IkYE5oIUJ2x5HKu3cXgA8LRgzOwTc5MhwyFYRSU0xyN0Phbx3NsQYw==}
peerDependencies:
@@ -13448,6 +13330,7 @@ packages:
vitefu: 0.2.4(vite@4.5.0)
transitivePeerDependencies:
- supports-color
dev: true
/vite-plugin-wasm@3.2.2(vite@4.5.0):
resolution: {integrity: sha512-cdbBUNR850AEoMd5nvLmnyeq63CSfoP1ctD/L2vLk/5+wsgAPlAVAzUK5nGKWO/jtehNlrSSHLteN+gFQw7VOA==}
@@ -13562,6 +13445,7 @@ packages:
rollup: 3.28.0
optionalDependencies:
fsevents: 2.3.2
dev: true
/vitefu@0.2.4(vite@4.4.7):
resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==}
@@ -13582,6 +13466,7 @@ packages:
optional: true
dependencies:
vite: 4.5.0(@types/node@20.8.10)
dev: true
/wait-on@6.0.1(debug@4.3.4):
resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==}
@@ -13753,7 +13638,7 @@ packages:
'@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0)
'@babel/core': 7.22.10
'@babel/preset-env': 7.22.10(@babel/core@7.22.10)
'@babel/runtime': 7.22.10
'@babel/runtime': 7.23.2
'@rollup/plugin-babel': 5.3.1(@babel/core@7.22.10)(rollup@2.79.1)
'@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1)
'@rollup/plugin-replace': 2.4.2(rollup@2.79.1)

36
src/App.tsx Normal file
View File

@@ -0,0 +1,36 @@
// @refresh reload
import { Capacitor } from "@capacitor/core";
import { StatusBar, Style } from "@capacitor/status-bar";
import { Title } from "@solidjs/meta";
import { ErrorBoundary, Suspense } from "solid-js";
import { ErrorDisplay, I18nProvider } from "~/components";
import { Router } from "~/router";
import { Provider as MegaStoreProvider } from "~/state/megaStore";
const setStatusBarStyleDark = async () => {
await StatusBar.setStyle({ style: Style.Dark });
};
if (Capacitor.isNativePlatform()) {
await setStatusBarStyleDark();
}
export default function App() {
return (
<Suspense>
<Title>Mutiny Wallet</Title>
<ErrorBoundary fallback={(e) => <ErrorDisplay error={e} />}>
<MegaStoreProvider>
<I18nProvider>
<ErrorBoundary
fallback={(e) => <ErrorDisplay error={e} />}
>
<Router />
</ErrorBoundary>
</I18nProvider>
</MegaStoreProvider>
</ErrorBoundary>
</Suspense>
);
}

View File

@@ -1,4 +1,5 @@
import { Contact } from "@mutinywallet/mutiny-wasm";
import { A } from "@solidjs/router";
import {
createEffect,
createResource,
@@ -8,7 +9,6 @@ import {
Show,
Switch
} from "solid-js";
import { A } from "solid-start";
import {
ActivityDetailsModal,

View File

@@ -1,5 +1,6 @@
import { Capacitor } from "@capacitor/core";
import { Dialog } from "@kobalte/core";
import { useNavigate } from "@solidjs/router";
import {
createEffect,
createResource,
@@ -12,7 +13,6 @@ import {
Show,
Switch
} from "solid-js";
import { useNavigate } from "solid-start";
import close from "~/assets/icons/close.svg";
import currencySwap from "~/assets/icons/currency-swap.svg";

View File

@@ -1,5 +1,5 @@
import { A, useNavigate } from "@solidjs/router";
import { Match, Show, Switch } from "solid-js";
import { A, useNavigate } from "solid-start";
import shuffle from "~/assets/icons/shuffle.svg";
import {

View File

@@ -1,6 +1,6 @@
import { createForm } from "@modular-forms/solid";
import { useNavigate } from "@solidjs/router";
import { createSignal, For, Show } from "solid-js";
import { useNavigate } from "solid-start";
import { Button, ExternalLink, InfoBox, NiceP, VStack } from "~/components";
import { useI18n } from "~/i18n/context";

View File

@@ -1,8 +1,8 @@
import { Dialog } from "@kobalte/core";
import { SubmitHandler } from "@modular-forms/solid";
import { Contact } from "@mutinywallet/mutiny-wasm";
import { useNavigate } from "@solidjs/router";
import { createSignal, Match, Show, Switch } from "solid-js";
import { useNavigate } from "solid-start";
import close from "~/assets/icons/close.svg";
import {

View File

@@ -1,5 +1,5 @@
import { A } from "@solidjs/router";
import { createSignal, Show } from "solid-js";
import { A } from "solid-start";
import { Button, InfoBox, SimpleDialog, TextField } from "~/components";
import { useI18n } from "~/i18n/context";

View File

@@ -1,4 +1,5 @@
import { A, Title } from "solid-start";
import { Title } from "@solidjs/meta";
import { A } from "@solidjs/router";
import { ExternalLink } from "~/components";
import {

View File

@@ -1,4 +1,4 @@
import { A, useLocation } from "solid-start";
import { A, useLocation } from "@solidjs/router";
import gift from "~/assets/icons/gift.svg";
import { useI18n } from "~/i18n/context";

View File

@@ -6,7 +6,12 @@ import { I18nContext } from "~/i18n/context";
export const I18nProvider: ParentComponent = (props) => {
const [i18nConfigured] = createResource(async () => {
await i18nConfig;
console.log("about to get the config");
try {
await i18nConfig;
} catch (e) {
console.error("Config error", e);
}
return true;
});

View File

@@ -1,5 +1,5 @@
import { A } from "@solidjs/router";
import { ParentComponent, Show } from "solid-js";
import { A } from "solid-start";
import forward from "~/assets/icons/forward.svg";
import { useI18n } from "~/i18n/context";

View File

@@ -1,4 +1,4 @@
import { A } from "solid-start";
import { A } from "@solidjs/router";
import airplane from "~/assets/icons/airplane.svg";
import receive from "~/assets/icons/big-receive.svg";

View File

@@ -1,5 +1,5 @@
import { Title } from "@solidjs/meta";
import { Match, Switch } from "solid-js";
import { Title } from "solid-start";
import nodevice from "~/assets/no-device.png";
import {

View File

@@ -1,4 +1,4 @@
import { A } from "solid-start";
import { A } from "@solidjs/router";
import { Back } from "~/assets/svg/Back";
import { useI18n } from "~/i18n/context";

View File

@@ -1,4 +1,4 @@
import { useLocation, useNavigate } from "solid-start";
import { useLocation, useNavigate } from "@solidjs/router";
import { BackButton } from "~/components";
import { useI18n } from "~/i18n/context";

View File

@@ -1,6 +1,6 @@
import { A } from "@solidjs/router";
import { JSX, ParentComponent, Show, splitProps } from "solid-js";
import { Dynamic } from "solid-js/web";
import { A } from "solid-start";
import { LoadingSpinner } from "~/components";

View File

@@ -5,6 +5,7 @@ import {
Separator
} from "@kobalte/core";
import { TagItem, TagKind } from "@mutinywallet/mutiny-wasm";
import { A } from "@solidjs/router";
import {
createResource,
createSignal,
@@ -15,7 +16,6 @@ import {
Suspense,
Switch
} from "solid-js";
import { A } from "solid-start";
import check from "~/assets/icons/check.svg";
import close from "~/assets/icons/close.svg";

View File

@@ -1,3 +0,0 @@
import { mount, StartClient } from "solid-start/entry-client";
mount(() => <StartClient />, document);

View File

@@ -1,9 +0,0 @@
import {
createHandler,
renderAsync,
StartServer
} from "solid-start/entry-server";
export default createHandler(
renderAsync((event) => <StartServer event={event} />)
);

23
src/index.tsx Normal file
View File

@@ -0,0 +1,23 @@
/* @refresh reload */
import { render } from "solid-js/web";
import "./root.css";
import { MetaProvider } from "@solidjs/meta";
import { Router } from "@solidjs/router";
import App from "./App";
const root = document.getElementById("root");
render(
() => (
<Router>
{/* important that there's only one of these. hardcoded meta elements in index.html can be decorated with data-sm to be mutatable */}
<MetaProvider>
<App />
</MetaProvider>
</Router>
),
root!
);

View File

@@ -1,105 +0,0 @@
// @refresh reload
import { Suspense } from "solid-js";
import {
Body,
ErrorBoundary,
Head,
Html,
Link,
Meta,
Scripts,
Title
} from "solid-start";
import "./root.css";
import { Capacitor } from "@capacitor/core";
import { StatusBar, Style } from "@capacitor/status-bar";
import { ErrorDisplay, I18nProvider } from "~/components";
import { Router } from "~/router";
import { Provider as MegaStoreProvider } from "~/state/megaStore";
const setStatusBarStyleDark = async () => {
await StatusBar.setStyle({ style: Style.Dark });
};
if (Capacitor.isNativePlatform()) {
await setStatusBarStyleDark();
}
export default function Root() {
return (
<Html lang="en">
<Head>
<Title>Mutiny Wallet</Title>
<Meta charset="utf-8" />
<Meta
name="viewport"
content="width=device-width, initial-scale=1.0 height=device-height viewport-fit=cover user-scalable=no"
/>
<Link rel="manifest" href="/manifest.webmanifest" />
<Meta name="theme-color" content="rgb(23,23,23)" />
<Meta
name="description"
content="Mutiny is a self-custodial lightning wallet that runs in the browser."
/>
<Link rel="icon" href="/favicon.ico" />
<Meta name="twitter:card" content="summary_large_image" />
<Meta name="twitter:title" content="Mutiny Wallet" />
<Meta
name="twitter:description"
content="Mutiny is a self-custodial lightning wallet that runs in the browser."
/>
<Meta
name="twitter:site"
content="https://app.mutinywallet.com/"
/>
<Meta
name="twitter:image"
content="https://app.mutinywallet.com/images/twitter_card_image.png"
/>
<Meta property="og:type" content="website" />
<Meta property="og:title" content="Mutiny Wallet" />
<Meta
property="og:description"
content="Mutiny is a self-custodial lightning wallet that runs in the browser."
/>
<Meta
property="og:url"
content="https://app.mutinywallet.com/"
/>
<Meta
property="og:image"
content="https://app.mutinywallet.com/images/twitter_card_image.png"
/>
<Link
rel="apple-touch-icon"
href="/images/icon.png"
sizes="512x512"
/>
<Link
rel="mask-icon"
href="/mutiny_logo_mask.svg"
color="#000"
/>
</Head>
<Body>
<Suspense>
<ErrorBoundary fallback={(e) => <ErrorDisplay error={e} />}>
<MegaStoreProvider>
<I18nProvider>
<ErrorBoundary
fallback={(e) => <ErrorDisplay error={e} />}
>
<Router />
</ErrorBoundary>
</I18nProvider>
</MegaStoreProvider>
</ErrorBoundary>
</Suspense>
<Scripts />
</Body>
</Html>
);
}

View File

@@ -1,13 +1,38 @@
// @refresh reload
import { Match, onCleanup, Switch } from "solid-js";
import { FileRoutes, Routes, useNavigate } from "solid-start";
import "./root.css";
import { App as CapacitorApp } from "@capacitor/app";
import { Capacitor } from "@capacitor/core";
import { Route, Routes, useNavigate } from "@solidjs/router";
import { Match, onCleanup, Switch } from "solid-js";
import { SetupErrorDisplay, Toaster } from "~/components";
import {
Activity,
Feedback,
Gift as GiftReceive,
Main,
NotFound,
Receive,
Redshift,
Scanner,
Send,
Swap
} from "~/routes";
import {
Admin,
Backup,
Channels,
Connections,
Currency,
EmergencyKit,
Encrypt,
Gift,
LnUrlAuth,
Plus,
Restore,
Servers,
Settings,
SyncNostrContacts
} from "~/routes/settings";
import { useMegaStore } from "./state/megaStore";
@@ -63,9 +88,37 @@ export function Router() {
<SetupErrorDisplay initialError={state.setup_error!} />
</Match>
<Match when={true}>
<GlobalListeners />
<Routes>
<GlobalListeners />
<FileRoutes />
<Route path="/" component={Main} />
<Route path="/activity" component={Activity} />
<Route path="/feedback" component={Feedback} />
<Route path="/gift" component={GiftReceive} />
<Route path="/receive" component={Receive} />
<Route path="/redshift" component={Redshift} />
<Route path="/scanner" component={Scanner} />
<Route path="/send" component={Send} />
<Route path="/swap" component={Swap} />
<Route path="/settings">
<Route path="/" component={Settings} />
<Route path="/admin" component={Admin} />
<Route path="/backup" component={Backup} />
<Route path="/channels" component={Channels} />
<Route path="/connections" component={Connections} />
<Route path="/currency" component={Currency} />
<Route path="/emergencykit" component={EmergencyKit} />
<Route path="/encrypt" component={Encrypt} />
<Route path="/gift" component={Gift} />
<Route path="/lnurlauth" component={LnUrlAuth} />
<Route path="/plus" component={Plus} />
<Route path="/restore" component={Restore} />
<Route path="/servers" component={Servers} />
<Route
path="/syncnostrcontacts"
component={SyncNostrContacts}
/>
</Route>
<Route path="/*all" component={NotFound} />
</Routes>
<Toaster />
</Match>

View File

@@ -98,7 +98,7 @@ function ContactRow() {
const TAB =
"flex-1 inline-block px-8 py-4 text-lg font-semibold rounded-lg ui-selected:bg-white/10 bg-neutral-950 hover:bg-white/10";
export default function Activity() {
export function Activity() {
const i18n = useI18n();
const [state, _actions] = useMegaStore();
return (

View File

@@ -1,6 +1,6 @@
import { createForm, required, SubmitHandler } from "@modular-forms/solid";
import { A, useLocation } from "@solidjs/router";
import { createSignal, Match, Show, Switch } from "solid-js";
import { A, useLocation } from "solid-start";
import feedback from "~/assets/icons/feedback.svg";
import { ExternalLink, InfoBox, MegaCheck, NavBar } from "~/components";
@@ -164,7 +164,7 @@ function FeedbackForm(props: { onSubmitted: () => void }) {
);
}
export default function Feedback() {
export function Feedback() {
const i18n = useI18n();
const [submitted, setSubmitted] = createSignal(false);
const location = useLocation();

View File

@@ -1,3 +1,4 @@
import { useSearchParams } from "@solidjs/router";
import {
createMemo,
createResource,
@@ -7,7 +8,6 @@ import {
Suspense,
Switch
} from "solid-js";
import { useSearchParams } from "solid-start";
import treasureClosed from "~/assets/treasure-closed.png";
import treasure from "~/assets/treasure.gif";
@@ -91,7 +91,7 @@ function InboundWarning() {
);
}
export default function GiftPage() {
export function Gift() {
const [state, _] = useMegaStore();
const i18n = useI18n();

View File

@@ -1,5 +1,5 @@
import { A } from "@solidjs/router";
import { Show, Suspense } from "solid-js";
import { A } from "solid-start";
import scan from "~/assets/icons/scan.svg";
import settings from "~/assets/icons/settings.svg";
@@ -24,7 +24,7 @@ import { useI18n } from "~/i18n/context";
import { FeedbackLink } from "~/routes/Feedback";
import { useMegaStore } from "~/state/megaStore";
export default function App() {
export function Main() {
const i18n = useI18n();
const [state, _actions] = useMegaStore();

View File

@@ -6,6 +6,7 @@ import {
MutinyInvoice,
TagItem
} from "@mutinywallet/mutiny-wasm";
import { useNavigate } from "@solidjs/router";
import {
createEffect,
createMemo,
@@ -16,7 +17,6 @@ import {
Show,
Switch
} from "solid-js";
import { useNavigate } from "solid-start";
import side2side from "~/assets/icons/side-to-side.svg";
import {
@@ -107,7 +107,7 @@ function FeeWarning(props: { fee: bigint; flavor: ReceiveFlavor }) {
);
}
export default function Receive() {
export function Receive() {
const [state, actions] = useMegaStore();
const navigate = useNavigate();
const i18n = useI18n();

View File

@@ -374,7 +374,7 @@ const KV: ParentComponent<{ key: string }> = (props) => {
);
};
export default function Redshift() {
export function Redshift() {
const i18n = useI18n();
const [state, _actions] = useMegaStore();

View File

@@ -1,13 +1,13 @@
import { Clipboard } from "@capacitor/clipboard";
import { Capacitor } from "@capacitor/core";
import { useNavigate } from "@solidjs/router";
import { createEffect, createSignal } from "solid-js";
import { useNavigate } from "solid-start";
import { Button, Scanner as Reader, showToast } from "~/components";
import { useI18n } from "~/i18n/context";
import { useMegaStore } from "~/state/megaStore";
export default function Scanner() {
export function Scanner() {
const i18n = useI18n();
const [_state, actions] = useMegaStore();
const [scanResult, setScanResult] = createSignal<string>();

View File

@@ -1,6 +1,7 @@
import { Clipboard } from "@capacitor/clipboard";
import { Capacitor } from "@capacitor/core";
import { Contact, MutinyInvoice, TagItem } from "@mutinywallet/mutiny-wasm";
import { useNavigate } from "@solidjs/router";
import {
createEffect,
createMemo,
@@ -10,7 +11,6 @@ import {
Show,
Switch
} from "solid-js";
import { useNavigate } from "solid-start";
import { Paste } from "~/assets/svg/Paste";
import { Scan } from "~/assets/svg/Scan";
@@ -237,7 +237,7 @@ function Failure(props: { reason: string }) {
);
}
export default function Send() {
export function Send() {
const [state, actions] = useMegaStore();
const navigate = useNavigate();
const i18n = useI18n();

View File

@@ -1,34 +0,0 @@
import {
AmountCard,
Button,
DefaultMain,
Fee,
LargeHeader,
NavBar,
OnboardWarning,
SafeArea,
ShareCard,
VStack
} from "~/components";
const SAMPLE =
"bitcoin:tb1prqm8xtlgme0vmw5s30lgf0a4f5g4mkgsqundwmpu6thrg8zr6uvq2qrhzq?amount=0.001&lightning=lntbs1m1pj9n9xjsp5xgdrmvprtm67p7nq4neparalexlhlmtxx87zx6xeqthsplu842zspp546d6zd2seyaxpapaxx62m88yz3xueqtjmn9v6wj8y56np8weqsxqdqqnp4qdn2hj8tfknpuvdg6tz9yrf3e27ltrx9y58c24jh89lnm43yjwfc5xqrpwjcqpj9qrsgq5sdgh0m3ur5mu5hrmmag4mx9yvy86f83pd0x9ww80kgck6tac3thuzkj0mrtltaxwnlfea95h2re7tj4qsnwzxlvrdmyq2h9mgapnycpppz6k6";
export default function Admin() {
return (
<SafeArea>
<DefaultMain>
<LargeHeader>Storybook</LargeHeader>
<OnboardWarning />
<VStack>
<AmountCard amountSats={"100000"} fee={"69"} />
<ShareCard text={SAMPLE} />
<Button loading intent="blue">
Button
</Button>
<Fee amountSats={15000n} />
</VStack>
</DefaultMain>
<NavBar activeTab="none" />
</SafeArea>
);
}

View File

@@ -1,5 +1,6 @@
import { createForm, required } from "@modular-forms/solid";
import { MutinyChannel, MutinyPeer } from "@mutinywallet/mutiny-wasm";
import { useNavigate } from "@solidjs/router";
import {
createMemo,
createResource,
@@ -9,7 +10,6 @@ import {
Show,
Switch
} from "solid-js";
import { useNavigate } from "solid-start";
import {
ActivityDetailsModal,
@@ -50,7 +50,7 @@ type ChannelOpenDetails = {
failure_reason?: Error;
};
export default function Swap() {
export function Swap() {
const [state, _actions] = useMegaStore();
const navigate = useNavigate();
const i18n = useI18n();

View File

@@ -1,15 +1,13 @@
import { Title } from "solid-start";
import { HttpStatusCode } from "solid-start/server";
import { Title } from "@solidjs/meta";
import { ButtonLink, DefaultMain, LargeHeader, SafeArea } from "~/components";
import { useI18n } from "~/i18n/context";
export default function NotFound() {
export function NotFound() {
const i18n = useI18n();
return (
<SafeArea>
<Title>{i18n.t("error.not_found.title")}</Title>
<HttpStatusCode code={404} />
<DefaultMain>
<LargeHeader>{i18n.t("error.not_found.title")}</LargeHeader>
<p>{i18n.t("error.not_found.wtf_paul")}</p>

10
src/routes/index.ts Normal file
View File

@@ -0,0 +1,10 @@
export * from "./[...404]";
export * from "./Activity";
export * from "./Feedback";
export * from "./Gift";
export * from "./Main";
export * from "./Receive";
export * from "./Redshift";
export * from "./Scanner";
export * from "./Send";
export * from "./Swap";

View File

@@ -13,7 +13,7 @@ import {
} from "~/components";
import { useI18n } from "~/i18n/context";
export default function Admin() {
export function Admin() {
const i18n = useI18n();
return (
<MutinyWalletGuard>

View File

@@ -1,5 +1,5 @@
import { useNavigate } from "@solidjs/router";
import { createEffect, createSignal, Show } from "solid-js";
import { useNavigate } from "solid-start";
import {
BackLink,
@@ -52,7 +52,7 @@ function Quiz(props: { setHasCheckedAll: (hasChecked: boolean) => void }) {
);
}
export default function Backup() {
export function Backup() {
const i18n = useI18n();
const [store, actions] = useMegaStore();
const navigate = useNavigate();

View File

@@ -125,7 +125,7 @@ export function LiquidityMonitor() {
);
}
export default function Channels() {
export function Channels() {
const i18n = useI18n();
return (
<MutinyWalletGuard>

View File

@@ -1,7 +1,7 @@
import { NwcProfile, type BudgetPeriod } from "@mutinywallet/mutiny-wasm";
import { useSearchParams } from "@solidjs/router";
import { createResource, createSignal, For, Show } from "solid-js";
import { QRCodeSVG } from "solid-qr-code";
import { useSearchParams } from "solid-start";
import {
AmountSats,
@@ -384,7 +384,7 @@ function Nwc() {
);
}
export default function Connections() {
export function Connections() {
const i18n = useI18n();
return (
<MutinyWalletGuard>

View File

@@ -10,7 +10,7 @@ import {
} from "~/components";
import { useI18n } from "~/i18n/context";
export default function Currency() {
export function Currency() {
const i18n = useI18n();
return (
<MutinyWalletGuard>

View File

@@ -29,7 +29,7 @@ function EmergencyStack() {
);
}
export default function EmergencyKit() {
export function EmergencyKit() {
const i18n = useI18n();
return (
<SafeArea>

View File

@@ -25,7 +25,7 @@ type EncryptPasswordForm = {
confirmPassword: string;
};
export default function Encrypt() {
export function Encrypt() {
const i18n = useI18n();
const [store, _actions] = useMegaStore();
const [error, setError] = createSignal<Error>();

View File

@@ -130,7 +130,7 @@ function ExistingGifts() {
);
}
export default function GiftPage() {
export function Gift() {
const i18n = useI18n();
const [state, _actions] = useMegaStore();

View File

@@ -14,7 +14,7 @@ import {
import { useI18n } from "~/i18n/context";
import { useMegaStore } from "~/state/megaStore";
export default function LnUrlAuth() {
export function LnUrlAuth() {
const i18n = useI18n();
const [state, _] = useMegaStore();

View File

@@ -1,3 +1,4 @@
import { A } from "@solidjs/router";
import {
createResource,
createSignal,
@@ -6,7 +7,6 @@ import {
Suspense,
Switch
} from "solid-js";
import { A } from "solid-start";
import party from "~/assets/party.gif";
import {
@@ -198,7 +198,7 @@ function PlusCTA() {
);
}
export default function Plus() {
export function Plus() {
const i18n = useI18n();
const [state, _actions] = useMegaStore();

View File

@@ -251,7 +251,7 @@ function TwelveWordsEntry() {
);
}
export default function RestorePage() {
export function Restore() {
const i18n = useI18n();
return (
<SafeArea>

View File

@@ -1,6 +1,6 @@
import { Capacitor } from "@capacitor/core";
import { A } from "@solidjs/router";
import { For, Show } from "solid-js";
import { A } from "solid-start";
import forward from "~/assets/icons/forward.svg";
import {
@@ -63,7 +63,7 @@ function SettingsLinkList(props: {
);
}
export default function Settings() {
export function Settings() {
const i18n = useI18n();
const [state, _actions] = useMegaStore();
// eslint-disable-next-line @typescript-eslint/ban-ts-comment

View File

@@ -150,7 +150,7 @@ function AsyncSettingsEditor() {
);
}
export default function Servers() {
export function Servers() {
const i18n = useI18n();
return (
<SafeArea>

View File

@@ -92,7 +92,7 @@ export function SyncContactsForm() {
);
}
export default function SyncNostrContacts() {
export function SyncNostrContacts() {
const [state, actions] = useMegaStore();
const [loading, setLoading] = createSignal(false);
const [error, setError] = createSignal<Error>();

View File

@@ -0,0 +1,14 @@
export * from "./Root";
export * from "./Admin";
export * from "./Backup";
export * from "./Channels";
export * from "./Connections";
export * from "./Currency";
export * from "./EmergencyKit";
export * from "./Encrypt";
export * from "./Gift";
export * from "./LnUrlAuth";
export * from "./Plus";
export * from "./Restore";
export * from "./Servers";
export * from "./SyncNostrContacts";

View File

@@ -6,6 +6,7 @@ import {
MutinyWallet,
TagItem
} from "@mutinywallet/mutiny-wasm";
import { useNavigate, useSearchParams } from "@solidjs/router";
import {
createContext,
onCleanup,
@@ -14,7 +15,6 @@ import {
useContext
} from "solid-js";
import { createStore } from "solid-js/store";
import { useNavigate, useSearchParams } from "solid-start";
import { checkBrowserCompatibility } from "~/logic/browserCompatibility";
import {

1
src/vite-env.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
/// <reference types="vite/client" />

View File

@@ -1,14 +1,17 @@
{
"compilerOptions": {
"declaration": true,
"declarationDir": "./types",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "node",
"jsxImportSource": "solid-js",
"noEmit": true,
"jsx": "preserve",
"strict": true,
"types": ["solid-start/env", "node", "vite-plugin-pwa/client"],
"types": ["node", "vite-plugin-pwa/client"],
"baseUrl": "./",
"paths": {
"~/*": ["./src/*"]

5
types/index.d.ts vendored Normal file
View File

@@ -0,0 +1,5 @@
declare module "*.svg" {
const content: any;
export default content;
}

View File

@@ -1,5 +1,5 @@
import solid from "solid-start/vite";
import { defineConfig } from "vite";
import solid from "vite-plugin-solid";
import { VitePWA, VitePWAOptions } from "vite-plugin-pwa";
import wasm from "vite-plugin-wasm";
import autoprefixer from "autoprefixer";
@@ -22,6 +22,11 @@ const pwaOptions: Partial<VitePWAOptions> = {
};
export default defineConfig({
build: {
target: "esnext",
outDir: "dist/public",
emptyOutDir: true
},
server: {
port: 3420,
fs: {
@@ -29,7 +34,7 @@ export default defineConfig({
allow: [".."]
}
},
plugins: [wasm(), solid({ ssr: false }), VitePWA(pwaOptions)],
plugins: [wasm(), solid(), VitePWA(pwaOptions)],
define: {
"import.meta.env.__COMMIT_HASH__": JSON.stringify(commitHash),
"import.meta.env.__RELEASE_VERSION__": JSON.stringify(process.env.npm_package_version)
@@ -41,19 +46,19 @@ export default defineConfig({
// Don't want vite to bundle these late during dev causing reload
include: [
"qr-scanner",
"@kobalte/core",
"@solid-primitives/upload",
"i18next",
"i18next-browser-languagedetector",
"@capacitor-mlkit/barcode-scanner",
"@nostr-dev-kit/ndk",
"@capacitor-mlkit/barcode-scanning",
"@capacitor/app",
"@capacitor/app-launcher",
"@capacitor/clipboard",
"@capacitor/core",
"@capacitor/filesystem",
"@capacitor/toast",
"@capacitor/haptics",
"@capacitor/app",
"@capacitor/browser",
"@capacitor/share",
"@capacitor/status-bar",
"@capacitor/toast",
],
// This is necessary because otherwise `vite dev` can't find the wasm
exclude: ["@mutinywallet/mutiny-wasm", "@mutinywallet/waila-wasm"]