From 8d68832c629d668b77090096158a0b0a0f11a23e Mon Sep 17 00:00:00 2001 From: Sacha Weatherstone Date: Wed, 8 Dec 2021 02:05:46 +1100 Subject: [PATCH] Add node map + fixes --- package.json | 27 +- pnpm-lock.yaml | 690 +++++++++++++++--------- src/components/Map/index.tsx | 211 ++++++++ src/components/Map/styles.ts | 25 + src/components/generic/StatCard.tsx | 17 - src/components/templates/PageLayout.tsx | 2 +- src/core/connection.ts | 10 + src/core/slices/meshtasticSlice.ts | 53 +- src/pages/Messages.tsx | 2 +- src/pages/Nodes/Index.tsx | 118 ++-- src/pages/Nodes/Node.tsx | 65 --- vite.config.ts | 11 + 12 files changed, 850 insertions(+), 381 deletions(-) create mode 100644 src/components/Map/index.tsx create mode 100644 src/components/Map/styles.ts delete mode 100644 src/components/generic/StatCard.tsx delete mode 100644 src/pages/Nodes/Node.tsx diff --git a/package.json b/package.json index 7ba19e7d..0901be70 100644 --- a/package.json +++ b/package.json @@ -13,39 +13,41 @@ }, "dependencies": { "@headlessui/react": "^1.4.2", - "@meshtastic/meshtasticjs": "^0.6.31", + "@meshtastic/meshtasticjs": "^0.6.32", "@reduxjs/toolkit": "^1.6.2", "boring-avatars": "^1.5.8", - "i18next": "^21.5.3", + "i18next": "^21.5.5", "i18next-browser-languagedetector": "^6.1.2", + "mapbox-gl": "^2.6.1", "react": "^17.0.2", "react-dom": "^17.0.2", "react-file-icon": "^1.1.0", - "react-hook-form": "^7.20.4", + "react-hook-form": "^7.21.0", "react-i18next": "^11.14.3", "react-icons": "^4.3.1", "react-json-pretty": "^2.2.0", "react-qr-code": "^2.0.3", "react-redux": "^7.2.6", "rfc4648": "^1.5.0", - "swr": "^1.0.1", + "swr": "^1.1.0", "timeago-react": "^3.0.4", "type-route": "^0.6.0", "use-breakpoint": "^3.0.0" }, "devDependencies": { + "@types/mapbox-gl": "^2.6.0", "@types/react": "^17.0.37", "@types/react-dom": "^17.0.11", "@types/react-file-icon": "^1.0.1", "@types/w3c-web-serial": "^1.0.2", "@types/web-bluetooth": "^0.0.11", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", + "@typescript-eslint/eslint-plugin": "^5.6.0", + "@typescript-eslint/parser": "^5.6.0", "@verypossible/eslint-config": "^1.6.1", - "@vitejs/plugin-react": "^1.1.0", + "@vitejs/plugin-react": "^1.1.1", "autoprefixer": "^10.4.0", "babel-plugin-module-resolver": "^4.1.0", - "eslint": "8.3.0", + "eslint": "8.4.1", "eslint-config-prettier": "^8.3.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-babel-module": "^5.3.1", @@ -55,12 +57,13 @@ "eslint-plugin-react-hooks": "^4.3.0", "gzipper": "^6.0.0", "postcss": "^8.4.4", - "prettier": "^2.5.0", + "prettier": "^2.5.1", "tailwindcss": "^3.0.0-alpha.2", "tar": "^6.1.11", "typescript": "^4.5.2", - "vite": "^2.6.14", - "vite-plugin-pwa": "^0.11.7", - "workbox-window": "^6.4.1" + "vite": "^2.7.0", + "vite-plugin-cdn-import": "^0.3.5", + "vite-plugin-pwa": "^0.11.10", + "workbox-window": "^6.4.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 937fe1dc..4ad997be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,21 +2,22 @@ lockfileVersion: 5.3 specifiers: '@headlessui/react': ^1.4.2 - '@meshtastic/meshtasticjs': ^0.6.31 + '@meshtastic/meshtasticjs': ^0.6.32 '@reduxjs/toolkit': ^1.6.2 + '@types/mapbox-gl': ^2.6.0 '@types/react': ^17.0.37 '@types/react-dom': ^17.0.11 '@types/react-file-icon': ^1.0.1 '@types/w3c-web-serial': ^1.0.2 '@types/web-bluetooth': ^0.0.11 - '@typescript-eslint/eslint-plugin': ^5.4.0 - '@typescript-eslint/parser': ^5.4.0 + '@typescript-eslint/eslint-plugin': ^5.6.0 + '@typescript-eslint/parser': ^5.6.0 '@verypossible/eslint-config': ^1.6.1 - '@vitejs/plugin-react': ^1.1.0 + '@vitejs/plugin-react': ^1.1.1 autoprefixer: ^10.4.0 babel-plugin-module-resolver: ^4.1.0 boring-avatars: ^1.5.8 - eslint: 8.3.0 + eslint: 8.4.1 eslint-config-prettier: ^8.3.0 eslint-import-resolver-alias: ^1.1.2 eslint-import-resolver-babel-module: ^5.3.1 @@ -25,93 +26,98 @@ specifiers: eslint-plugin-react: ^7.27.1 eslint-plugin-react-hooks: ^4.3.0 gzipper: ^6.0.0 - i18next: ^21.5.3 + i18next: ^21.5.5 i18next-browser-languagedetector: ^6.1.2 + mapbox-gl: ^2.6.1 postcss: ^8.4.4 - prettier: ^2.5.0 + prettier: ^2.5.1 react: ^17.0.2 react-dom: ^17.0.2 react-file-icon: ^1.1.0 - react-hook-form: ^7.20.4 + react-hook-form: ^7.21.0 react-i18next: ^11.14.3 react-icons: ^4.3.1 react-json-pretty: ^2.2.0 react-qr-code: ^2.0.3 react-redux: ^7.2.6 rfc4648: ^1.5.0 - swr: ^1.0.1 + swr: ^1.1.0 tailwindcss: ^3.0.0-alpha.2 tar: ^6.1.11 timeago-react: ^3.0.4 type-route: ^0.6.0 typescript: ^4.5.2 use-breakpoint: ^3.0.0 - vite: ^2.6.14 - vite-plugin-pwa: ^0.11.7 - workbox-window: ^6.4.1 + vite: ^2.7.0 + vite-plugin-cdn-import: ^0.3.5 + vite-plugin-pwa: ^0.11.10 + workbox-window: ^6.4.2 dependencies: '@headlessui/react': 1.4.2_react-dom@17.0.2+react@17.0.2 - '@meshtastic/meshtasticjs': 0.6.31 + '@meshtastic/meshtasticjs': 0.6.32 '@reduxjs/toolkit': 1.6.2_react-redux@7.2.6+react@17.0.2 boring-avatars: 1.5.8 - i18next: 21.5.3 + i18next: 21.5.5 i18next-browser-languagedetector: 6.1.2 + mapbox-gl: 2.6.1 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 react-file-icon: 1.1.0_react-dom@17.0.2+react@17.0.2 - react-hook-form: 7.20.4_react@17.0.2 - react-i18next: 11.14.3_i18next@21.5.3+react@17.0.2 + react-hook-form: 7.21.0_react@17.0.2 + react-i18next: 11.14.3_i18next@21.5.5+react@17.0.2 react-icons: 4.3.1_react@17.0.2 react-json-pretty: 2.2.0_react-dom@17.0.2+react@17.0.2 react-qr-code: 2.0.3_react@17.0.2 react-redux: 7.2.6_react-dom@17.0.2+react@17.0.2 rfc4648: 1.5.0 - swr: 1.0.1_react@17.0.2 + swr: 1.1.0_react@17.0.2 timeago-react: 3.0.4_react@17.0.2 type-route: 0.6.0 use-breakpoint: 3.0.0_react-dom@17.0.2+react@17.0.2 devDependencies: + '@types/mapbox-gl': 2.6.0 '@types/react': 17.0.37 '@types/react-dom': 17.0.11 '@types/react-file-icon': 1.0.1 '@types/w3c-web-serial': 1.0.2 '@types/web-bluetooth': 0.0.11 - '@typescript-eslint/eslint-plugin': 5.4.0_5c8ff4cecd5a55e744866c0654edac32 - '@typescript-eslint/parser': 5.4.0_eslint@8.3.0+typescript@4.5.2 + '@typescript-eslint/eslint-plugin': 5.6.0_16d83f5c41c3abb1061a82b07c18e4f3 + '@typescript-eslint/parser': 5.6.0_eslint@8.4.1+typescript@4.5.2 '@verypossible/eslint-config': 1.6.1_typescript@4.5.2 - '@vitejs/plugin-react': 1.1.0 + '@vitejs/plugin-react': 1.1.1 autoprefixer: 10.4.0_postcss@8.4.4 babel-plugin-module-resolver: 4.1.0 - eslint: 8.3.0 - eslint-config-prettier: 8.3.0_eslint@8.3.0 + eslint: 8.4.1 + eslint-config-prettier: 8.3.0_eslint@8.4.1 eslint-import-resolver-alias: 1.1.2_eslint-plugin-import@2.25.3 eslint-import-resolver-babel-module: 5.3.1_e51044130ac762fd207a8cd2109b5344 - eslint-import-resolver-typescript: 2.5.0_a32f4f7b9ceb1e357b5ea9f682f0210a - eslint-plugin-import: 2.25.3_eslint@8.3.0 - eslint-plugin-react: 7.27.1_eslint@8.3.0 - eslint-plugin-react-hooks: 4.3.0_eslint@8.3.0 + eslint-import-resolver-typescript: 2.5.0_581d2b6245defd0595f2dd29dbf58da2 + eslint-plugin-import: 2.25.3_eslint@8.4.1 + eslint-plugin-react: 7.27.1_eslint@8.4.1 + eslint-plugin-react-hooks: 4.3.0_eslint@8.4.1 gzipper: 6.0.0 postcss: 8.4.4 - prettier: 2.5.0 + prettier: 2.5.1 tailwindcss: 3.0.0-alpha.2_6b4e3d148bdcb715d5f821ed0a9c268b tar: 6.1.11 typescript: 4.5.2 - vite: 2.6.14 - vite-plugin-pwa: 0.11.7_vite@2.6.14 - workbox-window: 6.4.1 + vite: 2.7.0 + vite-plugin-cdn-import: 0.3.5 + vite-plugin-pwa: 0.11.10_vite@2.7.0 + workbox-window: 6.4.2 packages: - /@apideck/better-ajv-errors/0.2.7_ajv@8.8.2: - resolution: {integrity: sha512-J2dW+EHYudbwI7MGovcHWLBrxasl21uuroc2zT8bH2RxYuv2g5GqsO5jcKUZz4LaMST45xhKjVuyRYkhcWyMhA==} + /@apideck/better-ajv-errors/0.3.1_ajv@8.8.2: + resolution: {integrity: sha512-6RMV31esAxqlDIvVCG/CJxY/s8dFNVOI5w8RWIfDMhjg/iwqnawko9tJXau/leqC4+T1Bu8et99QVWCwU5wk+g==} engines: {node: '>=10'} peerDependencies: ajv: '>=8' dependencies: ajv: 8.8.2 - json-schema: 0.3.0 + json-schema: 0.4.0 jsonpointer: 5.0.0 leven: 3.1.0 dev: true @@ -1229,7 +1235,7 @@ packages: babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.0 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.0 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.0 - core-js-compat: 3.19.1 + core-js-compat: 3.19.3 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -1305,13 +1311,13 @@ packages: - supports-color dev: true - /@eslint/eslintrc/1.0.4: - resolution: {integrity: sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==} + /@eslint/eslintrc/1.0.5: + resolution: {integrity: sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.3 - espree: 9.1.0 + espree: 9.2.0 globals: 13.12.0 ignore: 4.0.6 import-fresh: 3.3.0 @@ -1344,8 +1350,8 @@ packages: - supports-color dev: true - /@humanwhocodes/config-array/0.6.0: - resolution: {integrity: sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==} + /@humanwhocodes/config-array/0.9.2: + resolution: {integrity: sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -1359,10 +1365,54 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@meshtastic/meshtasticjs/0.6.31: - resolution: {integrity: sha512-MV4Pav7ob0/GSRsJViv3MfOhVroqm0tNkzCIA1Cvjj/PnSSqet8bdyMdFO2iCxuvnf1wE5hJ3rZoQ0+wfmaXaA==} + /@mapbox/geojson-rewind/0.5.1: + resolution: {integrity: sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==} + hasBin: true + dependencies: + get-stream: 6.0.1 + minimist: 1.2.5 + dev: false + + /@mapbox/geojson-types/1.0.2: + resolution: {integrity: sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==} + dev: false + + /@mapbox/jsonlint-lines-primitives/2.0.2: + resolution: {integrity: sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=} + engines: {node: '>= 0.6'} + dev: false + + /@mapbox/mapbox-gl-supported/2.0.1: + resolution: {integrity: sha512-HP6XvfNIzfoMVfyGjBckjiAOQK9WfX0ywdLubuPMPv+Vqf5fj0uCbgBQYpiqcWZT6cbyyRnTSXDheT1ugvF6UQ==} + dev: false + + /@mapbox/point-geometry/0.1.0: + resolution: {integrity: sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI=} + dev: false + + /@mapbox/tiny-sdf/2.0.4: + resolution: {integrity: sha512-CBtL2rhZiYmdIryksp0zh4Mmx54iClYfNb0mpYeHrZnq4z84lVjre7LBWGPEjWspEn6AiF0lxC1HaZDye89m3g==} + dev: false + + /@mapbox/unitbezier/0.0.0: + resolution: {integrity: sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4=} + dev: false + + /@mapbox/vector-tile/1.3.1: + resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + dependencies: + '@mapbox/point-geometry': 0.1.0 + dev: false + + /@mapbox/whoots-js/3.1.0: + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + dev: false + + /@meshtastic/meshtasticjs/0.6.32: + resolution: {integrity: sha512-w2vHIejJ60YPHuWvpuJcSlhcTAzg8R2mTWkMeg+94UOeG13CEPy9KFBCdhtGABVGKhcFlO98ni92qErVH5Ak+g==} dependencies: - '@protobuf-ts/runtime': 2.0.7 + '@protobuf-ts/runtime': 2.1.0 sub-events: 1.8.9 dev: false @@ -1387,8 +1437,8 @@ packages: fastq: 1.13.0 dev: true - /@protobuf-ts/runtime/2.0.7: - resolution: {integrity: sha512-jT8FYEX7NkAzxZXVjshIhtCV/ReuZm/3sCH0GWnaa8woy9VG+He0N+dpj2svaJbkdUThSxJE3zwmJcH0/3vEsw==} + /@protobuf-ts/runtime/2.1.0: + resolution: {integrity: sha512-HZwkgJW9SGiE9+0lWKr1X997tmG01/40j+hr9yBVk+hTQcm7Hsf77XhMNtsDjWUOcspG6GBXu8o3g4i3kD5/zQ==} dev: false /@reduxjs/toolkit/1.6.2_react-redux@7.2.6+react@17.0.2: @@ -1410,7 +1460,7 @@ packages: reselect: 4.1.5 dev: false - /@rollup/plugin-babel/5.3.0_@babel+core@7.16.0+rollup@2.60.1: + /@rollup/plugin-babel/5.3.0_@babel+core@7.16.0+rollup@2.60.2: resolution: {integrity: sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -1423,36 +1473,36 @@ packages: dependencies: '@babel/core': 7.16.0 '@babel/helper-module-imports': 7.16.0 - '@rollup/pluginutils': 3.1.0_rollup@2.60.1 - rollup: 2.60.1 + '@rollup/pluginutils': 3.1.0_rollup@2.60.2 + rollup: 2.60.2 dev: true - /@rollup/plugin-node-resolve/11.2.1_rollup@2.60.1: + /@rollup/plugin-node-resolve/11.2.1_rollup@2.60.2: resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} engines: {node: '>= 10.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.60.1 + '@rollup/pluginutils': 3.1.0_rollup@2.60.2 '@types/resolve': 1.17.1 builtin-modules: 3.2.0 deepmerge: 4.2.2 is-module: 1.0.0 resolve: 1.20.0 - rollup: 2.60.1 + rollup: 2.60.2 dev: true - /@rollup/plugin-replace/2.4.2_rollup@2.60.1: + /@rollup/plugin-replace/2.4.2_rollup@2.60.2: resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.60.1 + '@rollup/pluginutils': 3.1.0_rollup@2.60.2 magic-string: 0.25.7 - rollup: 2.60.1 + rollup: 2.60.2 dev: true - /@rollup/pluginutils/3.1.0_rollup@2.60.1: + /@rollup/pluginutils/3.1.0_rollup@2.60.2: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: @@ -1461,7 +1511,7 @@ packages: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.0 - rollup: 2.60.1 + rollup: 2.60.2 dev: true /@rollup/pluginutils/4.1.1: @@ -1485,6 +1535,14 @@ packages: resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} dev: true + /@types/estree/0.0.50: + resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==} + dev: true + + /@types/geojson/7946.0.8: + resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==} + dev: true + /@types/hoist-non-react-statics/3.3.1: resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} dependencies: @@ -1500,8 +1558,14 @@ packages: resolution: {integrity: sha1-7ihweulOEdK4J7y+UnC86n8+ce4=} dev: true - /@types/node/16.11.10: - resolution: {integrity: sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==} + /@types/mapbox-gl/2.6.0: + resolution: {integrity: sha512-lHdITzC0IVn9+Pq6WFkkK0N6rUKIqxsdrNeixiQdvROFn2Aeu3TDvhpuag1IdengL5WGGRuEhK6m6HB916ReLw==} + dependencies: + '@types/geojson': 7946.0.8 + dev: true + + /@types/node/16.11.12: + resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==} dev: true /@types/parse-json/4.0.0: @@ -1542,7 +1606,7 @@ packages: /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 16.11.10 + '@types/node': 16.11.12 dev: true /@types/scheduler/0.16.2: @@ -1586,8 +1650,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.4.0_5c8ff4cecd5a55e744866c0654edac32: - resolution: {integrity: sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==} + /@typescript-eslint/eslint-plugin/5.6.0_16d83f5c41c3abb1061a82b07c18e4f3: + resolution: {integrity: sha512-MIbeMy5qfLqtgs1hWd088k1hOuRsN9JrHUPwVVKCD99EOUqScd7SrwoZl4Gso05EAP9w1kvLWUVGJOVpRPkDPA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -1597,11 +1661,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 5.4.0_eslint@8.3.0+typescript@4.5.2 - '@typescript-eslint/parser': 5.4.0_eslint@8.3.0+typescript@4.5.2 - '@typescript-eslint/scope-manager': 5.4.0 + '@typescript-eslint/experimental-utils': 5.6.0_eslint@8.4.1+typescript@4.5.2 + '@typescript-eslint/parser': 5.6.0_eslint@8.4.1+typescript@4.5.2 + '@typescript-eslint/scope-manager': 5.6.0 debug: 4.3.3 - eslint: 8.3.0 + eslint: 8.4.1 functional-red-black-tree: 1.0.1 ignore: 5.1.9 regexpp: 3.2.0 @@ -1630,19 +1694,19 @@ packages: - typescript dev: true - /@typescript-eslint/experimental-utils/5.4.0_eslint@8.3.0+typescript@4.5.2: - resolution: {integrity: sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==} + /@typescript-eslint/experimental-utils/5.6.0_eslint@8.4.1+typescript@4.5.2: + resolution: {integrity: sha512-VDoRf3Qj7+W3sS/ZBXZh3LBzp0snDLEgvp6qj0vOAIiAPM07bd5ojQ3CTzF/QFl5AKh7Bh1ycgj6lFBJHUt/DA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' dependencies: '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 5.4.0 - '@typescript-eslint/types': 5.4.0 - '@typescript-eslint/typescript-estree': 5.4.0_typescript@4.5.2 - eslint: 8.3.0 + '@typescript-eslint/scope-manager': 5.6.0 + '@typescript-eslint/types': 5.6.0 + '@typescript-eslint/typescript-estree': 5.6.0_typescript@4.5.2 + eslint: 8.4.1 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.3.0 + eslint-utils: 3.0.0_eslint@8.4.1 transitivePeerDependencies: - supports-color - typescript @@ -1668,8 +1732,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.4.0_eslint@8.3.0+typescript@4.5.2: - resolution: {integrity: sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==} + /@typescript-eslint/parser/5.6.0_eslint@8.4.1+typescript@4.5.2: + resolution: {integrity: sha512-YVK49NgdUPQ8SpCZaOpiq1kLkYRPMv9U5gcMrywzI8brtwZjr/tG3sZpuHyODt76W/A0SufNjYt9ZOgrC4tLIQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1678,11 +1742,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.4.0 - '@typescript-eslint/types': 5.4.0 - '@typescript-eslint/typescript-estree': 5.4.0_typescript@4.5.2 + '@typescript-eslint/scope-manager': 5.6.0 + '@typescript-eslint/types': 5.6.0 + '@typescript-eslint/typescript-estree': 5.6.0_typescript@4.5.2 debug: 4.3.3 - eslint: 8.3.0 + eslint: 8.4.1 typescript: 4.5.2 transitivePeerDependencies: - supports-color @@ -1696,12 +1760,12 @@ packages: '@typescript-eslint/visitor-keys': 4.33.0 dev: true - /@typescript-eslint/scope-manager/5.4.0: - resolution: {integrity: sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==} + /@typescript-eslint/scope-manager/5.6.0: + resolution: {integrity: sha512-1U1G77Hw2jsGWVsO2w6eVCbOg0HZ5WxL/cozVSTfqnL/eB9muhb8THsP0G3w+BB5xAHv9KptwdfYFAUfzcIh4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.4.0 - '@typescript-eslint/visitor-keys': 5.4.0 + '@typescript-eslint/types': 5.6.0 + '@typescript-eslint/visitor-keys': 5.6.0 dev: true /@typescript-eslint/types/4.33.0: @@ -1709,8 +1773,8 @@ packages: engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true - /@typescript-eslint/types/5.4.0: - resolution: {integrity: sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==} + /@typescript-eslint/types/5.6.0: + resolution: {integrity: sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -1735,8 +1799,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.4.0_typescript@4.5.2: - resolution: {integrity: sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==} + /@typescript-eslint/typescript-estree/5.6.0_typescript@4.5.2: + resolution: {integrity: sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -1744,8 +1808,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.4.0 - '@typescript-eslint/visitor-keys': 5.4.0 + '@typescript-eslint/types': 5.6.0 + '@typescript-eslint/visitor-keys': 5.6.0 debug: 4.3.3 globby: 11.0.4 is-glob: 4.0.3 @@ -1764,11 +1828,11 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /@typescript-eslint/visitor-keys/5.4.0: - resolution: {integrity: sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==} + /@typescript-eslint/visitor-keys/5.6.0: + resolution: {integrity: sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.4.0 + '@typescript-eslint/types': 5.6.0 eslint-visitor-keys: 3.1.0 dev: true @@ -1785,15 +1849,15 @@ packages: eslint-plugin-import: 2.25.3_eslint@7.32.0 eslint-plugin-react: 7.27.1_eslint@7.32.0 eslint-plugin-react-hooks: 4.3.0_eslint@7.32.0 - prettier: 2.5.0 + prettier: 2.5.1 transitivePeerDependencies: - '@babel/core' - supports-color - typescript dev: true - /@vitejs/plugin-react/1.1.0: - resolution: {integrity: sha512-hRAqG6/lYf0mfDm/1r0U81vwPWMpyi87e4bFK+LvVQQeIgdh6TwvfuF20waenSGSumz6JH2bfk9DbxdgDLRp/w==} + /@vitejs/plugin-react/1.1.1: + resolution: {integrity: sha512-IJSRD4culdwQ6cRK0D1mstV1vdvYSb2HK1JQ1FDo6Hr7j5ppWJEwBC2v/Gy0h/A1lMmi4AnXACY/d10EgbQNEA==} engines: {node: '>=12.0.0'} dependencies: '@babel/core': 7.16.0 @@ -1969,12 +2033,12 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.18.1 - caniuse-lite: 1.0.30001283 + caniuse-lite: 1.0.30001285 fraction.js: 4.1.2 normalize-range: 0.1.2 picocolors: 1.0.0 postcss: 8.4.4 - postcss-value-parser: 4.1.0 + postcss-value-parser: 4.2.0 dev: true /available-typed-arrays/1.0.5: @@ -2019,7 +2083,7 @@ packages: dependencies: '@babel/core': 7.16.0 '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.0 - core-js-compat: 3.19.1 + core-js-compat: 3.19.3 transitivePeerDependencies: - supports-color dev: true @@ -2067,8 +2131,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001283 - electron-to-chromium: 1.4.4 + caniuse-lite: 1.0.30001285 + electron-to-chromium: 1.4.12 escalade: 3.1.1 node-releases: 2.0.1 picocolors: 1.0.0 @@ -2100,8 +2164,8 @@ packages: engines: {node: '>= 6'} dev: true - /caniuse-lite/1.0.30001283: - resolution: {integrity: sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==} + /caniuse-lite/1.0.30001285: + resolution: {integrity: sha512-KAOkuUtcQ901MtmvxfKD+ODHH9YVDYnBt+TGYSz2KIfnq22CiArbUxXPN9067gNbgMlnNYRSwho8OPXZPALB9Q==} dev: true /chalk/2.4.2: @@ -2186,8 +2250,8 @@ packages: safe-buffer: 5.1.2 dev: true - /core-js-compat/3.19.1: - resolution: {integrity: sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==} + /core-js-compat/3.19.3: + resolution: {integrity: sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA==} dependencies: browserslist: 4.18.1 semver: 7.0.0 @@ -2218,6 +2282,10 @@ packages: engines: {node: '>=8'} dev: true + /csscolorparser/1.0.3: + resolution: {integrity: sha1-s085HupNqPPpgjHizNjfnAQfFxs=} + dev: false + /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2291,11 +2359,6 @@ packages: resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} dev: true - /dequal/2.0.2: - resolution: {integrity: sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==} - engines: {node: '>=6'} - dev: false - /detective/5.2.0: resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} engines: {node: '>=0.8.0'} @@ -2335,6 +2398,10 @@ packages: esutils: 2.0.3 dev: true + /earcut/2.2.3: + resolution: {integrity: sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==} + dev: false + /ejs/3.1.6: resolution: {integrity: sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==} engines: {node: '>=0.10.0'} @@ -2343,8 +2410,8 @@ packages: jake: 10.8.2 dev: true - /electron-to-chromium/1.4.4: - resolution: {integrity: sha512-teHtgwcmVcL46jlFvAaqjyiTLWuMrUQO1JqV303JKB4ysXG6m8fXSFhbjal9st0r9mNskI22AraJZorb1VcLVg==} + /electron-to-chromium/1.4.12: + resolution: {integrity: sha512-zjfhG9Us/hIy8AlQ5OzfbR/C4aBv1Dg/ak4GX35CELYlJ4tDAtoEcQivXvyBdqdNQ+R6PhlgQqV8UNPJmhkJog==} dev: true /emoji-regex/8.0.0: @@ -2382,7 +2449,7 @@ packages: is-shared-array-buffer: 1.0.1 is-string: 1.0.7 is-weakref: 1.0.1 - object-inspect: 1.11.0 + object-inspect: 1.11.1 object-keys: 1.1.1 object.assign: 4.1.2 string.prototype.trimend: 1.0.4 @@ -2596,13 +2663,13 @@ packages: eslint: 7.32.0 dev: true - /eslint-config-prettier/8.3.0_eslint@8.3.0: + /eslint-config-prettier/8.3.0_eslint@8.4.1: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.3.0 + eslint: 8.4.1 dev: true /eslint-import-resolver-alias/1.1.2_eslint-plugin-import@2.25.3: @@ -2611,7 +2678,7 @@ packages: peerDependencies: eslint-plugin-import: '>=1.4.0' dependencies: - eslint-plugin-import: 2.25.3_eslint@8.3.0 + eslint-plugin-import: 2.25.3_eslint@8.4.1 dev: true /eslint-import-resolver-babel-module/5.3.1_e51044130ac762fd207a8cd2109b5344: @@ -2633,7 +2700,7 @@ packages: resolve: 1.20.0 dev: true - /eslint-import-resolver-typescript/2.5.0_a32f4f7b9ceb1e357b5ea9f682f0210a: + /eslint-import-resolver-typescript/2.5.0_581d2b6245defd0595f2dd29dbf58da2: resolution: {integrity: sha512-qZ6e5CFr+I7K4VVhQu3M/9xGv9/YmwsEXrsm3nimw8vWaVHRDrQRp26BgCypTxBp3vUp4o5aVEJRiy0F2DFddQ==} engines: {node: '>=4'} peerDependencies: @@ -2641,8 +2708,8 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.3 - eslint: 8.3.0 - eslint-plugin-import: 2.25.3_eslint@8.3.0 + eslint: 8.4.1 + eslint-plugin-import: 2.25.3_eslint@8.4.1 glob: 7.2.0 is-glob: 4.0.3 resolve: 1.20.0 @@ -2700,7 +2767,7 @@ packages: tsconfig-paths: 3.12.0 dev: true - /eslint-plugin-import/2.25.3_eslint@8.3.0: + /eslint-plugin-import/2.25.3_eslint@8.4.1: resolution: {integrity: sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==} engines: {node: '>=4'} peerDependencies: @@ -2710,7 +2777,7 @@ packages: array.prototype.flat: 1.2.5 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.3.0 + eslint: 8.4.1 eslint-import-resolver-node: 0.3.6 eslint-module-utils: 2.7.1 has: 1.0.3 @@ -2731,13 +2798,13 @@ packages: eslint: 7.32.0 dev: true - /eslint-plugin-react-hooks/4.3.0_eslint@8.3.0: + /eslint-plugin-react-hooks/4.3.0_eslint@8.4.1: resolution: {integrity: sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.3.0 + eslint: 8.4.1 dev: true /eslint-plugin-react/7.27.1_eslint@7.32.0: @@ -2763,7 +2830,7 @@ packages: string.prototype.matchall: 4.0.6 dev: true - /eslint-plugin-react/7.27.1_eslint@8.3.0: + /eslint-plugin-react/7.27.1_eslint@8.4.1: resolution: {integrity: sha512-meyunDjMMYeWr/4EBLTV1op3iSG3mjT/pz5gti38UzfM4OPpNc2m0t2xvKCOMU5D6FSdd34BIMFOvQbW+i8GAA==} engines: {node: '>=4'} peerDependencies: @@ -2772,7 +2839,7 @@ packages: array-includes: 3.1.4 array.prototype.flatmap: 1.2.5 doctrine: 2.1.0 - eslint: 8.3.0 + eslint: 8.4.1 estraverse: 5.3.0 jsx-ast-utils: 3.2.1 minimatch: 3.0.4 @@ -2819,13 +2886,13 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-utils/3.0.0_eslint@8.3.0: + /eslint-utils/3.0.0_eslint@8.4.1: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.3.0 + eslint: 8.4.1 eslint-visitor-keys: 2.1.0 dev: true @@ -2886,20 +2953,20 @@ packages: semver: 7.3.5 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 - table: 6.7.3 + table: 6.7.5 text-table: 0.2.0 v8-compile-cache: 2.3.0 transitivePeerDependencies: - supports-color dev: true - /eslint/8.3.0: - resolution: {integrity: sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==} + /eslint/8.4.1: + resolution: {integrity: sha512-TxU/p7LB1KxQ6+7aztTnO7K0i+h0tDi81YRY9VzB6Id71kNz+fFYnf5HD5UOQmxkzcoa0TlVZf9dpMtUv0GpWg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.0.4 - '@humanwhocodes/config-array': 0.6.0 + '@eslint/eslintrc': 1.0.5 + '@humanwhocodes/config-array': 0.9.2 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -2908,9 +2975,9 @@ packages: enquirer: 2.3.6 escape-string-regexp: 4.0.0 eslint-scope: 7.1.0 - eslint-utils: 3.0.0_eslint@8.3.0 + eslint-utils: 3.0.0_eslint@8.4.1 eslint-visitor-keys: 3.1.0 - espree: 9.1.0 + espree: 9.2.0 esquery: 1.4.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -2949,8 +3016,8 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /espree/9.1.0: - resolution: {integrity: sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==} + /espree/9.2.0: + resolution: {integrity: sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.6.0 @@ -3117,6 +3184,7 @@ packages: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + requiresBuild: true dev: true optional: true @@ -3133,6 +3201,10 @@ packages: engines: {node: '>=6.9.0'} dev: true + /geojson-vt/3.2.1: + resolution: {integrity: sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==} + dev: false + /get-intrinsic/1.1.1: resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} dependencies: @@ -3145,6 +3217,11 @@ packages: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} dev: true + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -3153,6 +3230,10 @@ packages: get-intrinsic: 1.1.1 dev: true + /gl-matrix/3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + dev: false + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3206,6 +3287,10 @@ packages: resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} dev: true + /grid-index/1.1.0: + resolution: {integrity: sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==} + dev: false + /gzipper/6.0.0: resolution: {integrity: sha512-48rB8e5boI2cGjti7nscwN13/bdFEqV+8IUciVacy6akGOq3mGJySf2gXLqpoYGyHUwmP0JFsSPciXC6uolb8A==} engines: {node: '>=12'} @@ -3273,8 +3358,8 @@ packages: '@babel/runtime': 7.16.3 dev: false - /i18next/21.5.3: - resolution: {integrity: sha512-9R8127a0/N5okiD7eeo6XBPQsHgHsLr1GdQEa35Pcw305ArC9KZDLs9kbgdn3xuVUNYlVu8+gWzz73eVkna0gA==} + /i18next/21.5.5: + resolution: {integrity: sha512-CPXa0o5AhpRjoz0DxKfDxwkH+oPAHRkaWbHwPLF16pYWsKij8FFR1/b0gj4l1UzACOwlFTEwpNhzzf1PuRhetg==} dependencies: '@babel/runtime': 7.16.3 dev: false @@ -3283,6 +3368,10 @@ packages: resolution: {integrity: sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw==} dev: true + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} @@ -3442,6 +3531,12 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-reference/1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 0.0.50 + dev: true + /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3529,7 +3624,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.11.10 + '@types/node': 16.11.12 merge-stream: 2.0.0 supports-color: 7.2.0 dev: true @@ -3575,8 +3670,8 @@ packages: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} dev: true - /json-schema/0.3.0: - resolution: {integrity: sha512-TYfxx36xfl52Rf1LU9HyWSLGPdYLL+SQ8/E/0yVyKG8wCCDaSrhPap0vEdlsZWRaS6tnKKLPGiEJGiREVC8kxQ==} + /json-schema/0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} dev: true /json-stable-stringify-without-jsonify/1.0.1: @@ -3624,6 +3719,10 @@ packages: object.assign: 4.1.2 dev: true + /kdbush/3.0.0: + resolution: {integrity: sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==} + dev: false + /leven/3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -3705,6 +3804,34 @@ packages: sourcemap-codec: 1.4.8 dev: true + /mapbox-gl/2.6.1: + resolution: {integrity: sha512-faGbSZfcFuZ4GWwkWnJrRD3oICZAt/mVKnGuOmeBobCj9onfTRz270qSoOXeRBKd3po5VA2cCPI91YwA8DsAoQ==} + dependencies: + '@mapbox/geojson-rewind': 0.5.1 + '@mapbox/geojson-types': 1.0.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/mapbox-gl-supported': 2.0.1 + '@mapbox/point-geometry': 0.1.0 + '@mapbox/tiny-sdf': 2.0.4 + '@mapbox/unitbezier': 0.0.0 + '@mapbox/vector-tile': 1.3.1 + '@mapbox/whoots-js': 3.1.0 + csscolorparser: 1.0.3 + earcut: 2.2.3 + geojson-vt: 3.2.1 + gl-matrix: 3.4.3 + grid-index: 1.1.0 + minimist: 1.2.5 + murmurhash-js: 1.0.0 + pbf: 3.2.1 + potpack: 1.0.2 + quickselect: 2.0.0 + rw: 1.3.3 + supercluster: 7.1.4 + tinyqueue: 2.0.3 + vt-pbf: 3.1.3 + dev: false + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -3730,7 +3857,6 @@ packages: /minimist/1.2.5: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} - dev: true /minipass/3.1.5: resolution: {integrity: sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==} @@ -3765,6 +3891,10 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true + /murmurhash-js/1.0.0: + resolution: {integrity: sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=} + dev: false + /nanoid/3.1.30: resolution: {integrity: sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3798,8 +3928,8 @@ packages: engines: {node: '>= 6'} dev: true - /object-inspect/1.11.0: - resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} + /object-inspect/1.11.1: + resolution: {integrity: sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA==} dev: true /object-is/1.1.5: @@ -3956,6 +4086,14 @@ packages: engines: {node: '>=8'} dev: true + /pbf/3.2.1: + resolution: {integrity: sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==} + hasBin: true + dependencies: + ieee754: 1.2.1 + resolve-protobuf-schema: 2.1.0 + dev: false + /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -4019,8 +4157,8 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss-value-parser/4.1.0: - resolution: {integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==} + /postcss-value-parser/4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true /postcss/8.4.4: @@ -4032,13 +4170,17 @@ packages: source-map-js: 1.0.1 dev: true + /potpack/1.0.2: + resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} + dev: false + /prelude-ls/1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /prettier/2.5.0: - resolution: {integrity: sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==} + /prettier/2.5.1: + resolution: {integrity: sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -4060,6 +4202,10 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /protocol-buffers-schema/3.6.0: + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} + dev: false + /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -4078,6 +4224,10 @@ packages: engines: {node: '>=10'} dev: true + /quickselect/2.0.0: + resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} + dev: false + /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -4108,8 +4258,8 @@ packages: tinycolor2: 1.4.2 dev: false - /react-hook-form/7.20.4_react@17.0.2: - resolution: {integrity: sha512-Nvy6TnNMlBoR+qS8FpA8lrqtGJ4uoi/MRYEgMEdBMY0HwHVuC7wB1sk6wTjg7FjOUt7QqMAP2W/vOhTWbKrtkQ==} + /react-hook-form/7.21.0_react@17.0.2: + resolution: {integrity: sha512-aekCf+dedYFIg+7nCK2acMvZ+s6Ohw2I7UNQ+zNIadBl1SoXow2Tl6c3F49xF8GFCdn5jeK43JHH26rmtdRyLQ==} engines: {node: '>=12.0'} peerDependencies: react: ^16.8.0 || ^17 @@ -4117,7 +4267,7 @@ packages: react: 17.0.2 dev: false - /react-i18next/11.14.3_i18next@21.5.3+react@17.0.2: + /react-i18next/11.14.3_i18next@21.5.5+react@17.0.2: resolution: {integrity: sha512-Hf2aanbKgYxPjG8ZdKr+PBz9sY6sxXuZWizxCYyJD2YzvJ0W9JTQcddVEjDaKyBoCyd3+5HTerdhc9ehFugc6g==} peerDependencies: i18next: '>= 19.0.0' @@ -4125,7 +4275,7 @@ packages: dependencies: '@babel/runtime': 7.16.3 html-parse-stringify: 3.0.1 - i18next: 21.5.3 + i18next: 21.5.5 react: 17.0.2 dev: false @@ -4296,6 +4446,12 @@ packages: engines: {node: '>=8'} dev: true + /resolve-protobuf-schema/2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + dependencies: + protocol-buffers-schema: 3.6.0 + dev: false + /resolve/1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: @@ -4326,22 +4482,33 @@ packages: glob: 7.2.0 dev: true - /rollup-plugin-terser/7.0.2_rollup@2.60.1: + /rollup-plugin-external-globals/0.6.1: + resolution: {integrity: sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA==} + peerDependencies: + rollup: ^2.25.0 + dependencies: + '@rollup/pluginutils': 4.1.1 + estree-walker: 2.0.2 + is-reference: 1.2.1 + magic-string: 0.25.7 + dev: true + + /rollup-plugin-terser/7.0.2_rollup@2.60.2: resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} peerDependencies: rollup: ^2.0.0 dependencies: '@babel/code-frame': 7.16.0 jest-worker: 26.6.2 - rollup: 2.60.1 + rollup: 2.60.2 serialize-javascript: 4.0.0 terser: 5.10.0 transitivePeerDependencies: - acorn dev: true - /rollup/2.60.1: - resolution: {integrity: sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==} + /rollup/2.60.2: + resolution: {integrity: sha512-1Bgjpq61sPjgoZzuiDSGvbI1tD91giZABgjCQBKM5aYLnzjq52GoDuWVwT/cm/MCxCMPU8gqQvkj8doQ5C8Oqw==} engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: @@ -4354,6 +4521,10 @@ packages: queue-microtask: 1.2.3 dev: true + /rw/1.3.3: + resolution: {integrity: sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=} + dev: false + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true @@ -4410,7 +4581,7 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.1 - object-inspect: 1.11.0 + object-inspect: 1.11.1 dev: true /slash/3.0.0: @@ -4545,6 +4716,12 @@ packages: engines: {node: '>=10.0.0'} dev: false + /supercluster/7.1.4: + resolution: {integrity: sha512-GhKkRM1jMR6WUwGPw05fs66pOFWhf59lXq+Q3J3SxPvhNcmgOtLRV6aVQPMRsmXdpaeFJGivt+t7QXUPL3ff4g==} + dependencies: + kdbush: 3.0.0 + dev: false + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -4559,17 +4736,16 @@ packages: has-flag: 4.0.0 dev: true - /swr/1.0.1_react@17.0.2: - resolution: {integrity: sha512-EPQAxSjoD4IaM49rpRHK0q+/NzcwoT8c0/Ylu/u3/6mFj/CWnQVjNJ0MV2Iuw/U+EJSd2TX5czdAwKPYZIG0YA==} + /swr/1.1.0_react@17.0.2: + resolution: {integrity: sha512-MFL3mkl752Uap81nLA1tEu7vQmikPamSziW+6dBidYKAo4oLOlUx/x5GZy4ZCkCwfZe2uedylkz1UMGnatUX4g==} peerDependencies: - react: ^16.11.0 || ^17.0.0 + react: ^16.11.0 || ^17.0.0 || ^18.0.0 dependencies: - dequal: 2.0.2 react: 17.0.2 dev: false - /table/6.7.3: - resolution: {integrity: sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==} + /table/6.7.5: + resolution: {integrity: sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==} engines: {node: '>=10.0.0'} dependencies: ajv: 8.8.2 @@ -4606,7 +4782,7 @@ packages: postcss-load-config: 3.1.0 postcss-nested: 5.0.6_postcss@8.4.4 postcss-selector-parser: 6.0.6 - postcss-value-parser: 4.1.0 + postcss-value-parser: 4.2.0 quick-lru: 5.1.1 resolve: 1.20.0 tmp: 0.2.1 @@ -4677,6 +4853,10 @@ packages: resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} dev: false + /tinyqueue/2.0.3: + resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==} + dev: false + /tmp/0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} @@ -4833,8 +5013,16 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true - /vite-plugin-pwa/0.11.7_vite@2.6.14: - resolution: {integrity: sha512-sU+VrUNVP87E79GCCBTusdoiqja3Qapsrp48+xFDf28zaeNZ2nuuCoCIPshmyusGuY0I51wRFxiBjcbdheEBSw==} + /vite-plugin-cdn-import/0.3.5: + resolution: {integrity: sha512-e1raoalfBiIhv+hnMeSp1UNjloDDBhHpeFxkwRRdPBmTdDRqdEEn8owUmT5u8UBSVCs4xN3n/od4a91vXEhXPQ==} + dependencies: + rollup-plugin-external-globals: 0.6.1 + transitivePeerDependencies: + - rollup + dev: true + + /vite-plugin-pwa/0.11.10_vite@2.7.0: + resolution: {integrity: sha512-H2iIe6XVN8it0jkrpZcdmBaGarZxeA657y+9WeDKtxjRJmwIL8qixhiE9FZr0SFS2OHyzkumJvE7FOaemt1/SQ==} peerDependencies: vite: ^2.0.0 dependencies: @@ -4842,18 +5030,18 @@ packages: debug: 4.3.3 fast-glob: 3.2.7 pretty-bytes: 5.6.0 - rollup: 2.60.1 - vite: 2.6.14 - workbox-build: 6.4.1 - workbox-window: 6.4.1 + rollup: 2.60.2 + vite: 2.7.0 + workbox-build: 6.4.2 + workbox-window: 6.4.2 transitivePeerDependencies: - '@types/babel__core' - acorn - supports-color dev: true - /vite/2.6.14: - resolution: {integrity: sha512-2HA9xGyi+EhY2MXo0+A2dRsqsAG3eFNEVIo12olkWhOmc8LfiM+eMdrXf+Ruje9gdXgvSqjLI9freec1RUM5EA==} + /vite/2.7.0: + resolution: {integrity: sha512-ZM629j9n6f1Gcr2KsfpLhJ0FRkift4SsTLSvExmNpGJYzyi1JyLOFybz85ShqFP5f4oCfJSblWAma9X8lZg/vA==} engines: {node: '>=12.2.0'} hasBin: true peerDependencies: @@ -4871,7 +5059,7 @@ packages: esbuild: 0.13.15 postcss: 8.4.4 resolve: 1.20.0 - rollup: 2.60.1 + rollup: 2.60.2 optionalDependencies: fsevents: 2.3.2 dev: true @@ -4881,6 +5069,14 @@ packages: engines: {node: '>=0.10.0'} dev: false + /vt-pbf/3.1.3: + resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} + dependencies: + '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile': 1.3.1 + pbf: 3.2.1 + dev: false + /webidl-conversions/4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true @@ -4937,30 +5133,30 @@ packages: engines: {node: '>=0.10.0'} dev: true - /workbox-background-sync/6.4.1: - resolution: {integrity: sha512-GiDklRhDF/oJ+WJhb6jO00wA+fjOZlY4SomqpumXP6OXp1WodmKu7xv75hpum0Kx4Fh3MZrj+9Ae+dIYlq21dA==} + /workbox-background-sync/6.4.2: + resolution: {integrity: sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==} dependencies: idb: 6.1.5 - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-broadcast-update/6.4.1: - resolution: {integrity: sha512-oz1WAEppIatucgIc49zXPsyQG6004eoKsyiJVGDyN94LIFpUDfGa+cykN32X0PaqOC9bdlj+4EjVBi0OuwkIHA==} + /workbox-broadcast-update/6.4.2: + resolution: {integrity: sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==} dependencies: - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-build/6.4.1: - resolution: {integrity: sha512-cvH74tEO8SrziFrCntZ/35B0uaMZFKG+gnk3vZmKLSUTab/6MlhL+UwYXf1sMV5SD/W/v7pnFKZbdAOAg5Ne2w==} + /workbox-build/6.4.2: + resolution: {integrity: sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==} engines: {node: '>=10.0.0'} dependencies: - '@apideck/better-ajv-errors': 0.2.7_ajv@8.8.2 + '@apideck/better-ajv-errors': 0.3.1_ajv@8.8.2 '@babel/core': 7.16.0 '@babel/preset-env': 7.16.4_@babel+core@7.16.0 '@babel/runtime': 7.16.3 - '@rollup/plugin-babel': 5.3.0_@babel+core@7.16.0+rollup@2.60.1 - '@rollup/plugin-node-resolve': 11.2.1_rollup@2.60.1 - '@rollup/plugin-replace': 2.4.2_rollup@2.60.1 + '@rollup/plugin-babel': 5.3.0_@babel+core@7.16.0+rollup@2.60.2 + '@rollup/plugin-node-resolve': 11.2.1_rollup@2.60.2 + '@rollup/plugin-replace': 2.4.2_rollup@2.60.2 '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.8.2 common-tags: 1.8.2 @@ -4969,120 +5165,120 @@ packages: glob: 7.2.0 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: 2.60.1 - rollup-plugin-terser: 7.0.2_rollup@2.60.1 + rollup: 2.60.2 + rollup-plugin-terser: 7.0.2_rollup@2.60.2 source-map: 0.8.0-beta.0 source-map-url: 0.4.1 stringify-object: 3.3.0 strip-comments: 2.0.1 tempy: 0.6.0 upath: 1.2.0 - workbox-background-sync: 6.4.1 - workbox-broadcast-update: 6.4.1 - workbox-cacheable-response: 6.4.1 - workbox-core: 6.4.1 - workbox-expiration: 6.4.1 - workbox-google-analytics: 6.4.1 - workbox-navigation-preload: 6.4.1 - workbox-precaching: 6.4.1 - workbox-range-requests: 6.4.1 - workbox-recipes: 6.4.1 - workbox-routing: 6.4.1 - workbox-strategies: 6.4.1 - workbox-streams: 6.4.1 - workbox-sw: 6.4.1 - workbox-window: 6.4.1 + workbox-background-sync: 6.4.2 + workbox-broadcast-update: 6.4.2 + workbox-cacheable-response: 6.4.2 + workbox-core: 6.4.2 + workbox-expiration: 6.4.2 + workbox-google-analytics: 6.4.2 + workbox-navigation-preload: 6.4.2 + workbox-precaching: 6.4.2 + workbox-range-requests: 6.4.2 + workbox-recipes: 6.4.2 + workbox-routing: 6.4.2 + workbox-strategies: 6.4.2 + workbox-streams: 6.4.2 + workbox-sw: 6.4.2 + workbox-window: 6.4.2 transitivePeerDependencies: - '@types/babel__core' - acorn - supports-color dev: true - /workbox-cacheable-response/6.4.1: - resolution: {integrity: sha512-omXplP3miJhQwx+jfFnqO9xWgNc8CLG6EWRvTyc8R81cA/4zhqh87yj9UVH+fGUmuIXOUBPAuulSazXUsvKFWg==} + /workbox-cacheable-response/6.4.2: + resolution: {integrity: sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==} dependencies: - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-core/6.4.1: - resolution: {integrity: sha512-5hosqpSK+48jHlj+5EHN5dtH1Ade4fqTe4+xX3U9wWK1SDaXEqXpVxdHuBqYfg75UE1PUINA0rhMZWTqeGoLFg==} + /workbox-core/6.4.2: + resolution: {integrity: sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==} dev: true - /workbox-expiration/6.4.1: - resolution: {integrity: sha512-N912AGhi95vhf2vebE3wPhnGjnR+t5W4yALDY7Pl6bcuhySNbwkkp2RjQcBB+dxrdiX2rOvavvdcf/q1LSnEyg==} + /workbox-expiration/6.4.2: + resolution: {integrity: sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==} dependencies: idb: 6.1.5 - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-google-analytics/6.4.1: - resolution: {integrity: sha512-L1JQISg1CxMAlqw3HXpWB2gRYsmJ9F9OgC2/UNAZLyOJTFk1faZziPS4eXe+UaHevZ+Ma66Z2zfYxPUTr5znjQ==} + /workbox-google-analytics/6.4.2: + resolution: {integrity: sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==} dependencies: - workbox-background-sync: 6.4.1 - workbox-core: 6.4.1 - workbox-routing: 6.4.1 - workbox-strategies: 6.4.1 + workbox-background-sync: 6.4.2 + workbox-core: 6.4.2 + workbox-routing: 6.4.2 + workbox-strategies: 6.4.2 dev: true - /workbox-navigation-preload/6.4.1: - resolution: {integrity: sha512-npgZYoeaE+teQvpWqZLgJDJ6I3qxwqAfnSIa8yrNQ2sLR1A88uWGGsiRzfUsIdKjVCLPQVZ+clwb6XU1vyW9Lw==} + /workbox-navigation-preload/6.4.2: + resolution: {integrity: sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==} dependencies: - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-precaching/6.4.1: - resolution: {integrity: sha512-Sq8d+/wfcXFjwuVwKe2VxD4QddRBgkO6pJVgpHbk5WFynR8dc8Zj3BlJ38e4nMlRuBZ8996TIgAmk/U6Rr5YHQ==} + /workbox-precaching/6.4.2: + resolution: {integrity: sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==} dependencies: - workbox-core: 6.4.1 - workbox-routing: 6.4.1 - workbox-strategies: 6.4.1 + workbox-core: 6.4.2 + workbox-routing: 6.4.2 + workbox-strategies: 6.4.2 dev: true - /workbox-range-requests/6.4.1: - resolution: {integrity: sha512-X/asYHeuWIKg5Tk+dfmiEOo9hlkQ1K737dnENj8zL97kZDdcfokPT5CuXgM2xqX7NMoahONq1Eo2UoFfJNjZzg==} + /workbox-range-requests/6.4.2: + resolution: {integrity: sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==} dependencies: - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-recipes/6.4.1: - resolution: {integrity: sha512-Yu9tLmgD25NorZPO3FHJUii/Y2ghrx2jD2QKMaWBBplshw1MFokqlmr3Dz3O6NI8jBBUnK5Dtbl0+SCwVGSCqg==} + /workbox-recipes/6.4.2: + resolution: {integrity: sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==} dependencies: - workbox-cacheable-response: 6.4.1 - workbox-core: 6.4.1 - workbox-expiration: 6.4.1 - workbox-precaching: 6.4.1 - workbox-routing: 6.4.1 - workbox-strategies: 6.4.1 + workbox-cacheable-response: 6.4.2 + workbox-core: 6.4.2 + workbox-expiration: 6.4.2 + workbox-precaching: 6.4.2 + workbox-routing: 6.4.2 + workbox-strategies: 6.4.2 dev: true - /workbox-routing/6.4.1: - resolution: {integrity: sha512-FIy27mwM3WdDASOTMX10OZ8q3Un47ULeDtDrDAKfWYIP/oTF2xoA1/HtXpOjBlyg5VP/poPX5GDojXHXAXpfzQ==} + /workbox-routing/6.4.2: + resolution: {integrity: sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==} dependencies: - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-strategies/6.4.1: - resolution: {integrity: sha512-2UQ+7Siy4Z5QG2LebbVhDLmPG3M7bVo/tZqN4LNUGXS6fDlpbTTK6A3Hu0W8gCVwIX0tSg7U3mVhDntH4qt3Dg==} + /workbox-strategies/6.4.2: + resolution: {integrity: sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==} dependencies: - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true - /workbox-streams/6.4.1: - resolution: {integrity: sha512-0t3QKBml3Qi37JniDfEn0FfN4JRgMK6sEcjGxvmMGwlHAyKukZr0Gj58ax1o1KYGGJr72RDBK+YXI9Sk9cKifw==} + /workbox-streams/6.4.2: + resolution: {integrity: sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==} dependencies: - workbox-core: 6.4.1 - workbox-routing: 6.4.1 + workbox-core: 6.4.2 + workbox-routing: 6.4.2 dev: true - /workbox-sw/6.4.1: - resolution: {integrity: sha512-IJNYcNbjugMB9v+Yx7uswohjOaYoimw5dI0Gcaj2zrJHKjV0bom+BPRCdijmttN/3uVbX57jhNe8SMzWMj7fHw==} + /workbox-sw/6.4.2: + resolution: {integrity: sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==} dev: true - /workbox-window/6.4.1: - resolution: {integrity: sha512-v5G1U+NN0sHErvE9fzHRA75FrfRFj/0dihFnvno5yqHZZIb9G4U2AarodSDRBC3t6CsnLO68l1Bj1gsHqsM9Qw==} + /workbox-window/6.4.2: + resolution: {integrity: sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==} dependencies: '@types/trusted-types': 2.0.2 - workbox-core: 6.4.1 + workbox-core: 6.4.2 dev: true /wrappy/1.0.2: diff --git a/src/components/Map/index.tsx b/src/components/Map/index.tsx new file mode 100644 index 00000000..ea8b41fb --- /dev/null +++ b/src/components/Map/index.tsx @@ -0,0 +1,211 @@ +import 'mapbox-gl/dist/mapbox-gl.css'; + +import React from 'react'; + +import mapboxgl from 'mapbox-gl'; +import { renderToString } from 'react-dom/server'; +import { FaDirections, FaGlobeAfrica, FaMountain } from 'react-icons/fa'; +import { MdFullscreen, MdRadar, MdWbShade } from 'react-icons/md'; + +import { useAppSelector } from '@app/hooks/redux'; +import { IconButton } from '@components/generic/IconButton'; + +import { MapStyles } from './styles'; + +export const Map = (): JSX.Element => { + const darkMode = useAppSelector((state) => state.app.darkMode); + const nodes = useAppSelector((state) => state.meshtastic.nodes); + + mapboxgl.accessToken = + 'pk.eyJ1Ijoic2FjaGF3IiwiYSI6ImNrNW9meXozZjBsdW0zbHBjM2FnNnV6cmsifQ.3E4n8eFGD9ZOFo-XDVeZnQ'; + const mapDiv = React.useRef(null); + const [map, setMap] = React.useState(null as mapboxgl.Map | null); + const [exaggeration, setExaggeration] = React.useState(false); + const [shading, setShading] = React.useState(false); + const [maptype, setMaptype] = React.useState< + 'Streets' | 'Outdoors' | 'Satellite' | 'Default' + >('Default'); + + const PlaceNodes = (): void => { + nodes.map((node) => { + if (node.currentPosition && map) { + new mapboxgl.Marker({}) + .setLngLat({ + lat: node.currentPosition?.latitudeI / 1e7, + lng: node.currentPosition?.longitudeI / 1e7, + }) + .setPopup( + new mapboxgl.Popup().setHTML( + renderToString( +
+
+ {node.user?.longName} +
+
    +
  • ID: {node.number}
  • +
+
, + ), + ), + ) + .addTo(map); + } + }); + }; + + React.useEffect(() => { + PlaceNodes(); + }, [nodes]); + + React.useEffect(() => { + if (map?.loaded()) { + switch (maptype) { + case 'Outdoors': + map.setStyle(MapStyles.Outdoors.url); + break; + + case 'Satellite': + map.setStyle(MapStyles.Satellite.url); + break; + + case 'Streets': + map.setStyle(MapStyles.Streets.url); + break; + + default: + map.setStyle(darkMode ? MapStyles.Dark.url : MapStyles.Light.url); + break; + } + } + }, [maptype, darkMode, map]); + + React.useEffect(() => { + if (map?.loaded()) { + if (shading) { + map + .addSource('mapbox-dem', { + type: 'raster-dem', + url: 'mapbox://mapbox.mapbox-terrain-dem-v1', + tileSize: 512, + maxzoom: 14, + }) + .addLayer( + { + id: 'hillshading', + source: 'mapbox-dem', + type: 'hillshade', + // insert below waterway-river-canal-shadow; + // where hillshading sits in the Mapbox Outdoors style + }, + 'waterway-river-canal-shadow', + ); + } else { + map.removeLayer('hillshading'); + } + } + }, [shading, map]); + + React.useEffect(() => { + if (map?.loaded()) { + if (exaggeration) { + map + .addSource('mapbox-dem', { + type: 'raster-dem', + url: 'mapbox://mapbox.mapbox-terrain-dem-v1', + tileSize: 512, + maxzoom: 14, + }) + .setTerrain({ + source: 'mapbox-dem', + exaggeration: 1.5, + }); + } else { + map.setTerrain(); + } + } + }, [exaggeration, map]); + + React.useEffect(() => { + if (!map && mapDiv.current) { + const map = new mapboxgl.Map({ + container: mapDiv.current, + style: darkMode ? MapStyles.Dark.url : MapStyles.Light.url, + // center: [lng, lat], + // zoom: zoom, + }); + setMap(map); + + map.on('load', () => { + map.addLayer({ + id: 'sky', + type: 'sky', + paint: { + 'sky-type': 'atmosphere', + 'sky-atmosphere-sun': [0.0, 0.0], + 'sky-atmosphere-sun-intensity': 15, + }, + }); + PlaceNodes(); + }); + } + }, [map, darkMode]); + + return ( +
+
+ { + if (maptype === 'Satellite') { + setMaptype('Default'); + } else { + setMaptype('Satellite'); + } + }} + icon={} + /> + +
+ { + if (maptype === 'Outdoors') { + setMaptype('Default'); + } else { + setMaptype('Outdoors'); + } + }} + icon={} + /> + {maptype === 'Outdoors' && ( + { + setShading(!shading); + }} + icon={} + /> + )} +
+ +
+ { + setExaggeration(!exaggeration); + }} + icon={} + /> + } /> + } /> +
+
+
+
+
+ ); +}; diff --git a/src/components/Map/styles.ts b/src/components/Map/styles.ts new file mode 100644 index 00000000..944c2553 --- /dev/null +++ b/src/components/Map/styles.ts @@ -0,0 +1,25 @@ +export interface MapStyle { + title: string; + url: string; +} + +export const MapStyles = { + Streets: { + title: 'Streets', + url: 'mapbox://styles/mapbox/streets-v11', + } as MapStyle, + Outdoors: { + title: 'Outdoors', + url: 'mapbox://styles/mapbox/outdoors-v11', + } as MapStyle, + + Light: { + title: 'Light', + url: 'mapbox://styles/mapbox/light-v10', + } as MapStyle, + Dark: { title: 'Dark', url: 'mapbox://styles/mapbox/dark-v10' } as MapStyle, + Satellite: { + title: 'Satellite', + url: 'mapbox://styles/mapbox/satellite-v9', + } as MapStyle, +}; diff --git a/src/components/generic/StatCard.tsx b/src/components/generic/StatCard.tsx deleted file mode 100644 index c4554e48..00000000 --- a/src/components/generic/StatCard.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import type React from 'react'; - -export interface StatCardProps { - title: string; - value: string | JSX.Element; -} - -export const StatCard = ({ title, value }: StatCardProps): JSX.Element => { - return ( -
-
-
{title}
-
{value}
-
-
- ); -}; diff --git a/src/components/templates/PageLayout.tsx b/src/components/templates/PageLayout.tsx index 4fd332c7..c4e4a02f 100644 --- a/src/components/templates/PageLayout.tsx +++ b/src/components/templates/PageLayout.tsx @@ -37,7 +37,7 @@ export const PageLayout = ({ }} > -
+
{title}
diff --git a/src/core/connection.ts b/src/core/connection.ts index 520059c6..d2932973 100644 --- a/src/core/connection.ts +++ b/src/core/connection.ts @@ -10,6 +10,7 @@ import { setMyNodeInfo, setPreferences, setReady, + updateLastInteraction, } from '@core/slices/meshtasticSlice'; import { store } from '@core/store'; import { @@ -136,6 +137,15 @@ const registerListeners = (): void => { store.dispatch(setLastMeshInterraction(date.getTime())), ); + connection.onRoutingPacket.subscribe((routingPacket) => { + store.dispatch( + updateLastInteraction({ + id: routingPacket.packet.from, + time: new Date(routingPacket.packet.rxTime * 1000), + }), + ); + }); + connection.onTextPacket.subscribe((message) => { const myNodeNum = store.getState().meshtastic.radio.hardware.myNodeNum; diff --git a/src/core/slices/meshtasticSlice.ts b/src/core/slices/meshtasticSlice.ts index da1fed55..f702726d 100644 --- a/src/core/slices/meshtasticSlice.ts +++ b/src/core/slices/meshtasticSlice.ts @@ -2,8 +2,6 @@ import { Protobuf, Types } from '@meshtastic/meshtasticjs'; import type { PayloadAction } from '@reduxjs/toolkit'; import { createSlice } from '@reduxjs/toolkit'; -// import { connection } from '../connection'; - export interface MessageWithAck { message: Types.TextPacket; ack: boolean; @@ -16,11 +14,19 @@ export interface ChannelData { messages: MessageWithAck[]; } +interface CurrentPosition { + latitudeI: number; + longitudeI: number; + altitude: number; + posTimestamp: number; +} + export interface Node { number: number; lastHeard: Date; snr: number[]; positions: Protobuf.Position[]; + currentPosition?: CurrentPosition; user?: Protobuf.User; } @@ -79,8 +85,9 @@ export const meshtasticSlice = createSlice({ ); if (node) { node.user = action.payload.data; - // todo: use rx time - node.lastHeard = new Date(); + if (action.payload.packet.rxTime) { + node.lastHeard = new Date(action.payload.packet.rxTime * 1000); + } } else { console.log('Node not in DB'); } @@ -90,10 +97,29 @@ export const meshtasticSlice = createSlice({ (node) => node.number === action.payload.packet.from, ); - node?.positions.push(action.payload.data); if (node) { - // todo: use rx time - node.lastHeard = new Date(); + node.positions.push(action.payload.data); + + if ( + action.payload.data.latitudeI || + action.payload.data.longitudeI || + action.payload.data.altitude + ) { + node.currentPosition = { + latitudeI: + action.payload.data.latitudeI ?? node.currentPosition?.latitudeI, + longitudeI: + action.payload.data.longitudeI ?? + node.currentPosition?.longitudeI, + altitude: + action.payload.data.altitude ?? node.currentPosition?.altitude, + posTimestamp: action.payload.data.posTimestamp, //maybe new date? + }; + } + + if (action.payload.packet.rxTime) { + node.lastHeard = new Date(action.payload.packet.rxTime * 1000); + } } }, addNode: (state, action: PayloadAction) => { @@ -156,13 +182,23 @@ export const meshtasticSlice = createSlice({ const channelIndex = state.radio.channels.findIndex( (channel) => channel.channel.index === action.payload.channel, ); - // todo: update last mesh/user interraction here state.radio.channels[channelIndex].messages.map((message) => { if (message.message.packet.id === action.payload.messageId) { message.ack = true; } }); }, + updateLastInteraction: ( + state, + action: PayloadAction<{ id: number; time: Date }>, + ) => { + const node = state.nodes.find( + (node) => node.number === action.payload.id, + ); + if (node) { + node.lastHeard = action.payload.time; + } + }, setHostOverrideEnabled: (state, action: PayloadAction) => { state.hostOverrideEnabled = action.payload; localStorage.setItem('hostOverrideEnabled', String(action.payload)); @@ -199,6 +235,7 @@ export const { setPreferences, addMessage, ackMessage, + updateLastInteraction, setHostOverrideEnabled, setHostOverride, resetState, diff --git a/src/pages/Messages.tsx b/src/pages/Messages.tsx index e0396996..57d11953 100644 --- a/src/pages/Messages.tsx +++ b/src/pages/Messages.tsx @@ -50,7 +50,7 @@ export const Messages = (): JSX.Element => { isSender={message.isSender} message={message.message.data} ack={message.ack} - rxTime={new Date()} + rxTime={message.received} senderName={ nodes.find((node) => node.number === message.message.packet.from) ?.user?.longName ?? 'UNK' diff --git a/src/pages/Nodes/Index.tsx b/src/pages/Nodes/Index.tsx index 46c8c110..f2d017e9 100644 --- a/src/pages/Nodes/Index.tsx +++ b/src/pages/Nodes/Index.tsx @@ -1,43 +1,101 @@ -import type React from 'react'; +import React from 'react'; -import Avatar from 'boring-avatars'; +import { FiCode, FiXCircle } from 'react-icons/fi'; +import { MdGpsFixed, MdGpsNotFixed, MdGpsOff } from 'react-icons/md'; +import TimeAgo from 'timeago-react'; +import { useBreakpoint } from '@app/hooks/breakpoint'; import { useAppSelector } from '@app/hooks/redux'; -import { PageLayout } from '@components/templates/PageLayout'; +import { Drawer } from '@components/generic/Drawer'; +import { IconButton } from '@components/generic/IconButton'; +import { Map } from '@components/Map'; import { Protobuf } from '@meshtastic/meshtasticjs'; -import { Node } from './Node'; - export const Nodes = (): JSX.Element => { const myNodeNum = useAppSelector( (state) => state.meshtastic.radio.hardware, ).myNodeNum; - const nodes = useAppSelector((state) => state.meshtastic.nodes).filter( - (node) => node.number !== myNodeNum, - ); + const nodes = useAppSelector((state) => state.meshtastic.nodes); + // .filter( + // (node) => node.number !== myNodeNum, + // ); + const [navOpen, setNavOpen] = React.useState(false); + + const { breakpoint } = useBreakpoint(); + return ( - { - return { - title: node.user?.longName ?? node.number.toString(), - description: node.user - ? Protobuf.HardwareModel[node.user.hwModel] - : 'Unknown Hardware', - icon: ( - + { + setNavOpen(!navOpen); + }} + > +
+
+ Nodes +
+
+ } + onClick={(): void => { + setNavOpen(false); + }} /> - ), - }; - })} - panels={nodes.map((node, index) => ( - - ))} - /> +
+
+ {!nodes.length && ( + + No nodes found. + + )} + {nodes.map((node) => ( +
+
+
new Date(Date.now() - 1000 * 60 * 15) + ? 'bg-green-500' + : node.lastHeard > new Date(Date.now() - 1000 * 60 * 30) + ? 'bg-yellow-500' + : 'bg-red-500' + }`} + /> +
{node.user?.longName}
+
+ {node.lastHeard.getTime() ? ( + + ) : ( + 'Never' + )} +
+ {node.currentPosition ? ( + new Date(node.positions[0].posTimestamp * 1000) > + new Date(new Date().getTime() - 1000 * 60 * 30) ? ( + } /> + ) : ( + } /> + ) + ) : ( + } /> + )} +
+
+
+ {Protobuf.HardwareModel[node.user?.hwModel ?? 0]} +
+
+ } /> +
+
+
+ ))} + + +
); }; diff --git a/src/pages/Nodes/Node.tsx b/src/pages/Nodes/Node.tsx deleted file mode 100644 index 936fecc7..00000000 --- a/src/pages/Nodes/Node.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import 'react-json-pretty/themes/acai.css'; - -import React from 'react'; - -import { FiCode, FiMenu } from 'react-icons/fi'; -import JSONPretty from 'react-json-pretty'; -import TimeAgo from 'timeago-react'; - -import { Card } from '@components/generic/Card'; -import { Cover } from '@components/generic/Cover'; -import { IconButton } from '@components/generic/IconButton'; -import { StatCard } from '@components/generic/StatCard'; -import { PrimaryTemplate } from '@components/templates/PrimaryTemplate'; -import type { Node as NodeType } from '@core/slices/meshtasticSlice'; - -export interface NodeProps { - navOpen?: boolean; - setNavOpen?: React.Dispatch>; - node: NodeType; -} - -export const Node = ({ navOpen, setNavOpen, node }: NodeProps): JSX.Element => { - const [debug, setDebug] = React.useState(false); - return ( - } - onClick={(): void => { - setNavOpen && setNavOpen(!navOpen); - }} - /> - } - rightButton={ - } - active={debug} - onClick={(): void => { - setDebug(!debug); - }} - /> - } - > -
-
- : 'Never' - } - /> - -
- - } /> -
- -
-
-
-
- ); -}; diff --git a/vite.config.ts b/vite.config.ts index 8e5b3210..267e3781 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,6 @@ import path from 'path'; import { defineConfig } from 'vite'; +import importToCDN from 'vite-plugin-cdn-import'; import { VitePWA } from 'vite-plugin-pwa'; import react from '@vitejs/plugin-react'; @@ -8,6 +9,16 @@ import react from '@vitejs/plugin-react'; export default defineConfig({ plugins: [ react(), + importToCDN({ + modules: [ + { + name: 'mapbox-gl', + var: 'mapboxgl', + path: `dist/mapbox-gl.js`, + }, + ], + }), + VitePWA({ mode: 'production',