From d0a88fdc7209ae23974f399e4a9d92070fd9eb2a Mon Sep 17 00:00:00 2001 From: Bernt Christian Egeland Date: Sun, 14 Jan 2024 15:39:23 +0000 Subject: [PATCH 1/5] added qr code in networks --- package-lock.json | 151 +++++++++++++++++++++++++++++++++---- package.json | 3 +- src/pages/network/[id].tsx | 20 +++++ 3 files changed, 158 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index c04a3c45..c7a7d13f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "next": "14.0.3", "next-auth": "4.24.5", "next-intl": "3.1.4", + "next-qrcode": "^2.5.1", "next-themes": "^0.2.1", "nodemailer": "^6.9.4", "pug": "^3.0.2", @@ -2965,7 +2966,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3530,7 +3530,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, "engines": { "node": ">=6" } @@ -4071,6 +4070,14 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -4242,6 +4249,11 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -4367,8 +4379,12 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -4720,7 +4736,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4864,7 +4879,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -5402,7 +5416,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -7115,7 +7128,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -7517,6 +7529,21 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/next-qrcode": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/next-qrcode/-/next-qrcode-2.5.1.tgz", + "integrity": "sha512-ibiS1+p+myjurC1obVIgo7UCjFhxm0SNYTkikahQVmnyzlfREOdUCf2f77Vbz6W6q2zfx5Eww2/20vbgkLNdLw==", + "dependencies": { + "qrcode": "^1.5.3" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, "node_modules/next-themes": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", @@ -7781,7 +7808,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -7793,7 +7819,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -7808,7 +7833,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -7847,7 +7871,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -7921,6 +7944,14 @@ "node": ">=8" } }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -8382,6 +8413,84 @@ } ] }, + "node_modules/qrcode": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", + "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -8642,11 +8751,15 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -8836,6 +8949,11 @@ "semver": "bin/semver.js" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/set-function-length": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", @@ -9202,7 +9320,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9216,7 +9333,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10161,6 +10277,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, "node_modules/which-typed-array": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", diff --git a/package.json b/package.json index 3e3f08ef..87ccf592 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "next": "14.0.3", "next-auth": "4.24.5", "next-intl": "3.1.4", + "next-qrcode": "^2.5.1", "next-themes": "^0.2.1", "nodemailer": "^6.9.4", "pug": "^3.0.2", @@ -105,4 +106,4 @@ "prisma": { "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" } -} \ No newline at end of file +} diff --git a/src/pages/network/[id].tsx b/src/pages/network/[id].tsx index 070a76e5..76f14a59 100644 --- a/src/pages/network/[id].tsx +++ b/src/pages/network/[id].tsx @@ -26,6 +26,7 @@ import { globalSiteTitle } from "~/utils/global"; import { getServerSideProps } from "~/server/getServerSideProps"; import useOrganizationWebsocket from "~/hooks/useOrganizationWebsocket"; import NetworkLoadingSkeleton from "~/components/shared/networkLoadingSkeleton"; +import { useQRCode } from "next-qrcode"; const HeadSection = ({ title }: { title: string }) => ( @@ -46,6 +47,8 @@ interface IProps { const NetworkById = ({ orgIds }: IProps) => { const b = useTranslations("commonButtons"); const t = useTranslations("networkById"); + const { Image } = useQRCode(); + const [state, setState] = useState({ viewZombieTable: false, isDebug: false, @@ -152,6 +155,23 @@ const NetworkById = ({ orgIds }: IProps) => { +
+ +
From 8657fabee639b2e152e883314d28fcaa6fcc9f7a Mon Sep 17 00:00:00 2001 From: Bernt Christian Egeland Date: Sun, 14 Jan 2024 19:00:23 +0000 Subject: [PATCH 2/5] first test --- package-lock.json | 156 ++++++------------------------------- package.json | 2 +- src/pages/network/[id].tsx | 117 +++++++++++++++++++++++----- 3 files changed, 121 insertions(+), 154 deletions(-) diff --git a/package-lock.json b/package-lock.json index c7a7d13f..efb0c4eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,10 +40,10 @@ "next": "14.0.3", "next-auth": "4.24.5", "next-intl": "3.1.4", - "next-qrcode": "^2.5.1", "next-themes": "^0.2.1", "nodemailer": "^6.9.4", "pug": "^3.0.2", + "qrcode.react": "^3.1.0", "react": "18.2.0", "react-copy-to-clipboard": "^5.1.0", "react-datepicker": "^4.21.0", @@ -2966,6 +2966,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -3530,6 +3531,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "engines": { "node": ">=6" } @@ -4070,14 +4072,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -4249,11 +4243,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dijkstrajs": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", - "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -4379,12 +4368,8 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -4736,6 +4721,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4879,6 +4865,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -5416,6 +5403,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "engines": { "node": ">=8" } @@ -7128,6 +7116,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -7529,21 +7518,6 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/next-qrcode": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/next-qrcode/-/next-qrcode-2.5.1.tgz", - "integrity": "sha512-ibiS1+p+myjurC1obVIgo7UCjFhxm0SNYTkikahQVmnyzlfREOdUCf2f77Vbz6W6q2zfx5Eww2/20vbgkLNdLw==", - "dependencies": { - "qrcode": "^1.5.3" - }, - "engines": { - "node": ">=8", - "npm": ">=5" - }, - "peerDependencies": { - "react": ">=17.0.0" - } - }, "node_modules/next-themes": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", @@ -7808,6 +7782,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -7819,6 +7794,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -7833,6 +7809,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } @@ -7871,6 +7848,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -7944,14 +7922,6 @@ "node": ">=8" } }, - "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -8413,82 +8383,12 @@ } ] }, - "node_modules/qrcode": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", - "dependencies": { - "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", - "pngjs": "^5.0.0", - "yargs": "^15.3.1" - }, - "bin": { - "qrcode": "bin/qrcode" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/qrcode/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/qrcode/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qrcode/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/qrcode/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qrcode/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/querystringify": { @@ -8751,15 +8651,11 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -8949,11 +8845,6 @@ "semver": "bin/semver.js" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "node_modules/set-function-length": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", @@ -9320,6 +9211,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9333,6 +9225,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10277,11 +10170,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" - }, "node_modules/which-typed-array": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", diff --git a/package.json b/package.json index 87ccf592..eac787ee 100644 --- a/package.json +++ b/package.json @@ -47,10 +47,10 @@ "next": "14.0.3", "next-auth": "4.24.5", "next-intl": "3.1.4", - "next-qrcode": "^2.5.1", "next-themes": "^0.2.1", "nodemailer": "^6.9.4", "pug": "^3.0.2", + "qrcode.react": "^3.1.0", "react": "18.2.0", "react-copy-to-clipboard": "^5.1.0", "react-datepicker": "^4.21.0", diff --git a/src/pages/network/[id].tsx b/src/pages/network/[id].tsx index 76f14a59..6b2fc598 100644 --- a/src/pages/network/[id].tsx +++ b/src/pages/network/[id].tsx @@ -1,5 +1,5 @@ import { useRouter } from "next/router"; -import { useState, type ReactElement } from "react"; +import { useState, type ReactElement, useEffect, useRef } from "react"; import { LayoutAuthenticated } from "~/components/layouts/layout"; import { NettworkRoutes } from "~/components/networkByIdPage/networkRoutes"; import { NetworkMembersTable } from "~/components/networkByIdPage/table/networkMembersTable"; @@ -26,7 +26,9 @@ import { globalSiteTitle } from "~/utils/global"; import { getServerSideProps } from "~/server/getServerSideProps"; import useOrganizationWebsocket from "~/hooks/useOrganizationWebsocket"; import NetworkLoadingSkeleton from "~/components/shared/networkLoadingSkeleton"; -import { useQRCode } from "next-qrcode"; +import { QRCodeSVG } from "qrcode.react"; +import daisyuiColors from "daisyui/src/theming/themes"; +import { useTheme } from "next-themes"; const HeadSection = ({ title }: { title: string }) => ( @@ -46,14 +48,23 @@ interface IProps { const NetworkById = ({ orgIds }: IProps) => { const b = useTranslations("commonButtons"); + const [themeRGBColor, setThemeRGBColor] = useState(""); + const { theme } = useTheme(); const t = useTranslations("networkById"); - const { Image } = useQRCode(); - + // const { Image } = useQRCode(); + const qrRef = useRef(null); const [state, setState] = useState({ viewZombieTable: false, isDebug: false, }); + useEffect(() => { + // console.log(theme); + // const selectedTheme = document.documentElement.getAttribute("data-theme"); + // Assuming the themes are structured in an array or object + setThemeRGBColor(daisyuiColors[theme]?.primary); + }, [theme]); + useOrganizationWebsocket(orgIds); const { callModal } = useModalStore((state) => state); @@ -122,6 +133,68 @@ const NetworkById = ({ orgIds }: IProps) => { ); } + const svgcopyToClipboard = () => { + if (qrRef.current) { + const originalSvgElement = qrRef.current.querySelector("svg"); + if (!originalSvgElement) { + console.error("QR code SVG element not found"); + return; + } + + // Serialize and parse the original SVG to ensure a proper clone + const serializedSvg = new XMLSerializer().serializeToString(originalSvgElement); + const clonedSvgElement = new DOMParser().parseFromString( + serializedSvg, + "image/svg+xml", + ).documentElement; + + // Set the first path element to white + const firstPath = clonedSvgElement.querySelector("path"); + if (firstPath) { + firstPath.setAttribute("fill", "#FFFFFF"); + } + + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + + const svgBlob = new Blob( + [new XMLSerializer().serializeToString(clonedSvgElement)], + { type: "image/svg+xml" }, + ); + const url = URL.createObjectURL(svgBlob); + + const image = new Image(); + image.onload = () => { + canvas.width = image.width; + canvas.height = image.height; + ctx.drawImage(image, 0, 0); + URL.revokeObjectURL(url); + + // Convert canvas to PNG + const pngUrl = canvas.toDataURL("image/png"); + + // Create a temporary link to trigger download + const downloadLink = document.createElement("a"); + downloadLink.href = pngUrl; + downloadLink.download = `qr-${query.id}.png`; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + }; + + image.onerror = () => { + console.error("Error loading SVG image"); + URL.revokeObjectURL(url); + }; + + image.src = url; + } else { + console.error("QR ref not found"); + } + }; + + // In your React component + ; return (
@@ -155,21 +228,27 @@ const NetworkById = ({ orgIds }: IProps) => {
-
- + {/*
From 2eab4767e990703ab4da293da5cfb47ac7ef9b43 Mon Sep 17 00:00:00 2001 From: Bernt Christian Egeland Date: Mon, 8 Apr 2024 15:43:09 +0200 Subject: [PATCH 3/5] cleanup --- src/pages/network/[id].tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/network/[id].tsx b/src/pages/network/[id].tsx index 6b2fc598..f3c147d5 100644 --- a/src/pages/network/[id].tsx +++ b/src/pages/network/[id].tsx @@ -233,9 +233,8 @@ const NetworkById = ({ orgIds }: IProps) => { className="shadow-md cursor-pointer" onClick={svgcopyToClipboard} > - {/* Date: Mon, 8 Apr 2024 16:07:14 +0200 Subject: [PATCH 4/5] qr layout --- .../networkByIdPage/networkQrCode.tsx | 53 ++++++++ src/pages/network/[id].tsx | 114 ++---------------- src/pages/organization/[orgid]/[id].tsx | 61 +++++----- 3 files changed, 94 insertions(+), 134 deletions(-) create mode 100644 src/components/networkByIdPage/networkQrCode.tsx diff --git a/src/components/networkByIdPage/networkQrCode.tsx b/src/components/networkByIdPage/networkQrCode.tsx new file mode 100644 index 00000000..80e79697 --- /dev/null +++ b/src/components/networkByIdPage/networkQrCode.tsx @@ -0,0 +1,53 @@ +import { useTheme } from "next-themes"; +import { QRCodeSVG } from "qrcode.react"; +import React, { useEffect, useState } from "react"; +import { CopyToClipboard } from "react-copy-to-clipboard"; +import toast from "react-hot-toast"; +import daisyuiColors from "daisyui/src/theming/themes"; +import { useTranslations } from "next-intl"; + +interface IProps { + networkId: string; +} + +const urlBuilder = (networkId: string) => { + return `https://joinzt.com/addnetwork?nwid=${networkId}&v=1`; +}; + +const NetworkQrCode = ({ networkId }: IProps) => { + const t = useTranslations("networkById"); + const [themeRGBColor, setThemeRGBColor] = useState(""); + const { theme } = useTheme(); + + useEffect(() => { + setThemeRGBColor(daisyuiColors[theme]?.primary); + }, [theme]); + + return ( + + toast.success( + t("copyToClipboard.success", { + element: urlBuilder(networkId), + }), + { + id: "copyNwid", + }, + ) + } + title={t("copyToClipboard.title")} + > + + + ); +}; + +export default NetworkQrCode; diff --git a/src/pages/network/[id].tsx b/src/pages/network/[id].tsx index 0f231593..b039a21f 100644 --- a/src/pages/network/[id].tsx +++ b/src/pages/network/[id].tsx @@ -1,5 +1,5 @@ import { useRouter } from "next/router"; -import { useState, type ReactElement, useEffect, useRef } from "react"; +import { useState, type ReactElement } from "react"; import { LayoutAuthenticated } from "~/components/layouts/layout"; import { NettworkRoutes } from "~/components/networkByIdPage/networkRoutes"; import { NetworkMembersTable } from "~/components/networkByIdPage/table/networkMembersTable"; @@ -26,9 +26,7 @@ import { globalSiteTitle } from "~/utils/global"; import { getServerSideProps } from "~/server/getServerSideProps"; import useOrganizationWebsocket from "~/hooks/useOrganizationWebsocket"; import NetworkLoadingSkeleton from "~/components/shared/networkLoadingSkeleton"; -import { QRCodeSVG } from "qrcode.react"; -import daisyuiColors from "daisyui/src/theming/themes"; -import { useTheme } from "next-themes"; +import NetworkQrCode from "~/components/networkByIdPage/networkQrCode"; const HeadSection = ({ title }: { title: string }) => ( @@ -48,23 +46,12 @@ interface IProps { const NetworkById = ({ orgIds }: IProps) => { const b = useTranslations("commonButtons"); - const [themeRGBColor, setThemeRGBColor] = useState(""); - const { theme } = useTheme(); const t = useTranslations("networkById"); - // const { Image } = useQRCode(); - const qrRef = useRef(null); const [state, setState] = useState({ viewZombieTable: false, isDebug: false, }); - useEffect(() => { - // console.log(theme); - // const selectedTheme = document.documentElement.getAttribute("data-theme"); - // Assuming the themes are structured in an array or object - setThemeRGBColor(daisyuiColors[theme]?.primary); - }, [theme]); - useOrganizationWebsocket(orgIds); const { callModal } = useModalStore((state) => state); @@ -132,74 +119,12 @@ const NetworkById = ({ orgIds }: IProps) => { ); } - const svgcopyToClipboard = () => { - if (qrRef.current) { - const originalSvgElement = qrRef.current.querySelector("svg"); - if (!originalSvgElement) { - console.error("QR code SVG element not found"); - return; - } - - // Serialize and parse the original SVG to ensure a proper clone - const serializedSvg = new XMLSerializer().serializeToString(originalSvgElement); - const clonedSvgElement = new DOMParser().parseFromString( - serializedSvg, - "image/svg+xml", - ).documentElement; - - // Set the first path element to white - const firstPath = clonedSvgElement.querySelector("path"); - if (firstPath) { - firstPath.setAttribute("fill", "#FFFFFF"); - } - - const canvas = document.createElement("canvas"); - const ctx = canvas.getContext("2d"); - - const svgBlob = new Blob( - [new XMLSerializer().serializeToString(clonedSvgElement)], - { type: "image/svg+xml" }, - ); - const url = URL.createObjectURL(svgBlob); - - const image = new Image(); - image.onload = () => { - canvas.width = image.width; - canvas.height = image.height; - ctx.drawImage(image, 0, 0); - URL.revokeObjectURL(url); - - // Convert canvas to PNG - const pngUrl = canvas.toDataURL("image/png"); - - // Create a temporary link to trigger download - const downloadLink = document.createElement("a"); - downloadLink.href = pngUrl; - downloadLink.download = `qr-${query.id}.png`; - document.body.appendChild(downloadLink); - downloadLink.click(); - document.body.removeChild(downloadLink); - }; - - image.onerror = () => { - console.error("Error loading SVG image"); - URL.revokeObjectURL(url); - }; - - image.src = url; - } else { - console.error("QR ref not found"); - } - }; - - // In your React component - ; return (
-
-
+
+
{t("networkId")} @@ -226,31 +151,12 @@ const NetworkById = ({ orgIds }: IProps) => {
-
-
- -
-
- +
+ +
+
+ +
diff --git a/src/pages/organization/[orgid]/[id].tsx b/src/pages/organization/[orgid]/[id].tsx index d08675a5..f578362a 100644 --- a/src/pages/organization/[orgid]/[id].tsx +++ b/src/pages/organization/[orgid]/[id].tsx @@ -26,6 +26,7 @@ import { getServerSideProps } from "~/server/getServerSideProps"; import useOrganizationWebsocket from "~/hooks/useOrganizationWebsocket"; import NetworkLoadingSkeleton from "~/components/shared/networkLoadingSkeleton"; import HeadSection from "~/components/shared/metaTags"; +import NetworkQrCode from "~/components/networkByIdPage/networkQrCode"; type OrganizationId = { id: string; @@ -115,40 +116,40 @@ const OrganizationNetworkById = ({ orgIds }: IProps) => {
-
+
{/* Left section with network ID, name, and description */} -
-
- {/* Network ID */} -
- {t("networkId")} - - - toast.success( - t("copyToClipboard.success", { element: network?.nwid }), - { id: "copyNwid" }, - ) - } - title={t("copyToClipboard.title")} - > -
- {network?.nwid} - -
-
-
-
- {/* Network Name */} - - {/* Network Description */} - +
+ {/* Network ID */} +
+ {t("networkId")} + + + toast.success( + t("copyToClipboard.success", { element: network?.nwid }), + { id: "copyNwid" }, + ) + } + title={t("copyToClipboard.title")} + > +
+ {network?.nwid} + +
+
+
+ {/* Network Name */} + + {/* Network Description */} + +
+
+
- {/* Right section with NetworkPrivatePublic */} -
+
From 85b1ed72d70658c17dcfb25943f05c159943b922 Mon Sep 17 00:00:00 2001 From: Bernt Christian Egeland Date: Mon, 8 Apr 2024 16:18:44 +0200 Subject: [PATCH 5/5] qr code --- src/pages/central/[id].tsx | 10 ++++++++-- src/pages/network/[id].tsx | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/pages/central/[id].tsx b/src/pages/central/[id].tsx index 9a32f8c4..9f30aac2 100644 --- a/src/pages/central/[id].tsx +++ b/src/pages/central/[id].tsx @@ -25,6 +25,7 @@ import { NetworkDns } from "~/components/networkByIdPage/networkDns"; import { getServerSideProps } from "~/server/getServerSideProps"; import useOrganizationWebsocket from "~/hooks/useOrganizationWebsocket"; import NetworkLoadingSkeleton from "~/components/shared/networkLoadingSkeleton"; +import NetworkQrCode from "~/components/networkByIdPage/networkQrCode"; const HeadSection = ({ title }: { title: string }) => ( @@ -91,7 +92,7 @@ const CentralNetworkById = ({ orgIds }) => {
-
+
{t("networkId")} @@ -118,8 +119,13 @@ const CentralNetworkById = ({ orgIds }) => {
+
+ +
+
+ +
-
diff --git a/src/pages/network/[id].tsx b/src/pages/network/[id].tsx index b039a21f..5a549dee 100644 --- a/src/pages/network/[id].tsx +++ b/src/pages/network/[id].tsx @@ -123,7 +123,7 @@ const NetworkById = ({ orgIds }: IProps) => { return (
-
+