From f48553f178cf60b5b5a9dad3c432441c8b570e95 Mon Sep 17 00:00:00 2001 From: Malte Grimm Date: Fri, 16 Dec 2022 16:49:53 +0100 Subject: [PATCH 01/10] Add button to clear device list --- .../PageComponents/Connect/Serial.tsx | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/components/PageComponents/Connect/Serial.tsx b/src/components/PageComponents/Connect/Serial.tsx index 55e5df81..bf315a18 100644 --- a/src/components/PageComponents/Connect/Serial.tsx +++ b/src/components/PageComponents/Connect/Serial.tsx @@ -29,6 +29,19 @@ export const Serial = (): JSX.Element => { void updateSerialPortList(); }, [updateSerialPortList]); + // // Check if this is a meshtastic device + // const probe = async (port: SerialPort) => { + // return; + // if(port.readable) + // return; + // console.log("Creating connection"); + // const connection = new ISerialConnection(randId()); + // await connection.connect({ port, concurrentLogOutput: false }); + // connection.events.onNodeInfoPacket.subscribe( async (nodeInfo) => { + // console.log(nodeInfo); + // }); + // } + const onConnect = async (port: SerialPort) => { const id = randId(); const device = addDevice(id); @@ -74,6 +87,14 @@ export const Serial = (): JSX.Element => { > New device + ); }; From 7fcba605b4931d675d8f163a1821bf59cc563e4a Mon Sep 17 00:00:00 2001 From: Malte Grimm Date: Fri, 16 Dec 2022 16:50:36 +0100 Subject: [PATCH 02/10] Setup page start --- package.json | 1 + pnpm-lock.yaml | 193 +++++++++++++++++------------- src/App.tsx | 4 +- src/components/DeviceSelector.tsx | 15 ++- src/components/SetupPage.tsx | 22 ++++ src/components/SidebarSetup.tsx | 34 ++++++ 6 files changed, 184 insertions(+), 85 deletions(-) create mode 100644 src/components/SetupPage.tsx create mode 100644 src/components/SidebarSetup.tsx diff --git a/package.json b/package.json index 9af11f3d..1eecf11d 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "chartjs-adapter-date-fns": "^3.0.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "csstype": "3.0.10", "date-fns": "^2.29.3", "geodesy": "^2.4.0", "immer": "^9.0.17", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3cbf7ef1..9b2ecc52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.4 +lockfileVersion: 5.3 specifiers: '@emeraldpay/hashicon-react': ^0.5.2 @@ -26,6 +26,7 @@ specifiers: chartjs-adapter-date-fns: ^3.0.0 class-transformer: ^0.5.1 class-validator: ^0.14.0 + csstype: 3.0.10 date-fns: ^2.29.3 eslint: ^8.31.0 eslint-config-prettier: ^8.5.0 @@ -65,18 +66,19 @@ specifiers: dependencies: '@emeraldpay/hashicon-react': 0.5.2 - '@headlessui/react': 1.7.7_biqbaboplfbrettd7655fr4n2y + '@headlessui/react': 1.7.7_react-dom@18.2.0+react@18.2.0 '@heroicons/react': 2.0.13_react@18.2.0 - '@hookform/error-message': 2.0.1_7yhncxxycytkes3mwygyjxyp6u + '@hookform/error-message': 2.0.1_fe0ed15ef81626a24b6cb60d84df0ff5 '@hookform/resolvers': 2.9.10_react-hook-form@7.41.3 '@meshtastic/meshtasticjs': 0.9.8 '@tailwindcss/typography': 0.5.8_tailwindcss@3.2.4 '@turf/turf': 6.5.0 base64-js: 1.5.1 chart.js: 4.1.1 - chartjs-adapter-date-fns: 3.0.0_iln6v37jwapfq6ambblo6nwala + chartjs-adapter-date-fns: 3.0.0_chart.js@4.1.1+date-fns@2.29.3 class-transformer: 0.5.1 class-validator: 0.14.0 + csstype: 3.0.10 date-fns: 2.29.3 geodesy: 2.4.0 immer: 9.0.17 @@ -84,13 +86,13 @@ dependencies: maplibre-gl: 2.4.0 pretty-ms: 8.0.0 react: 18.2.0 - react-chartjs-2: 5.1.0_dxa6kz4w32vmgoazz4fv7vwm2e + react-chartjs-2: 5.1.0_chart.js@4.1.1+react@18.2.0 react-dom: 18.2.0_react@18.2.0 react-hook-form: 7.41.3_react@18.2.0 - react-hot-toast: 2.4.0_biqbaboplfbrettd7655fr4n2y - react-json-tree: 0.17.0_kzbn2opkn2327fwg5yzwzya5o4 - react-map-gl: 7.0.20_6eczaga5xxiwzxtfiyk6fioasq - react-qrcode-logo: 2.8.0_biqbaboplfbrettd7655fr4n2y + react-hot-toast: 2.4.0_cd1aa7a7c37ce2553841751f727f4bac + react-json-tree: 0.17.0_5642dd39ea6eb7af96c6ee336ce01d77 + react-map-gl: 7.0.20_f10590181dbdd16cde654615e2a1c094 + react-qrcode-logo: 2.8.0_react-dom@18.2.0+react@18.2.0 rfc4648: 1.5.2 timeago-react: 3.0.5_react@18.2.0 zustand: 4.2.0_immer@9.0.17+react@18.2.0 @@ -104,14 +106,14 @@ devDependencies: '@types/react-dom': 18.0.10 '@types/w3c-web-serial': 1.0.3 '@types/web-bluetooth': 0.0.16 - '@typescript-eslint/eslint-plugin': 5.47.1_axni7f4fgvh6tlufnh6hwgsifq - '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/eslint-plugin': 5.47.1_05da8f9785354fe9ae8569fc7b1a482c + '@typescript-eslint/parser': 5.47.1_eslint@8.31.0+typescript@4.9.4 '@vitejs/plugin-react': 3.0.0_vite@4.0.3 autoprefixer: 10.4.13_postcss@8.4.20 eslint: 8.31.0 eslint-config-prettier: 8.5.0_eslint@8.31.0 - eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4 - eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi + eslint-import-resolver-typescript: 3.5.2_72fe982162dd88c98c30db727c58d787 + eslint-plugin-import: 2.26.0_eslint@8.31.0 eslint-plugin-react: 7.31.11_eslint@8.31.0 eslint-plugin-react-hooks: 4.6.0_eslint@8.31.0 gzipper: 7.2.0 @@ -119,7 +121,7 @@ devDependencies: prettier: 2.8.1 prettier-plugin-tailwindcss: 0.2.1_prettier@2.8.1 rollup-plugin-visualizer: 5.9.0 - tailwindcss: 3.2.4_postcss@8.4.20 + tailwindcss: 3.2.4 tar: 6.1.13 tslib: 2.4.1 typescript: 4.9.4 @@ -1547,7 +1549,7 @@ packages: base64-js: 1.5.1 dev: true - /@headlessui/react/1.7.7_biqbaboplfbrettd7655fr4n2y: + /@headlessui/react/1.7.7_react-dom@18.2.0+react@18.2.0: resolution: {integrity: sha512-BqDOd/tB9u2tA0T3Z0fn18ktw+KbVwMnkxxsGPIH2hzssrQhKB5n/6StZOyvLYP/FsYtvuXfi9I0YowKPv2c1w==} engines: {node: '>=10'} peerDependencies: @@ -1567,7 +1569,7 @@ packages: react: 18.2.0 dev: false - /@hookform/error-message/2.0.1_7yhncxxycytkes3mwygyjxyp6u: + /@hookform/error-message/2.0.1_fe0ed15ef81626a24b6cb60d84df0ff5: resolution: {integrity: sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==} peerDependencies: react: '>=16.8.0' @@ -1723,10 +1725,12 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + dev: true /@nodelib/fs.stat/2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + dev: true /@nodelib/fs.walk/1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} @@ -1734,6 +1738,7 @@ packages: dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + dev: true /@pkgr/utils/2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} @@ -1751,7 +1756,7 @@ packages: resolution: {integrity: sha512-PVxsH81y9kEbHldxxG/8Y3z2mTXWQytRl8zNS0mTPUjkEC+8GUX6gj6LsA8EFp25fAs9V0ruh+aNWmPccEI9MA==} dev: false - /@rollup/plugin-babel/5.3.1_quedi3p7womesqmjrcxptomfpa: + /@rollup/plugin-babel/5.3.1_@babel+core@7.20.7+rollup@2.79.1: resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -1875,7 +1880,7 @@ packages: tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' dependencies: mini-svg-data-uri: 1.4.4 - tailwindcss: 3.2.4_postcss@8.4.20 + tailwindcss: 3.2.4 dev: true /@tailwindcss/typography/0.5.8_tailwindcss@3.2.4: @@ -1887,7 +1892,7 @@ packages: lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.2.4_postcss@8.4.20 + tailwindcss: 3.2.4 dev: false /@turf/along/6.5.0: @@ -3022,6 +3027,7 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 csstype: 3.1.1 + dev: true /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -3031,6 +3037,7 @@ packages: /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} + dev: true /@types/semver/7.3.13: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} @@ -3052,7 +3059,7 @@ packages: resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} dev: true - /@typescript-eslint/eslint-plugin/5.47.1_axni7f4fgvh6tlufnh6hwgsifq: + /@typescript-eslint/eslint-plugin/5.47.1_05da8f9785354fe9ae8569fc7b1a482c: resolution: {integrity: sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3063,10 +3070,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/parser': 5.47.1_eslint@8.31.0+typescript@4.9.4 '@typescript-eslint/scope-manager': 5.47.1 - '@typescript-eslint/type-utils': 5.47.1_iukboom6ndih5an6iafl45j2fe - '@typescript-eslint/utils': 5.47.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/type-utils': 5.47.1_eslint@8.31.0+typescript@4.9.4 + '@typescript-eslint/utils': 5.47.1_eslint@8.31.0+typescript@4.9.4 debug: 4.3.4 eslint: 8.31.0 ignore: 5.2.4 @@ -3079,7 +3086,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.47.1_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/parser/5.47.1_eslint@8.31.0+typescript@4.9.4: resolution: {integrity: sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3107,7 +3114,7 @@ packages: '@typescript-eslint/visitor-keys': 5.47.1 dev: true - /@typescript-eslint/type-utils/5.47.1_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/type-utils/5.47.1_eslint@8.31.0+typescript@4.9.4: resolution: {integrity: sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3118,7 +3125,7 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 - '@typescript-eslint/utils': 5.47.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/utils': 5.47.1_eslint@8.31.0+typescript@4.9.4 debug: 4.3.4 eslint: 8.31.0 tsutils: 3.21.0_typescript@4.9.4 @@ -3153,7 +3160,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.47.1_iukboom6ndih5an6iafl45j2fe: + /@typescript-eslint/utils/5.47.1_eslint@8.31.0+typescript@4.9.4: resolution: {integrity: sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3211,15 +3218,18 @@ packages: acorn: 7.4.1 acorn-walk: 7.2.0 xtend: 4.0.2 + dev: true /acorn-walk/7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} engines: {node: '>=0.4.0'} + dev: true /acorn/7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn/8.8.1: resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} @@ -3270,9 +3280,11 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + dev: true /arg/5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3403,6 +3415,7 @@ packages: /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + dev: true /bl/4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -3429,6 +3442,7 @@ packages: engines: {node: '>=8'} dependencies: fill-range: 7.0.1 + dev: true /browserslist/4.21.4: resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} @@ -3471,6 +3485,7 @@ packages: /camelcase-css/2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + dev: true /caniuse-lite/1.0.30001441: resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==} @@ -3500,7 +3515,7 @@ packages: '@kurkle/color': 0.3.1 dev: false - /chartjs-adapter-date-fns/3.0.0_iln6v37jwapfq6ambblo6nwala: + /chartjs-adapter-date-fns/3.0.0_chart.js@4.1.1+date-fns@2.29.3: resolution: {integrity: sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg==} peerDependencies: chart.js: '>=2.8.0' @@ -3523,6 +3538,7 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.2 + dev: true /chownr/2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -3674,6 +3690,10 @@ packages: engines: {node: '>=4'} hasBin: true + /csstype/3.0.10: + resolution: {integrity: sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==} + dev: false + /csstype/3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} @@ -3698,22 +3718,12 @@ packages: /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true dependencies: ms: 2.0.0 dev: true /debug/3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true dependencies: ms: 2.1.3 dev: true @@ -3790,6 +3800,7 @@ packages: /defined/1.0.1: resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: true /density-clustering/1.3.0: resolution: {integrity: sha512-icpmBubVTwLnsaor9qH/4tG5+7+f61VcqMN3V3pm9sxxSCt2Jcs0zWOgwZW9ARJYaKD3FumIgHiMOcIMRRAzFQ==} @@ -3803,9 +3814,11 @@ packages: acorn-node: 1.8.2 defined: 1.0.1 minimist: 1.2.7 + dev: true /didyoumean/1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true /dir-glob/3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -3816,6 +3829,7 @@ packages: /dlv/1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -4006,11 +4020,9 @@ packages: dependencies: debug: 3.2.7 resolve: 1.22.1 - transitivePeerDependencies: - - supports-color dev: true - /eslint-import-resolver-typescript/3.5.2_ol7jqilc3wemtdbq3nzhywgxq4: + /eslint-import-resolver-typescript/3.5.2_72fe982162dd88c98c30db727c58d787: resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -4020,7 +4032,7 @@ packages: debug: 4.3.4 enhanced-resolve: 5.12.0 eslint: 8.31.0 - eslint-plugin-import: 2.26.0_bpx4furzt4ibermwbsj75osuwi + eslint-plugin-import: 2.26.0_eslint@8.31.0 get-tsconfig: 4.3.0 globby: 13.1.3 is-core-module: 2.11.0 @@ -4030,54 +4042,32 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_of6uaipqaoaobv57tu2gvxhnhu: + /eslint-module-utils/2.7.4_eslint@8.31.0: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: - '@typescript-eslint/parser': '*' eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true eslint: optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true dependencies: - '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe debug: 3.2.7 eslint: 8.31.0 - eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 3.5.2_ol7jqilc3wemtdbq3nzhywgxq4 - transitivePeerDependencies: - - supports-color dev: true - /eslint-plugin-import/2.26.0_bpx4furzt4ibermwbsj75osuwi: + /eslint-plugin-import/2.26.0_eslint@8.31.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: - '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true dependencies: - '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe array-includes: 3.1.6 array.prototype.flat: 1.3.1 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.31.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_of6uaipqaoaobv57tu2gvxhnhu + eslint-module-utils: 2.7.4_eslint@8.31.0 has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -4085,10 +4075,6 @@ packages: object.values: 1.1.6 resolve: 1.22.1 tsconfig-paths: 3.14.1 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color dev: true /eslint-plugin-react-hooks/4.6.0_eslint@8.31.0: @@ -4267,6 +4253,7 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 + dev: true /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -4280,6 +4267,7 @@ packages: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 + dev: true /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -4299,6 +4287,7 @@ packages: engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 + dev: true /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -4378,6 +4367,7 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: true optional: true /function-bind/1.1.1: @@ -4468,12 +4458,14 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 + dev: true /glob-parent/6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true /glob/7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -4549,10 +4541,12 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true - /goober/2.1.11: + /goober/2.1.11_csstype@3.0.10: resolution: {integrity: sha512-5SS2lmxbhqH0u9ABEWq7WPU69a4i2pYcHeCxqaNq6Cw3mnrF0ghWNM4tEGid4dKy8XNIAUbuThuozDHHKJVh3A==} peerDependencies: csstype: ^3.0.10 + dependencies: + csstype: 3.0.10 dev: false /gopd/1.0.1: @@ -4697,6 +4691,7 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 + dev: true /is-boolean-object/1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -4715,6 +4710,7 @@ packages: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 + dev: true /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -4731,6 +4727,7 @@ packages: /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + dev: true /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} @@ -4742,6 +4739,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 + dev: true /is-interactive/1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} @@ -4771,6 +4769,7 @@ packages: /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + dev: true /is-obj/1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} @@ -5010,6 +5009,7 @@ packages: /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} + dev: true /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -5137,6 +5137,7 @@ packages: /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + dev: true /micromatch/4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -5144,6 +5145,7 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 + dev: true /mimic-fn/2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -5218,6 +5220,7 @@ packages: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -5248,6 +5251,7 @@ packages: /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + dev: true /normalize-range/0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} @@ -5261,6 +5265,7 @@ packages: /object-hash/3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + dev: true /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} @@ -5446,6 +5451,7 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -5470,14 +5476,17 @@ packages: /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + dev: true /pify/2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + dev: true /pirates/3.0.2: resolution: {integrity: sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==} @@ -5506,6 +5515,7 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.1 + dev: true /postcss-js/4.0.0_postcss@8.4.20: resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} @@ -5515,6 +5525,7 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.20 + dev: true /postcss-load-config/3.1.4_postcss@8.4.20: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} @@ -5531,6 +5542,7 @@ packages: lilconfig: 2.0.6 postcss: 8.4.20 yaml: 1.10.2 + dev: true /postcss-nested/6.0.0_postcss@8.4.20: resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} @@ -5540,6 +5552,7 @@ packages: dependencies: postcss: 8.4.20 postcss-selector-parser: 6.0.11 + dev: true /postcss-selector-parser/6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -5555,9 +5568,11 @@ packages: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + dev: true /postcss-value-parser/4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true /postcss/8.4.20: resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} @@ -5566,6 +5581,7 @@ packages: nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /potpack/1.0.2: resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} @@ -5642,10 +5658,12 @@ packages: /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true /quick-lru/5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + dev: true /quickselect/1.1.1: resolution: {integrity: sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==} @@ -5689,7 +5707,7 @@ packages: lodash.curry: 4.1.1 dev: false - /react-chartjs-2/5.1.0_dxa6kz4w32vmgoazz4fv7vwm2e: + /react-chartjs-2/5.1.0_chart.js@4.1.1+react@18.2.0: resolution: {integrity: sha512-Gt76b7+p7nMQq0MvkWfUSNAzIm/TLAnAO32zIpSzrQyc9JWRbVCtq8qOzPJmfpDzPcIJ7Y9Gp5g+VdTRrGITsQ==} peerDependencies: chart.js: ^4.1.1 @@ -5718,14 +5736,14 @@ packages: react: 18.2.0 dev: false - /react-hot-toast/2.4.0_biqbaboplfbrettd7655fr4n2y: + /react-hot-toast/2.4.0_cd1aa7a7c37ce2553841751f727f4bac: resolution: {integrity: sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA==} engines: {node: '>=10'} peerDependencies: react: '>=16' react-dom: '>=16' dependencies: - goober: 2.1.11 + goober: 2.1.11_csstype@3.0.10 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 transitivePeerDependencies: @@ -5735,7 +5753,7 @@ packages: /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /react-json-tree/0.17.0_kzbn2opkn2327fwg5yzwzya5o4: + /react-json-tree/0.17.0_5642dd39ea6eb7af96c6ee336ce01d77: resolution: {integrity: sha512-hcWjibI/fAvsKnfYk+lka5OrE1Lvb1jH5pSnFhIU5T8cCCxB85r6h/NOzDPggSSgErjmx4rl3+2EkeclIKBOhg==} peerDependencies: '@types/react': ^16.3.0 || ^17.0.0 || ^18.0.0 @@ -5750,7 +5768,7 @@ packages: react-base16-styling: 0.9.1 dev: false - /react-map-gl/7.0.20_6eczaga5xxiwzxtfiyk6fioasq: + /react-map-gl/7.0.20_f10590181dbdd16cde654615e2a1c094: resolution: {integrity: sha512-Q1formrWEdt9vY5DyW2vgdmAPuSMH2TFn8xKMlA+cmBlyS8veQvVTGoq4lAm8p3Hb/90ZpNmMtI4s107r931vQ==} peerDependencies: mapbox-gl: '*' @@ -5761,7 +5779,7 @@ packages: react: 18.2.0 dev: false - /react-qrcode-logo/2.8.0_biqbaboplfbrettd7655fr4n2y: + /react-qrcode-logo/2.8.0_react-dom@18.2.0+react@18.2.0: resolution: {integrity: sha512-dbEgjsg6C4tK6+oGmCRDlJ7urQAWqybaGBLJtp8Z6ZYvVUP302HBXk/F7VRk54yWTwzlHwig3VK6HMKCha2YFw==} peerDependencies: react: '>=16.4.1' @@ -5798,6 +5816,7 @@ packages: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 + dev: true /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -5844,6 +5863,7 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + dev: true /regenerate-unicode-properties/10.1.0: resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} @@ -5929,6 +5949,7 @@ packages: is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true /resolve/2.0.0-next.4: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} @@ -5950,6 +5971,7 @@ packages: /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true /rfc4648/1.5.2: resolution: {integrity: sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==} @@ -6015,6 +6037,7 @@ packages: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + dev: true /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -6128,6 +6151,7 @@ packages: /source-map-js/1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: true /source-map-support/0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -6297,6 +6321,7 @@ packages: /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + dev: true /synckit/0.8.4: resolution: {integrity: sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw==} @@ -6306,12 +6331,10 @@ packages: tslib: 2.4.1 dev: true - /tailwindcss/3.2.4_postcss@8.4.20: + /tailwindcss/3.2.4: resolution: {integrity: sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==} engines: {node: '>=12.13.0'} hasBin: true - peerDependencies: - postcss: ^8.0.9 dependencies: arg: 5.0.2 chokidar: 3.5.3 @@ -6338,6 +6361,7 @@ packages: resolve: 1.22.1 transitivePeerDependencies: - ts-node + dev: true /tapable/2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -6446,6 +6470,7 @@ packages: engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 + dev: true /topojson-client/3.1.0: resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} @@ -6573,7 +6598,7 @@ packages: engines: {node: '>=14.0.0'} hasBin: true dependencies: - '@typescript-eslint/parser': 5.47.1_iukboom6ndih5an6iafl45j2fe + '@typescript-eslint/parser': 5.47.1_eslint@8.31.0+typescript@4.9.4 '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 chalk: 4.1.2 debug: 4.3.4 @@ -6822,7 +6847,7 @@ packages: '@babel/core': 7.20.7 '@babel/preset-env': 7.20.2_@babel+core@7.20.7 '@babel/runtime': 7.20.7 - '@rollup/plugin-babel': 5.3.1_quedi3p7womesqmjrcxptomfpa + '@rollup/plugin-babel': 5.3.1_@babel+core@7.20.7+rollup@2.79.1 '@rollup/plugin-node-resolve': 11.2.1_rollup@2.79.1 '@rollup/plugin-replace': 2.4.2_rollup@2.79.1 '@surma/rollup-plugin-off-main-thread': 2.2.3 @@ -6962,6 +6987,7 @@ packages: /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + dev: true /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -6979,6 +7005,7 @@ packages: /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + dev: true /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} diff --git a/src/App.tsx b/src/App.tsx index 5c8b632c..54a2307a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,6 +15,7 @@ import { PageNav } from "@components/PageNav.js"; import { Sidebar } from "@components/Sidebar.js"; import { useDeviceStore } from "@core/stores/deviceStore.js"; import { ThemeController } from "./components/generic/ThemeController.js"; +import { SetupPage } from "./components/SetupPage.js"; export const App = (): JSX.Element => { const { getDevice } = useDeviceStore(); @@ -45,7 +46,8 @@ export const App = (): JSX.Element => { - )} + )} + {selectedDevice === -1 && } {selectedDevice === 0 && } diff --git a/src/components/DeviceSelector.tsx b/src/components/DeviceSelector.tsx index d780ed96..7951ef6d 100644 --- a/src/components/DeviceSelector.tsx +++ b/src/components/DeviceSelector.tsx @@ -4,7 +4,7 @@ import { useAppStore } from "@app/core/stores/appStore.js"; import { useDeviceStore } from "@app/core/stores/deviceStore.js"; import { Mono } from "@components/generic/Mono.js"; import { Hashicon } from "@emeraldpay/hashicon-react"; -import { MoonIcon, PlusIcon } from "@heroicons/react/24/outline"; +import { MoonIcon, PlusIcon, WrenchScrewdriverIcon } from "@heroicons/react/24/outline"; import { IconButton } from "./form/IconButton.js"; export const DeviceSelector = (): JSX.Element => { @@ -44,6 +44,19 @@ export const DeviceSelector = (): JSX.Element => { }`} /> +
{ + setSelectedDevice(-1); + }} + className="group flex h-8 w-8 cursor-pointer p-0.5 drop-shadow-md" + > + +
+
{ + const { getDevices } = useDeviceStore(); + const testDevice = getDevices()[0]; + + return ( + + + + + + + ); +} \ No newline at end of file diff --git a/src/components/SidebarSetup.tsx b/src/components/SidebarSetup.tsx new file mode 100644 index 00000000..1ca7b01d --- /dev/null +++ b/src/components/SidebarSetup.tsx @@ -0,0 +1,34 @@ +import type React from "react"; + +import { useDevice } from "@app/core/providers/useDevice.js"; +import { toMGRS } from "@app/core/utils/toMGRS.js"; +import { BatteryWidget } from "@components/Widgets/BatteryWidget.js"; +import { DeviceWidget } from "@components/Widgets/DeviceWidget.js"; +import { PeersWidget } from "@components/Widgets/PeersWidget.js"; +import { PositionWidget } from "@components/Widgets/PositionWidget.js"; +import { useAppStore } from "@core/stores/appStore.js"; +import { useDeviceStore } from "@core/stores/deviceStore.js"; +import { CommandLineIcon } from "@heroicons/react/24/outline"; +import { Types } from "@meshtastic/meshtasticjs"; + +import { Input } from "./form/Input.js"; +import { Mono } from "./generic/Mono.js"; + +export const SidebarSetup = (): JSX.Element => { + // const { removeDevice } = useDeviceStore(); + // const { connection, hardware, nodes, status, currentMetrics } = useDevice(); + const { selectedDevice, setSelectedDevice, setCommandPaletteOpen } = + useAppStore(); + // const myNode = nodes.find((n) => n.data.num === hardware.myNodeNum); + + return ( +
+
+ {Test} +
+
+
{Test2}
+ +
+ ); +}; From a1581781b47db4ab149f916471e099372ab0c82b Mon Sep 17 00:00:00 2001 From: Malte Grimm Date: Fri, 16 Dec 2022 17:20:37 +0100 Subject: [PATCH 03/10] Update PageNav to take pages as parameters --- src/App.tsx | 8 +- src/PageRouter.tsx | 2 + .../{SetupPage.tsx => DeviceSetup.tsx} | 11 +- src/components/PageNav.tsx | 117 ++++++++++-------- src/core/stores/deviceStore.ts | 3 +- src/pages/Setup.tsx | 42 +++++++ 6 files changed, 123 insertions(+), 60 deletions(-) rename src/components/{SetupPage.tsx => DeviceSetup.tsx} (62%) create mode 100644 src/pages/Setup.tsx diff --git a/src/App.tsx b/src/App.tsx index 54a2307a..e2b194a6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -11,11 +11,11 @@ import { DeviceSelector } from "@components/DeviceSelector.js"; import { DialogManager } from "@components/Dialog/DialogManager.js"; import { Drawer } from "@components/Drawer/index.js"; import { NewDevice } from "@components/NewDevice.js"; -import { PageNav } from "@components/PageNav.js"; +import { PageNav, pagesDevice } from "@components/PageNav.js"; import { Sidebar } from "@components/Sidebar.js"; import { useDeviceStore } from "@core/stores/deviceStore.js"; import { ThemeController } from "./components/generic/ThemeController.js"; -import { SetupPage } from "./components/SetupPage.js"; +import { DeviceSetup } from "./components/DeviceSetup.js"; export const App = (): JSX.Element => { const { getDevice } = useDeviceStore(); @@ -38,7 +38,7 @@ export const App = (): JSX.Element => { /> - +
@@ -47,7 +47,7 @@ export const App = (): JSX.Element => { )} - {selectedDevice === -1 && } + {selectedDevice === -1 && } {selectedDevice === 0 && }
diff --git a/src/PageRouter.tsx b/src/PageRouter.tsx index 5756f183..1d587300 100644 --- a/src/PageRouter.tsx +++ b/src/PageRouter.tsx @@ -9,6 +9,7 @@ import { LogsPage } from "@pages/Logs.js"; import { MapPage } from "@pages/Map.js"; import { MessagesPage } from "@pages/Messages.js"; import { PeersPage } from "@pages/Peers.js"; +import { SetupPage } from "./pages/Setup"; export const PageRouter = (): JSX.Element => { const { activePage } = useDevice(); @@ -22,6 +23,7 @@ export const PageRouter = (): JSX.Element => { {activePage === "peers" && } {activePage === "info" && } {activePage === "logs" && } + {activePage === "setup" && }
); }; diff --git a/src/components/SetupPage.tsx b/src/components/DeviceSetup.tsx similarity index 62% rename from src/components/SetupPage.tsx rename to src/components/DeviceSetup.tsx index 2fb280a1..5bc9c5ed 100644 --- a/src/components/SetupPage.tsx +++ b/src/components/DeviceSetup.tsx @@ -1,22 +1,23 @@ import { useDeviceStore } from "@app/core/stores/deviceStore"; import { DeviceWrapper } from "@app/DeviceWrapper"; +import { PageRouter } from "@app/PageRouter"; import { ConfigPage } from "@app/pages/Config"; import { Mono } from "./generic/Mono"; -import { PageNav } from "./PageNav"; +import { PageNav, pagesDevice, pagesSetup } from "./PageNav"; import { SidebarSetup } from "./SidebarSetup"; -export const SetupPage = (): JSX.Element => { +export const DeviceSetup = (): JSX.Element => { const { getDevices } = useDeviceStore(); const testDevice = getDevices()[0]; return ( - - - + + + ); } \ No newline at end of file diff --git a/src/components/PageNav.tsx b/src/components/PageNav.tsx index 2730d206..d9f9b86a 100644 --- a/src/components/PageNav.tsx +++ b/src/components/PageNav.tsx @@ -13,57 +13,12 @@ import { UsersIcon } from "@heroicons/react/24/outline"; -export const PageNav = (): JSX.Element => { - const { activePage, setActivePage } = useDevice(); - - interface NavLink { - name: string; - icon: JSX.Element; - page: Page; - } +interface PageNavProps { + pages: NavLink[] +} - const pages: NavLink[] = [ - { - name: "Messages", - icon: , - page: "messages" - }, - { - name: "Map", - icon: , - page: "map" - }, - { - name: "Extensions", - icon: , - page: "extensions" - }, - { - name: "Config", - icon: , - page: "config" - }, - { - name: "Channels", - icon: , - page: "channels" - }, - { - name: "Peers", - icon: , - page: "peers" - }, - { - name: "Info", - icon: , - page: "info" - }, - { - name: "Logs", - icon: , - page: "logs" - } - ]; +export const PageNav = ({pages}: PageNavProps): JSX.Element => { + const { activePage, setActivePage } = useDevice(); return (
@@ -87,3 +42,65 @@ export const PageNav = (): JSX.Element => {
); }; + +interface NavLink { + name: string; + icon: JSX.Element; + page: Page; +} + +export const pagesDevice: NavLink[] = [ + { + name: "Messages", + icon: , + page: "messages" + }, + { + name: "Map", + icon: , + page: "map" + }, + { + name: "Extensions", + icon: , + page: "extensions" + }, + { + name: "Config", + icon: , + page: "config" + }, + { + name: "Channels", + icon: , + page: "channels" + }, + { + name: "Peers", + icon: , + page: "peers" + }, + { + name: "Info", + icon: , + page: "info" + }, + { + name: "Logs", + icon: , + page: "logs" + } +]; + +export const pagesSetup: NavLink[] = [ + { + name: "Setup", + icon: , + page: "extensions" + }, + { + name: "Config", + icon: , + page: "config" + } +] \ No newline at end of file diff --git a/src/core/stores/deviceStore.ts b/src/core/stores/deviceStore.ts index 860ca1b5..61a499cc 100644 --- a/src/core/stores/deviceStore.ts +++ b/src/core/stores/deviceStore.ts @@ -13,7 +13,8 @@ export type Page = | "channels" | "peers" | "info" - | "logs"; + | "logs" + | "setup"; export interface MessageWithState extends Types.PacketMetadata { state: MessageState; diff --git a/src/pages/Setup.tsx b/src/pages/Setup.tsx new file mode 100644 index 00000000..f0bafd3d --- /dev/null +++ b/src/pages/Setup.tsx @@ -0,0 +1,42 @@ +import type React from "react"; + +import { TabbedContent, TabType } from "@app/components/generic/TabbedContent"; +import { Channel } from "@app/components/PageComponents/Channel.js"; +import { Button } from "@components/form/Button.js"; +import { useDevice } from "@core/providers/useDevice.js"; +import { + ArrowDownOnSquareStackIcon, + QrCodeIcon +} from "@heroicons/react/24/outline"; +import { Protobuf } from "@meshtastic/meshtasticjs"; + +export const SetupPage = (): JSX.Element => { + const { channels, setQRDialogOpen, setImportDialogOpen } = useDevice(); + + const tabs: TabType[] = channels.map((channel) => { + return { + name: channel.config.settings?.name.length + ? channel.config.settings.name + : channel.config.role === Protobuf.Channel_Role.PRIMARY + ? "Primary" + : `Channel: ${channel.config.index}`, + element: () => + }; + }); + + return ( + , + action: () => setImportDialogOpen(true) + }, + { + icon: , + action: () => setQRDialogOpen(true) + } + ]} + /> + ); +}; From ec9a1b335fa961bd7c46f4cf53acdc513ffbda8c Mon Sep 17 00:00:00 2001 From: Malte Grimm Date: Sat, 17 Dec 2022 19:03:53 +0100 Subject: [PATCH 04/10] Add device list to setup page --- src/components/SidebarSetup.tsx | 25 ++++++++++++++++++++++++- src/components/form/Button.tsx | 4 +++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/components/SidebarSetup.tsx b/src/components/SidebarSetup.tsx index 1ca7b01d..dbab6dd6 100644 --- a/src/components/SidebarSetup.tsx +++ b/src/components/SidebarSetup.tsx @@ -13,6 +13,8 @@ import { Types } from "@meshtastic/meshtasticjs"; import { Input } from "./form/Input.js"; import { Mono } from "./generic/Mono.js"; +import { useState } from "react"; +import { Button } from "./form/Button.js"; export const SidebarSetup = (): JSX.Element => { // const { removeDevice } = useDeviceStore(); @@ -21,10 +23,31 @@ export const SidebarSetup = (): JSX.Element => { useAppStore(); // const myNode = nodes.find((n) => n.data.num === hardware.myNodeNum); + const { getDevices } = useDeviceStore(); + const devices = getDevices(); + const [devicesToFlash, setSelectedToFlash] = useState(devices.map(d => false)); + console.log(`Device 0: ${devicesToFlash[0]}`); + return (
- {Test} +
+ {devices.map((device, index) => ( + + ))} + +
{Test2}
diff --git a/src/components/form/Button.tsx b/src/components/form/Button.tsx index db071be9..0f29064f 100644 --- a/src/components/form/Button.tsx +++ b/src/components/form/Button.tsx @@ -3,11 +3,13 @@ import type { ButtonHTMLAttributes } from "react"; export interface ButtonProps extends ButtonHTMLAttributes { size?: "sm" | "md" | "lg"; + color?: string; iconBefore?: JSX.Element; } export const Button = ({ size = "md", + color = "bg-accentMuted", iconBefore, children, disabled, @@ -16,7 +18,7 @@ export const Button = ({ }: ButtonProps): JSX.Element => { return (
-
{Test2}
+
{(Configurations go here)}
); diff --git a/src/core/stores/deviceStore.ts b/src/core/stores/deviceStore.ts index 61a499cc..a39a7492 100644 --- a/src/core/stores/deviceStore.ts +++ b/src/core/stores/deviceStore.ts @@ -70,6 +70,7 @@ export interface Device { shutdownDialogOpen: boolean; rebootDialogOpen: boolean; pendingSettingsChanges: boolean; + selectedToFlash: boolean; setReady(ready: boolean): void; setStatus: (status: Types.DeviceStatusEnum) => void; @@ -81,6 +82,7 @@ export interface Device { setPeerInfoOpen: (open: boolean) => void; setActivePeer: (peer: number) => void; setPendingSettingsChanges: (state: boolean) => void; + setSelectedToFlash: (state: boolean) => void; addChannel: (channel: Channel) => void; addWaypoint: (waypoint: Protobuf.Waypoint) => void; addNodeInfo: (nodeInfo: Protobuf.NodeInfo) => void; @@ -142,6 +144,7 @@ export const useDeviceStore = create((set, get) => ({ shutdownDialogOpen: false, rebootDialogOpen: false, pendingSettingsChanges: false, + selectedToFlash: false, setReady: (ready: boolean) => { set( @@ -313,6 +316,16 @@ export const useDeviceStore = create((set, get) => ({ }) ); }, + setSelectedToFlash: (state) => { + set( + produce((draft) => { + const device = draft.devices.get(id); + if (device) { + device.selectedToFlash = state; + } + }) + ); + }, addChannel: (channel: Channel) => { set( produce((draft) => { diff --git a/src/pages/Setup.tsx b/src/pages/Setup.tsx index 4e417417..b4caeaf0 100644 --- a/src/pages/Setup.tsx +++ b/src/pages/Setup.tsx @@ -8,10 +8,31 @@ import { ArrowDownOnSquareStackIcon, QrCodeIcon } from "@heroicons/react/24/outline"; -import { Protobuf } from "@meshtastic/meshtasticjs"; +import { IBLEConnection, ISerialConnection, Protobuf } from "@meshtastic/meshtasticjs"; import { Mono } from "@app/components/generic/Mono"; +import { useDeviceStore } from "@app/core/stores/deviceStore"; export const SetupPage = (): JSX.Element => { + const { getDevices } = useDeviceStore(); + const devices = getDevices(); + + return ( +
+ Devices to flash: {devices.filter(d => d.selectedToFlash).length}/{devices.length}
+ +
+ ); + + return ( Setup page goes here ) const { channels, setQRDialogOpen, setImportDialogOpen } = useDevice(); From 4822684c7ae1c42538508b67c52e55db8fe37c58 Mon Sep 17 00:00:00 2001 From: Malte Grimm Date: Sun, 18 Dec 2022 19:28:24 +0100 Subject: [PATCH 07/10] Start on flashing --- package.json | 1 + pnpm-lock.yaml | 6 ++ .../PageComponents/Connect/Serial.tsx | 1 + src/components/SidebarSetup.tsx | 12 ++- src/core/stores/configStore.ts | 26 ------- src/core/stores/deviceStore.ts | 30 ++++++++ src/pages/Setup.tsx | 76 ++++++++++--------- 7 files changed, 88 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 1eecf11d..0d7ea2df 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@hookform/resolvers": "^2.9.10", "@meshtastic/meshtasticjs": "^0.9.8", "@tailwindcss/typography": "^0.5.8", + "@toit/esptool.js": "^0.12.3", "@turf/turf": "^6.5.0", "base64-js": "^1.5.1", "chart.js": "^4.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2b06b49..9cdbb8f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,7 @@ specifiers: '@meshtastic/meshtasticjs': ^0.9.8 '@tailwindcss/forms': ^0.5.3 '@tailwindcss/typography': ^0.5.8 + '@toit/esptool.js': ^0.12.3 '@turf/turf': ^6.5.0 '@types/chrome': ^0.0.206 '@types/geodesy': ^2.2.3 @@ -72,6 +73,7 @@ dependencies: '@hookform/resolvers': 2.9.10_react-hook-form@7.41.3 '@meshtastic/meshtasticjs': 0.9.8 '@tailwindcss/typography': 0.5.8_tailwindcss@3.2.4 + '@toit/esptool.js': 0.12.3 '@turf/turf': 6.5.0 base64-js: 1.5.1 chart.js: 4.1.1 @@ -1892,6 +1894,10 @@ packages: tailwindcss: 3.2.4_postcss@8.4.20 dev: false + /@toit/esptool.js/0.12.3: + resolution: {integrity: sha512-oli5WyZeSyDjjKAk5UC2hJMypmWUsI6kKUgkVihr56cKeK0KiJr4gu7LQ4IcvfduI92mm+bogLsgn9n2FXofeA==} + dev: false + /@turf/along/6.5.0: resolution: {integrity: sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==} dependencies: diff --git a/src/components/PageComponents/Connect/Serial.tsx b/src/components/PageComponents/Connect/Serial.tsx index bf315a18..ee8192ba 100644 --- a/src/components/PageComponents/Connect/Serial.tsx +++ b/src/components/PageComponents/Connect/Serial.tsx @@ -55,6 +55,7 @@ export const Serial = (): JSX.Element => { }) .catch((e: Error) => console.log(`Unable to Connect: ${e.message}`)); device.addConnection(connection); + device.setSerialPort(port); subscribeAll(device, connection); }; diff --git a/src/components/SidebarSetup.tsx b/src/components/SidebarSetup.tsx index 208dbbb0..318cf0a8 100644 --- a/src/components/SidebarSetup.tsx +++ b/src/components/SidebarSetup.tsx @@ -7,7 +7,7 @@ import { DeviceWidget } from "@components/Widgets/DeviceWidget.js"; import { PeersWidget } from "@components/Widgets/PeersWidget.js"; import { PositionWidget } from "@components/Widgets/PositionWidget.js"; import { useAppStore } from "@core/stores/appStore.js"; -import { useDeviceStore } from "@core/stores/deviceStore.js"; +import { Device, useDeviceStore } from "@core/stores/deviceStore.js"; import { CommandLineIcon } from "@heroicons/react/24/outline"; import { Types } from "@meshtastic/meshtasticjs"; @@ -42,7 +42,7 @@ export const SidebarSetup = (): JSX.Element => { }} size="sm" > - {`${device.nodes.find(d => d.data.num == device.hardware.myNodeNum)?.data.user?.longName ?? ""}`} + {`${getButtonText(device)}`} ))} @@ -54,3 +54,11 @@ export const SidebarSetup = (): JSX.Element => { ); }; + +function getButtonText(device: Device): string { + if(device.flashingProgress.step == 'flashing') + return `${(device.flashingProgress.percentage * 100).toFixed(2)}%`; + else if(device.flashingProgress.step == 'done') + return "Done" + return device.nodes.find(d => d.data.num == device.hardware.myNodeNum)?.data.user?.longName ?? ""; +} \ No newline at end of file diff --git a/src/core/stores/configStore.ts b/src/core/stores/configStore.ts index 43fe6553..e295742b 100644 --- a/src/core/stores/configStore.ts +++ b/src/core/stores/configStore.ts @@ -49,32 +49,6 @@ export const useConfigStore = create((set, get) => ({ configs: new Map(), templateConfigs: [], - // addDeviceConfig: (id: number) => { - // set( - // produce((draft) => { - // draft.configs.set(id, { - // mainConfig: Protobuf.LocalConfig.create(), - // moduleConfig: Protobuf.LocalModuleConfig.create() - // }); - // }) - // ); - // return get().configs.get(id)!; - // }, - // removeDeviceConfig: (id: number) => { - // set( - // produce((draft) => { - // draft.configs.delete(id); - // }) - // ); - // }, - // getDeviceConfigs: () => { - // const configs = get().configs; - // const posKeys = Array.from(configs.keys()).filter(id => id > 0); - // return posKeys.map(key => configs.get(key)!); - // }, - // getDeviceConfig: (id: number) => { - // return get().configs.get(id); - // } addTemplateConfig: () => { const newConfig = { config: Protobuf.LocalConfig.create(), moduleConfig: Protobuf.LocalModuleConfig.create() }; diff --git a/src/core/stores/deviceStore.ts b/src/core/stores/deviceStore.ts index a39a7492..91fb1998 100644 --- a/src/core/stores/deviceStore.ts +++ b/src/core/stores/deviceStore.ts @@ -49,6 +49,11 @@ export interface processPacketParams { time: number; } +export interface FlashingProgress { + step: 'idle' | 'erasing' | 'flashing' | 'done'; + percentage: number; +} + export interface Device { id: number; ready: boolean; @@ -71,6 +76,8 @@ export interface Device { rebootDialogOpen: boolean; pendingSettingsChanges: boolean; selectedToFlash: boolean; + serialPort?: SerialPort; // TEMP until lib let's you access the port + flashingProgress: FlashingProgress; setReady(ready: boolean): void; setStatus: (status: Types.DeviceStatusEnum) => void; @@ -83,6 +90,8 @@ export interface Device { setActivePeer: (peer: number) => void; setPendingSettingsChanges: (state: boolean) => void; setSelectedToFlash: (state: boolean) => void; + setSerialPort: (port: SerialPort) => void; + setFlashingProgress: (progress: FlashingProgress) => void; addChannel: (channel: Channel) => void; addWaypoint: (waypoint: Protobuf.Waypoint) => void; addNodeInfo: (nodeInfo: Protobuf.NodeInfo) => void; @@ -145,6 +154,7 @@ export const useDeviceStore = create((set, get) => ({ rebootDialogOpen: false, pendingSettingsChanges: false, selectedToFlash: false, + flashingProgress: { step: 'idle', percentage: 0 }, setReady: (ready: boolean) => { set( @@ -326,6 +336,26 @@ export const useDeviceStore = create((set, get) => ({ }) ); }, + setSerialPort: (port) => { + set( + produce((draft) => { + const device = draft.devices.get(id); + if (device) { + device.serialPort = port; + } + }) + ) + }, + setFlashingProgress: (progress) => { + set( + produce((draft) => { + const device = draft.devices.get(id); + if (device) { + device.flashingProgress = progress; + } + }) + ) + }, addChannel: (channel: Channel) => { set( produce((draft) => { diff --git a/src/pages/Setup.tsx b/src/pages/Setup.tsx index b4caeaf0..a669bc6d 100644 --- a/src/pages/Setup.tsx +++ b/src/pages/Setup.tsx @@ -4,62 +4,66 @@ import { TabbedContent, TabType } from "@app/components/generic/TabbedContent"; import { Channel } from "@app/components/PageComponents/Channel.js"; import { Button } from "@components/form/Button.js"; import { useDevice } from "@core/providers/useDevice.js"; +import { EspLoader } from '@toit/esptool.js'; import { ArrowDownOnSquareStackIcon, QrCodeIcon } from "@heroicons/react/24/outline"; import { IBLEConnection, ISerialConnection, Protobuf } from "@meshtastic/meshtasticjs"; import { Mono } from "@app/components/generic/Mono"; -import { useDeviceStore } from "@app/core/stores/deviceStore"; +import { FlashingProgress, useDeviceStore } from "@app/core/stores/deviceStore"; export const SetupPage = (): JSX.Element => { const { getDevices } = useDeviceStore(); const devices = getDevices(); + const devicesToFlash = devices.filter(d => d.selectedToFlash); + + let flashButtonText; + let flashButtonEnabled = false; + if(devicesToFlash.length == 0) + flashButtonText = "No device selected"; + else if(devicesToFlash.filter(d => d.flashingProgress.step == 'done').length == devicesToFlash.length) + flashButtonText = "Flashing complete"; + else { + flashButtonText = "Flash"; + flashButtonEnabled = true; + } return (
- Devices to flash: {devices.filter(d => d.selectedToFlash).length}/{devices.length}
+ Devices to flash: {devicesToFlash.length}/{devices.length}
); +}; +async function flash(port: SerialPort, setProgress: (progress: FlashingProgress) => void) { - return ( Setup page goes here ) - const { channels, setQRDialogOpen, setImportDialogOpen } = useDevice(); - - const tabs: TabType[] = channels.map((channel) => { - return { - name: channel.config.settings?.name.length - ? channel.config.settings.name - : channel.config.role === Protobuf.Channel_Role.PRIMARY - ? "Primary" - : `Channel: ${channel.config.index}`, - element: () => - }; - }); +} - return ( - , - action: () => setImportDialogOpen(true) - }, - { - icon: , - action: () => setQRDialogOpen(true) - } - ]} - /> - ); -}; +async function simulateProgress(setProgress: (progress: FlashingProgress) => void) { + let percentage = 0; + while(percentage < 1) { + setProgress({ step: 'flashing', percentage }); + await new Promise(resolve => setTimeout(resolve, Math.random() * 1000 + 1000)); + percentage += Math.random() * 0.1; + } + setProgress({ step: 'done', percentage }); +} \ No newline at end of file From aeba42bb2ce5cb06b2b6fc4a7c5a3f37a32e0bbc Mon Sep 17 00:00:00 2001 From: Malte Grimm Date: Sun, 5 Feb 2023 23:03:23 +0100 Subject: [PATCH 08/10] Fix sidebar --- src/App.tsx | 2 +- src/components/DeviceSelector.tsx | 6 ++-- src/components/DeviceSetup.tsx | 6 ++-- src/components/SidebarSetup.tsx | 48 ++++++++++++++++--------------- src/components/form/Button.tsx | 2 +- 5 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 0c17c37d..f24c6f85 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -39,7 +39,7 @@ export const App = (): JSX.Element => { ) : ( )} - {device && } + {{device && }} diff --git a/src/components/DeviceSelector.tsx b/src/components/DeviceSelector.tsx index aa2cebfb..fd373404 100644 --- a/src/components/DeviceSelector.tsx +++ b/src/components/DeviceSelector.tsx @@ -12,6 +12,8 @@ export const DeviceSelector = (): JSX.Element => { const { selectedDevice, setSelectedDevice, darkMode, setDarkMode } = useAppStore(); + console.log(`Current device: ${selectedDevice}`); + return (
@@ -44,8 +46,8 @@ export const DeviceSelector = (): JSX.Element => {
- - {selectedDevice !== 0 && ( + + {selectedDevice > 0 && ( // TODO_MG: Handle selectedDevice == -1 <> diff --git a/src/components/DeviceSetup.tsx b/src/components/DeviceSetup.tsx index 9c20069c..e0ea0504 100644 --- a/src/components/DeviceSetup.tsx +++ b/src/components/DeviceSetup.tsx @@ -17,9 +17,9 @@ export const DeviceSetup = (): JSX.Element => { return ( - - {/* */} - + { } + {/* TODO_MG: Fix these */} + {/* */} ); } \ No newline at end of file diff --git a/src/components/SidebarSetup.tsx b/src/components/SidebarSetup.tsx index 318cf0a8..2bb2db5b 100644 --- a/src/components/SidebarSetup.tsx +++ b/src/components/SidebarSetup.tsx @@ -28,29 +28,31 @@ export const SidebarSetup = (): JSX.Element => { const devicesToFlash = devices.map(d => d.selectedToFlash); return ( -
-
-
- {devices.map((device, index) => ( - - ))} - -
-
-
-
{(Configurations go here)}
- +
+
+
+
+ {devices.map((device, index) => ( + + ))} + +
+
+
+
{(Configurations go here)}
+ +
); }; diff --git a/src/components/form/Button.tsx b/src/components/form/Button.tsx index bcab4a6c..d668cf53 100644 --- a/src/components/form/Button.tsx +++ b/src/components/form/Button.tsx @@ -14,7 +14,7 @@ export const Button = ({ }: ButtonProps): JSX.Element => { return (
-
{(Configurations go here)}
+
{ +
+ {[ currentConfig ].map((c, index) => ( + + ))} + +
+ } +
{ + + }{ + + }
+
- // ); };