DM support
This commit is contained in:
+10
-10
@@ -22,7 +22,7 @@
|
|||||||
"@emeraldpay/hashicon-react": "^0.5.2",
|
"@emeraldpay/hashicon-react": "^0.5.2",
|
||||||
"@hookform/error-message": "^2.0.1",
|
"@hookform/error-message": "^2.0.1",
|
||||||
"@hookform/resolvers": "^2.9.11",
|
"@hookform/resolvers": "^2.9.11",
|
||||||
"@meshtastic/meshtasticjs": "2.0.20-1",
|
"@meshtastic/meshtasticjs": "2.0.20-5",
|
||||||
"@radix-ui/react-accordion": "^1.1.0",
|
"@radix-ui/react-accordion": "^1.1.0",
|
||||||
"@radix-ui/react-checkbox": "^1.0.1",
|
"@radix-ui/react-checkbox": "^1.0.1",
|
||||||
"@radix-ui/react-dialog": "^1.0.2",
|
"@radix-ui/react-dialog": "^1.0.2",
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
"cmdk": "^0.1.22",
|
"cmdk": "^0.1.22",
|
||||||
"geodesy": "^2.4.0",
|
"geodesy": "^2.4.0",
|
||||||
"immer": "^9.0.19",
|
"immer": "^9.0.19",
|
||||||
"lucide-react": "^0.112.0",
|
"lucide-react": "^0.115.0",
|
||||||
"mapbox-gl": "npm:empty-npm-package@^1.0.0",
|
"mapbox-gl": "npm:empty-npm-package@^1.0.0",
|
||||||
"maplibre-gl": "2.4.0",
|
"maplibre-gl": "2.4.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
@@ -62,15 +62,15 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/forms": "^0.5.3",
|
"@tailwindcss/forms": "^0.5.3",
|
||||||
"@types/chrome": "^0.0.212",
|
"@types/chrome": "^0.0.216",
|
||||||
"@types/geodesy": "^2.2.3",
|
"@types/geodesy": "^2.2.3",
|
||||||
"@types/node": "^18.13.0",
|
"@types/node": "^18.14.0",
|
||||||
"@types/react": "^18.0.28",
|
"@types/react": "^18.0.28",
|
||||||
"@types/react-dom": "^18.0.10",
|
"@types/react-dom": "^18.0.11",
|
||||||
"@types/w3c-web-serial": "^1.0.3",
|
"@types/w3c-web-serial": "^1.0.3",
|
||||||
"@types/web-bluetooth": "^0.0.16",
|
"@types/web-bluetooth": "^0.0.16",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.51.0",
|
"@typescript-eslint/eslint-plugin": "^5.52.0",
|
||||||
"@typescript-eslint/parser": "^5.51.0",
|
"@typescript-eslint/parser": "^5.52.0",
|
||||||
"@vitejs/plugin-react": "^3.1.0",
|
"@vitejs/plugin-react": "^3.1.0",
|
||||||
"autoprefixer": "^10.4.13",
|
"autoprefixer": "^10.4.13",
|
||||||
"eslint": "^8.34.0",
|
"eslint": "^8.34.0",
|
||||||
@@ -82,13 +82,13 @@
|
|||||||
"gzipper": "^7.2.0",
|
"gzipper": "^7.2.0",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"prettier": "^2.8.4",
|
"prettier": "^2.8.4",
|
||||||
"prettier-plugin-tailwindcss": "^0.2.2",
|
"prettier-plugin-tailwindcss": "^0.2.3",
|
||||||
"rollup-plugin-visualizer": "^5.9.0",
|
"rollup-plugin-visualizer": "^5.9.0",
|
||||||
"tailwindcss": "^3.2.6",
|
"tailwindcss": "^3.2.7",
|
||||||
"tar": "^6.1.13",
|
"tar": "^6.1.13",
|
||||||
"tslib": "^2.5.0",
|
"tslib": "^2.5.0",
|
||||||
"typescript": "^4.9.5",
|
"typescript": "^4.9.5",
|
||||||
"vite": "^4.1.1",
|
"vite": "^4.1.2",
|
||||||
"vite-plugin-environment": "^1.1.3",
|
"vite-plugin-environment": "^1.1.3",
|
||||||
"vite-plugin-pwa": "^0.14.4"
|
"vite-plugin-pwa": "^0.14.4"
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+181
-134
@@ -4,7 +4,7 @@ specifiers:
|
|||||||
'@emeraldpay/hashicon-react': ^0.5.2
|
'@emeraldpay/hashicon-react': ^0.5.2
|
||||||
'@hookform/error-message': ^2.0.1
|
'@hookform/error-message': ^2.0.1
|
||||||
'@hookform/resolvers': ^2.9.11
|
'@hookform/resolvers': ^2.9.11
|
||||||
'@meshtastic/meshtasticjs': 2.0.20-1
|
'@meshtastic/meshtasticjs': 2.0.20-5
|
||||||
'@radix-ui/react-accordion': ^1.1.0
|
'@radix-ui/react-accordion': ^1.1.0
|
||||||
'@radix-ui/react-checkbox': ^1.0.1
|
'@radix-ui/react-checkbox': ^1.0.1
|
||||||
'@radix-ui/react-dialog': ^1.0.2
|
'@radix-ui/react-dialog': ^1.0.2
|
||||||
@@ -21,15 +21,15 @@ specifiers:
|
|||||||
'@tailwindcss/forms': ^0.5.3
|
'@tailwindcss/forms': ^0.5.3
|
||||||
'@tailwindcss/typography': ^0.5.9
|
'@tailwindcss/typography': ^0.5.9
|
||||||
'@turf/turf': ^6.5.0
|
'@turf/turf': ^6.5.0
|
||||||
'@types/chrome': ^0.0.212
|
'@types/chrome': ^0.0.216
|
||||||
'@types/geodesy': ^2.2.3
|
'@types/geodesy': ^2.2.3
|
||||||
'@types/node': ^18.13.0
|
'@types/node': ^18.14.0
|
||||||
'@types/react': ^18.0.28
|
'@types/react': ^18.0.28
|
||||||
'@types/react-dom': ^18.0.10
|
'@types/react-dom': ^18.0.11
|
||||||
'@types/w3c-web-serial': ^1.0.3
|
'@types/w3c-web-serial': ^1.0.3
|
||||||
'@types/web-bluetooth': ^0.0.16
|
'@types/web-bluetooth': ^0.0.16
|
||||||
'@typescript-eslint/eslint-plugin': ^5.51.0
|
'@typescript-eslint/eslint-plugin': ^5.52.0
|
||||||
'@typescript-eslint/parser': ^5.51.0
|
'@typescript-eslint/parser': ^5.52.0
|
||||||
'@vitejs/plugin-react': ^3.1.0
|
'@vitejs/plugin-react': ^3.1.0
|
||||||
autoprefixer: ^10.4.13
|
autoprefixer: ^10.4.13
|
||||||
base64-js: ^1.5.1
|
base64-js: ^1.5.1
|
||||||
@@ -47,12 +47,12 @@ specifiers:
|
|||||||
geodesy: ^2.4.0
|
geodesy: ^2.4.0
|
||||||
gzipper: ^7.2.0
|
gzipper: ^7.2.0
|
||||||
immer: ^9.0.19
|
immer: ^9.0.19
|
||||||
lucide-react: ^0.112.0
|
lucide-react: ^0.115.0
|
||||||
mapbox-gl: npm:empty-npm-package@^1.0.0
|
mapbox-gl: npm:empty-npm-package@^1.0.0
|
||||||
maplibre-gl: 2.4.0
|
maplibre-gl: 2.4.0
|
||||||
postcss: ^8.4.21
|
postcss: ^8.4.21
|
||||||
prettier: ^2.8.4
|
prettier: ^2.8.4
|
||||||
prettier-plugin-tailwindcss: ^0.2.2
|
prettier-plugin-tailwindcss: ^0.2.3
|
||||||
react: ^18.2.0
|
react: ^18.2.0
|
||||||
react-dom: ^18.2.0
|
react-dom: ^18.2.0
|
||||||
react-hook-form: ^7.43.1
|
react-hook-form: ^7.43.1
|
||||||
@@ -61,13 +61,13 @@ specifiers:
|
|||||||
rfc4648: ^1.5.2
|
rfc4648: ^1.5.2
|
||||||
rollup-plugin-visualizer: ^5.9.0
|
rollup-plugin-visualizer: ^5.9.0
|
||||||
tailwind-merge: ^1.9.1
|
tailwind-merge: ^1.9.1
|
||||||
tailwindcss: ^3.2.6
|
tailwindcss: ^3.2.7
|
||||||
tailwindcss-animate: ^1.0.5
|
tailwindcss-animate: ^1.0.5
|
||||||
tar: ^6.1.13
|
tar: ^6.1.13
|
||||||
timeago-react: ^3.0.5
|
timeago-react: ^3.0.5
|
||||||
tslib: ^2.5.0
|
tslib: ^2.5.0
|
||||||
typescript: ^4.9.5
|
typescript: ^4.9.5
|
||||||
vite: ^4.1.1
|
vite: ^4.1.2
|
||||||
vite-plugin-environment: ^1.1.3
|
vite-plugin-environment: ^1.1.3
|
||||||
vite-plugin-pwa: ^0.14.4
|
vite-plugin-pwa: ^0.14.4
|
||||||
zustand: 4.3.3
|
zustand: 4.3.3
|
||||||
@@ -76,7 +76,7 @@ dependencies:
|
|||||||
'@emeraldpay/hashicon-react': 0.5.2
|
'@emeraldpay/hashicon-react': 0.5.2
|
||||||
'@hookform/error-message': 2.0.1_zf7ga3u4zrffjlingb6kh5ipva
|
'@hookform/error-message': 2.0.1_zf7ga3u4zrffjlingb6kh5ipva
|
||||||
'@hookform/resolvers': 2.9.11_react-hook-form@7.43.1
|
'@hookform/resolvers': 2.9.11_react-hook-form@7.43.1
|
||||||
'@meshtastic/meshtasticjs': link:../js
|
'@meshtastic/meshtasticjs': 2.0.20-5
|
||||||
'@radix-ui/react-accordion': 1.1.0_biqbaboplfbrettd7655fr4n2y
|
'@radix-ui/react-accordion': 1.1.0_biqbaboplfbrettd7655fr4n2y
|
||||||
'@radix-ui/react-checkbox': 1.0.1_biqbaboplfbrettd7655fr4n2y
|
'@radix-ui/react-checkbox': 1.0.1_biqbaboplfbrettd7655fr4n2y
|
||||||
'@radix-ui/react-dialog': 1.0.2_zula6vjvt3wdocc4mwcxqa6nzi
|
'@radix-ui/react-dialog': 1.0.2_zula6vjvt3wdocc4mwcxqa6nzi
|
||||||
@@ -90,7 +90,7 @@ dependencies:
|
|||||||
'@radix-ui/react-tabs': 1.0.2_biqbaboplfbrettd7655fr4n2y
|
'@radix-ui/react-tabs': 1.0.2_biqbaboplfbrettd7655fr4n2y
|
||||||
'@radix-ui/react-toast': 1.1.2_biqbaboplfbrettd7655fr4n2y
|
'@radix-ui/react-toast': 1.1.2_biqbaboplfbrettd7655fr4n2y
|
||||||
'@radix-ui/react-tooltip': 1.0.3_zula6vjvt3wdocc4mwcxqa6nzi
|
'@radix-ui/react-tooltip': 1.0.3_zula6vjvt3wdocc4mwcxqa6nzi
|
||||||
'@tailwindcss/typography': 0.5.9_tailwindcss@3.2.6
|
'@tailwindcss/typography': 0.5.9_tailwindcss@3.2.7
|
||||||
'@turf/turf': 6.5.0
|
'@turf/turf': 6.5.0
|
||||||
base64-js: 1.5.1
|
base64-js: 1.5.1
|
||||||
class-transformer: 0.5.1
|
class-transformer: 0.5.1
|
||||||
@@ -100,7 +100,7 @@ dependencies:
|
|||||||
cmdk: 0.1.22_zula6vjvt3wdocc4mwcxqa6nzi
|
cmdk: 0.1.22_zula6vjvt3wdocc4mwcxqa6nzi
|
||||||
geodesy: 2.4.0
|
geodesy: 2.4.0
|
||||||
immer: 9.0.19
|
immer: 9.0.19
|
||||||
lucide-react: 0.112.0_react@18.2.0
|
lucide-react: 0.115.0_react@18.2.0
|
||||||
mapbox-gl: /empty-npm-package/1.0.0
|
mapbox-gl: /empty-npm-package/1.0.0
|
||||||
maplibre-gl: 2.4.0
|
maplibre-gl: 2.4.0
|
||||||
react: 18.2.0
|
react: 18.2.0
|
||||||
@@ -110,41 +110,41 @@ dependencies:
|
|||||||
react-qrcode-logo: 2.8.0_biqbaboplfbrettd7655fr4n2y
|
react-qrcode-logo: 2.8.0_biqbaboplfbrettd7655fr4n2y
|
||||||
rfc4648: 1.5.2
|
rfc4648: 1.5.2
|
||||||
tailwind-merge: 1.9.1
|
tailwind-merge: 1.9.1
|
||||||
tailwindcss-animate: 1.0.5_tailwindcss@3.2.6
|
tailwindcss-animate: 1.0.5_tailwindcss@3.2.7
|
||||||
timeago-react: 3.0.5_react@18.2.0
|
timeago-react: 3.0.5_react@18.2.0
|
||||||
zustand: 4.3.3_immer@9.0.19+react@18.2.0
|
zustand: 4.3.3_immer@9.0.19+react@18.2.0
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@tailwindcss/forms': 0.5.3_tailwindcss@3.2.6
|
'@tailwindcss/forms': 0.5.3_tailwindcss@3.2.7
|
||||||
'@types/chrome': 0.0.212
|
'@types/chrome': 0.0.216
|
||||||
'@types/geodesy': 2.2.3
|
'@types/geodesy': 2.2.3
|
||||||
'@types/node': 18.13.0
|
'@types/node': 18.14.0
|
||||||
'@types/react': 18.0.28
|
'@types/react': 18.0.28
|
||||||
'@types/react-dom': 18.0.10
|
'@types/react-dom': 18.0.11
|
||||||
'@types/w3c-web-serial': 1.0.3
|
'@types/w3c-web-serial': 1.0.3
|
||||||
'@types/web-bluetooth': 0.0.16
|
'@types/web-bluetooth': 0.0.16
|
||||||
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4
|
'@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
|
||||||
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm
|
'@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
|
||||||
'@vitejs/plugin-react': 3.1.0_vite@4.1.1
|
'@vitejs/plugin-react': 3.1.0_vite@4.1.2
|
||||||
autoprefixer: 10.4.13_postcss@8.4.21
|
autoprefixer: 10.4.13_postcss@8.4.21
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
eslint-config-prettier: 8.6.0_eslint@8.34.0
|
eslint-config-prettier: 8.6.0_eslint@8.34.0
|
||||||
eslint-import-resolver-typescript: 3.5.3_mvgyw3chnqkp6sgfmmtihyjpnm
|
eslint-import-resolver-typescript: 3.5.3_mvgyw3chnqkp6sgfmmtihyjpnm
|
||||||
eslint-plugin-import: 2.27.5_inmo4nrctlhmfx73hzu6aogupa
|
eslint-plugin-import: 2.27.5_gndiqgw2wrzfeqy4ccfxbmtnsi
|
||||||
eslint-plugin-react: 7.32.2_eslint@8.34.0
|
eslint-plugin-react: 7.32.2_eslint@8.34.0
|
||||||
eslint-plugin-react-hooks: 4.6.0_eslint@8.34.0
|
eslint-plugin-react-hooks: 4.6.0_eslint@8.34.0
|
||||||
gzipper: 7.2.0
|
gzipper: 7.2.0
|
||||||
postcss: 8.4.21
|
postcss: 8.4.21
|
||||||
prettier: 2.8.4
|
prettier: 2.8.4
|
||||||
prettier-plugin-tailwindcss: 0.2.2_prettier@2.8.4
|
prettier-plugin-tailwindcss: 0.2.3_prettier@2.8.4
|
||||||
rollup-plugin-visualizer: 5.9.0
|
rollup-plugin-visualizer: 5.9.0
|
||||||
tailwindcss: 3.2.6_postcss@8.4.21
|
tailwindcss: 3.2.7_postcss@8.4.21
|
||||||
tar: 6.1.13
|
tar: 6.1.13
|
||||||
tslib: 2.5.0
|
tslib: 2.5.0
|
||||||
typescript: 4.9.5
|
typescript: 4.9.5
|
||||||
vite: 4.1.1_@types+node@18.13.0
|
vite: 4.1.2_@types+node@18.14.0
|
||||||
vite-plugin-environment: 1.1.3_vite@4.1.1
|
vite-plugin-environment: 1.1.3_vite@4.1.2
|
||||||
vite-plugin-pwa: 0.14.4_vite@4.1.1
|
vite-plugin-pwa: 0.14.4_vite@4.1.2
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
@@ -268,7 +268,7 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.20.12
|
'@babel/core': 7.20.12
|
||||||
'@babel/helper-annotate-as-pure': 7.18.6
|
'@babel/helper-annotate-as-pure': 7.18.6
|
||||||
regexpu-core: 5.3.0
|
regexpu-core: 5.3.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12:
|
/@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.12:
|
||||||
@@ -1267,7 +1267,7 @@ packages:
|
|||||||
babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12
|
babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.12
|
||||||
babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12
|
babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.12
|
||||||
babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12
|
babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.12
|
||||||
core-js-compat: 3.27.2
|
core-js-compat: 3.28.0
|
||||||
semver: 6.3.0
|
semver: 6.3.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
@@ -1332,6 +1332,18 @@ packages:
|
|||||||
to-fast-properties: 2.0.0
|
to-fast-properties: 2.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@buf/meshtastic_protobufs.bufbuild_es/1.0.0-20230217124815-d362b2e8810a.1_@bufbuild+protobuf@1.0.0:
|
||||||
|
resolution: {registry: https://buf.build/gen/npm/v1, tarball: https://buf.build/gen/npm/v1/@buf/meshtastic_protobufs.bufbuild_es/1.0.0-20230217124815-d362b2e8810a.1/tarball}
|
||||||
|
peerDependencies:
|
||||||
|
'@bufbuild/protobuf': ^1.0.0
|
||||||
|
dependencies:
|
||||||
|
'@bufbuild/protobuf': 1.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/@bufbuild/protobuf/1.0.0:
|
||||||
|
resolution: {integrity: sha512-oH3jHBrZ6to8Qf4zLg7O8KqSY42kQZNBRXJRMp5uSi0mqE4L8NbyMnZHeOsbXmTb0xpptRyH11LfS+KeVhXzAA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@emeraldpay/hashicon-react/0.5.2:
|
/@emeraldpay/hashicon-react/0.5.2:
|
||||||
resolution: {integrity: sha512-XCoYKpq8QQOniiSZf5ouzdvXbKfG6q4ICHRqCO/GNofiF0Ra+LR/7+tomHlXVcLPBS9sDAoZQQw/Sr24KRAbJg==}
|
resolution: {integrity: sha512-XCoYKpq8QQOniiSZf5ouzdvXbKfG6q4ICHRqCO/GNofiF0Ra+LR/7+tomHlXVcLPBS9sDAoZQQw/Sr24KRAbJg==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
@@ -1719,6 +1731,18 @@ packages:
|
|||||||
engines: {node: '>=6.0.0'}
|
engines: {node: '>=6.0.0'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/@meshtastic/meshtasticjs/2.0.20-5:
|
||||||
|
resolution: {integrity: sha512-4N1stS98kPeCro8VaWlcv9Y59aBvhFMi5fx7EEeWtbYElhWPI3ahhqChoykY6hh5ommHqESe954WbG7eh0wT4Q==}
|
||||||
|
dependencies:
|
||||||
|
'@buf/meshtastic_protobufs.bufbuild_es': 1.0.0-20230217124815-d362b2e8810a.1_@bufbuild+protobuf@1.0.0
|
||||||
|
'@bufbuild/protobuf': 1.0.0
|
||||||
|
crc: 4.3.2
|
||||||
|
sub-events: 1.9.0
|
||||||
|
tslog: 4.7.4
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- buffer
|
||||||
|
dev: false
|
||||||
|
|
||||||
/@nodelib/fs.scandir/2.1.5:
|
/@nodelib/fs.scandir/2.1.5:
|
||||||
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
@@ -2512,7 +2536,7 @@ packages:
|
|||||||
rollup: 2.79.1
|
rollup: 2.79.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@rollup/plugin-replace/5.0.2_rollup@3.15.0:
|
/@rollup/plugin-replace/5.0.2_rollup@3.17.1:
|
||||||
resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==}
|
resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2521,9 +2545,9 @@ packages:
|
|||||||
rollup:
|
rollup:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rollup/pluginutils': 5.0.2_rollup@3.15.0
|
'@rollup/pluginutils': 5.0.2_rollup@3.17.1
|
||||||
magic-string: 0.27.0
|
magic-string: 0.27.0
|
||||||
rollup: 3.15.0
|
rollup: 3.17.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@rollup/pluginutils/3.1.0_rollup@2.79.1:
|
/@rollup/pluginutils/3.1.0_rollup@2.79.1:
|
||||||
@@ -2538,7 +2562,7 @@ packages:
|
|||||||
rollup: 2.79.1
|
rollup: 2.79.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@rollup/pluginutils/5.0.2_rollup@3.15.0:
|
/@rollup/pluginutils/5.0.2_rollup@3.17.1:
|
||||||
resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
|
resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -2550,7 +2574,7 @@ packages:
|
|||||||
'@types/estree': 1.0.0
|
'@types/estree': 1.0.0
|
||||||
estree-walker: 2.0.2
|
estree-walker: 2.0.2
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
rollup: 3.15.0
|
rollup: 3.17.1
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@stablelib/binary/1.0.1:
|
/@stablelib/binary/1.0.1:
|
||||||
@@ -2588,16 +2612,16 @@ packages:
|
|||||||
string.prototype.matchall: 4.0.8
|
string.prototype.matchall: 4.0.8
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@tailwindcss/forms/0.5.3_tailwindcss@3.2.6:
|
/@tailwindcss/forms/0.5.3_tailwindcss@3.2.7:
|
||||||
resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==}
|
resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1'
|
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1'
|
||||||
dependencies:
|
dependencies:
|
||||||
mini-svg-data-uri: 1.4.4
|
mini-svg-data-uri: 1.4.4
|
||||||
tailwindcss: 3.2.6_postcss@8.4.21
|
tailwindcss: 3.2.7_postcss@8.4.21
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@tailwindcss/typography/0.5.9_tailwindcss@3.2.6:
|
/@tailwindcss/typography/0.5.9_tailwindcss@3.2.7:
|
||||||
resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==}
|
resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
tailwindcss: '>=3.0.0 || insiders'
|
tailwindcss: '>=3.0.0 || insiders'
|
||||||
@@ -2606,7 +2630,7 @@ packages:
|
|||||||
lodash.isplainobject: 4.0.6
|
lodash.isplainobject: 4.0.6
|
||||||
lodash.merge: 4.6.2
|
lodash.merge: 4.6.2
|
||||||
postcss-selector-parser: 6.0.10
|
postcss-selector-parser: 6.0.10
|
||||||
tailwindcss: 3.2.6_postcss@8.4.21
|
tailwindcss: 3.2.7_postcss@8.4.21
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@turf/along/6.5.0:
|
/@turf/along/6.5.0:
|
||||||
@@ -3639,8 +3663,8 @@ packages:
|
|||||||
d3-voronoi: 1.1.2
|
d3-voronoi: 1.1.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/chrome/0.0.212:
|
/@types/chrome/0.0.216:
|
||||||
resolution: {integrity: sha512-O9blKfj6mQyBvkexEa71xcpRfkjAu8izQD3qGYfdwffk+mJhF7eogz628bZr5dETT6Eu7vU0stUGYG/+EQWj9g==}
|
resolution: {integrity: sha512-nJezaOm7yX2Zen+9NhNuGBE2WtssH/ssbqIeULL13wMlCwvjNmSaUeueFEixMODKyCY2vlhkD/jERSvEG0wWEA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/filesystem': 0.0.32
|
'@types/filesystem': 0.0.32
|
||||||
'@types/har-format': 1.2.10
|
'@types/har-format': 1.2.10
|
||||||
@@ -3706,8 +3730,8 @@ packages:
|
|||||||
'@types/pbf': 3.0.2
|
'@types/pbf': 3.0.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/@types/node/18.13.0:
|
/@types/node/18.14.0:
|
||||||
resolution: {integrity: sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==}
|
resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/pbf/3.0.2:
|
/@types/pbf/3.0.2:
|
||||||
@@ -3717,8 +3741,8 @@ packages:
|
|||||||
/@types/prop-types/15.7.5:
|
/@types/prop-types/15.7.5:
|
||||||
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
||||||
|
|
||||||
/@types/react-dom/18.0.10:
|
/@types/react-dom/18.0.11:
|
||||||
resolution: {integrity: sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==}
|
resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/react': 18.0.28
|
'@types/react': 18.0.28
|
||||||
dev: true
|
dev: true
|
||||||
@@ -3733,7 +3757,7 @@ packages:
|
|||||||
/@types/resolve/1.17.1:
|
/@types/resolve/1.17.1:
|
||||||
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
|
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 18.13.0
|
'@types/node': 18.14.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/scheduler/0.16.2:
|
/@types/scheduler/0.16.2:
|
||||||
@@ -3743,8 +3767,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
|
resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/trusted-types/2.0.2:
|
/@types/trusted-types/2.0.3:
|
||||||
resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==}
|
resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@types/validator/13.7.12:
|
/@types/validator/13.7.12:
|
||||||
@@ -3759,8 +3783,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
|
resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/eslint-plugin/5.51.0_z4swst3wuuqk4hlme4ajzslgh4:
|
/@typescript-eslint/eslint-plugin/5.52.0_6cfvjsbua5ptj65675bqcn6oza:
|
||||||
resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==}
|
resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@typescript-eslint/parser': ^5.0.0
|
'@typescript-eslint/parser': ^5.0.0
|
||||||
@@ -3770,10 +3794,10 @@ packages:
|
|||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm
|
'@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
|
||||||
'@typescript-eslint/scope-manager': 5.51.0
|
'@typescript-eslint/scope-manager': 5.52.0
|
||||||
'@typescript-eslint/type-utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm
|
'@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
|
||||||
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm
|
'@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
|
||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
grapheme-splitter: 1.0.4
|
grapheme-splitter: 1.0.4
|
||||||
@@ -3787,8 +3811,8 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/parser/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm:
|
/@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
|
||||||
resolution: {integrity: sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==}
|
resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
|
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
|
||||||
@@ -3797,9 +3821,9 @@ packages:
|
|||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/scope-manager': 5.51.0
|
'@typescript-eslint/scope-manager': 5.52.0
|
||||||
'@typescript-eslint/types': 5.51.0
|
'@typescript-eslint/types': 5.52.0
|
||||||
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5
|
'@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
|
||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
typescript: 4.9.5
|
typescript: 4.9.5
|
||||||
@@ -3807,16 +3831,16 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/scope-manager/5.51.0:
|
/@typescript-eslint/scope-manager/5.52.0:
|
||||||
resolution: {integrity: sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==}
|
resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 5.51.0
|
'@typescript-eslint/types': 5.52.0
|
||||||
'@typescript-eslint/visitor-keys': 5.51.0
|
'@typescript-eslint/visitor-keys': 5.52.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/type-utils/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm:
|
/@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
|
||||||
resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==}
|
resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: '*'
|
eslint: '*'
|
||||||
@@ -3825,8 +3849,8 @@ packages:
|
|||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5
|
'@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
|
||||||
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm
|
'@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
|
||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
tsutils: 3.21.0_typescript@4.9.5
|
tsutils: 3.21.0_typescript@4.9.5
|
||||||
@@ -3835,13 +3859,13 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/types/5.51.0:
|
/@typescript-eslint/types/5.52.0:
|
||||||
resolution: {integrity: sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==}
|
resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/typescript-estree/5.51.0_typescript@4.9.5:
|
/@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5:
|
||||||
resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==}
|
resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '*'
|
typescript: '*'
|
||||||
@@ -3849,8 +3873,8 @@ packages:
|
|||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 5.51.0
|
'@typescript-eslint/types': 5.52.0
|
||||||
'@typescript-eslint/visitor-keys': 5.51.0
|
'@typescript-eslint/visitor-keys': 5.52.0
|
||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
globby: 11.1.0
|
globby: 11.1.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
@@ -3861,17 +3885,17 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/utils/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm:
|
/@typescript-eslint/utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
|
||||||
resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==}
|
resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
|
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/json-schema': 7.0.11
|
'@types/json-schema': 7.0.11
|
||||||
'@types/semver': 7.3.13
|
'@types/semver': 7.3.13
|
||||||
'@typescript-eslint/scope-manager': 5.51.0
|
'@typescript-eslint/scope-manager': 5.52.0
|
||||||
'@typescript-eslint/types': 5.51.0
|
'@typescript-eslint/types': 5.52.0
|
||||||
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5
|
'@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
eslint-scope: 5.1.1
|
eslint-scope: 5.1.1
|
||||||
eslint-utils: 3.0.0_eslint@8.34.0
|
eslint-utils: 3.0.0_eslint@8.34.0
|
||||||
@@ -3881,15 +3905,15 @@ packages:
|
|||||||
- typescript
|
- typescript
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@typescript-eslint/visitor-keys/5.51.0:
|
/@typescript-eslint/visitor-keys/5.52.0:
|
||||||
resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==}
|
resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==}
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 5.51.0
|
'@typescript-eslint/types': 5.52.0
|
||||||
eslint-visitor-keys: 3.3.0
|
eslint-visitor-keys: 3.3.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/@vitejs/plugin-react/3.1.0_vite@4.1.1:
|
/@vitejs/plugin-react/3.1.0_vite@4.1.2:
|
||||||
resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==}
|
resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -3900,7 +3924,7 @@ packages:
|
|||||||
'@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12
|
'@babel/plugin-transform-react-jsx-source': 7.19.6_@babel+core@7.20.12
|
||||||
magic-string: 0.27.0
|
magic-string: 0.27.0
|
||||||
react-refresh: 0.14.0
|
react-refresh: 0.14.0
|
||||||
vite: 4.1.1_@types+node@18.13.0
|
vite: 4.1.2_@types+node@18.14.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
@@ -4064,7 +4088,7 @@ packages:
|
|||||||
postcss: ^8.1.0
|
postcss: ^8.1.0
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist: 4.21.5
|
browserslist: 4.21.5
|
||||||
caniuse-lite: 1.0.30001451
|
caniuse-lite: 1.0.30001456
|
||||||
fraction.js: 4.2.0
|
fraction.js: 4.2.0
|
||||||
normalize-range: 0.1.2
|
normalize-range: 0.1.2
|
||||||
picocolors: 1.0.0
|
picocolors: 1.0.0
|
||||||
@@ -4097,7 +4121,7 @@ packages:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.20.12
|
'@babel/core': 7.20.12
|
||||||
'@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12
|
'@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.12
|
||||||
core-js-compat: 3.27.2
|
core-js-compat: 3.28.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
@@ -4148,8 +4172,8 @@ packages:
|
|||||||
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
caniuse-lite: 1.0.30001451
|
caniuse-lite: 1.0.30001456
|
||||||
electron-to-chromium: 1.4.295
|
electron-to-chromium: 1.4.302
|
||||||
node-releases: 2.0.10
|
node-releases: 2.0.10
|
||||||
update-browserslist-db: 1.0.10_browserslist@4.21.5
|
update-browserslist-db: 1.0.10_browserslist@4.21.5
|
||||||
dev: true
|
dev: true
|
||||||
@@ -4178,8 +4202,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
|
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
|
|
||||||
/caniuse-lite/1.0.30001451:
|
/caniuse-lite/1.0.30001456:
|
||||||
resolution: {integrity: sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==}
|
resolution: {integrity: sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/chalk/2.4.2:
|
/chalk/2.4.2:
|
||||||
@@ -4226,7 +4250,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==}
|
resolution: {integrity: sha512-ct3ltplN8I9fOwUd8GrP8UQixwff129BkEtuWDKL5W45cQuLd19xqmTLu5ge78YDm/fdje6FMt0hGOhl0lii3A==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/validator': 13.7.12
|
'@types/validator': 13.7.12
|
||||||
libphonenumber-js: 1.10.19
|
libphonenumber-js: 1.10.20
|
||||||
validator: 13.9.0
|
validator: 13.9.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
@@ -4323,8 +4347,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
|
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/core-js-compat/3.27.2:
|
/core-js-compat/3.28.0:
|
||||||
resolution: {integrity: sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==}
|
resolution: {integrity: sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist: 4.21.5
|
browserslist: 4.21.5
|
||||||
dev: true
|
dev: true
|
||||||
@@ -4333,6 +4357,16 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
|
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/crc/4.3.2:
|
||||||
|
resolution: {integrity: sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
peerDependencies:
|
||||||
|
buffer: '>=6.0.3'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
buffer:
|
||||||
|
optional: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
/cross-spawn/7.0.3:
|
/cross-spawn/7.0.3:
|
||||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
|
||||||
engines: {node: '>= 8'}
|
engines: {node: '>= 8'}
|
||||||
@@ -4522,8 +4556,8 @@ packages:
|
|||||||
jake: 10.8.5
|
jake: 10.8.5
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/electron-to-chromium/1.4.295:
|
/electron-to-chromium/1.4.302:
|
||||||
resolution: {integrity: sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==}
|
resolution: {integrity: sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/emoji-regex/8.0.0:
|
/emoji-regex/8.0.0:
|
||||||
@@ -4699,7 +4733,7 @@ packages:
|
|||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
enhanced-resolve: 5.12.0
|
enhanced-resolve: 5.12.0
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
eslint-plugin-import: 2.27.5_inmo4nrctlhmfx73hzu6aogupa
|
eslint-plugin-import: 2.27.5_gndiqgw2wrzfeqy4ccfxbmtnsi
|
||||||
get-tsconfig: 4.4.0
|
get-tsconfig: 4.4.0
|
||||||
globby: 13.1.3
|
globby: 13.1.3
|
||||||
is-core-module: 2.11.0
|
is-core-module: 2.11.0
|
||||||
@@ -4709,7 +4743,7 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/eslint-module-utils/2.7.4_7d5otxxipfjcaqho6psg7iyp4e:
|
/eslint-module-utils/2.7.4_cvrl34cvgpgac5pvqi7ag6zw7e:
|
||||||
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
|
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -4730,7 +4764,7 @@ packages:
|
|||||||
eslint-import-resolver-webpack:
|
eslint-import-resolver-webpack:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm
|
'@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
|
||||||
debug: 3.2.7
|
debug: 3.2.7
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
eslint-import-resolver-node: 0.3.7
|
eslint-import-resolver-node: 0.3.7
|
||||||
@@ -4739,7 +4773,7 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/eslint-plugin-import/2.27.5_inmo4nrctlhmfx73hzu6aogupa:
|
/eslint-plugin-import/2.27.5_gndiqgw2wrzfeqy4ccfxbmtnsi:
|
||||||
resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
|
resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -4749,7 +4783,7 @@ packages:
|
|||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm
|
'@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
|
||||||
array-includes: 3.1.6
|
array-includes: 3.1.6
|
||||||
array.prototype.flat: 1.3.1
|
array.prototype.flat: 1.3.1
|
||||||
array.prototype.flatmap: 1.3.1
|
array.prototype.flatmap: 1.3.1
|
||||||
@@ -4757,7 +4791,7 @@ packages:
|
|||||||
doctrine: 2.1.0
|
doctrine: 2.1.0
|
||||||
eslint: 8.34.0
|
eslint: 8.34.0
|
||||||
eslint-import-resolver-node: 0.3.7
|
eslint-import-resolver-node: 0.3.7
|
||||||
eslint-module-utils: 2.7.4_7d5otxxipfjcaqho6psg7iyp4e
|
eslint-module-utils: 2.7.4_cvrl34cvgpgac5pvqi7ag6zw7e
|
||||||
has: 1.0.3
|
has: 1.0.3
|
||||||
is-core-module: 2.11.0
|
is-core-module: 2.11.0
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
@@ -4860,7 +4894,7 @@ packages:
|
|||||||
eslint-utils: 3.0.0_eslint@8.34.0
|
eslint-utils: 3.0.0_eslint@8.34.0
|
||||||
eslint-visitor-keys: 3.3.0
|
eslint-visitor-keys: 3.3.0
|
||||||
espree: 9.4.1
|
espree: 9.4.1
|
||||||
esquery: 1.4.0
|
esquery: 1.4.2
|
||||||
esutils: 2.0.3
|
esutils: 2.0.3
|
||||||
fast-deep-equal: 3.1.3
|
fast-deep-equal: 3.1.3
|
||||||
file-entry-cache: 6.0.1
|
file-entry-cache: 6.0.1
|
||||||
@@ -4898,8 +4932,8 @@ packages:
|
|||||||
eslint-visitor-keys: 3.3.0
|
eslint-visitor-keys: 3.3.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/esquery/1.4.0:
|
/esquery/1.4.2:
|
||||||
resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
|
resolution: {integrity: sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==}
|
||||||
engines: {node: '>=0.10'}
|
engines: {node: '>=0.10'}
|
||||||
dependencies:
|
dependencies:
|
||||||
estraverse: 5.3.0
|
estraverse: 5.3.0
|
||||||
@@ -5547,7 +5581,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
|
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
|
||||||
engines: {node: '>= 10.13.0'}
|
engines: {node: '>= 10.13.0'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 18.13.0
|
'@types/node': 18.14.0
|
||||||
merge-stream: 2.0.0
|
merge-stream: 2.0.0
|
||||||
supports-color: 7.2.0
|
supports-color: 7.2.0
|
||||||
dev: true
|
dev: true
|
||||||
@@ -5653,8 +5687,8 @@ packages:
|
|||||||
type-check: 0.4.0
|
type-check: 0.4.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/libphonenumber-js/1.10.19:
|
/libphonenumber-js/1.10.20:
|
||||||
resolution: {integrity: sha512-MDZ1zLIkfSDZV5xBta3nuvbEOlsnKCPe4z5r3hyup/AXveevkl9A1eSWmLhd2FX4k7pJDe4MrLeQsux0HI/VWg==}
|
resolution: {integrity: sha512-kQovlKNdLcVzerbTPmJ+Fx4R+7/pYXmPDIllHjg7IxL4X6MsMG7jaT5opfYrBok0uqkByVif//JUR8e11l/V7w==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/lilconfig/2.0.6:
|
/lilconfig/2.0.6:
|
||||||
@@ -5714,8 +5748,8 @@ packages:
|
|||||||
yallist: 4.0.0
|
yallist: 4.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/lucide-react/0.112.0_react@18.2.0:
|
/lucide-react/0.115.0_react@18.2.0:
|
||||||
resolution: {integrity: sha512-+glJwNv7bv6I6WOb8RRbaVHJdaoaV/KWV44ag/EpAoSsWxSUML5RP8hA+9O188RoEv9ZFMx1l+7HPwTDnt0L/Q==}
|
resolution: {integrity: sha512-VGL7jBKN6pEXi6peXoyn9t9O7olvinaAonnoe+iFi/F2q7/yQzAFM5KR1OY15u9PlrB3scI9HvcTFoOrIjUaVQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^16.5.1 || ^17.0.0 || ^18.0.0
|
react: ^16.5.1 || ^17.0.0 || ^18.0.0
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -6125,10 +6159,11 @@ packages:
|
|||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/prettier-plugin-tailwindcss/0.2.2_prettier@2.8.4:
|
/prettier-plugin-tailwindcss/0.2.3_prettier@2.8.4:
|
||||||
resolution: {integrity: sha512-5RjUbWRe305pUpc48MosoIp6uxZvZxrM6GyOgsbGLTce+ehePKNm7ziW2dLG2air9aXbGuXlHVSQQw4Lbosq3w==}
|
resolution: {integrity: sha512-s2N5Dh7Ao5KTV1mao5ZBnn8EKtUcDPJEkGViZIjI0Ij9TTI5zgTz4IHOxW33jOdjHKa8CSjM88scelUiC5TNRQ==}
|
||||||
engines: {node: '>=12.17.0'}
|
engines: {node: '>=12.17.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
'@ianvs/prettier-plugin-sort-imports': '*'
|
||||||
'@prettier/plugin-php': '*'
|
'@prettier/plugin-php': '*'
|
||||||
'@prettier/plugin-pug': '*'
|
'@prettier/plugin-pug': '*'
|
||||||
'@shopify/prettier-plugin-liquid': '*'
|
'@shopify/prettier-plugin-liquid': '*'
|
||||||
@@ -6145,6 +6180,8 @@ packages:
|
|||||||
prettier-plugin-svelte: '*'
|
prettier-plugin-svelte: '*'
|
||||||
prettier-plugin-twig-melody: '*'
|
prettier-plugin-twig-melody: '*'
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
|
'@ianvs/prettier-plugin-sort-imports':
|
||||||
|
optional: true
|
||||||
'@prettier/plugin-php':
|
'@prettier/plugin-php':
|
||||||
optional: true
|
optional: true
|
||||||
'@prettier/plugin-pug':
|
'@prettier/plugin-pug':
|
||||||
@@ -6464,8 +6501,8 @@ packages:
|
|||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/regexpu-core/5.3.0:
|
/regexpu-core/5.3.1:
|
||||||
resolution: {integrity: sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ==}
|
resolution: {integrity: sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/regjsgen': 0.8.0
|
'@babel/regjsgen': 0.8.0
|
||||||
@@ -6550,7 +6587,7 @@ packages:
|
|||||||
jest-worker: 26.6.2
|
jest-worker: 26.6.2
|
||||||
rollup: 2.79.1
|
rollup: 2.79.1
|
||||||
serialize-javascript: 4.0.0
|
serialize-javascript: 4.0.0
|
||||||
terser: 5.16.3
|
terser: 5.16.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/rollup-plugin-visualizer/5.9.0:
|
/rollup-plugin-visualizer/5.9.0:
|
||||||
@@ -6566,7 +6603,7 @@ packages:
|
|||||||
open: 8.4.1
|
open: 8.4.1
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
source-map: 0.7.4
|
source-map: 0.7.4
|
||||||
yargs: 17.6.2
|
yargs: 17.7.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/rollup/2.79.1:
|
/rollup/2.79.1:
|
||||||
@@ -6577,8 +6614,8 @@ packages:
|
|||||||
fsevents: 2.3.2
|
fsevents: 2.3.2
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/rollup/3.15.0:
|
/rollup/3.17.1:
|
||||||
resolution: {integrity: sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==}
|
resolution: {integrity: sha512-8RnSms6rNqHmZK+wiqgnPCqen+rRnUHXkciGDirh7B00g1rX1vpKbPDhuxCvAG2bburoI+W4Q9/PlUB/zYkiYA==}
|
||||||
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
|
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
@@ -6803,6 +6840,11 @@ packages:
|
|||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/sub-events/1.9.0:
|
||||||
|
resolution: {integrity: sha512-dnFBayilG9Ku0k/lNs1Y7WV4kv91+ovCoeBV3uIYrY49DylvBb6z9d9ED2ctcrvX2YlReFalpCgJNtSgmrOaJg==}
|
||||||
|
engines: {node: '>=10.0.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/supercluster/7.1.5:
|
/supercluster/7.1.5:
|
||||||
resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==}
|
resolution: {integrity: sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==}
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -6839,16 +6881,16 @@ packages:
|
|||||||
resolution: {integrity: sha512-ED9MkiUHlmfh58EC1xHRqXcH1IQyRtmDP0AmXlugYkP2tvfu7ejtjFEHJLJt93mQ7ZJkcqSIgm9M394bq5vOJg==}
|
resolution: {integrity: sha512-ED9MkiUHlmfh58EC1xHRqXcH1IQyRtmDP0AmXlugYkP2tvfu7ejtjFEHJLJt93mQ7ZJkcqSIgm9M394bq5vOJg==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/tailwindcss-animate/1.0.5_tailwindcss@3.2.6:
|
/tailwindcss-animate/1.0.5_tailwindcss@3.2.7:
|
||||||
resolution: {integrity: sha512-UU3qrOJ4lFQABY+MVADmBm+0KW3xZyhMdRvejwtXqYOL7YjHYxmuREFAZdmVG5LPe5E9CAst846SLC4j5I3dcw==}
|
resolution: {integrity: sha512-UU3qrOJ4lFQABY+MVADmBm+0KW3xZyhMdRvejwtXqYOL7YjHYxmuREFAZdmVG5LPe5E9CAst846SLC4j5I3dcw==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
tailwindcss: '>=3.0.0 || insiders'
|
tailwindcss: '>=3.0.0 || insiders'
|
||||||
dependencies:
|
dependencies:
|
||||||
tailwindcss: 3.2.6_postcss@8.4.21
|
tailwindcss: 3.2.7_postcss@8.4.21
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/tailwindcss/3.2.6_postcss@8.4.21:
|
/tailwindcss/3.2.7_postcss@8.4.21:
|
||||||
resolution: {integrity: sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==}
|
resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==}
|
||||||
engines: {node: '>=12.13.0'}
|
engines: {node: '>=12.13.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -6920,8 +6962,8 @@ packages:
|
|||||||
unique-string: 2.0.0
|
unique-string: 2.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/terser/5.16.3:
|
/terser/5.16.4:
|
||||||
resolution: {integrity: sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==}
|
resolution: {integrity: sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -7019,6 +7061,11 @@ packages:
|
|||||||
/tslib/2.5.0:
|
/tslib/2.5.0:
|
||||||
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
|
resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==}
|
||||||
|
|
||||||
|
/tslog/4.7.4:
|
||||||
|
resolution: {integrity: sha512-/hz7E1ahN9KXNywEGJZ8SL4s3YLu9fKYBHOXsKgXwk73qZ7Y5NCkqktP6Y+0MQNfnqOdH8eRE0Rw0spmyTWLPg==}
|
||||||
|
engines: {node: '>=16'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/tsutils/3.21.0_typescript@4.9.5:
|
/tsutils/3.21.0_typescript@4.9.5:
|
||||||
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
|
resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
@@ -7199,25 +7246,25 @@ packages:
|
|||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
/vite-plugin-environment/1.1.3_vite@4.1.1:
|
/vite-plugin-environment/1.1.3_vite@4.1.2:
|
||||||
resolution: {integrity: sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA==}
|
resolution: {integrity: sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: '>= 2.7'
|
vite: '>= 2.7'
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 4.1.1_@types+node@18.13.0
|
vite: 4.1.2_@types+node@18.14.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/vite-plugin-pwa/0.14.4_vite@4.1.1:
|
/vite-plugin-pwa/0.14.4_vite@4.1.2:
|
||||||
resolution: {integrity: sha512-M7Ct0so8OlouMkTWgXnl8W1xU95glITSKIe7qswZf1tniAstO2idElGCnsrTJ5NPNSx1XqfTCOUj8j94S6FD7Q==}
|
resolution: {integrity: sha512-M7Ct0so8OlouMkTWgXnl8W1xU95glITSKIe7qswZf1tniAstO2idElGCnsrTJ5NPNSx1XqfTCOUj8j94S6FD7Q==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
vite: ^3.1.0 || ^4.0.0
|
vite: ^3.1.0 || ^4.0.0
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rollup/plugin-replace': 5.0.2_rollup@3.15.0
|
'@rollup/plugin-replace': 5.0.2_rollup@3.17.1
|
||||||
debug: 4.3.4
|
debug: 4.3.4
|
||||||
fast-glob: 3.2.12
|
fast-glob: 3.2.12
|
||||||
pretty-bytes: 6.1.0
|
pretty-bytes: 6.1.0
|
||||||
rollup: 3.15.0
|
rollup: 3.17.1
|
||||||
vite: 4.1.1_@types+node@18.13.0
|
vite: 4.1.2_@types+node@18.14.0
|
||||||
workbox-build: 6.5.4
|
workbox-build: 6.5.4
|
||||||
workbox-window: 6.5.4
|
workbox-window: 6.5.4
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@@ -7225,8 +7272,8 @@ packages:
|
|||||||
- supports-color
|
- supports-color
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/vite/4.1.1_@types+node@18.13.0:
|
/vite/4.1.2_@types+node@18.14.0:
|
||||||
resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==}
|
resolution: {integrity: sha512-MWDb9Rfy3DI8omDQySbMK93nQqStwbsQWejXRY2EBzEWKmLAXWb1mkI9Yw2IJrc+oCvPCI1Os5xSSIBYY6DEAw==}
|
||||||
engines: {node: ^14.18.0 || >=16.0.0}
|
engines: {node: ^14.18.0 || >=16.0.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
@@ -7250,11 +7297,11 @@ packages:
|
|||||||
terser:
|
terser:
|
||||||
optional: true
|
optional: true
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 18.13.0
|
'@types/node': 18.14.0
|
||||||
esbuild: 0.16.17
|
esbuild: 0.16.17
|
||||||
postcss: 8.4.21
|
postcss: 8.4.21
|
||||||
resolve: 1.22.1
|
resolve: 1.22.1
|
||||||
rollup: 3.15.0
|
rollup: 3.17.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents: 2.3.2
|
fsevents: 2.3.2
|
||||||
dev: true
|
dev: true
|
||||||
@@ -7472,7 +7519,7 @@ packages:
|
|||||||
/workbox-window/6.5.4:
|
/workbox-window/6.5.4:
|
||||||
resolution: {integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==}
|
resolution: {integrity: sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==}
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/trusted-types': 2.0.2
|
'@types/trusted-types': 2.0.3
|
||||||
workbox-core: 6.5.4
|
workbox-core: 6.5.4
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
@@ -7515,8 +7562,8 @@ packages:
|
|||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
/yargs/17.6.2:
|
/yargs/17.7.0:
|
||||||
resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==}
|
resolution: {integrity: sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
dependencies:
|
dependencies:
|
||||||
cliui: 8.0.1
|
cliui: 8.0.1
|
||||||
|
|||||||
@@ -122,9 +122,8 @@ export const CommandPalette = (): JSX.Element => {
|
|||||||
subItems: getDevices().map((device) => {
|
subItems: getDevices().map((device) => {
|
||||||
return {
|
return {
|
||||||
label:
|
label:
|
||||||
device.nodes.find(
|
device.nodes.get(device.hardware.myNodeNum)?.user?.longName ??
|
||||||
(n) => n.data.num === device.hardware.myNodeNum
|
device.hardware.myNodeNum.toString(),
|
||||||
)?.data.user?.longName ?? device.hardware.myNodeNum.toString(),
|
|
||||||
icon: (
|
icon: (
|
||||||
<Hashicon
|
<Hashicon
|
||||||
size={16}
|
size={16}
|
||||||
|
|||||||
@@ -42,9 +42,8 @@ export const Dashboard = () => {
|
|||||||
<div className="px-4 py-4 sm:px-6">
|
<div className="px-4 py-4 sm:px-6">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<p className="truncate text-sm font-medium text-accent">
|
<p className="truncate text-sm font-medium text-accent">
|
||||||
{device.nodes.filter(
|
{device.nodes.get(device.hardware.myNodeNum)?.user
|
||||||
(n) => n.data.num === device.hardware.myNodeNum
|
?.longName ?? "UNK"}
|
||||||
)[0]?.data.user?.longName ?? "UNK"}
|
|
||||||
</p>
|
</p>
|
||||||
<div className="inline-flex w-24 justify-center gap-2 rounded-full bg-slate-100 py-1 text-xs font-semibold text-slate-900 transition-colors hover:bg-slate-700 hover:text-slate-50">
|
<div className="inline-flex w-24 justify-center gap-2 rounded-full bg-slate-100 py-1 text-xs font-semibold text-slate-900 transition-colors hover:bg-slate-700 hover:text-slate-50">
|
||||||
{device.connection?.connType === "ble" && (
|
{device.connection?.connType === "ble" && (
|
||||||
@@ -74,9 +73,7 @@ export const Dashboard = () => {
|
|||||||
className="text-gray-400"
|
className="text-gray-400"
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
{device.nodes.length === 0
|
{device.nodes.size === 0 ? 0 : device.nodes.size - 1}
|
||||||
? 0
|
|
||||||
: device.nodes.length - 1}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -29,19 +29,19 @@ export const DeviceNameDialog = ({
|
|||||||
}: DeviceNameDialogProps): JSX.Element => {
|
}: DeviceNameDialogProps): JSX.Element => {
|
||||||
const { hardware, nodes, connection } = useDevice();
|
const { hardware, nodes, connection } = useDevice();
|
||||||
|
|
||||||
const myNode = nodes.find((n) => n.data.num === hardware.myNodeNum);
|
const myNode = nodes.get(hardware.myNodeNum);
|
||||||
|
|
||||||
const { register, handleSubmit } = useForm<User>({
|
const { register, handleSubmit } = useForm<User>({
|
||||||
values: {
|
values: {
|
||||||
longName: myNode?.data.user?.longName ?? "Unknown",
|
longName: myNode?.user?.longName ?? "Unknown",
|
||||||
shortName: myNode?.data.user?.shortName ?? "Unknown"
|
shortName: myNode?.user?.shortName ?? "Unknown"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const onSubmit = handleSubmit((data) => {
|
const onSubmit = handleSubmit((data) => {
|
||||||
connection?.setOwner(
|
connection?.setOwner(
|
||||||
new Protobuf.User({
|
new Protobuf.User({
|
||||||
...myNode?.data.user,
|
...myNode?.user,
|
||||||
...data
|
...data
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ export const DialogManager = (): JSX.Element => {
|
|||||||
onOpenChange={(open) => {
|
onOpenChange={(open) => {
|
||||||
setDialogOpen("QR", open);
|
setDialogOpen("QR", open);
|
||||||
}}
|
}}
|
||||||
channels={channels.map((ch) => ch.config)}
|
channels={channels}
|
||||||
loraConfig={config.lora}
|
loraConfig={config.lora}
|
||||||
/>
|
/>
|
||||||
<ImportDialog
|
<ImportDialog
|
||||||
@@ -22,7 +22,7 @@ export const DialogManager = (): JSX.Element => {
|
|||||||
onOpenChange={(open) => {
|
onOpenChange={(open) => {
|
||||||
setDialogOpen("import", open);
|
setDialogOpen("import", open);
|
||||||
}}
|
}}
|
||||||
channels={channels.map((ch) => ch.config)}
|
channels={channels}
|
||||||
loraConfig={config.lora}
|
loraConfig={config.lora}
|
||||||
/>
|
/>
|
||||||
<ShutdownDialog
|
<ShutdownDialog
|
||||||
|
|||||||
@@ -1,33 +1,46 @@
|
|||||||
|
import { Subtle } from "@app/components/UI/Typography/Subtle.js";
|
||||||
|
import { MessageWithState, useDevice } from "@app/core/stores/deviceStore.js";
|
||||||
import { Message } from "@components/PageComponents/Messages/Message.js";
|
import { Message } from "@components/PageComponents/Messages/Message.js";
|
||||||
import { MessageInput } from "@components/PageComponents/Messages/MessageInput.js";
|
import { MessageInput } from "@components/PageComponents/Messages/MessageInput.js";
|
||||||
import { useDevice } from "@core/stores/deviceStore.js";
|
import type { Types } from "@meshtastic/meshtasticjs";
|
||||||
import type { Channel } from "@core/stores/deviceStore.js";
|
import { InboxIcon } from "lucide-react";
|
||||||
|
|
||||||
export interface ChannelChatProps {
|
export interface ChannelChatProps {
|
||||||
channel: Channel;
|
messages?: MessageWithState[];
|
||||||
|
channel: Types.ChannelNumber;
|
||||||
|
to: Types.Destination;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ChannelChat = ({ channel }: ChannelChatProps): JSX.Element => {
|
export const ChannelChat = ({
|
||||||
|
messages,
|
||||||
|
channel,
|
||||||
|
to
|
||||||
|
}: ChannelChatProps): JSX.Element => {
|
||||||
const { nodes } = useDevice();
|
const { nodes } = useDevice();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-grow flex-col">
|
<div className="flex flex-grow flex-col">
|
||||||
<div className="flex flex-grow flex-col">
|
<div className="flex flex-grow flex-col">
|
||||||
{channel.messages.map((message, index) => (
|
{messages ? (
|
||||||
<Message
|
messages.map((message, index) => (
|
||||||
key={index}
|
<Message
|
||||||
message={message}
|
key={index}
|
||||||
lastMsgSameUser={
|
message={message}
|
||||||
index === 0
|
lastMsgSameUser={
|
||||||
? false
|
index === 0 ? false : messages[index - 1].from === message.from
|
||||||
: channel.messages[index - 1].from === message.from
|
}
|
||||||
}
|
sender={nodes.get(message.from)}
|
||||||
sender={nodes.find((node) => node.data.num === message.from)?.data}
|
/>
|
||||||
/>
|
))
|
||||||
))}
|
) : (
|
||||||
|
<div className="m-auto">
|
||||||
|
<InboxIcon className="m-auto" />
|
||||||
|
<Subtle>No Messages</Subtle>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="p-3">
|
<div className="p-3">
|
||||||
<MessageInput channel={channel} />
|
<MessageInput to={to} channel={channel} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
import { WaypointMessage } from "@components/PageComponents/Messages/WaypointMessage.js";
|
|
||||||
import { useDevice } from "@core/stores/deviceStore.js";
|
|
||||||
import type { AllMessageTypes } from "@core/stores/deviceStore.js";
|
|
||||||
import { Hashicon } from "@emeraldpay/hashicon-react";
|
import { Hashicon } from "@emeraldpay/hashicon-react";
|
||||||
import {
|
import {
|
||||||
CircleEllipsisIcon,
|
CircleEllipsisIcon,
|
||||||
@@ -8,10 +5,11 @@ import {
|
|||||||
CheckCircle2Icon
|
CheckCircle2Icon
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import type { Protobuf } from "@meshtastic/meshtasticjs";
|
import type { Protobuf } from "@meshtastic/meshtasticjs";
|
||||||
|
import type { MessageWithState } from "@app/core/stores/deviceStore.js";
|
||||||
|
|
||||||
export interface MessageProps {
|
export interface MessageProps {
|
||||||
lastMsgSameUser: boolean;
|
lastMsgSameUser: boolean;
|
||||||
message: AllMessageTypes;
|
message: MessageWithState;
|
||||||
sender?: Protobuf.NodeInfo;
|
sender?: Protobuf.NodeInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,13 +18,6 @@ export const Message = ({
|
|||||||
message,
|
message,
|
||||||
sender
|
sender
|
||||||
}: MessageProps): JSX.Element => {
|
}: MessageProps): JSX.Element => {
|
||||||
const { setPeerInfoOpen, setActivePeer, connection } = useDevice();
|
|
||||||
|
|
||||||
const openPeer = (): void => {
|
|
||||||
setActivePeer(message.from);
|
|
||||||
setPeerInfoOpen(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
return lastMsgSameUser ? (
|
return lastMsgSameUser ? (
|
||||||
<div className="ml-5 flex">
|
<div className="ml-5 flex">
|
||||||
{message.state === "ack" ? (
|
{message.state === "ack" ? (
|
||||||
@@ -36,28 +27,21 @@ export const Message = ({
|
|||||||
) : (
|
) : (
|
||||||
<AlertCircleIcon size={16} className="my-auto text-textSecondary" />
|
<AlertCircleIcon size={16} className="my-auto text-textSecondary" />
|
||||||
)}
|
)}
|
||||||
{"waypointID" in message ? (
|
<span
|
||||||
<WaypointMessage waypointID={message.waypointID} />
|
className={`ml-4 border-l-2 border-l-backgroundPrimary pl-2 ${
|
||||||
) : (
|
message.state === "ack" ? "text-textPrimary" : "text-textSecondary"
|
||||||
<span
|
}`}
|
||||||
className={`ml-4 border-l-2 border-l-backgroundPrimary pl-2 ${
|
>
|
||||||
message.state === "ack" ? "text-textPrimary" : "text-textSecondary"
|
{message.data}
|
||||||
}`}
|
</span>
|
||||||
>
|
|
||||||
{message.data}
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="mx-4 mt-2 gap-2">
|
<div className="mx-4 mt-2 gap-2">
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<div className="w-6 cursor-pointer" onClick={openPeer}>
|
<div className="w-6 cursor-pointer">
|
||||||
<Hashicon value={(sender?.num ?? 0).toString()} size={32} />
|
<Hashicon value={(sender?.num ?? 0).toString()} size={32} />
|
||||||
</div>
|
</div>
|
||||||
<span
|
<span className="cursor-pointer font-medium text-textPrimary">
|
||||||
className="cursor-pointer font-medium text-textPrimary"
|
|
||||||
onClick={openPeer}
|
|
||||||
>
|
|
||||||
{sender?.user?.longName ?? "UNK"}
|
{sender?.user?.longName ?? "UNK"}
|
||||||
</span>
|
</span>
|
||||||
<span className="mt-1 font-mono text-xs text-textSecondary">
|
<span className="mt-1 font-mono text-xs text-textSecondary">
|
||||||
@@ -78,19 +62,13 @@ export const Message = ({
|
|||||||
) : (
|
) : (
|
||||||
<AlertCircleIcon size={16} className="my-auto text-textSecondary" />
|
<AlertCircleIcon size={16} className="my-auto text-textSecondary" />
|
||||||
)}
|
)}
|
||||||
{"waypointID" in message ? (
|
<span
|
||||||
<WaypointMessage waypointID={message.waypointID} />
|
className={`ml-4 border-l-2 border-l-backgroundPrimary pl-2 ${
|
||||||
) : (
|
message.state === "ack" ? "text-textPrimary" : "text-textSecondary"
|
||||||
<span
|
}`}
|
||||||
className={`ml-4 border-l-2 border-l-backgroundPrimary pl-2 ${
|
>
|
||||||
message.state === "ack"
|
{message.data}
|
||||||
? "text-textPrimary"
|
</span>
|
||||||
: "text-textSecondary"
|
|
||||||
}`}
|
|
||||||
>
|
|
||||||
{message.data}
|
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,29 +1,50 @@
|
|||||||
import { Input } from "@components/UI/Input.js";
|
import { Input } from "@components/UI/Input.js";
|
||||||
import { useDevice } from "@core/stores/deviceStore.js";
|
import { useDevice } from "@core/stores/deviceStore.js";
|
||||||
import type { Channel } from "@core/stores/deviceStore.js";
|
|
||||||
import { SendIcon } from "lucide-react";
|
import { SendIcon } from "lucide-react";
|
||||||
import type { Types } from "@meshtastic/meshtasticjs";
|
import type { Types } from "@meshtastic/meshtasticjs";
|
||||||
import { Button } from "@components/UI/Button.js";
|
import { Button } from "@components/UI/Button.js";
|
||||||
|
|
||||||
export interface MessageInputProps {
|
export interface MessageInputProps {
|
||||||
channel: Channel;
|
to: Types.Destination;
|
||||||
|
channel: Types.ChannelNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MessageInput = ({ channel }: MessageInputProps): JSX.Element => {
|
export const MessageInput = ({
|
||||||
const { connection, setMessageState, messageDraft, setMessageDraft } =
|
to,
|
||||||
useDevice();
|
channel
|
||||||
|
}: MessageInputProps): JSX.Element => {
|
||||||
|
const {
|
||||||
|
connection,
|
||||||
|
setMessageState,
|
||||||
|
messageDraft,
|
||||||
|
setMessageDraft,
|
||||||
|
hardware
|
||||||
|
} = useDevice();
|
||||||
|
|
||||||
|
const myNodeNum = hardware.myNodeNum;
|
||||||
|
|
||||||
const sendText = async (message: string) => {
|
const sendText = async (message: string) => {
|
||||||
await connection
|
await connection
|
||||||
?.sendText(
|
?.sendText(message, to, true, channel)
|
||||||
message,
|
.then((id) =>
|
||||||
"broadcast",
|
setMessageState(
|
||||||
true,
|
to === "broadcast" ? "broadcast" : "direct",
|
||||||
channel.config.index as Types.ChannelNumber
|
channel,
|
||||||
|
to as number,
|
||||||
|
myNodeNum,
|
||||||
|
id,
|
||||||
|
"ack"
|
||||||
|
)
|
||||||
)
|
)
|
||||||
.then((id) => setMessageState(channel.config.index, id, "ack"))
|
|
||||||
.catch((e: Types.PacketError) =>
|
.catch((e: Types.PacketError) =>
|
||||||
setMessageState(channel.config.index, e.id, e.error)
|
setMessageState(
|
||||||
|
to === "broadcast" ? "broadcast" : "direct",
|
||||||
|
channel,
|
||||||
|
to as number,
|
||||||
|
myNodeNum,
|
||||||
|
e.id,
|
||||||
|
e.error
|
||||||
|
)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
import { useDevice } from "@core/stores/deviceStore.js";
|
|
||||||
import { toMGRS } from "@core/utils/toMGRS.js";
|
|
||||||
import { MapPinIcon } from "lucide-react";
|
|
||||||
|
|
||||||
export interface WaypointMessageProps {
|
|
||||||
waypointID: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const WaypointMessage = ({
|
|
||||||
waypointID
|
|
||||||
}: WaypointMessageProps): JSX.Element => {
|
|
||||||
const { waypoints } = useDevice();
|
|
||||||
const waypoint = waypoints.find((wp) => wp.id === waypointID);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="ml-4 border-l-2 border-l-slate-200 pl-2">
|
|
||||||
<div className="flex gap-2 rounded-md p-2">
|
|
||||||
<MapPinIcon size={16} className="m-auto text-slate-600" />
|
|
||||||
<div>
|
|
||||||
<div className="flex gap-2">
|
|
||||||
<div className="font-bold">{waypoint?.name}</div>
|
|
||||||
<span className="font-mono text-sm text-slate-500">
|
|
||||||
{toMGRS(waypoint?.latitudeI, waypoint?.longitudeI)}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<span className="text-sm">{waypoint?.description}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
@@ -20,7 +20,7 @@ export interface SidebarProps {
|
|||||||
|
|
||||||
export const Sidebar = ({ children }: SidebarProps): JSX.Element => {
|
export const Sidebar = ({ children }: SidebarProps): JSX.Element => {
|
||||||
const { hardware, nodes } = useDevice();
|
const { hardware, nodes } = useDevice();
|
||||||
const myNode = nodes.find((n) => n.data.num === hardware.myNodeNum);
|
const myNode = nodes.get(hardware.myNodeNum);
|
||||||
const { activePage, setActivePage, setDialogOpen } = useDevice();
|
const { activePage, setActivePage, setDialogOpen } = useDevice();
|
||||||
|
|
||||||
interface NavLink {
|
interface NavLink {
|
||||||
@@ -62,9 +62,9 @@ export const Sidebar = ({ children }: SidebarProps): JSX.Element => {
|
|||||||
<div className="flex justify-between px-8 py-6">
|
<div className="flex justify-between px-8 py-6">
|
||||||
<div>
|
<div>
|
||||||
<span className="text-lg font-medium">
|
<span className="text-lg font-medium">
|
||||||
{myNode?.data.user?.shortName ?? "UNK"}
|
{myNode?.user?.shortName ?? "UNK"}
|
||||||
</span>
|
</span>
|
||||||
<Subtle>{myNode?.data.user?.longName ?? "UNK"}</Subtle>
|
<Subtle>{myNode?.user?.longName ?? "UNK"}</Subtle>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
className="transition-all hover:text-accent"
|
className="transition-all hover:text-accent"
|
||||||
|
|||||||
+153
-187
@@ -4,6 +4,7 @@ import { produce } from "immer";
|
|||||||
import { create } from "zustand";
|
import { create } from "zustand";
|
||||||
|
|
||||||
import { Protobuf, Types } from "@meshtastic/meshtasticjs";
|
import { Protobuf, Types } from "@meshtastic/meshtasticjs";
|
||||||
|
import { channel } from "diagnostics_channel";
|
||||||
|
|
||||||
export type Page = "messages" | "map" | "config" | "channels" | "peers";
|
export type Page = "messages" | "map" | "config" | "channels" | "peers";
|
||||||
|
|
||||||
@@ -11,35 +12,8 @@ export interface MessageWithState extends Types.PacketMetadata<string> {
|
|||||||
state: MessageState;
|
state: MessageState;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface WaypointIDWithState
|
|
||||||
extends Omit<Types.PacketMetadata<Protobuf.Waypoint>, "data"> {
|
|
||||||
waypointID: number;
|
|
||||||
state: MessageState;
|
|
||||||
}
|
|
||||||
|
|
||||||
export type AllMessageTypes = MessageWithState | WaypointIDWithState;
|
|
||||||
|
|
||||||
export type MessageState = "ack" | "waiting" | Protobuf.Routing_Error;
|
export type MessageState = "ack" | "waiting" | Protobuf.Routing_Error;
|
||||||
|
|
||||||
export interface Channel {
|
|
||||||
config: Protobuf.Channel;
|
|
||||||
lastInterraction: Date;
|
|
||||||
messages: AllMessageTypes[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Node {
|
|
||||||
deviceMetrics: {
|
|
||||||
metric: Protobuf.DeviceMetrics;
|
|
||||||
timestamp: Date;
|
|
||||||
}[];
|
|
||||||
environmentMetrics: {
|
|
||||||
metric: Protobuf.EnvironmentMetrics;
|
|
||||||
timestamp: Date;
|
|
||||||
}[];
|
|
||||||
metadata?: Protobuf.DeviceMetadata;
|
|
||||||
data: Protobuf.NodeInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface processPacketParams {
|
export interface processPacketParams {
|
||||||
from: number;
|
from: number;
|
||||||
snr: number;
|
snr: number;
|
||||||
@@ -55,22 +29,24 @@ export type DialogVariant =
|
|||||||
|
|
||||||
export interface Device {
|
export interface Device {
|
||||||
id: number;
|
id: number;
|
||||||
ready: boolean;
|
|
||||||
status: Types.DeviceStatusEnum;
|
status: Types.DeviceStatusEnum;
|
||||||
channels: Channel[];
|
channels: Protobuf.Channel[];
|
||||||
config: Protobuf.LocalConfig;
|
config: Protobuf.LocalConfig;
|
||||||
moduleConfig: Protobuf.LocalModuleConfig;
|
moduleConfig: Protobuf.LocalModuleConfig;
|
||||||
workingConfig: Protobuf.Config[];
|
workingConfig: Protobuf.Config[];
|
||||||
workingModuleConfig: Protobuf.ModuleConfig[];
|
workingModuleConfig: Protobuf.ModuleConfig[];
|
||||||
hardware: Protobuf.MyNodeInfo;
|
hardware: Protobuf.MyNodeInfo;
|
||||||
nodes: Node[];
|
nodes: Map<number, Protobuf.NodeInfo>;
|
||||||
|
metadata: Map<number, Protobuf.DeviceMetadata>;
|
||||||
|
messages: {
|
||||||
|
direct: Map<number, MessageWithState[]>;
|
||||||
|
broadcast: Map<Types.ChannelNumber, MessageWithState[]>;
|
||||||
|
};
|
||||||
connection?: Types.ConnectionType;
|
connection?: Types.ConnectionType;
|
||||||
activePage: Page;
|
activePage: Page;
|
||||||
peerInfoOpen: boolean;
|
|
||||||
activePeer: number;
|
activePeer: number;
|
||||||
waypoints: Protobuf.Waypoint[];
|
waypoints: Protobuf.Waypoint[];
|
||||||
regionUnset: boolean;
|
// currentMetrics: Protobuf.DeviceMetrics;
|
||||||
currentMetrics: Protobuf.DeviceMetrics;
|
|
||||||
pendingSettingsChanges: boolean;
|
pendingSettingsChanges: boolean;
|
||||||
messageDraft: string;
|
messageDraft: string;
|
||||||
dialog: {
|
dialog: {
|
||||||
@@ -81,31 +57,29 @@ export interface Device {
|
|||||||
deviceName: boolean;
|
deviceName: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
setReady(ready: boolean): void;
|
|
||||||
setStatus: (status: Types.DeviceStatusEnum) => void;
|
setStatus: (status: Types.DeviceStatusEnum) => void;
|
||||||
setConfig: (config: Protobuf.Config) => void;
|
setConfig: (config: Protobuf.Config) => void;
|
||||||
setModuleConfig: (config: Protobuf.ModuleConfig) => void;
|
setModuleConfig: (config: Protobuf.ModuleConfig) => void;
|
||||||
setWorkingConfig: (config: Protobuf.Config) => void;
|
setWorkingConfig: (config: Protobuf.Config) => void;
|
||||||
setWorkingModuleConfig: (config: Protobuf.ModuleConfig) => void;
|
setWorkingModuleConfig: (config: Protobuf.ModuleConfig) => void;
|
||||||
setHardware: (hardware: Protobuf.MyNodeInfo) => void;
|
setHardware: (hardware: Protobuf.MyNodeInfo) => void;
|
||||||
setMetrics: (metrics: Types.PacketMetadata<Protobuf.Telemetry>) => void;
|
// setMetrics: (metrics: Types.PacketMetadata<Protobuf.Telemetry>) => void;
|
||||||
setActivePage: (page: Page) => void;
|
setActivePage: (page: Page) => void;
|
||||||
setPeerInfoOpen: (open: boolean) => void;
|
|
||||||
setActivePeer: (peer: number) => void;
|
setActivePeer: (peer: number) => void;
|
||||||
setPendingSettingsChanges: (state: boolean) => void;
|
setPendingSettingsChanges: (state: boolean) => void;
|
||||||
addChannel: (channel: Channel) => void;
|
addChannel: (channel: Protobuf.Channel) => void;
|
||||||
addWaypoint: (waypoint: Protobuf.Waypoint) => void;
|
addWaypoint: (waypoint: Protobuf.Waypoint) => void;
|
||||||
addNodeInfo: (nodeInfo: Protobuf.NodeInfo) => void;
|
addNodeInfo: (nodeInfo: Protobuf.NodeInfo) => void;
|
||||||
addUser: (user: Types.PacketMetadata<Protobuf.User>) => void;
|
addUser: (user: Types.PacketMetadata<Protobuf.User>) => void;
|
||||||
addPosition: (position: Types.PacketMetadata<Protobuf.Position>) => void;
|
addPosition: (position: Types.PacketMetadata<Protobuf.Position>) => void;
|
||||||
addConnection: (connection: Types.ConnectionType) => void;
|
addConnection: (connection: Types.ConnectionType) => void;
|
||||||
addMessage: (message: MessageWithState) => void;
|
addMessage: (message: MessageWithState) => void;
|
||||||
addWaypointMessage: (message: WaypointIDWithState) => void;
|
addMetadata: (from: number, metadata: Protobuf.DeviceMetadata) => void;
|
||||||
addDeviceMetadataMessage: (
|
|
||||||
metadata: Types.PacketMetadata<Protobuf.DeviceMetadata>
|
|
||||||
) => void;
|
|
||||||
setMessageState: (
|
setMessageState: (
|
||||||
channelIndex: number,
|
type: "direct" | "broadcast",
|
||||||
|
channelIndex: Types.ChannelNumber,
|
||||||
|
to: number,
|
||||||
|
from: number,
|
||||||
messageId: number,
|
messageId: number,
|
||||||
state: MessageState
|
state: MessageState
|
||||||
) => void;
|
) => void;
|
||||||
@@ -133,7 +107,6 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
draft.devices.set(id, {
|
draft.devices.set(id, {
|
||||||
id,
|
id,
|
||||||
ready: false,
|
|
||||||
status: Types.DeviceStatusEnum.DEVICE_DISCONNECTED,
|
status: Types.DeviceStatusEnum.DEVICE_DISCONNECTED,
|
||||||
channels: [],
|
channels: [],
|
||||||
config: new Protobuf.LocalConfig(),
|
config: new Protobuf.LocalConfig(),
|
||||||
@@ -141,14 +114,17 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
workingConfig: [],
|
workingConfig: [],
|
||||||
workingModuleConfig: [],
|
workingModuleConfig: [],
|
||||||
hardware: new Protobuf.MyNodeInfo(),
|
hardware: new Protobuf.MyNodeInfo(),
|
||||||
nodes: [],
|
nodes: new Map(),
|
||||||
|
metadata: new Map(),
|
||||||
|
messages: {
|
||||||
|
direct: new Map(),
|
||||||
|
broadcast: new Map()
|
||||||
|
},
|
||||||
connection: undefined,
|
connection: undefined,
|
||||||
activePage: "messages",
|
activePage: "messages",
|
||||||
peerInfoOpen: false,
|
|
||||||
activePeer: 0,
|
activePeer: 0,
|
||||||
waypoints: [],
|
waypoints: [],
|
||||||
regionUnset: false,
|
// currentMetrics: new Protobuf.DeviceMetrics(),
|
||||||
currentMetrics: new Protobuf.DeviceMetrics(),
|
|
||||||
dialog: {
|
dialog: {
|
||||||
import: false,
|
import: false,
|
||||||
QR: false,
|
QR: false,
|
||||||
@@ -159,16 +135,6 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
pendingSettingsChanges: false,
|
pendingSettingsChanges: false,
|
||||||
messageDraft: "",
|
messageDraft: "",
|
||||||
|
|
||||||
setReady: (ready: boolean) => {
|
|
||||||
set(
|
|
||||||
produce<DeviceState>((draft) => {
|
|
||||||
const device = draft.devices.get(id);
|
|
||||||
if (device) {
|
|
||||||
device.ready = ready;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
},
|
|
||||||
setStatus: (status: Types.DeviceStatusEnum) => {
|
setStatus: (status: Types.DeviceStatusEnum) => {
|
||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
@@ -203,9 +169,6 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
break;
|
break;
|
||||||
case "lora":
|
case "lora":
|
||||||
device.config.lora = config.payloadVariant.value;
|
device.config.lora = config.payloadVariant.value;
|
||||||
device.regionUnset =
|
|
||||||
config.payloadVariant.value.region ===
|
|
||||||
Protobuf.Config_LoRaConfig_RegionCode.UNSET;
|
|
||||||
break;
|
break;
|
||||||
case "bluetooth":
|
case "bluetooth":
|
||||||
device.config.bluetooth = config.payloadVariant.value;
|
device.config.bluetooth = config.payloadVariant.value;
|
||||||
@@ -305,50 +268,50 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
setMetrics: (metrics: Types.PacketMetadata<Protobuf.Telemetry>) => {
|
// setMetrics: (metrics: Types.PacketMetadata<Protobuf.Telemetry>) => {
|
||||||
set(
|
// set(
|
||||||
produce<DeviceState>((draft) => {
|
// produce<DeviceState>((draft) => {
|
||||||
const device = draft.devices.get(id);
|
// const device = draft.devices.get(id);
|
||||||
let node = device?.nodes.find(
|
// let node = device?.nodes.find(
|
||||||
(n) => n.data.num === metrics.from
|
// (n) => n.data.num === metrics.from
|
||||||
);
|
// );
|
||||||
if (node) {
|
// if (node) {
|
||||||
switch (metrics.data.variant.case) {
|
// switch (metrics.data.variant.case) {
|
||||||
case "deviceMetrics":
|
// case "deviceMetrics":
|
||||||
if (device) {
|
// if (device) {
|
||||||
if (metrics.data.variant.value.batteryLevel) {
|
// if (metrics.data.variant.value.batteryLevel) {
|
||||||
device.currentMetrics.batteryLevel =
|
// device.currentMetrics.batteryLevel =
|
||||||
metrics.data.variant.value.batteryLevel;
|
// metrics.data.variant.value.batteryLevel;
|
||||||
}
|
// }
|
||||||
if (metrics.data.variant.value.voltage) {
|
// if (metrics.data.variant.value.voltage) {
|
||||||
device.currentMetrics.voltage =
|
// device.currentMetrics.voltage =
|
||||||
metrics.data.variant.value.voltage;
|
// metrics.data.variant.value.voltage;
|
||||||
}
|
// }
|
||||||
if (metrics.data.variant.value.airUtilTx) {
|
// if (metrics.data.variant.value.airUtilTx) {
|
||||||
device.currentMetrics.airUtilTx =
|
// device.currentMetrics.airUtilTx =
|
||||||
metrics.data.variant.value.airUtilTx;
|
// metrics.data.variant.value.airUtilTx;
|
||||||
}
|
// }
|
||||||
if (metrics.data.variant.value.channelUtilization) {
|
// if (metrics.data.variant.value.channelUtilization) {
|
||||||
device.currentMetrics.channelUtilization =
|
// device.currentMetrics.channelUtilization =
|
||||||
metrics.data.variant.value.channelUtilization;
|
// metrics.data.variant.value.channelUtilization;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
node.deviceMetrics.push({
|
// node.deviceMetrics.push({
|
||||||
metric: metrics.data.variant.value,
|
// metric: metrics.data.variant.value,
|
||||||
timestamp: metrics.rxTime
|
// timestamp: metrics.rxTime
|
||||||
});
|
// });
|
||||||
break;
|
// break;
|
||||||
case "environmentMetrics":
|
// case "environmentMetrics":
|
||||||
node.environmentMetrics.push({
|
// node.environmentMetrics.push({
|
||||||
metric: metrics.data.variant.value,
|
// metric: metrics.data.variant.value,
|
||||||
timestamp: metrics.rxTime
|
// timestamp: metrics.rxTime
|
||||||
});
|
// });
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
);
|
// );
|
||||||
},
|
// },
|
||||||
setActivePage: (page) => {
|
setActivePage: (page) => {
|
||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
@@ -369,18 +332,16 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
addChannel: (channel: Channel) => {
|
addChannel: (channel: Protobuf.Channel) => {
|
||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
const device = draft.devices.get(id);
|
const device = draft.devices.get(id);
|
||||||
if (device) {
|
if (device) {
|
||||||
const channelIndex = device.channels.findIndex(
|
const channelIndex = device.channels.findIndex(
|
||||||
(c) => c.config.index === channel.config.index
|
(c) => c.index === channel.index
|
||||||
);
|
);
|
||||||
if (channelIndex !== -1) {
|
if (channelIndex !== -1) {
|
||||||
const messages = device.channels[channelIndex].messages;
|
|
||||||
device.channels[channelIndex] = channel;
|
device.channels[channelIndex] = channel;
|
||||||
device.channels[channelIndex].messages = messages;
|
|
||||||
} else {
|
} else {
|
||||||
device.channels.push(channel);
|
device.channels.push(channel);
|
||||||
}
|
}
|
||||||
@@ -410,29 +371,10 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
const device = draft.devices.get(id);
|
const device = draft.devices.get(id);
|
||||||
const node = device?.nodes.find(
|
if (!device) {
|
||||||
(node) => node.data.num === nodeInfo.num
|
return;
|
||||||
);
|
|
||||||
if (node) {
|
|
||||||
node.data = nodeInfo;
|
|
||||||
} else {
|
|
||||||
device?.nodes.push({
|
|
||||||
data: nodeInfo,
|
|
||||||
metadata: undefined,
|
|
||||||
deviceMetrics: [],
|
|
||||||
environmentMetrics: []
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
},
|
|
||||||
setPeerInfoOpen: (open) => {
|
|
||||||
set(
|
|
||||||
produce<DeviceState>((draft) => {
|
|
||||||
const device = draft.devices.get(id);
|
|
||||||
if (device) {
|
|
||||||
device.peerInfoOpen = open;
|
|
||||||
}
|
}
|
||||||
|
device.nodes.set(nodeInfo.num, nodeInfo);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -450,12 +392,13 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
const device = draft.devices.get(id);
|
const device = draft.devices.get(id);
|
||||||
const node = device?.nodes.find(
|
if (!device) {
|
||||||
(node) => node.data.num === user.from
|
return;
|
||||||
);
|
|
||||||
if (node) {
|
|
||||||
node.data.user = user.data;
|
|
||||||
}
|
}
|
||||||
|
const currentNode =
|
||||||
|
device.nodes.get(user.from) ?? new Protobuf.NodeInfo();
|
||||||
|
currentNode.user = user.data;
|
||||||
|
device.nodes.set(user.from, currentNode);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -463,12 +406,13 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
const device = draft.devices.get(id);
|
const device = draft.devices.get(id);
|
||||||
const node = device?.nodes.find(
|
if (!device) {
|
||||||
(node) => node.data.num === position.from
|
return;
|
||||||
);
|
|
||||||
if (node) {
|
|
||||||
node.data.position = position.data;
|
|
||||||
}
|
}
|
||||||
|
const currentNode =
|
||||||
|
device.nodes.get(position.from) ?? new Protobuf.NodeInfo();
|
||||||
|
currentNode.position = position.data;
|
||||||
|
device.nodes.set(position.from, currentNode);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -486,53 +430,78 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
const device = draft.devices.get(id);
|
const device = draft.devices.get(id);
|
||||||
device?.channels
|
if (!device) {
|
||||||
.find((ch) => ch.config.index === message.channel)
|
return;
|
||||||
?.messages.push(message);
|
}
|
||||||
})
|
const messageGroup = device.messages[message.type];
|
||||||
);
|
const messageIndex =
|
||||||
},
|
message.type === "direct"
|
||||||
addWaypointMessage: (waypointID) => {
|
? message.from === device.hardware.myNodeNum
|
||||||
set(
|
? message.to
|
||||||
produce<DeviceState>((draft) => {
|
: message.from
|
||||||
const device = draft.devices.get(id);
|
: message.channel;
|
||||||
device?.channels
|
const messages = messageGroup.get(messageIndex);
|
||||||
.find((ch) => ch.config.index === waypointID.channel)
|
|
||||||
?.messages.push(waypointID);
|
if (messages) {
|
||||||
})
|
messages.push(message);
|
||||||
);
|
messageGroup.set(messageIndex, messages);
|
||||||
},
|
} else {
|
||||||
addDeviceMetadataMessage: (metadata) => {
|
messageGroup.set(messageIndex, [message]);
|
||||||
set(
|
|
||||||
produce<DeviceState>((draft) => {
|
|
||||||
const device = draft.devices.get(id);
|
|
||||||
const node = device?.nodes.find(
|
|
||||||
(n) => n.data.num === metadata.from
|
|
||||||
);
|
|
||||||
if (node) {
|
|
||||||
node.metadata = metadata.data;
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
addMetadata: (from, metadata) => {
|
||||||
|
set(
|
||||||
|
produce<DeviceState>((draft) => {
|
||||||
|
const device = draft.devices.get(id);
|
||||||
|
if (!device) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
device.metadata.set(from, metadata);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
},
|
||||||
setMessageState: (
|
setMessageState: (
|
||||||
channelIndex: number,
|
type: "direct" | "broadcast",
|
||||||
|
channelIndex: Types.ChannelNumber,
|
||||||
|
to: number,
|
||||||
|
from: number,
|
||||||
messageId: number,
|
messageId: number,
|
||||||
state: MessageState
|
state: MessageState
|
||||||
) => {
|
) => {
|
||||||
set(
|
set(
|
||||||
produce<DeviceState>((draft) => {
|
produce<DeviceState>((draft) => {
|
||||||
|
console.log("setMessageState called");
|
||||||
const device = draft.devices.get(id);
|
const device = draft.devices.get(id);
|
||||||
|
if (!device) {
|
||||||
const channel = device?.channels.find(
|
console.log("no device found for id");
|
||||||
(ch) => ch.config.index === channelIndex
|
return;
|
||||||
);
|
|
||||||
const message = channel?.messages.find(
|
|
||||||
(msg) => msg.id === messageId
|
|
||||||
);
|
|
||||||
if (message) {
|
|
||||||
message.state = state;
|
|
||||||
}
|
}
|
||||||
|
const messageGroup = device.messages[type];
|
||||||
|
|
||||||
|
const messageIndex =
|
||||||
|
type === "direct"
|
||||||
|
? from === device.hardware.myNodeNum
|
||||||
|
? to
|
||||||
|
: from
|
||||||
|
: channelIndex;
|
||||||
|
const messages = messageGroup.get(messageIndex);
|
||||||
|
|
||||||
|
if (!messages) {
|
||||||
|
console.log("no messages found for id");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
messageGroup.set(
|
||||||
|
messageIndex,
|
||||||
|
messages.map((msg) => {
|
||||||
|
if (msg.id === messageId) {
|
||||||
|
msg.state = state;
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
})
|
||||||
|
);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -554,25 +523,22 @@ export const useDeviceStore = create<DeviceState>((set, get) => ({
|
|||||||
if (!device) {
|
if (!device) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const node = device.nodes.find((n) => n.data.num === data.from);
|
const node = device.nodes.get(data.from);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
device.nodes.push({
|
device.nodes.set(
|
||||||
data: new Protobuf.NodeInfo({
|
data.from,
|
||||||
|
new Protobuf.NodeInfo({
|
||||||
num: data.from,
|
num: data.from,
|
||||||
lastHeard: data.time,
|
lastHeard: data.time,
|
||||||
snr: data.snr
|
snr: data.snr
|
||||||
}),
|
})
|
||||||
metadata: undefined,
|
);
|
||||||
deviceMetrics: [],
|
|
||||||
environmentMetrics: []
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
} else {
|
} else {
|
||||||
node.data = {
|
device.nodes.set(data.from, {
|
||||||
...node.data,
|
...node,
|
||||||
lastHeard: data.time,
|
lastHeard: data.time,
|
||||||
snr: data.snr
|
snr: data.snr
|
||||||
};
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export const subscribeAll = (
|
|||||||
// onMeshHeartbeat
|
// onMeshHeartbeat
|
||||||
|
|
||||||
connection.events.onDeviceMetadataPacket.subscribe((metadataPacket) => {
|
connection.events.onDeviceMetadataPacket.subscribe((metadataPacket) => {
|
||||||
device.addDeviceMetadataMessage(metadataPacket);
|
device.addMetadata(metadataPacket.from, metadataPacket.data);
|
||||||
});
|
});
|
||||||
|
|
||||||
connection.events.onRoutingPacket.subscribe((routingPacket) => {
|
connection.events.onRoutingPacket.subscribe((routingPacket) => {
|
||||||
@@ -34,27 +34,16 @@ export const subscribeAll = (
|
|||||||
});
|
});
|
||||||
|
|
||||||
connection.events.onTelemetryPacket.subscribe((telemetryPacket) => {
|
connection.events.onTelemetryPacket.subscribe((telemetryPacket) => {
|
||||||
device.setMetrics(telemetryPacket);
|
// device.setMetrics(telemetryPacket);
|
||||||
});
|
});
|
||||||
|
|
||||||
connection.events.onDeviceStatus.subscribe((status) => {
|
connection.events.onDeviceStatus.subscribe((status) => {
|
||||||
device.setStatus(status);
|
device.setStatus(status);
|
||||||
|
|
||||||
if (status === Types.DeviceStatusEnum.DEVICE_CONFIGURED) {
|
|
||||||
// device.setReady(true);
|
|
||||||
} else if (status === Types.DeviceStatusEnum.DEVICE_DISCONNECTED) {
|
|
||||||
device.setReady(false);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
connection.events.onWaypointPacket.subscribe((waypoint) => {
|
connection.events.onWaypointPacket.subscribe((waypoint) => {
|
||||||
const { data, ...rest } = waypoint;
|
const { data, ...rest } = waypoint;
|
||||||
device.addWaypoint(data);
|
device.addWaypoint(data);
|
||||||
device.addWaypointMessage({
|
|
||||||
waypointID: data.id,
|
|
||||||
state: rest.from !== myNodeNum ? "ack" : "waiting",
|
|
||||||
...rest
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
connection.events.onMyNodeInfo.subscribe((nodeInfo) => {
|
connection.events.onMyNodeInfo.subscribe((nodeInfo) => {
|
||||||
@@ -78,11 +67,7 @@ export const subscribeAll = (
|
|||||||
});
|
});
|
||||||
|
|
||||||
connection.events.onChannelPacket.subscribe((channel) => {
|
connection.events.onChannelPacket.subscribe((channel) => {
|
||||||
device.addChannel({
|
device.addChannel(channel);
|
||||||
config: channel,
|
|
||||||
lastInterraction: new Date(),
|
|
||||||
messages: []
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
connection.events.onConfigPacket.subscribe((config) => {
|
connection.events.onConfigPacket.subscribe((config) => {
|
||||||
device.setConfig(config);
|
device.setConfig(config);
|
||||||
|
|||||||
+5
-14
@@ -5,10 +5,7 @@ import { Channel } from "@components/PageComponents/Channel.js";
|
|||||||
import { useDevice } from "@core/stores/deviceStore.js";
|
import { useDevice } from "@core/stores/deviceStore.js";
|
||||||
import { QrCodeIcon, ImportIcon } from "lucide-react";
|
import { QrCodeIcon, ImportIcon } from "lucide-react";
|
||||||
import { Protobuf, Types } from "@meshtastic/meshtasticjs";
|
import { Protobuf, Types } from "@meshtastic/meshtasticjs";
|
||||||
import { SidebarSection } from "@components/UI/Sidebar/SidebarSection.js";
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { Button } from "@components/UI/Button.js";
|
|
||||||
import { SidebarButton } from "@components/UI/Sidebar/sidebarButton.js";
|
|
||||||
import {
|
import {
|
||||||
Tabs,
|
Tabs,
|
||||||
TabsContent,
|
TabsContent,
|
||||||
@@ -35,7 +32,7 @@ export const ChannelsPage = (): JSX.Element => {
|
|||||||
<PageLayout
|
<PageLayout
|
||||||
label={`Channel: ${
|
label={`Channel: ${
|
||||||
channels[activeChannel]
|
channels[activeChannel]
|
||||||
? getChannelName(channels[activeChannel].config)
|
? getChannelName(channels[activeChannel])
|
||||||
: "Loading..."
|
: "Loading..."
|
||||||
}`}
|
}`}
|
||||||
actions={[
|
actions={[
|
||||||
@@ -58,20 +55,14 @@ export const ChannelsPage = (): JSX.Element => {
|
|||||||
<Tabs defaultValue="0">
|
<Tabs defaultValue="0">
|
||||||
<TabsList>
|
<TabsList>
|
||||||
{channels.map((channel) => (
|
{channels.map((channel) => (
|
||||||
<TabsTrigger
|
<TabsTrigger key={channel.index} value={channel.index.toString()}>
|
||||||
key={channel.config.index}
|
{getChannelName(channel)}
|
||||||
value={channel.config.index.toString()}
|
|
||||||
>
|
|
||||||
{getChannelName(channel.config)}
|
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
))}
|
))}
|
||||||
</TabsList>
|
</TabsList>
|
||||||
{channels.map((channel) => (
|
{channels.map((channel) => (
|
||||||
<TabsContent
|
<TabsContent key={channel.index} value={channel.index.toString()}>
|
||||||
key={channel.config.index}
|
<Channel key={channel.index} channel={channel} />
|
||||||
value={channel.config.index.toString()}
|
|
||||||
>
|
|
||||||
<Channel key={channel.config.index} channel={channel.config} />
|
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
))}
|
))}
|
||||||
</Tabs>
|
</Tabs>
|
||||||
|
|||||||
+15
-11
@@ -21,13 +21,17 @@ export const MapPage = (): JSX.Element => {
|
|||||||
const { rasterSources } = useAppStore();
|
const { rasterSources } = useAppStore();
|
||||||
const { default: map } = useMap();
|
const { default: map } = useMap();
|
||||||
|
|
||||||
|
const allNodes = Array.from(nodes.values());
|
||||||
|
|
||||||
const getBBox = () => {
|
const getBBox = () => {
|
||||||
const nodesWithPosition = nodes.filter((n) => n.data.position?.latitudeI);
|
const nodesWithPosition = allNodes.filter(
|
||||||
|
(node) => node.position?.latitudeI
|
||||||
|
);
|
||||||
if (!nodesWithPosition.length) return;
|
if (!nodesWithPosition.length) return;
|
||||||
const line = lineString(
|
const line = lineString(
|
||||||
nodesWithPosition.map((n) => [
|
nodesWithPosition.map((n) => [
|
||||||
(n.data.position?.latitudeI ?? 0) / 1e7,
|
(n.position?.latitudeI ?? 0) / 1e7,
|
||||||
(n.data.position?.longitudeI ?? 0) / 1e7
|
(n.position?.longitudeI ?? 0) / 1e7
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
const bounds = bbox(line);
|
const bounds = bbox(line);
|
||||||
@@ -43,8 +47,8 @@ export const MapPage = (): JSX.Element => {
|
|||||||
map?.easeTo({
|
map?.easeTo({
|
||||||
zoom: 12,
|
zoom: 12,
|
||||||
center: [
|
center: [
|
||||||
(nodesWithPosition[0].data.position?.longitudeI ?? 0) / 1e7,
|
(nodesWithPosition[0].position?.longitudeI ?? 0) / 1e7,
|
||||||
(nodesWithPosition[0].data.position?.latitudeI ?? 0) / 1e7
|
(nodesWithPosition[0].position?.latitudeI ?? 0) / 1e7
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -123,16 +127,16 @@ export const MapPage = (): JSX.Element => {
|
|||||||
<Layer type="raster" />
|
<Layer type="raster" />
|
||||||
</Source>
|
</Source>
|
||||||
))} */}
|
))} */}
|
||||||
{nodes.map((n) => {
|
{allNodes.map((node) => {
|
||||||
if (n.data.position?.latitudeI) {
|
if (node.position?.latitudeI) {
|
||||||
return (
|
return (
|
||||||
<Marker
|
<Marker
|
||||||
key={n.data.num}
|
key={node.num}
|
||||||
longitude={n.data.position.longitudeI / 1e7}
|
longitude={node.position.longitudeI / 1e7}
|
||||||
latitude={n.data.position.latitudeI / 1e7}
|
latitude={node.position.latitudeI / 1e7}
|
||||||
anchor="bottom"
|
anchor="bottom"
|
||||||
>
|
>
|
||||||
<Hashicon value={n.data.num.toString()} size={32} />
|
<Hashicon value={node.num.toString()} size={32} />
|
||||||
</Marker>
|
</Marker>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
+53
-26
@@ -6,63 +6,90 @@ import { Hashicon } from "@emeraldpay/hashicon-react";
|
|||||||
import { HashIcon } from "lucide-react";
|
import { HashIcon } from "lucide-react";
|
||||||
import { Protobuf, Types } from "@meshtastic/meshtasticjs";
|
import { Protobuf, Types } from "@meshtastic/meshtasticjs";
|
||||||
import { SidebarSection } from "@components/UI/Sidebar/SidebarSection.js";
|
import { SidebarSection } from "@components/UI/Sidebar/SidebarSection.js";
|
||||||
import { useState } from "react";
|
import { useMemo, useState } from "react";
|
||||||
import { getChannelName } from "./Channels.js";
|
import { getChannelName } from "./Channels.js";
|
||||||
import { SidebarButton } from "@components/UI/Sidebar/sidebarButton.js";
|
import { SidebarButton } from "@components/UI/Sidebar/sidebarButton.js";
|
||||||
|
|
||||||
export const MessagesPage = (): JSX.Element => {
|
export const MessagesPage = (): JSX.Element => {
|
||||||
const { channels, nodes, hardware } = useDevice();
|
const { channels, nodes, hardware, messages } = useDevice();
|
||||||
const [activeChannel, setActiveChannel] = useState<Types.ChannelNumber>(
|
const [chatType, setChatType] =
|
||||||
|
useState<Types.PacketDestination>("broadcast");
|
||||||
|
const [activeChat, setActiveChat] = useState<number>(
|
||||||
Types.ChannelNumber.PRIMARY
|
Types.ChannelNumber.PRIMARY
|
||||||
);
|
);
|
||||||
|
const filteredNodes = Array.from(nodes.values()).filter(
|
||||||
|
(n) => n.num !== hardware.myNodeNum
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Sidebar>
|
<Sidebar>
|
||||||
<SidebarSection label="Channels">
|
<SidebarSection label="Channels">
|
||||||
{channels
|
{channels
|
||||||
.filter((ch) => ch.config.role !== Protobuf.Channel_Role.DISABLED)
|
.filter((ch) => ch.role !== Protobuf.Channel_Role.DISABLED)
|
||||||
.map((channel) => (
|
.map((channel) => (
|
||||||
<SidebarButton
|
<SidebarButton
|
||||||
key={channel.config.index}
|
key={channel.index}
|
||||||
label={
|
label={
|
||||||
channel.config.settings?.name.length
|
channel.settings?.name.length
|
||||||
? channel.config.settings?.name
|
? channel.settings?.name
|
||||||
: channel.config.index === 0
|
: channel.index === 0
|
||||||
? "Primary"
|
? "Primary"
|
||||||
: `Ch ${channel.config.index}`
|
: `Ch ${channel.index}`
|
||||||
}
|
}
|
||||||
active={channel.config.index === activeChannel}
|
active={activeChat === channel.index}
|
||||||
onClick={() => setActiveChannel(channel.config.index)}
|
onClick={() => {
|
||||||
|
setChatType("broadcast");
|
||||||
|
setActiveChat(channel.index);
|
||||||
|
}}
|
||||||
element={<HashIcon size={16} className="mr-2" />}
|
element={<HashIcon size={16} className="mr-2" />}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</SidebarSection>
|
</SidebarSection>
|
||||||
<SidebarSection label="Peers">
|
<SidebarSection label="Peers">
|
||||||
{nodes
|
{filteredNodes.map((node) => (
|
||||||
.filter((n) => n.data.num !== hardware.myNodeNum)
|
<SidebarButton
|
||||||
.map((node) => (
|
key={node.num}
|
||||||
<SidebarButton
|
label={node.user?.longName ?? "Unknown"}
|
||||||
key={node.data.num}
|
active={activeChat === node.num}
|
||||||
label={node.data.user?.longName ?? "Unknown"}
|
onClick={() => {
|
||||||
element={
|
setChatType("direct");
|
||||||
<Hashicon size={20} value={node.data.num.toString()} />
|
setActiveChat(node.num);
|
||||||
}
|
}}
|
||||||
/>
|
element={<Hashicon size={20} value={node.num.toString()} />}
|
||||||
))}
|
/>
|
||||||
|
))}
|
||||||
</SidebarSection>
|
</SidebarSection>
|
||||||
</Sidebar>
|
</Sidebar>
|
||||||
<PageLayout
|
<PageLayout
|
||||||
label={`Messages: ${
|
label={`Messages: ${
|
||||||
channels[activeChannel]
|
chatType === "broadcast" && channels[activeChat]
|
||||||
? getChannelName(channels[activeChannel].config)
|
? getChannelName(channels[activeChat])
|
||||||
|
: chatType === "direct" && nodes.get(activeChat)
|
||||||
|
? nodes.get(activeChat)?.user?.longName ?? "Unknown"
|
||||||
: "Loading..."
|
: "Loading..."
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{channels.map(
|
{channels.map(
|
||||||
(channel) =>
|
(channel) =>
|
||||||
channel.config.index === activeChannel && (
|
activeChat === channel.index && (
|
||||||
<ChannelChat key={channel.config.index} channel={channel} />
|
<ChannelChat
|
||||||
|
key={channel.index}
|
||||||
|
to="broadcast"
|
||||||
|
messages={messages.broadcast.get(channel.index)}
|
||||||
|
channel={channel.index}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
{filteredNodes.map(
|
||||||
|
(node) =>
|
||||||
|
activeChat === node.num && (
|
||||||
|
<ChannelChat
|
||||||
|
key={node.num}
|
||||||
|
to={activeChat}
|
||||||
|
messages={messages.direct.get(node.num)}
|
||||||
|
channel={Types.ChannelNumber.PRIMARY}
|
||||||
|
/>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
|
|||||||
+17
-13
@@ -8,7 +8,11 @@ import { Protobuf } from "@meshtastic/meshtasticjs";
|
|||||||
import { Sidebar } from "@components/Sidebar.js";
|
import { Sidebar } from "@components/Sidebar.js";
|
||||||
|
|
||||||
export const PeersPage = (): JSX.Element => {
|
export const PeersPage = (): JSX.Element => {
|
||||||
const { connection, nodes } = useDevice();
|
const { nodes, hardware } = useDevice();
|
||||||
|
|
||||||
|
const filteredNodes = Array.from(nodes.values()).filter(
|
||||||
|
(n) => n.num !== hardware.myNodeNum
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -23,32 +27,32 @@ export const PeersPage = (): JSX.Element => {
|
|||||||
{ title: "Last Heard", type: "normal", sortable: true },
|
{ title: "Last Heard", type: "normal", sortable: true },
|
||||||
{ title: "SNR", type: "normal", sortable: true }
|
{ title: "SNR", type: "normal", sortable: true }
|
||||||
]}
|
]}
|
||||||
rows={nodes.map((node) => [
|
rows={filteredNodes.map((node) => [
|
||||||
<Hashicon size={24} value={node.data.num.toString()} />,
|
<Hashicon size={24} value={node.num.toString()} />,
|
||||||
<h1>
|
<h1>
|
||||||
{node.data.user?.longName ?? node.data.user?.macaddr
|
{node.user?.longName ?? node.user?.macaddr
|
||||||
? `Meshtastic_${base16
|
? `Meshtastic_${base16
|
||||||
.stringify(node.data.user?.macaddr.subarray(4, 6) ?? [])
|
.stringify(node.user?.macaddr.subarray(4, 6) ?? [])
|
||||||
.toLowerCase()}`
|
.toLowerCase()}`
|
||||||
: `UNK: ${node.data.num}`}
|
: `UNK: ${node.num}`}
|
||||||
</h1>,
|
</h1>,
|
||||||
|
|
||||||
<Mono>{Protobuf.HardwareModel[node.data.user?.hwModel ?? 0]}</Mono>,
|
<Mono>{Protobuf.HardwareModel[node.user?.hwModel ?? 0]}</Mono>,
|
||||||
<Mono>
|
<Mono>
|
||||||
{base16
|
{base16
|
||||||
.stringify(node.data.user?.macaddr ?? [])
|
.stringify(node.user?.macaddr ?? [])
|
||||||
.match(/.{1,2}/g)
|
.match(/.{1,2}/g)
|
||||||
?.join(":") ?? "UNK"}
|
?.join(":") ?? "UNK"}
|
||||||
</Mono>,
|
</Mono>,
|
||||||
node.data.lastHeard === 0 ? (
|
node.lastHeard === 0 ? (
|
||||||
<p>Never</p>
|
<p>Never</p>
|
||||||
) : (
|
) : (
|
||||||
<TimeAgo timestamp={node.data.lastHeard * 1000} />
|
<TimeAgo timestamp={node.lastHeard * 1000} />
|
||||||
),
|
),
|
||||||
<Mono>
|
<Mono>
|
||||||
{node.data.snr}db/
|
{node.snr}db/
|
||||||
{Math.min(Math.max((node.data.snr + 10) * 5, 0), 100)}%/
|
{Math.min(Math.max((node.snr + 10) * 5, 0), 100)}%/
|
||||||
{(node.data.snr + 10) * 5}raw
|
{(node.snr + 10) * 5}raw
|
||||||
</Mono>
|
</Mono>
|
||||||
])}
|
])}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user