diff --git a/web/package-lock.json b/web/package-lock.json index ca15e9e5..038a9f85 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -350,278 +350,6 @@ "node": ">=18" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@esbuild/linux-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", @@ -639,159 +367,6 @@ "node": ">=12" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -3176,216 +2751,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", - "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", - "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", - "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", - "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", - "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", - "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", - "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", - "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", - "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", - "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", - "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", - "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", - "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", - "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", - "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.52.5", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", @@ -3414,76 +2779,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", - "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", - "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", - "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", - "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", - "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@scure/base": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", @@ -3671,91 +2966,6 @@ } } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.13.5.tgz", - "integrity": "sha512-lKNv7SujeXvKn16gvQqUQI5DdyY8v7xcoO3k06/FJbHJS90zEwZdQiMNRiqpYw/orU543tPaWgz7cIYWhbopiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.13.5.tgz", - "integrity": "sha512-ILd38Fg/w23vHb0yVjlWvQBoE37ZJTdlLHa8LRCFDdX4WKfnVBiblsCU9ar4QTMNdeTBEX9iUF4IrbNWhaF1Ng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.13.5.tgz", - "integrity": "sha512-Q6eS3Pt8GLkXxqz9TAw+AUk9HpVJt8Uzm54MvPsqp2yuGmY0/sNaPPNVqctCX9fu/Nu8eaWUen0si6iEiCsazQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.13.5.tgz", - "integrity": "sha512-aNDfeN+9af+y+M2MYfxCzCy/VDq7Z5YIbMqRI739o8Ganz6ST+27kjQFd8Y/57JN/hcnUEa9xqdS3XY7WaVtSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.13.5.tgz", - "integrity": "sha512-9+ZxFN5GJag4CnYnq6apKTnnezpfJhCumyz0504/JbHLo+Ue+ZtJnf3RhyA9W9TINtLE0bC4hKpWi8ZKoETyOQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@swc/core-linux-x64-gnu": { "version": "1.13.5", "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.13.5.tgz", @@ -3790,57 +3000,6 @@ "node": ">=10" } }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.13.5.tgz", - "integrity": "sha512-cZ6UpumhF9SDJvv4DA2fo9WIzlNFuKSkZpZmPG1c+4PFSEMy5DFOjBSllCvnqihCabzXzpn6ykCwBmHpy31vQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.13.5.tgz", - "integrity": "sha512-C5Yi/xIikrFUzZcyGj9L3RpKljFvKiDMtyDzPKzlsDrKIw2EYY+bF88gB6oGY5RGmv4DAX8dbnpRAqgFD0FMEw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.13.5.tgz", - "integrity": "sha512-YrKdMVxbYmlfybCSbRtrilc6UA8GF5aPmGKBdPvjrarvsmf4i7ZHGCEnLtfOMd3Lwbs2WUZq3WdMbozYeLU93Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -3973,6 +3132,20 @@ } } }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -6508,20 +5681,6 @@ "url": "https://github.com/sponsors/rawify" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -10391,278 +9550,6 @@ } } }, - "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/vitest/node_modules/@esbuild/linux-x64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", @@ -10680,108 +9567,6 @@ "node": ">=18" } }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/vitest/node_modules/@vitest/mocker": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.10.tgz", diff --git a/web/src/App.tsx b/web/src/App.tsx index f8f011b5..92987f6c 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,23 +1,6 @@ -import { useEffect } from 'react'; +import { useEffect, lazy, Suspense } from 'react'; import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom'; import { ThemeProvider } from '@/components/theme-provider'; -import Index from '@/pages/Index'; -import Login from '@/pages/Login'; -import Dashboard from '@/pages/Dashboard'; -import EmailVerification from '@/pages/EmailVerification'; -import PasswordReset from '@/pages/PasswordReset'; -import ProfileSettings from '@/pages/ProfileSettings'; -import AdminPanel from '@/pages/AdminPanel'; -import WalletDashboard from './pages/WalletDashboard'; -import ReservesDashboardPage from './pages/ReservesDashboardPage'; -import BeCitizen from './pages/BeCitizen'; -import Citizens from './pages/Citizens'; -import CitizensIssues from './pages/citizens/CitizensIssues'; -import GovernmentEntrance from './pages/citizens/GovernmentEntrance'; -import Elections from './pages/Elections'; -import EducationPlatform from './pages/EducationPlatform'; -import P2PPlatform from './pages/P2PPlatform'; -import { DEXDashboard } from './components/dex/DEXDashboard'; import { AppProvider } from '@/contexts/AppContext'; import { PolkadotProvider } from '@/contexts/PolkadotContext'; import { WalletProvider } from '@/contexts/WalletContext'; @@ -27,12 +10,38 @@ import { AuthProvider } from '@/contexts/AuthContext'; import { DashboardProvider } from '@/contexts/DashboardContext'; import { ReferralProvider } from '@/contexts/ReferralContext'; import { ProtectedRoute } from '@/components/ProtectedRoute'; -import NotFound from '@/pages/NotFound'; import { Toaster } from '@/components/ui/toaster'; import { ErrorBoundary } from '@/components/ErrorBoundary'; import './App.css'; import './i18n/config'; +// Lazy load pages for code splitting +const Index = lazy(() => import('@/pages/Index')); +const Login = lazy(() => import('@/pages/Login')); +const Dashboard = lazy(() => import('@/pages/Dashboard')); +const EmailVerification = lazy(() => import('@/pages/EmailVerification')); +const PasswordReset = lazy(() => import('@/pages/PasswordReset')); +const ProfileSettings = lazy(() => import('@/pages/ProfileSettings')); +const AdminPanel = lazy(() => import('@/pages/AdminPanel')); +const WalletDashboard = lazy(() => import('./pages/WalletDashboard')); +const ReservesDashboardPage = lazy(() => import('./pages/ReservesDashboardPage')); +const BeCitizen = lazy(() => import('./pages/BeCitizen')); +const Citizens = lazy(() => import('./pages/Citizens')); +const CitizensIssues = lazy(() => import('./pages/citizens/CitizensIssues')); +const GovernmentEntrance = lazy(() => import('./pages/citizens/GovernmentEntrance')); +const Elections = lazy(() => import('./pages/Elections')); +const EducationPlatform = lazy(() => import('./pages/EducationPlatform')); +const P2PPlatform = lazy(() => import('./pages/P2PPlatform')); +const DEXDashboard = lazy(() => import('./components/dex/DEXDashboard').then(m => ({ default: m.DEXDashboard }))); +const NotFound = lazy(() => import('@/pages/NotFound')); + +// Loading component +const PageLoader = () => ( +
+
+
+); + function ReferralHandler() { const location = useLocation(); @@ -44,7 +53,9 @@ function ReferralHandler() { if (refParam) { // Store referrer address in localStorage localStorage.setItem('referrerAddress', refParam); - console.log('Referrer address saved:', refParam); + if (import.meta.env.DEV) { + console.log('Referrer address saved:', refParam); + } } }, [location]); @@ -52,12 +63,14 @@ function ReferralHandler() { } function App() { + const endpoint = import.meta.env.VITE_WS_ENDPOINT || 'ws://127.0.0.1:9944'; + return ( - + @@ -65,63 +78,64 @@ function App() { - - } /> - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - - - - } /> - - - - } /> - - - - } /> - - - - } /> - - - - } /> - - - - } /> - - - - } /> - - - - } /> - - - - } /> - } /> - + }> + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + } /> + + + + } /> + + + + } /> + + + + } /> + + + + } /> + + + + } /> + + + + } /> + + + + } /> + + + + } /> + } /> + + diff --git a/web/src/components/AccountBalance.tsx b/web/src/components/AccountBalance.tsx index 5275bc3f..c33f94f9 100644 --- a/web/src/components/AccountBalance.tsx +++ b/web/src/components/AccountBalance.tsx @@ -82,7 +82,7 @@ export const AccountBalance: React.FC = () => { if (!api || !isApiReady) return; try { - console.log('💰 Fetching token prices from pools...'); + if (import.meta.env.DEV) console.log('💰 Fetching token prices from pools...'); // Import utilities for pool account derivation const { stringToU8a } = await import('@polkadot/util'); @@ -108,10 +108,10 @@ export const AccountBalance: React.FC = () => { // Calculate price: 1 HEZ = ? USD const hezPrice = Number(reserve1 * BigInt(10 ** 12)) / Number(reserve0 * BigInt(10 ** 6)); - console.log('✅ HEZ price:', hezPrice, 'USD'); + if (import.meta.env.DEV) console.log('✅ HEZ price:', hezPrice, 'USD'); setHezUsdPrice(hezPrice); } else { - console.warn('⚠️ wHEZ/wUSDT pool has no reserves'); + if (import.meta.env.DEV) console.warn('⚠️ wHEZ/wUSDT pool has no reserves'); } // Fetch PEZ/wUSDT pool reserves (Asset 1 / Asset 2) @@ -133,13 +133,13 @@ export const AccountBalance: React.FC = () => { // Calculate price: 1 PEZ = ? USD const pezPrice = Number(reserve1 * BigInt(10 ** 12)) / Number(reserve0 * BigInt(10 ** 6)); - console.log('✅ PEZ price:', pezPrice, 'USD'); + if (import.meta.env.DEV) console.log('✅ PEZ price:', pezPrice, 'USD'); setPezUsdPrice(pezPrice); } else { - console.warn('⚠️ PEZ/wUSDT pool has no reserves'); + if (import.meta.env.DEV) console.warn('⚠️ PEZ/wUSDT pool has no reserves'); } } catch (error) { - console.error('❌ Failed to fetch token prices:', error); + if (import.meta.env.DEV) console.error('❌ Failed to fetch token prices:', error); } }; @@ -210,13 +210,13 @@ export const AccountBalance: React.FC = () => { }); } } catch (error) { - console.error(`Failed to fetch token ${assetId}:`, error); + if (import.meta.env.DEV) console.error(`Failed to fetch token ${assetId}:`, error); } } setOtherTokens(tokens); } catch (error) { - console.error('Failed to fetch other tokens:', error); + if (import.meta.env.DEV) console.error('Failed to fetch other tokens:', error); } }; @@ -258,7 +258,7 @@ export const AccountBalance: React.FC = () => { setPezBalance('0'); } } catch (error) { - console.error('Failed to fetch PEZ balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch PEZ balance:', error); setPezBalance('0'); } @@ -277,7 +277,7 @@ export const AccountBalance: React.FC = () => { setUsdtBalance('0'); } } catch (error) { - console.error('Failed to fetch USDT balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch USDT balance:', error); setUsdtBalance('0'); } @@ -287,7 +287,7 @@ export const AccountBalance: React.FC = () => { // Fetch other tokens await fetchOtherTokens(); } catch (error) { - console.error('Failed to fetch balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch balance:', error); } finally { setIsLoading(false); } @@ -342,7 +342,7 @@ export const AccountBalance: React.FC = () => { const userScores = await getAllScores(api, selectedAccount.address); setScores(userScores); } catch (err) { - console.error('Failed to fetch scores:', err); + if (import.meta.env.DEV) console.error('Failed to fetch scores:', err); setScores({ trustScore: 0, referralScore: 0, @@ -406,7 +406,7 @@ export const AccountBalance: React.FC = () => { } ); } catch (error) { - console.error('Failed to subscribe to PEZ balance:', error); + if (import.meta.env.DEV) console.error('Failed to subscribe to PEZ balance:', error); } // Subscribe to USDT balance (wUSDT - Asset ID: 2) @@ -428,7 +428,7 @@ export const AccountBalance: React.FC = () => { } ); } catch (error) { - console.error('Failed to subscribe to USDT balance:', error); + if (import.meta.env.DEV) console.error('Failed to subscribe to USDT balance:', error); } }; diff --git a/web/src/components/AddLiquidityModal.tsx b/web/src/components/AddLiquidityModal.tsx index b2472ae0..f621e018 100644 --- a/web/src/components/AddLiquidityModal.tsx +++ b/web/src/components/AddLiquidityModal.tsx @@ -95,13 +95,13 @@ export const AddLiquidityModal: React.FC = ({ const assetDetails0 = await api.query.assets.asset(asset0); const assetDetails1 = await api.query.assets.asset(asset1); - console.log('🔍 Querying minimum balances for assets:', { asset0, asset1 }); + if (import.meta.env.DEV) console.log('🔍 Querying minimum balances for assets:', { asset0, asset1 }); if (assetDetails0.isSome && assetDetails1.isSome) { const details0 = assetDetails0.unwrap().toJSON() as AssetDetails; const details1 = assetDetails1.unwrap().toJSON() as AssetDetails; - console.log('📦 Asset details:', { + if (import.meta.env.DEV) console.log('📦 Asset details:', { asset0: details0, asset1: details1 }); @@ -112,7 +112,7 @@ export const AddLiquidityModal: React.FC = ({ const minBalance0 = Number(minBalance0Raw) / Math.pow(10, asset0Decimals); const minBalance1 = Number(minBalance1Raw) / Math.pow(10, asset1Decimals); - console.log('📊 Minimum deposit requirements from assets:', { + if (import.meta.env.DEV) console.log('📊 Minimum deposit requirements from assets:', { asset0: asset0Name, minBalance0Raw, minBalance0, @@ -124,26 +124,26 @@ export const AddLiquidityModal: React.FC = ({ setMinDeposit0(minBalance0); setMinDeposit1(minBalance1); } else { - console.warn('⚠️ Asset details not found, using defaults'); + if (import.meta.env.DEV) console.warn('⚠️ Asset details not found, using defaults'); } // Also check if there's a MintMinLiquidity constant in assetConversion pallet if (api.consts.assetConversion) { const mintMinLiq = api.consts.assetConversion.mintMinLiquidity; if (mintMinLiq) { - console.log('🔧 AssetConversion MintMinLiquidity constant:', mintMinLiq.toString()); + if (import.meta.env.DEV) console.log('🔧 AssetConversion MintMinLiquidity constant:', mintMinLiq.toString()); } const liquidityWithdrawalFee = api.consts.assetConversion.liquidityWithdrawalFee; if (liquidityWithdrawalFee) { - console.log('🔧 AssetConversion LiquidityWithdrawalFee:', liquidityWithdrawalFee.toHuman()); + if (import.meta.env.DEV) console.log('🔧 AssetConversion LiquidityWithdrawalFee:', liquidityWithdrawalFee.toHuman()); } // Log all assetConversion constants - console.log('🔧 All assetConversion constants:', Object.keys(api.consts.assetConversion)); + if (import.meta.env.DEV) console.log('🔧 All assetConversion constants:', Object.keys(api.consts.assetConversion)); } } catch (err) { - console.error('❌ Error fetching minimum balances:', err); + if (import.meta.env.DEV) console.error('❌ Error fetching minimum balances:', err); // Keep default 0.01 if query fails } }; @@ -189,26 +189,26 @@ export const AddLiquidityModal: React.FC = ({ if (reserve0 >= MINIMUM_LIQUIDITY && reserve1 >= MINIMUM_LIQUIDITY) { setCurrentPrice(reserve1 / reserve0); setIsPoolEmpty(false); - console.log('Pool has liquidity - auto-calculating ratio:', reserve1 / reserve0); + if (import.meta.env.DEV) console.log('Pool has liquidity - auto-calculating ratio:', reserve1 / reserve0); } else { setCurrentPrice(null); setIsPoolEmpty(true); - console.log('Pool is empty or has dust only - manual input allowed'); + if (import.meta.env.DEV) console.log('Pool is empty or has dust only - manual input allowed'); } } else { // No reserves found - pool is empty setCurrentPrice(null); setIsPoolEmpty(true); - console.log('Pool is empty - manual input allowed'); + if (import.meta.env.DEV) console.log('Pool is empty - manual input allowed'); } } else { // Pool doesn't exist yet - completely empty setCurrentPrice(null); setIsPoolEmpty(true); - console.log('Pool does not exist yet - manual input allowed'); + if (import.meta.env.DEV) console.log('Pool does not exist yet - manual input allowed'); } } catch (err) { - console.error('Error fetching pool price:', err); + if (import.meta.env.DEV) console.error('Error fetching pool price:', err); // On error, assume pool is empty to allow manual input setCurrentPrice(null); setIsPoolEmpty(true); @@ -319,9 +319,9 @@ export const AddLiquidityModal: React.FC = ({ { signer: injector.signer }, ({ status, events, dispatchError }) => { if (status.isInBlock) { - console.log('Transaction in block:', status.asInBlock.toHex()); + if (import.meta.env.DEV) console.log('Transaction in block:', status.asInBlock.toHex()); } else if (status.isFinalized) { - console.log('Transaction finalized:', status.asFinalized.toHex()); + if (import.meta.env.DEV) console.log('Transaction finalized:', status.asFinalized.toHex()); // Check for errors const hasError = events.some(({ event }) => @@ -336,23 +336,23 @@ export const AddLiquidityModal: React.FC = ({ const decoded = api.registry.findMetaError(dispatchError.asModule); const { docs, name, section } = decoded; errorMessage = `${section}.${name}: ${docs.join(' ')}`; - console.error('Dispatch error:', errorMessage); + if (import.meta.env.DEV) console.error('Dispatch error:', errorMessage); } else { errorMessage = dispatchError.toString(); - console.error('Dispatch error:', errorMessage); + if (import.meta.env.DEV) console.error('Dispatch error:', errorMessage); } } events.forEach(({ event }) => { if (api.events.system.ExtrinsicFailed.is(event)) { - console.error('ExtrinsicFailed event:', event.toHuman()); + if (import.meta.env.DEV) console.error('ExtrinsicFailed event:', event.toHuman()); } }); setError(errorMessage); setIsLoading(false); } else { - console.log('Transaction successful'); + if (import.meta.env.DEV) console.log('Transaction successful'); setSuccess(true); setIsLoading(false); setAmount0(''); @@ -368,7 +368,7 @@ export const AddLiquidityModal: React.FC = ({ } ); } catch (err) { - console.error('Error adding liquidity:', err); + if (import.meta.env.DEV) console.error('Error adding liquidity:', err); setError(err instanceof Error ? err.message : 'Failed to add liquidity'); setIsLoading(false); } diff --git a/web/src/components/AppLayout.tsx b/web/src/components/AppLayout.tsx index 4cb03c09..13cc03bb 100644 --- a/web/src/components/AppLayout.tsx +++ b/web/src/components/AppLayout.tsx @@ -64,7 +64,7 @@ const AppLayout: React.FC = () => { .maybeSingle(); if (error) { - console.warn('Admin check error:', error); + if (import.meta.env.DEV) console.warn('Admin check error:', error); } _setIsAdmin(!!data); } else { @@ -300,7 +300,7 @@ const AppLayout: React.FC = () => {
{ - console.log('Proposal created:', proposal); + if (import.meta.env.DEV) console.log('Proposal created:', proposal); setShowProposalWizard(false); }} onCancel={() => setShowProposalWizard(false)} diff --git a/web/src/components/ErrorBoundary.tsx b/web/src/components/ErrorBoundary.tsx index e6bd7190..9ad5fabe 100644 --- a/web/src/components/ErrorBoundary.tsx +++ b/web/src/components/ErrorBoundary.tsx @@ -50,7 +50,7 @@ export class ErrorBoundary extends Component { componentDidCatch(error: Error, errorInfo: ErrorInfo): void { // Log error to console - console.error('ErrorBoundary caught an error:', error, errorInfo); + if (import.meta.env.DEV) console.error('ErrorBoundary caught an error:', error, errorInfo); // Update state with error details this.setState({ diff --git a/web/src/components/HeroSection.tsx b/web/src/components/HeroSection.tsx index 05346962..646a6709 100644 --- a/web/src/components/HeroSection.tsx +++ b/web/src/components/HeroSection.tsx @@ -25,7 +25,7 @@ const HeroSection: React.FC = () => { const referendaCount = await api.query.referenda.referendumCount(); activeProposals = referendaCount.toNumber(); } catch (err) { - console.warn('Failed to fetch referenda:', err); + if (import.meta.env.DEV) console.warn('Failed to fetch referenda:', err); } // Fetch total staked tokens @@ -39,7 +39,7 @@ const HeroSection: React.FC = () => { tokensStaked = `${formatted} HEZ`; } } catch (err) { - console.warn('Failed to fetch total stake:', err); + if (import.meta.env.DEV) console.warn('Failed to fetch total stake:', err); } // Count total voters from conviction voting @@ -52,7 +52,7 @@ const HeroSection: React.FC = () => { const uniqueAccounts = new Set(votingKeys.map(key => key.args[0].toString())); totalVoters = uniqueAccounts.size; } catch (err) { - console.warn('Failed to fetch voters:', err); + if (import.meta.env.DEV) console.warn('Failed to fetch voters:', err); } // Update stats @@ -63,13 +63,13 @@ const HeroSection: React.FC = () => { trustScore: 0 // TODO: Calculate trust score }); - console.log('✅ Hero stats updated:', { + if (import.meta.env.DEV) console.log('✅ Hero stats updated:', { activeProposals, totalVoters, tokensStaked }); } catch (error) { - console.error('Failed to fetch hero stats:', error); + if (import.meta.env.DEV) console.error('Failed to fetch hero stats:', error); } }; diff --git a/web/src/components/MultisigMembers.tsx b/web/src/components/MultisigMembers.tsx index 15cfd649..30e59458 100644 --- a/web/src/components/MultisigMembers.tsx +++ b/web/src/components/MultisigMembers.tsx @@ -52,7 +52,7 @@ export const MultisigMembers: React.FC = ({ setMultisigAddress(multisig); } } catch (error) { - console.error('Error fetching multisig members:', error); + if (import.meta.env.DEV) console.error('Error fetching multisig members:', error); } finally { setLoading(false); } diff --git a/web/src/components/NetworkStats.tsx b/web/src/components/NetworkStats.tsx index 41c256f2..07a19d05 100644 --- a/web/src/components/NetworkStats.tsx +++ b/web/src/components/NetworkStats.tsx @@ -45,14 +45,14 @@ export const NetworkStats: React.FC = () => { const nominators = await api.query.staking.nominators.entries(); nominatorCount = nominators.length; } catch { - console.warn('Staking pallet not available, nominators = 0'); + if (import.meta.env.DEV) console.warn('Staking pallet not available, nominators = 0'); } setValidatorCount(validators.length); setNominatorCount(nominatorCount); setPeers(health.peers.toNumber()); } catch (err) { - console.error('Failed to update network stats:', err); + if (import.meta.env.DEV) console.error('Failed to update network stats:', err); } }; @@ -63,7 +63,7 @@ export const NetworkStats: React.FC = () => { intervalId = setInterval(updateNetworkStats, 3000); } catch (err) { - console.error('Failed to subscribe to blocks:', err); + if (import.meta.env.DEV) console.error('Failed to subscribe to blocks:', err); } }; diff --git a/web/src/components/NftList.tsx b/web/src/components/NftList.tsx index 21c758ce..bafdda38 100644 --- a/web/src/components/NftList.tsx +++ b/web/src/components/NftList.tsx @@ -58,7 +58,7 @@ export const NftList: React.FC = () => { const userTikis = await getUserTikis(api, selectedAccount.address); setTikis(userTikis); } catch (err) { - console.error('Error fetching Tikis:', err); + if (import.meta.env.DEV) console.error('Error fetching Tikis:', err); setError('Failed to load NFTs'); } finally { setLoading(false); diff --git a/web/src/components/PoolDashboard.tsx b/web/src/components/PoolDashboard.tsx index 0a37766a..6f38f2ff 100644 --- a/web/src/components/PoolDashboard.tsx +++ b/web/src/components/PoolDashboard.tsx @@ -92,7 +92,7 @@ const PoolDashboard = () => { } } } catch (err) { - console.error('Error discovering pools:', err); + if (import.meta.env.DEV) console.error('Error discovering pools:', err); } }; @@ -178,7 +178,7 @@ const PoolDashboard = () => { setError('Pool not found'); } } catch (err) { - console.error('Error fetching pool data:', err); + if (import.meta.env.DEV) console.error('Error fetching pool data:', err); setError(err instanceof Error ? err.message : 'Failed to fetch pool data'); } finally { setIsLoading(false); @@ -219,7 +219,7 @@ const PoolDashboard = () => { } } } catch (err) { - console.error('Error fetching LP position:', err); + if (import.meta.env.DEV) console.error('Error fetching LP position:', err); } }; diff --git a/web/src/components/ReceiveModal.tsx b/web/src/components/ReceiveModal.tsx index 7944dc0c..001b7832 100644 --- a/web/src/components/ReceiveModal.tsx +++ b/web/src/components/ReceiveModal.tsx @@ -33,7 +33,9 @@ export const ReceiveModal: React.FC = ({ isOpen, onClose }) = dark: '#ffffff', light: '#0f172a' } - }).then(setQrCodeDataUrl).catch(console.error); + }).then(setQrCodeDataUrl).catch((err) => { + if (import.meta.env.DEV) console.error('QR code generation failed:', err); + }); } }, [selectedAccount, isOpen]); diff --git a/web/src/components/RemoveLiquidityModal.tsx b/web/src/components/RemoveLiquidityModal.tsx index ea5850b5..9fdffb44 100644 --- a/web/src/components/RemoveLiquidityModal.tsx +++ b/web/src/components/RemoveLiquidityModal.tsx @@ -59,7 +59,7 @@ export const RemoveLiquidityModal: React.FC = ({ const fetchMinBalances = async () => { try { - console.log(`🔍 Fetching minBalances for pool: asset0=${asset0} (${getDisplayTokenName(asset0)}), asset1=${asset1} (${getDisplayTokenName(asset1)})`); + if (import.meta.env.DEV) console.log(`🔍 Fetching minBalances for pool: asset0=${asset0} (${getDisplayTokenName(asset0)}), asset1=${asset1} (${getDisplayTokenName(asset1)})`); // For wHEZ (asset ID 0), we need to fetch from assets pallet // For native HEZ, we would need existentialDeposit from balances @@ -72,7 +72,7 @@ export const RemoveLiquidityModal: React.FC = ({ const details0 = assetDetails0.unwrap().toJSON() as Record; const min0 = Number(details0.minBalance) / Math.pow(10, getAssetDecimals(asset0)); setMinBalance0(min0); - console.log(`📊 ${getDisplayTokenName(asset0)} minBalance: ${min0}`); + if (import.meta.env.DEV) console.log(`📊 ${getDisplayTokenName(asset0)} minBalance: ${min0}`); } } else { // Other assets (PEZ, wUSDT, etc.) @@ -81,7 +81,7 @@ export const RemoveLiquidityModal: React.FC = ({ const details0 = assetDetails0.unwrap().toJSON() as Record; const min0 = Number(details0.minBalance) / Math.pow(10, getAssetDecimals(asset0)); setMinBalance0(min0); - console.log(`📊 ${getDisplayTokenName(asset0)} minBalance: ${min0}`); + if (import.meta.env.DEV) console.log(`📊 ${getDisplayTokenName(asset0)} minBalance: ${min0}`); } } @@ -92,7 +92,7 @@ export const RemoveLiquidityModal: React.FC = ({ const details1 = assetDetails1.unwrap().toJSON() as Record; const min1 = Number(details1.minBalance) / Math.pow(10, getAssetDecimals(asset1)); setMinBalance1(min1); - console.log(`📊 ${getDisplayTokenName(asset1)} minBalance: ${min1}`); + if (import.meta.env.DEV) console.log(`📊 ${getDisplayTokenName(asset1)} minBalance: ${min1}`); } } else { // Other assets (PEZ, wUSDT, etc.) @@ -101,11 +101,11 @@ export const RemoveLiquidityModal: React.FC = ({ const details1 = assetDetails1.unwrap().toJSON() as Record; const min1 = Number(details1.minBalance) / Math.pow(10, getAssetDecimals(asset1)); setMinBalance1(min1); - console.log(`📊 ${getDisplayTokenName(asset1)} minBalance: ${min1}`); + if (import.meta.env.DEV) console.log(`📊 ${getDisplayTokenName(asset1)} minBalance: ${min1}`); } } } catch (err) { - console.error('Error fetching minBalances:', err); + if (import.meta.env.DEV) console.error('Error fetching minBalances:', err); } }; @@ -128,7 +128,7 @@ export const RemoveLiquidityModal: React.FC = ({ setMaxRemovablePercentage(safeMaxPercent > 0 ? safeMaxPercent : 99); - console.log(`🔒 Max removable: ${safeMaxPercent}% (asset0: ${maxPercent0.toFixed(2)}%, asset1: ${maxPercent1.toFixed(2)}%)`); + if (import.meta.env.DEV) console.log(`🔒 Max removable: ${safeMaxPercent}% (asset0: ${maxPercent0.toFixed(2)}%, asset1: ${maxPercent1.toFixed(2)}%)`); }, [minBalance0, minBalance1, lpPosition.asset0Amount, lpPosition.asset1Amount]); const handleRemoveLiquidity = async () => { @@ -186,9 +186,9 @@ export const RemoveLiquidityModal: React.FC = ({ { signer: injector.signer }, ({ status, events }) => { if (status.isInBlock) { - console.log('Transaction in block'); + if (import.meta.env.DEV) console.log('Transaction in block'); } else if (status.isFinalized) { - console.log('Transaction finalized'); + if (import.meta.env.DEV) console.log('Transaction finalized'); // Check for errors const hasError = events.some(({ event }) => @@ -212,7 +212,7 @@ export const RemoveLiquidityModal: React.FC = ({ } ); } catch (err) { - console.error('Error removing liquidity:', err); + if (import.meta.env.DEV) console.error('Error removing liquidity:', err); setError(err instanceof Error ? err.message : 'Failed to remove liquidity'); setIsLoading(false); } diff --git a/web/src/components/ReservesDashboard.tsx b/web/src/components/ReservesDashboard.tsx index f5e9fb7c..e35ddcad 100644 --- a/web/src/components/ReservesDashboard.tsx +++ b/web/src/components/ReservesDashboard.tsx @@ -41,7 +41,7 @@ export const ReservesDashboard: React.FC = ({ setIsHealthy(health.isHealthy); setLastUpdate(new Date()); } catch (error) { - console.error('Error fetching reserve data:', error); + if (import.meta.env.DEV) console.error('Error fetching reserve data:', error); } finally { setLoading(false); } diff --git a/web/src/components/RouteGuards.tsx b/web/src/components/RouteGuards.tsx index 0f7bb1fb..3f0f9585 100644 --- a/web/src/components/RouteGuards.tsx +++ b/web/src/components/RouteGuards.tsx @@ -81,7 +81,7 @@ export const CitizenRoute: React.FC = ({ const citizenStatus = await checkCitizenStatus(api, selectedAccount.address); setIsCitizen(citizenStatus); } catch (error) { - console.error('Citizen check failed:', error); + if (import.meta.env.DEV) console.error('Citizen check failed:', error); setIsCitizen(false); } finally { setLoading(false); @@ -170,7 +170,7 @@ export const ValidatorRoute: React.FC = ({ const validatorStatus = await checkValidatorStatus(api, selectedAccount.address); setIsValidator(validatorStatus); } catch (error) { - console.error('Validator check failed:', error); + if (import.meta.env.DEV) console.error('Validator check failed:', error); setIsValidator(false); } finally { setLoading(false); @@ -261,7 +261,7 @@ export const EducatorRoute: React.FC = ({ const educatorStatus = await checkEducatorRole(api, selectedAccount.address); setIsEducator(educatorStatus); } catch (error) { - console.error('Educator check failed:', error); + if (import.meta.env.DEV) console.error('Educator check failed:', error); setIsEducator(false); } finally { setLoading(false); @@ -358,7 +358,7 @@ export const ModeratorRoute: React.FC = ({ const moderatorStatus = await checkModeratorRole(api, selectedAccount.address); setIsModerator(moderatorStatus); } catch (error) { - console.error('Moderator check failed:', error); + if (import.meta.env.DEV) console.error('Moderator check failed:', error); setIsModerator(false); } finally { setLoading(false); diff --git a/web/src/components/TokenSwap.tsx b/web/src/components/TokenSwap.tsx index 94663c6a..66079433 100644 --- a/web/src/components/TokenSwap.tsx +++ b/web/src/components/TokenSwap.tsx @@ -42,11 +42,11 @@ const TokenSwap = () => { const [isLoadingRate, setIsLoadingRate] = useState(false); // Get balances from wallet context - console.log('🔍 TokenSwap balances from context:', balances); - console.log('🔍 fromToken:', fromToken, 'toToken:', toToken); + if (import.meta.env.DEV) console.log('🔍 TokenSwap balances from context:', balances); + if (import.meta.env.DEV) console.log('🔍 fromToken:', fromToken, 'toToken:', toToken); const fromBalance = balances[fromToken as keyof typeof balances]; const toBalance = balances[toToken as keyof typeof balances]; - console.log('🔍 Final balances:', { fromBalance, toBalance }); + if (import.meta.env.DEV) console.log('🔍 Final balances:', { fromBalance, toBalance }); // Liquidity pool data interface LiquidityPool { @@ -123,7 +123,7 @@ const TokenSwap = () => { // Calculate minimum received with slippage const minReceived = (amountOut * (1 - parseFloat(slippage) / 100)).toFixed(4); - console.log('🔍 Uniswap V2 AMM:', { + if (import.meta.env.DEV) console.log('🔍 Uniswap V2 AMM:', { amountIn, amountInWithFee, reserveIn, @@ -149,16 +149,16 @@ const TokenSwap = () => { // Check if AssetConversion pallet is available useEffect(() => { - console.log('🔍 Checking DEX availability...', { api: !!api, isApiReady }); + if (import.meta.env.DEV) console.log('🔍 Checking DEX availability...', { api: !!api, isApiReady }); if (api && isApiReady) { const hasAssetConversion = api.tx.assetConversion !== undefined; - console.log('🔍 AssetConversion pallet check:', hasAssetConversion); + if (import.meta.env.DEV) console.log('🔍 AssetConversion pallet check:', hasAssetConversion); setIsDexAvailable(hasAssetConversion); if (!hasAssetConversion) { - console.warn('⚠️ AssetConversion pallet not available in runtime'); + if (import.meta.env.DEV) console.warn('⚠️ AssetConversion pallet not available in runtime'); } else { - console.log('✅ AssetConversion pallet is available!'); + if (import.meta.env.DEV) console.log('✅ AssetConversion pallet is available!'); } } }, [api, isApiReady]); @@ -167,14 +167,14 @@ const TokenSwap = () => { // Always use wHEZ/PEZ pool (the only valid pool) useEffect(() => { const fetchExchangeRate = async () => { - console.log('🔍 fetchExchangeRate check:', { api: !!api, isApiReady, isDexAvailable, fromToken, toToken }); + if (import.meta.env.DEV) console.log('🔍 fetchExchangeRate check:', { api: !!api, isApiReady, isDexAvailable, fromToken, toToken }); if (!api || !isApiReady || !isDexAvailable) { - console.log('⚠️ Skipping fetchExchangeRate:', { api: !!api, isApiReady, isDexAvailable }); + if (import.meta.env.DEV) console.log('⚠️ Skipping fetchExchangeRate:', { api: !!api, isApiReady, isDexAvailable }); return; } - console.log('✅ Starting fetchExchangeRate...'); + if (import.meta.env.DEV) console.log('✅ Starting fetchExchangeRate...'); setIsLoadingRate(true); try { // Map user-selected tokens to actual pool assets @@ -189,14 +189,14 @@ const TokenSwap = () => { const fromAssetId = getPoolAssetId(fromToken); const toAssetId = getPoolAssetId(toToken); - console.log('🔍 Looking for pool:', { fromToken, toToken, fromAssetId, toAssetId }); + if (import.meta.env.DEV) console.log('🔍 Looking for pool:', { fromToken, toToken, fromAssetId, toAssetId }); // IMPORTANT: Pool ID must be sorted (smaller asset ID first) const [asset1, asset2] = fromAssetId < toAssetId ? [fromAssetId, toAssetId] : [toAssetId, fromAssetId]; - console.log('🔍 Sorted pool assets:', { asset1, asset2 }); + if (import.meta.env.DEV) console.log('🔍 Sorted pool assets:', { asset1, asset2 }); // Create pool asset tuple [asset1, asset2] - must be sorted! const poolAssets = [ @@ -204,23 +204,23 @@ const TokenSwap = () => { { NativeOrAsset: { Asset: asset2 } } ]; - console.log('🔍 Pool query with:', poolAssets); + if (import.meta.env.DEV) console.log('🔍 Pool query with:', poolAssets); // Query pool from AssetConversion pallet const poolInfo = await api.query.assetConversion.pools(poolAssets); - console.log('🔍 Pool query result:', poolInfo.toHuman()); + if (import.meta.env.DEV) console.log('🔍 Pool query result:', poolInfo.toHuman()); - console.log('🔍 Pool isEmpty?', poolInfo.isEmpty, 'exists?', !poolInfo.isEmpty); + if (import.meta.env.DEV) console.log('🔍 Pool isEmpty?', poolInfo.isEmpty, 'exists?', !poolInfo.isEmpty); if (poolInfo && !poolInfo.isEmpty) { const pool = poolInfo.toJSON() as Record; - console.log('🔍 Pool data:', pool); + if (import.meta.env.DEV) console.log('🔍 Pool data:', pool); try { // New pallet version: reserves are stored in pool account balances // AccountIdConverter implementation in substrate: // blake2_256(&Encode::encode(&(PalletId, PoolId))[..]) - console.log('🔍 Deriving pool account using AccountIdConverter...'); + if (import.meta.env.DEV) console.log('🔍 Deriving pool account using AccountIdConverter...'); const { stringToU8a } = await import('@polkadot/util'); const { blake2AsU8a } = await import('@polkadot/util-crypto'); @@ -229,44 +229,44 @@ const TokenSwap = () => { // Create PoolId tuple (u32, u32) const poolId = api.createType('(u32, u32)', [asset1, asset2]); - console.log('🔍 Pool ID:', poolId.toHuman()); + if (import.meta.env.DEV) console.log('🔍 Pool ID:', poolId.toHuman()); // Create (PalletId, PoolId) tuple: ([u8; 8], (u32, u32)) const palletIdType = api.createType('[u8; 8]', PALLET_ID); const fullTuple = api.createType('([u8; 8], (u32, u32))', [palletIdType, poolId]); - console.log('🔍 Full tuple encoded length:', fullTuple.toU8a().length); - console.log('🔍 Full tuple bytes:', Array.from(fullTuple.toU8a())); + if (import.meta.env.DEV) console.log('🔍 Full tuple encoded length:', fullTuple.toU8a().length); + if (import.meta.env.DEV) console.log('🔍 Full tuple bytes:', Array.from(fullTuple.toU8a())); // Hash the SCALE-encoded tuple const accountHash = blake2AsU8a(fullTuple.toU8a(), 256); - console.log('🔍 Account hash:', Array.from(accountHash).slice(0, 8)); + if (import.meta.env.DEV) console.log('🔍 Account hash:', Array.from(accountHash).slice(0, 8)); const poolAccountId = api.createType('AccountId32', accountHash); - console.log('🔍 Pool AccountId (NEW METHOD):', poolAccountId.toString()); + if (import.meta.env.DEV) console.log('🔍 Pool AccountId (NEW METHOD):', poolAccountId.toString()); // Query pool account's asset balances - console.log('🔍 Querying reserves for asset', asset1, 'and', asset2); + if (import.meta.env.DEV) console.log('🔍 Querying reserves for asset', asset1, 'and', asset2); const reserve0Query = await api.query.assets.account(asset1, poolAccountId); const reserve1Query = await api.query.assets.account(asset2, poolAccountId); - console.log('🔍 Reserve0 query result:', reserve0Query.toHuman()); - console.log('🔍 Reserve1 query result:', reserve1Query.toHuman()); - console.log('🔍 Reserve0 isEmpty?', reserve0Query.isEmpty); - console.log('🔍 Reserve1 isEmpty?', reserve1Query.isEmpty); + if (import.meta.env.DEV) console.log('🔍 Reserve0 query result:', reserve0Query.toHuman()); + if (import.meta.env.DEV) console.log('🔍 Reserve1 query result:', reserve1Query.toHuman()); + if (import.meta.env.DEV) console.log('🔍 Reserve0 isEmpty?', reserve0Query.isEmpty); + if (import.meta.env.DEV) console.log('🔍 Reserve1 isEmpty?', reserve1Query.isEmpty); const reserve0Data = reserve0Query.toJSON() as Record; const reserve1Data = reserve1Query.toJSON() as Record; - console.log('🔍 Reserve0 JSON:', reserve0Data); - console.log('🔍 Reserve1 JSON:', reserve1Data); + if (import.meta.env.DEV) console.log('🔍 Reserve0 JSON:', reserve0Data); + if (import.meta.env.DEV) console.log('🔍 Reserve1 JSON:', reserve1Data); if (reserve0Data && reserve1Data && reserve0Data.balance && reserve1Data.balance) { // Parse hex string balances to BigInt, then to number const balance0Hex = reserve0Data.balance.toString(); const balance1Hex = reserve1Data.balance.toString(); - console.log('🔍 Raw hex balances:', { balance0Hex, balance1Hex }); + if (import.meta.env.DEV) console.log('🔍 Raw hex balances:', { balance0Hex, balance1Hex }); // Use correct decimals for each asset // asset1=0 (wHEZ): 12 decimals @@ -278,7 +278,7 @@ const TokenSwap = () => { const reserve0 = Number(BigInt(balance0Hex)) / (10 ** decimals0); const reserve1 = Number(BigInt(balance1Hex)) / (10 ** decimals1); - console.log('✅ Reserves found:', { reserve0, reserve1, decimals0, decimals1 }); + if (import.meta.env.DEV) console.log('✅ Reserves found:', { reserve0, reserve1, decimals0, decimals1 }); // Store pool reserves for AMM calculation setPoolReserves({ @@ -293,22 +293,22 @@ const TokenSwap = () => { ? reserve1 / reserve0 // from asset1 to asset2 : reserve0 / reserve1; // from asset2 to asset1 - console.log('✅ Exchange rate:', rate, 'direction:', fromAssetId === asset1 ? 'asset1→asset2' : 'asset2→asset1'); + if (import.meta.env.DEV) console.log('✅ Exchange rate:', rate, 'direction:', fromAssetId === asset1 ? 'asset1→asset2' : 'asset2→asset1'); setExchangeRate(rate); } else { - console.warn('⚠️ Pool has no reserves - reserve0Data:', reserve0Data, 'reserve1Data:', reserve1Data); + if (import.meta.env.DEV) console.warn('⚠️ Pool has no reserves - reserve0Data:', reserve0Data, 'reserve1Data:', reserve1Data); setExchangeRate(0); } } catch (err) { - console.error('❌ Error deriving pool account:', err); + if (import.meta.env.DEV) console.error('❌ Error deriving pool account:', err); setExchangeRate(0); } } else { - console.warn('No liquidity pool found for this pair'); + if (import.meta.env.DEV) console.warn('No liquidity pool found for this pair'); setExchangeRate(0); } } catch (error) { - console.error('Failed to fetch exchange rate:', error); + if (import.meta.env.DEV) console.error('Failed to fetch exchange rate:', error); setExchangeRate(0); } finally { setIsLoadingRate(false); @@ -358,7 +358,7 @@ const TokenSwap = () => { setLiquidityPools([]); } } catch (error) { - console.error('Failed to fetch liquidity pools:', error); + if (import.meta.env.DEV) console.error('Failed to fetch liquidity pools:', error); setLiquidityPools([]); } finally { setIsLoadingPools(false); @@ -384,7 +384,7 @@ const TokenSwap = () => { const startBlock = Math.max(0, currentBlockNumber - 100); - console.log('🔍 Fetching swap history from block', startBlock, 'to', currentBlockNumber); + if (import.meta.env.DEV) console.log('🔍 Fetching swap history from block', startBlock, 'to', currentBlockNumber); const transactions: SwapTransaction[] = []; @@ -427,7 +427,7 @@ const TokenSwap = () => { } } } catch (err) { - console.warn('Failed to parse swap path:', err); + if (import.meta.env.DEV) console.warn('Failed to parse swap path:', err); } const fromTokenSymbol = fromAssetId === 0 ? 'wHEZ' : fromAssetId === 1 ? 'PEZ' : fromAssetId === 2 ? 'USDT' : `Asset${fromAssetId}`; @@ -449,14 +449,14 @@ const TokenSwap = () => { } }); } catch (err) { - console.warn(`Failed to fetch block ${blockNum}:`, err); + if (import.meta.env.DEV) console.warn(`Failed to fetch block ${blockNum}:`, err); } } - console.log('✅ Swap history fetched:', transactions.length, 'transactions'); + if (import.meta.env.DEV) console.log('✅ Swap history fetched:', transactions.length, 'transactions'); setSwapHistory(transactions.slice(0, 10)); // Show max 10 } catch (error) { - console.error('Failed to fetch swap history:', error); + if (import.meta.env.DEV) console.error('Failed to fetch swap history:', error); setSwapHistory([]); } finally { setIsLoadingHistory(false); @@ -531,7 +531,7 @@ const TokenSwap = () => { toDecimals ); - console.log('💰 Swap amounts:', { + if (import.meta.env.DEV) console.log('💰 Swap amounts:', { fromToken, toToken, fromAmount, @@ -628,10 +628,10 @@ const TokenSwap = () => { selectedAccount.address, { signer: injector.signer }, async ({ status, events, dispatchError }) => { - console.log('🔍 Transaction status:', status.toHuman()); + if (import.meta.env.DEV) console.log('🔍 Transaction status:', status.toHuman()); if (status.isInBlock) { - console.log('✅ Transaction in block:', status.asInBlock.toHex()); + if (import.meta.env.DEV) console.log('✅ Transaction in block:', status.asInBlock.toHex()); toast({ title: 'Transaction Submitted', @@ -640,9 +640,9 @@ const TokenSwap = () => { } if (status.isFinalized) { - console.log('✅ Transaction finalized:', status.asFinalized.toHex()); - console.log('🔍 All events:', events.map(({ event }) => event.toHuman())); - console.log('🔍 dispatchError:', dispatchError?.toHuman()); + if (import.meta.env.DEV) console.log('✅ Transaction finalized:', status.asFinalized.toHex()); + if (import.meta.env.DEV) console.log('🔍 All events:', events.map(({ event }) => event.toHuman())); + if (import.meta.env.DEV) console.log('🔍 dispatchError:', dispatchError?.toHuman()); // Check for errors if (dispatchError) { @@ -677,11 +677,11 @@ const TokenSwap = () => { // Refresh balances and history without page reload await refreshBalances(); - console.log('✅ Balances refreshed after swap'); + if (import.meta.env.DEV) console.log('✅ Balances refreshed after swap'); // Refresh swap history after 3 seconds (wait for block finalization) setTimeout(async () => { - console.log('🔄 Refreshing swap history...'); + if (import.meta.env.DEV) console.log('🔄 Refreshing swap history...'); const fetchSwapHistory = async () => { if (!api || !isApiReady || !isDexAvailable || !selectedAccount) return; setIsLoadingHistory(true); @@ -723,7 +723,7 @@ const TokenSwap = () => { } } } catch (err) { - console.warn('Failed to parse swap path in refresh:', err); + if (import.meta.env.DEV) console.warn('Failed to parse swap path in refresh:', err); } const fromTokenSymbol = fromAssetId === 0 ? 'wHEZ' : fromAssetId === 1 ? 'PEZ' : fromAssetId === 2 ? 'USDT' : `Asset${fromAssetId}`; @@ -744,12 +744,12 @@ const TokenSwap = () => { } }); } catch (err) { - console.warn(`Failed to fetch block ${blockNum}:`, err); + if (import.meta.env.DEV) console.warn(`Failed to fetch block ${blockNum}:`, err); } } setSwapHistory(transactions.slice(0, 10)); } catch (error) { - console.error('Failed to refresh swap history:', error); + if (import.meta.env.DEV) console.error('Failed to refresh swap history:', error); } finally { setIsLoadingHistory(false); } @@ -769,7 +769,7 @@ const TokenSwap = () => { } ); } catch (error) { - console.error('Swap failed:', error); + if (import.meta.env.DEV) console.error('Swap failed:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Swap transaction failed', diff --git a/web/src/components/TokenomicsSection.tsx b/web/src/components/TokenomicsSection.tsx index 7132bc64..a2515a12 100644 --- a/web/src/components/TokenomicsSection.tsx +++ b/web/src/components/TokenomicsSection.tsx @@ -12,7 +12,7 @@ const TokenomicsSection: React.FC = () => { const baseAmount = selectedToken === 'PEZ' ? 74218750 : 37109375; // Calculate release amount for future use const releaseAmount = baseAmount / Math.pow(2, halvingPeriod); - console.log('Release amount:', releaseAmount); + if (import.meta.env.DEV) console.log('Release amount:', releaseAmount); }, [monthsPassed, halvingPeriod, selectedToken]); const pezDistribution = [ diff --git a/web/src/components/TransactionHistory.tsx b/web/src/components/TransactionHistory.tsx index d84ae39c..b5d51802 100644 --- a/web/src/components/TransactionHistory.tsx +++ b/web/src/components/TransactionHistory.tsx @@ -40,11 +40,11 @@ export const TransactionHistory: React.FC = ({ isOpen, setIsLoading(true); try { - console.log('Fetching transactions...'); + if (import.meta.env.DEV) console.log('Fetching transactions...'); const currentBlock = await api.rpc.chain.getBlock(); const currentBlockNumber = currentBlock.block.header.number.toNumber(); - console.log('Current block number:', currentBlockNumber); + if (import.meta.env.DEV) console.log('Current block number:', currentBlockNumber); const txList: Transaction[] = []; const blocksToCheck = Math.min(200, currentBlockNumber); @@ -66,7 +66,7 @@ export const TransactionHistory: React.FC = ({ isOpen, timestamp = Date.now(); } - console.log(`Block #${blockNumber}: ${block.block.extrinsics.length} extrinsics`); + if (import.meta.env.DEV) console.log(`Block #${blockNumber}: ${block.block.extrinsics.length} extrinsics`); // Check each extrinsic in the block block.block.extrinsics.forEach((extrinsic, index) => { @@ -77,7 +77,7 @@ export const TransactionHistory: React.FC = ({ isOpen, const { method, signer } = extrinsic; - console.log(` Extrinsic #${index}: ${method.section}.${method.method}, signer: ${signer.toString()}`); + if (import.meta.env.DEV) console.log(` Extrinsic #${index}: ${method.section}.${method.method}, signer: ${signer.toString()}`); // Check if transaction involves our account const fromAddress = signer.toString(); @@ -223,16 +223,16 @@ export const TransactionHistory: React.FC = ({ isOpen, } }); } catch (blockError) { - console.warn(`Error processing block #${blockNumber}:`, blockError); + if (import.meta.env.DEV) console.warn(`Error processing block #${blockNumber}:`, blockError); // Continue to next block } } - console.log('Found transactions:', txList.length); + if (import.meta.env.DEV) console.log('Found transactions:', txList.length); setTransactions(txList); } catch { - console.error('Failed to fetch transactions:', error); + if (import.meta.env.DEV) console.error('Failed to fetch transactions:', error); toast({ title: "Error", description: "Failed to fetch transaction history", diff --git a/web/src/components/TransferModal.tsx b/web/src/components/TransferModal.tsx index 7b56a5a3..bd3c369e 100644 --- a/web/src/components/TransferModal.tsx +++ b/web/src/components/TransferModal.tsx @@ -126,12 +126,12 @@ export const TransferModal: React.FC = ({ isOpen, onClose, s { signer: injector.signer }, ({ status, dispatchError }) => { if (status.isInBlock) { - console.log(`Transaction included in block: ${status.asInBlock}`); + if (import.meta.env.DEV) console.log(`Transaction included in block: ${status.asInBlock}`); setTxHash(status.asInBlock.toHex()); } if (status.isFinalized) { - console.log(`Transaction finalized: ${status.asFinalized}`); + if (import.meta.env.DEV) console.log(`Transaction finalized: ${status.asFinalized}`); // Check for errors if (dispatchError) { @@ -171,7 +171,7 @@ export const TransferModal: React.FC = ({ isOpen, onClose, s } ); } catch (error) { - console.error('Transfer error:', error); + if (import.meta.env.DEV) console.error('Transfer error:', error); setTxStatus('error'); setIsTransferring(false); diff --git a/web/src/components/USDTBridge.tsx b/web/src/components/USDTBridge.tsx index 836b3e2d..c56cd145 100644 --- a/web/src/components/USDTBridge.tsx +++ b/web/src/components/USDTBridge.tsx @@ -78,7 +78,7 @@ export const USDTBridge: React.FC = ({ ); setDepositAmount(''); } catch (err) { - console.error('Deposit error:', err); + if (import.meta.env.DEV) console.error('Deposit error:', err); setError(err instanceof Error ? err.message : 'Deposit failed'); } finally { setIsLoading(false); @@ -130,7 +130,7 @@ export const USDTBridge: React.FC = ({ } }); } catch (err) { - console.error('Withdrawal error:', err); + if (import.meta.env.DEV) console.error('Withdrawal error:', err); setError(err instanceof Error ? err.message : 'Withdrawal failed'); setIsLoading(false); } diff --git a/web/src/components/admin/CommissionSetupTab.tsx b/web/src/components/admin/CommissionSetupTab.tsx index 024a7645..32822869 100644 --- a/web/src/components/admin/CommissionSetupTab.tsx +++ b/web/src/components/admin/CommissionSetupTab.tsx @@ -38,10 +38,10 @@ export function CommissionSetupTab() { // Commission is initialized if there's at least one member setSetupComplete(memberList.length > 0); - console.log('Commission members:', memberList); - console.log('Setup complete:', memberList.length > 0); + if (import.meta.env.DEV) console.log('Commission members:', memberList); + if (import.meta.env.DEV) console.log('Setup complete:', memberList.length > 0); } catch (error) { - console.error('Error checking setup:', error); + if (import.meta.env.DEV) console.error('Error checking setup:', error); } finally { setLoading(false); } @@ -107,8 +107,8 @@ export function CommissionSetupTab() { // Add new members const updatedList = [...memberList, ...newMembers]; - console.log('Adding new members:', newMembers); - console.log('Updated member list:', updatedList); + if (import.meta.env.DEV) console.log('Adding new members:', newMembers); + if (import.meta.env.DEV) console.log('Updated member list:', updatedList); const tx = api.tx.sudo.sudo( api.tx.dynamicCommissionCollective.setMembers( @@ -150,7 +150,7 @@ export function CommissionSetupTab() { ); }); } catch (error) { - console.error('Error adding member:', error); + if (import.meta.env.DEV) console.error('Error adding member:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to add member', @@ -176,8 +176,8 @@ export function CommissionSetupTab() { const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log('Initializing KYC Commission...'); - console.log('Proxy account:', COMMISSIONS.KYC.proxyAccount); + if (import.meta.env.DEV) console.log('Initializing KYC Commission...'); + if (import.meta.env.DEV) console.log('Proxy account:', COMMISSIONS.KYC.proxyAccount); // Initialize DynamicCommissionCollective with Alice as first member // Other members can be added later @@ -194,7 +194,7 @@ export function CommissionSetupTab() { selectedAccount.address, { signer: injector.signer }, ({ status, dispatchError, events }) => { - console.log('Transaction status:', status.type); + if (import.meta.env.DEV) console.log('Transaction status:', status.type); if (status.isInBlock || status.isFinalized) { if (dispatchError) { @@ -207,7 +207,7 @@ export function CommissionSetupTab() { errorMessage = dispatchError.toString(); } - console.error('Setup error:', errorMessage); + if (import.meta.env.DEV) console.error('Setup error:', errorMessage); toast({ title: 'Setup Failed', description: errorMessage, @@ -223,20 +223,20 @@ export function CommissionSetupTab() { ); if (sudidEvent) { - console.log('✅ KYC Commission initialized'); + if (import.meta.env.DEV) console.log('✅ KYC Commission initialized'); toast({ title: 'Success', description: 'KYC Commission initialized successfully!', }); resolve(); } else { - console.warn('Transaction included but no Sudid event'); + if (import.meta.env.DEV) console.warn('Transaction included but no Sudid event'); resolve(); } } } ).catch((error) => { - console.error('Failed to sign and send:', error); + if (import.meta.env.DEV) console.error('Failed to sign and send:', error); toast({ title: 'Transaction Error', description: error instanceof Error ? error.message : 'Failed to submit transaction', @@ -250,7 +250,7 @@ export function CommissionSetupTab() { setTimeout(() => checkSetup(), 2000); } catch (error) { - console.error('Error initializing commission:', error); + if (import.meta.env.DEV) console.error('Error initializing commission:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to initialize commission', diff --git a/web/src/components/admin/CommissionVotingTab.tsx b/web/src/components/admin/CommissionVotingTab.tsx index 0e04a228..dca1b047 100644 --- a/web/src/components/admin/CommissionVotingTab.tsx +++ b/web/src/components/admin/CommissionVotingTab.tsx @@ -47,25 +47,25 @@ export function CommissionVotingTab() { const checkMembership = async () => { if (!api || !selectedAccount) { - console.log('No API or selected account'); + if (import.meta.env.DEV) console.log('No API or selected account'); setIsCommissionMember(false); return; } try { - console.log('Checking membership for:', selectedAccount.address); + if (import.meta.env.DEV) console.log('Checking membership for:', selectedAccount.address); // Check if user is directly a member of DynamicCommissionCollective const members = await api.query.dynamicCommissionCollective.members(); const memberList = members.toJSON() as string[]; - console.log('Commission members:', memberList); + if (import.meta.env.DEV) console.log('Commission members:', memberList); const isMember = memberList.includes(selectedAccount.address); - console.log('Is commission member:', isMember); + if (import.meta.env.DEV) console.log('Is commission member:', isMember); setIsCommissionMember(isMember); } catch (error) { - console.error('Error checking membership:', error); + if (import.meta.env.DEV) console.error('Error checking membership:', error); setIsCommissionMember(false); } }; @@ -116,9 +116,9 @@ export function CommissionVotingTab() { } setProposals(proposalList); - console.log(`Loaded ${proposalList.length} active proposals`); + if (import.meta.env.DEV) console.log(`Loaded ${proposalList.length} active proposals`); } catch (error) { - console.error('Error loading proposals:', error); + if (import.meta.env.DEV) console.error('Error loading proposals:', error); toast({ title: 'Error', description: 'Failed to load proposals', @@ -153,7 +153,7 @@ export function CommissionVotingTab() { const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log(`Voting ${approve ? 'AYE' : 'NAY'} on proposal:`, proposal.hash); + if (import.meta.env.DEV) console.log(`Voting ${approve ? 'AYE' : 'NAY'} on proposal:`, proposal.hash); // Vote directly (no proxy needed) const tx = api.tx.dynamicCommissionCollective.vote( @@ -167,7 +167,7 @@ export function CommissionVotingTab() { selectedAccount.address, { signer: injector.signer }, ({ status, dispatchError, events }) => { - console.log('Transaction status:', status.type); + if (import.meta.env.DEV) console.log('Transaction status:', status.type); if (status.isInBlock || status.isFinalized) { if (dispatchError) { @@ -180,7 +180,7 @@ export function CommissionVotingTab() { errorMessage = dispatchError.toString(); } - console.error('Vote error:', errorMessage); + if (import.meta.env.DEV) console.error('Vote error:', errorMessage); toast({ title: 'Vote Failed', description: errorMessage, @@ -201,13 +201,13 @@ export function CommissionVotingTab() { ); if (executedEvent) { - console.log('✅ Proposal executed (threshold reached)'); + if (import.meta.env.DEV) console.log('✅ Proposal executed (threshold reached)'); toast({ title: 'Success', description: 'Proposal passed and executed! KYC approved.', }); } else if (votedEvent) { - console.log('✅ Vote recorded'); + if (import.meta.env.DEV) console.log('✅ Vote recorded'); toast({ title: 'Vote Recorded', description: `Your ${approve ? 'AYE' : 'NAY'} vote has been recorded`, @@ -218,7 +218,7 @@ export function CommissionVotingTab() { } } ).catch((error) => { - console.error('Failed to sign and send:', error); + if (import.meta.env.DEV) console.error('Failed to sign and send:', error); toast({ title: 'Transaction Error', description: error instanceof Error ? error.message : 'Failed to submit transaction', @@ -234,7 +234,7 @@ export function CommissionVotingTab() { }, 2000); } catch (error) { - console.error('Error voting:', error); + if (import.meta.env.DEV) console.error('Error voting:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to vote', @@ -260,7 +260,7 @@ export function CommissionVotingTab() { const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log('Executing proposal:', proposal.hash); + if (import.meta.env.DEV) console.log('Executing proposal:', proposal.hash); // Get proposal length bound const proposalOption = await api.query.dynamicCommissionCollective.proposalOf(proposal.hash); @@ -282,7 +282,7 @@ export function CommissionVotingTab() { selectedAccount.address, { signer: injector.signer }, ({ status, dispatchError, events }) => { - console.log('Transaction status:', status.type); + if (import.meta.env.DEV) console.log('Transaction status:', status.type); if (status.isInBlock || status.isFinalized) { if (dispatchError) { @@ -295,7 +295,7 @@ export function CommissionVotingTab() { errorMessage = dispatchError.toString(); } - console.error('Execute error:', errorMessage); + if (import.meta.env.DEV) console.error('Execute error:', errorMessage); toast({ title: 'Execute Failed', description: errorMessage, @@ -315,14 +315,14 @@ export function CommissionVotingTab() { if (executedEvent) { const eventData = executedEvent.event.data.toHuman(); - console.log('✅ Proposal executed'); - console.log('Execute event data:', eventData); - console.log('Result:', eventData); + if (import.meta.env.DEV) console.log('✅ Proposal executed'); + if (import.meta.env.DEV) console.log('Execute event data:', eventData); + if (import.meta.env.DEV) console.log('Result:', eventData); // Check if execution was successful const result = eventData[eventData.length - 1]; // Last parameter is usually the result if (result && typeof result === 'object' && 'Err' in result) { - console.error('Execution failed:', result.Err); + if (import.meta.env.DEV) console.error('Execution failed:', result.Err); toast({ title: 'Execution Failed', description: `Proposal closed but execution failed: ${JSON.stringify(result.Err)}`, @@ -335,7 +335,7 @@ export function CommissionVotingTab() { }); } } else if (closedEvent) { - console.log('Proposal closed'); + if (import.meta.env.DEV) console.log('Proposal closed'); toast({ title: 'Proposal Closed', description: 'Proposal has been closed', @@ -346,7 +346,7 @@ export function CommissionVotingTab() { } } ).catch((error) => { - console.error('Failed to sign and send:', error); + if (import.meta.env.DEV) console.error('Failed to sign and send:', error); toast({ title: 'Transaction Error', description: error instanceof Error ? error.message : 'Failed to submit transaction', @@ -361,7 +361,7 @@ export function CommissionVotingTab() { }, 2000); } catch (error) { - console.error('Error executing:', error); + if (import.meta.env.DEV) console.error('Error executing:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to execute proposal', @@ -443,8 +443,8 @@ export function CommissionVotingTab() { memberList.push(selectedAccount.address); } - console.log('Adding member to commission:', selectedAccount.address); - console.log('New member list:', memberList); + if (import.meta.env.DEV) console.log('Adding member to commission:', selectedAccount.address); + if (import.meta.env.DEV) console.log('New member list:', memberList); // Use sudo to update members (requires sudo access) const tx = api.tx.sudo.sudo( diff --git a/web/src/components/admin/KycApprovalTab.tsx b/web/src/components/admin/KycApprovalTab.tsx index 80731486..ce1f0b0a 100644 --- a/web/src/components/admin/KycApprovalTab.tsx +++ b/web/src/components/admin/KycApprovalTab.tsx @@ -87,7 +87,7 @@ export function KycApprovalTab() { }); } } catch (err) { - console.error('Error fetching identity for', address, err); + if (import.meta.env.DEV) console.error('Error fetching identity for', address, err); } apps.push({ @@ -101,9 +101,9 @@ export function KycApprovalTab() { setPendingApps(apps); setIdentities(identityMap); - console.log(`Loaded ${apps.length} pending KYC applications`); + if (import.meta.env.DEV) console.log(`Loaded ${apps.length} pending KYC applications`); } catch (error) { - console.error('Error loading pending applications:', error); + if (import.meta.env.DEV) console.error('Error loading pending applications:', error); toast({ title: 'Error', description: 'Failed to load pending applications', @@ -129,8 +129,8 @@ export function KycApprovalTab() { const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log('Proposing KYC approval for:', application.address); - console.log('Commission member wallet:', selectedAccount.address); + if (import.meta.env.DEV) console.log('Proposing KYC approval for:', application.address); + if (import.meta.env.DEV) console.log('Commission member wallet:', selectedAccount.address); // Check if user is a member of DynamicCommissionCollective const members = await api.query.dynamicCommissionCollective.members(); @@ -147,16 +147,16 @@ export function KycApprovalTab() { return; } - console.log('✅ User is commission member'); + if (import.meta.env.DEV) console.log('✅ User is commission member'); // Create proposal for KYC approval const proposal = api.tx.identityKyc.approveKyc(application.address); const lengthBound = proposal.encodedLength; // Create proposal directly (no proxy needed) - console.log('Creating commission proposal for KYC approval'); - console.log('Applicant:', application.address); - console.log('Threshold:', COMMISSIONS.KYC.threshold); + if (import.meta.env.DEV) console.log('Creating commission proposal for KYC approval'); + if (import.meta.env.DEV) console.log('Applicant:', application.address); + if (import.meta.env.DEV) console.log('Threshold:', COMMISSIONS.KYC.threshold); const tx = api.tx.dynamicCommissionCollective.propose( COMMISSIONS.KYC.threshold, @@ -164,14 +164,14 @@ export function KycApprovalTab() { lengthBound ); - console.log('Transaction created:', tx.toHuman()); + if (import.meta.env.DEV) console.log('Transaction created:', tx.toHuman()); await new Promise((resolve, reject) => { tx.signAndSend( selectedAccount.address, { signer: injector.signer }, ({ status, dispatchError, events }) => { - console.log('Transaction status:', status.type); + if (import.meta.env.DEV) console.log('Transaction status:', status.type); if (status.isInBlock || status.isFinalized) { if (dispatchError) { @@ -184,7 +184,7 @@ export function KycApprovalTab() { errorMessage = dispatchError.toString(); } - console.error('Approval error:', errorMessage); + if (import.meta.env.DEV) console.error('Approval error:', errorMessage); toast({ title: 'Approval Failed', description: errorMessage, @@ -195,26 +195,26 @@ export function KycApprovalTab() { } // Check for Proposed event - console.log('All events:', events.map(e => `${e.event.section}.${e.event.method}`)); + if (import.meta.env.DEV) console.log('All events:', events.map(e => `${e.event.section}.${e.event.method}`)); const proposedEvent = events.find(({ event }) => event.section === 'dynamicCommissionCollective' && event.method === 'Proposed' ); if (proposedEvent) { - console.log('✅ KYC Approval proposal created'); + if (import.meta.env.DEV) console.log('✅ KYC Approval proposal created'); toast({ title: 'Proposal Created', description: `KYC approval proposed for ${application.address.slice(0, 8)}... Waiting for other commission members to vote.`, }); resolve(); } else { - console.warn('Transaction included but no Proposed event'); + if (import.meta.env.DEV) console.warn('Transaction included but no Proposed event'); resolve(); } } } ).catch((error) => { - console.error('Failed to sign and send:', error); + if (import.meta.env.DEV) console.error('Failed to sign and send:', error); toast({ title: 'Transaction Error', description: error instanceof Error ? error.message : 'Failed to submit transaction', @@ -232,7 +232,7 @@ export function KycApprovalTab() { }, 2000); } catch (error) { - console.error('Error approving KYC:', error); + if (import.meta.env.DEV) console.error('Error approving KYC:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to approve KYC', @@ -264,7 +264,7 @@ export function KycApprovalTab() { const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log('Rejecting KYC for:', application.address); + if (import.meta.env.DEV) console.log('Rejecting KYC for:', application.address); const tx = api.tx.identityKyc.rejectKyc(application.address); @@ -318,7 +318,7 @@ export function KycApprovalTab() { }, 2000); } catch (error) { - console.error('Error rejecting KYC:', error); + if (import.meta.env.DEV) console.error('Error rejecting KYC:', error); toast({ title: 'Error', description: error instanceof Error ? error.message : 'Failed to reject KYC', diff --git a/web/src/components/citizenship/ExistingCitizenAuth.tsx b/web/src/components/citizenship/ExistingCitizenAuth.tsx index fd049f9c..58f39e02 100644 --- a/web/src/components/citizenship/ExistingCitizenAuth.tsx +++ b/web/src/components/citizenship/ExistingCitizenAuth.tsx @@ -51,7 +51,7 @@ export const ExistingCitizenAuth: React.FC = ({ onClos setChallenge(authChallenge); setStep('signing'); } catch { - console.error('Verification error:', err); + if (import.meta.env.DEV) console.error('Verification error:', err); setError('Failed to verify Citizen Number'); setStep('error'); } @@ -97,7 +97,7 @@ export const ExistingCitizenAuth: React.FC = ({ onClos window.location.href = '/citizens'; }, 2000); } catch { - console.error('Signature error:', err); + if (import.meta.env.DEV) console.error('Signature error:', err); setError('Failed to sign authentication challenge'); setStep('error'); } diff --git a/web/src/components/citizenship/NewCitizenApplication.tsx b/web/src/components/citizenship/NewCitizenApplication.tsx index 6850cf62..193a6e13 100644 --- a/web/src/components/citizenship/NewCitizenApplication.tsx +++ b/web/src/components/citizenship/NewCitizenApplication.tsx @@ -48,7 +48,7 @@ export const NewCitizenApplication: React.FC = ({ on const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log('Confirming citizenship application (self-confirmation)...'); + if (import.meta.env.DEV) console.log('Confirming citizenship application (self-confirmation)...'); // Call confirm_citizenship() extrinsic - self-confirmation for Welati Tiki const tx = api.tx.identityKyc.confirmCitizenship(); @@ -57,10 +57,10 @@ export const NewCitizenApplication: React.FC = ({ on if (dispatchError) { if (dispatchError.isModule) { const decoded = api.registry.findMetaError(dispatchError.asModule); - console.error(`${decoded.section}.${decoded.name}: ${decoded.docs.join(' ')}`); + if (import.meta.env.DEV) console.error(`${decoded.section}.${decoded.name}: ${decoded.docs.join(' ')}`); setError(`${decoded.section}.${decoded.name}: ${decoded.docs.join(' ')}`); } else { - console.error(dispatchError.toString()); + if (import.meta.env.DEV) console.error(dispatchError.toString()); setError(dispatchError.toString()); } setConfirming(false); @@ -68,13 +68,13 @@ export const NewCitizenApplication: React.FC = ({ on } if (status.isInBlock || status.isFinalized) { - console.log('✅ Citizenship confirmed successfully!'); - console.log('Block hash:', status.asInBlock || status.asFinalized); + if (import.meta.env.DEV) console.log('✅ Citizenship confirmed successfully!'); + if (import.meta.env.DEV) console.log('Block hash:', status.asInBlock || status.asFinalized); // Check for CitizenshipConfirmed event events.forEach(({ event }) => { if (event.section === 'identityKyc' && event.method === 'CitizenshipConfirmed') { - console.log('📢 CitizenshipConfirmed event detected'); + if (import.meta.env.DEV) console.log('📢 CitizenshipConfirmed event detected'); setKycApproved(true); setWaitingForApproval(false); @@ -91,7 +91,7 @@ export const NewCitizenApplication: React.FC = ({ on }); } catch (err) { - console.error('Approval error:', err); + if (import.meta.env.DEV) console.error('Approval error:', err); setError((err as Error).message || 'Failed to approve application'); setConfirming(false); } @@ -100,7 +100,7 @@ export const NewCitizenApplication: React.FC = ({ on const handleReject = async () => { // Cancel/withdraw the application - simply close modal and go back // No blockchain interaction needed - application will remain Pending until confirmed or admin-rejected - console.log('Canceling citizenship application (no blockchain interaction)'); + if (import.meta.env.DEV) console.log('Canceling citizenship application (no blockchain interaction)'); onClose(); window.location.href = '/'; }; @@ -115,10 +115,10 @@ export const NewCitizenApplication: React.FC = ({ on setCheckingStatus(true); try { const status = await getKycStatus(api, selectedAccount.address); - console.log('Current KYC Status:', status); + if (import.meta.env.DEV) console.log('Current KYC Status:', status); if (status === 'Approved') { - console.log('KYC already approved! Redirecting to dashboard...'); + if (import.meta.env.DEV) console.log('KYC already approved! Redirecting to dashboard...'); setKycApproved(true); // Redirect to dashboard after 2 seconds @@ -131,7 +131,7 @@ export const NewCitizenApplication: React.FC = ({ on setWaitingForApproval(true); } } catch (err) { - console.error('Error checking KYC status:', err); + if (import.meta.env.DEV) console.error('Error checking KYC status:', err); } finally { setCheckingStatus(false); } @@ -146,13 +146,13 @@ export const NewCitizenApplication: React.FC = ({ on return; } - console.log('Setting up KYC approval listener for:', selectedAccount.address); + if (import.meta.env.DEV) console.log('Setting up KYC approval listener for:', selectedAccount.address); const unsubscribe = subscribeToKycApproval( api, selectedAccount.address, () => { - console.log('KYC Approved! Redirecting to dashboard...'); + if (import.meta.env.DEV) console.log('KYC Approved! Redirecting to dashboard...'); setKycApproved(true); setWaitingForApproval(false); @@ -163,7 +163,7 @@ export const NewCitizenApplication: React.FC = ({ on }, 2000); }, (error) => { - console.error('KYC approval subscription error:', error); + if (import.meta.env.DEV) console.error('KYC approval subscription error:', error); setError(`Failed to monitor approval status: ${error}`); } ); @@ -213,7 +213,7 @@ export const NewCitizenApplication: React.FC = ({ on // The referrer calls api.tx.referral.initiateReferral(refereeAddress) from InviteUserModal // Here we just use the referrerAddress in the citizenship data if provided if (referrerAddress) { - console.log(`KYC application with referrer: ${referrerAddress}`); + if (import.meta.env.DEV) console.log(`KYC application with referrer: ${referrerAddress}`); } // Prepare complete citizenship data @@ -228,8 +228,8 @@ export const NewCitizenApplication: React.FC = ({ on const commitmentHash = await generateCommitmentHash(citizenshipData); const nullifierHash = await generateNullifierHash(selectedAccount.address, citizenshipData.timestamp); - console.log('Commitment Hash:', commitmentHash); - console.log('Nullifier Hash:', nullifierHash); + if (import.meta.env.DEV) console.log('Commitment Hash:', commitmentHash); + if (import.meta.env.DEV) console.log('Nullifier Hash:', nullifierHash); // Encrypt data const encryptedData = await encryptData(citizenshipData, selectedAccount.address); @@ -240,9 +240,9 @@ export const NewCitizenApplication: React.FC = ({ on // Upload to IPFS const ipfsCid = await uploadToIPFS(encryptedData); - console.log('IPFS CID:', ipfsCid); - console.log('IPFS CID type:', typeof ipfsCid); - console.log('IPFS CID value:', JSON.stringify(ipfsCid)); + if (import.meta.env.DEV) console.log('IPFS CID:', ipfsCid); + if (import.meta.env.DEV) console.log('IPFS CID type:', typeof ipfsCid); + if (import.meta.env.DEV) console.log('IPFS CID value:', JSON.stringify(ipfsCid)); // Ensure ipfsCid is a string const cidString = String(ipfsCid); @@ -251,7 +251,7 @@ export const NewCitizenApplication: React.FC = ({ on } // Submit to blockchain - console.log('Submitting KYC application to blockchain...'); + if (import.meta.env.DEV) console.log('Submitting KYC application to blockchain...'); const result = await submitKycApplication( api, selectedAccount, @@ -267,8 +267,8 @@ export const NewCitizenApplication: React.FC = ({ on return; } - console.log('✅ KYC application submitted to blockchain'); - console.log('Block hash:', result.blockHash); + if (import.meta.env.DEV) console.log('✅ KYC application submitted to blockchain'); + if (import.meta.env.DEV) console.log('Block hash:', result.blockHash); // Save block hash for display if (result.blockHash) { @@ -281,7 +281,7 @@ export const NewCitizenApplication: React.FC = ({ on setWaitingForApproval(true); } catch (err) { - console.error('Submission error:', err); + if (import.meta.env.DEV) console.error('Submission error:', err); setError('Failed to submit citizenship application'); setSubmitting(false); } diff --git a/web/src/components/dashboard/CommissionProposalsCard.tsx b/web/src/components/dashboard/CommissionProposalsCard.tsx index e7e0c7da..8ea8e4f6 100644 --- a/web/src/components/dashboard/CommissionProposalsCard.tsx +++ b/web/src/components/dashboard/CommissionProposalsCard.tsx @@ -43,7 +43,7 @@ export function CommissionProposalsCard() { const memberList = members.toJSON() as string[]; setIsCommissionMember(memberList.includes(selectedAccount.address)); } catch (error) { - console.error('Error checking membership:', error); + if (import.meta.env.DEV) console.error('Error checking membership:', error); setIsCommissionMember(false); } }; @@ -89,7 +89,7 @@ export function CommissionProposalsCard() { setProposals(proposalList); } catch (error) { - console.error('Error loading proposals:', error); + if (import.meta.env.DEV) console.error('Error loading proposals:', error); } finally { setLoading(false); } @@ -249,14 +249,14 @@ export function CommissionProposalsCard() { if (executedEvent) { const eventData = executedEvent.event.data.toHuman(); - console.log('✅ Proposal executed'); - console.log('Execute event data:', eventData); - console.log('Result:', eventData); + if (import.meta.env.DEV) console.log('✅ Proposal executed'); + if (import.meta.env.DEV) console.log('Execute event data:', eventData); + if (import.meta.env.DEV) console.log('Result:', eventData); // Check if execution was successful const result = eventData[eventData.length - 1]; // Last parameter is usually the result if (result && typeof result === 'object' && 'Err' in result) { - console.error('Execution failed:', result.Err); + if (import.meta.env.DEV) console.error('Execution failed:', result.Err); toast({ title: 'Execution Failed', description: `Proposal closed but execution failed: ${JSON.stringify(result.Err)}`, diff --git a/web/src/components/delegation/DelegateProfile.tsx b/web/src/components/delegation/DelegateProfile.tsx index 36ebbd4a..cc8996b1 100644 --- a/web/src/components/delegation/DelegateProfile.tsx +++ b/web/src/components/delegation/DelegateProfile.tsx @@ -37,7 +37,7 @@ const DelegateProfile: React.FC = () => { const handleBecomeDelegate = () => { setIsDelegate(true); - console.log('Becoming a delegate with:', profileData); + if (import.meta.env.DEV) console.log('Becoming a delegate with:', profileData); }; if (!isDelegate) { diff --git a/web/src/components/delegation/DelegationManager.tsx b/web/src/components/delegation/DelegationManager.tsx index 0abb0d69..62412758 100644 --- a/web/src/components/delegation/DelegationManager.tsx +++ b/web/src/components/delegation/DelegationManager.tsx @@ -29,7 +29,7 @@ const DelegationManager: React.FC = () => { }; const handleDelegate = () => { - console.log('Delegating:', { + if (import.meta.env.DEV) console.log('Delegating:', { delegate: selectedDelegate, amount: delegationAmount, period: delegationPeriod diff --git a/web/src/components/dex/AddLiquidityModal.tsx b/web/src/components/dex/AddLiquidityModal.tsx index f99d7973..656ce502 100644 --- a/web/src/components/dex/AddLiquidityModal.tsx +++ b/web/src/components/dex/AddLiquidityModal.tsx @@ -56,7 +56,7 @@ export const AddLiquidityModal: React.FC = ({ setBalance1(balance1Data.isSome ? balance1Data.unwrap().balance.toString() : '0'); setBalance2(balance2Data.isSome ? balance2Data.unwrap().balance.toString() : '0'); } catch (error) { - console.error('Failed to fetch balances:', error); + if (import.meta.env.DEV) console.error('Failed to fetch balances:', error); } }; @@ -78,7 +78,7 @@ export const AddLiquidityModal: React.FC = ({ const amount2Display = formatTokenBalance(amount2Raw, pool.asset2Decimals, 6); setAmount2Input(amount2Display); } catch (error) { - console.error('Failed to calculate amount2:', error); + if (import.meta.env.DEV) console.error('Failed to calculate amount2:', error); } }; @@ -97,7 +97,7 @@ export const AddLiquidityModal: React.FC = ({ const amount1Display = formatTokenBalance(amount1Raw, pool.asset1Decimals, 6); setAmount1Input(amount1Display); } catch (error) { - console.error('Failed to calculate amount1:', error); + if (import.meta.env.DEV) console.error('Failed to calculate amount1:', error); } }; @@ -182,7 +182,7 @@ export const AddLiquidityModal: React.FC = ({ } ); } catch (error) { - console.error('Add liquidity failed:', error); + if (import.meta.env.DEV) console.error('Add liquidity failed:', error); setErrorMessage(error instanceof Error ? error.message : 'Transaction failed'); setTxStatus('error'); } diff --git a/web/src/components/dex/CreatePoolModal.tsx b/web/src/components/dex/CreatePoolModal.tsx index d8f2f710..8d157e67 100644 --- a/web/src/components/dex/CreatePoolModal.tsx +++ b/web/src/components/dex/CreatePoolModal.tsx @@ -55,18 +55,18 @@ export const CreatePoolModal: React.FC = ({ if (!api || !isApiReady || !account || asset1Id === null) return; try { - console.log('🔍 Fetching balance for asset', asset1Id, 'account', account); + if (import.meta.env.DEV) console.log('🔍 Fetching balance for asset', asset1Id, 'account', account); const balance1Data = await api.query.assets.account(asset1Id, account); if (balance1Data.isSome) { const balance = balance1Data.unwrap().balance.toString(); - console.log('✅ Balance found for asset', asset1Id, ':', balance); + if (import.meta.env.DEV) console.log('✅ Balance found for asset', asset1Id, ':', balance); setBalance1(balance); } else { - console.warn('⚠️ No balance found for asset', asset1Id); + if (import.meta.env.DEV) console.warn('⚠️ No balance found for asset', asset1Id); setBalance1('0'); } } catch (error) { - console.error('❌ Failed to fetch balance 1:', error); + if (import.meta.env.DEV) console.error('❌ Failed to fetch balance 1:', error); setBalance1('0'); } }; @@ -79,18 +79,18 @@ export const CreatePoolModal: React.FC = ({ if (!api || !isApiReady || !account || asset2Id === null) return; try { - console.log('🔍 Fetching balance for asset', asset2Id, 'account', account); + if (import.meta.env.DEV) console.log('🔍 Fetching balance for asset', asset2Id, 'account', account); const balance2Data = await api.query.assets.account(asset2Id, account); if (balance2Data.isSome) { const balance = balance2Data.unwrap().balance.toString(); - console.log('✅ Balance found for asset', asset2Id, ':', balance); + if (import.meta.env.DEV) console.log('✅ Balance found for asset', asset2Id, ':', balance); setBalance2(balance); } else { - console.warn('⚠️ No balance found for asset', asset2Id); + if (import.meta.env.DEV) console.warn('⚠️ No balance found for asset', asset2Id); setBalance2('0'); } } catch (error) { - console.error('❌ Failed to fetch balance 2:', error); + if (import.meta.env.DEV) console.error('❌ Failed to fetch balance 2:', error); setBalance2('0'); } }; @@ -121,7 +121,7 @@ export const CreatePoolModal: React.FC = ({ const amount1Raw = parseTokenInput(amount1Input, token1.decimals); const amount2Raw = parseTokenInput(amount2Input, token2.decimals); - console.log('💰 Validation check:', { + if (import.meta.env.DEV) console.log('💰 Validation check:', { token1: token1.symbol, amount1Input, amount1Raw, @@ -213,7 +213,7 @@ export const CreatePoolModal: React.FC = ({ } ); } catch (error) { - console.error('Pool creation failed:', error); + if (import.meta.env.DEV) console.error('Pool creation failed:', error); setErrorMessage(error instanceof Error ? error.message : 'Transaction failed'); setTxStatus('error'); } diff --git a/web/src/components/dex/InitializeHezPoolModal.tsx b/web/src/components/dex/InitializeHezPoolModal.tsx index b96592c5..247dd76d 100644 --- a/web/src/components/dex/InitializeHezPoolModal.tsx +++ b/web/src/components/dex/InitializeHezPoolModal.tsx @@ -58,7 +58,7 @@ export const InitializeHezPoolModal: React.FC = ({ const whezData = await api.query.assets.account(0, account); setWhezBalance(whezData.isSome ? whezData.unwrap().balance.toString() : '0'); } catch (error) { - console.error('Failed to fetch balances:', error); + if (import.meta.env.DEV) console.error('Failed to fetch balances:', error); } }; @@ -91,7 +91,7 @@ export const InitializeHezPoolModal: React.FC = ({ setErrorMessage(''); try { - console.log('🔄 Wrapping HEZ to wHEZ...', { + if (import.meta.env.DEV) console.log('🔄 Wrapping HEZ to wHEZ...', { hezAmount, hezAmountRaw: hezAmountRaw.toString(), }); @@ -104,10 +104,10 @@ export const InitializeHezPoolModal: React.FC = ({ account, { signer }, ({ status, dispatchError, events }) => { - console.log('📦 Transaction status:', status.type); + if (import.meta.env.DEV) console.log('📦 Transaction status:', status.type); if (status.isInBlock) { - console.log('✅ In block:', status.asInBlock.toHex()); + if (import.meta.env.DEV) console.log('✅ In block:', status.asInBlock.toHex()); if (dispatchError) { let errorMsg = ''; @@ -115,10 +115,10 @@ export const InitializeHezPoolModal: React.FC = ({ if (dispatchError.isModule) { const decoded = api.registry.findMetaError(dispatchError.asModule); errorMsg = `${decoded.section}.${decoded.name}: ${decoded.docs.join(' ')}`; - console.error('❌ Module error:', errorMsg); + if (import.meta.env.DEV) console.error('❌ Module error:', errorMsg); } else { errorMsg = dispatchError.toString(); - console.error('❌ Dispatch error:', errorMsg); + if (import.meta.env.DEV) console.error('❌ Dispatch error:', errorMsg); } setErrorMessage(errorMsg); @@ -129,8 +129,8 @@ export const InitializeHezPoolModal: React.FC = ({ variant: 'destructive', }); } else { - console.log('✅ Wrap successful!'); - console.log('📋 Events:', events.map(e => e.event.method).join(', ')); + if (import.meta.env.DEV) console.log('✅ Wrap successful!'); + if (import.meta.env.DEV) console.log('📋 Events:', events.map(e => e.event.method).join(', ')); setTxStatus('success'); toast({ title: 'Success!', @@ -145,7 +145,7 @@ export const InitializeHezPoolModal: React.FC = ({ } ); } catch (error) { - console.error('Wrap failed:', error); + if (import.meta.env.DEV) console.error('Wrap failed:', error); setErrorMessage(error instanceof Error ? error.message : 'Transaction failed'); setTxStatus('error'); toast({ diff --git a/web/src/components/dex/PoolBrowser.tsx b/web/src/components/dex/PoolBrowser.tsx index d2c103cb..596f6dda 100644 --- a/web/src/components/dex/PoolBrowser.tsx +++ b/web/src/components/dex/PoolBrowser.tsx @@ -39,7 +39,7 @@ export const PoolBrowser: React.FC = ({ const poolsData = await fetchPools(api); setPools(poolsData); } catch (error) { - console.error('Failed to load pools:', error); + if (import.meta.env.DEV) console.error('Failed to load pools:', error); } finally { setLoading(false); } diff --git a/web/src/components/dex/RemoveLiquidityModal.tsx b/web/src/components/dex/RemoveLiquidityModal.tsx index 5e5fb220..b09a6149 100644 --- a/web/src/components/dex/RemoveLiquidityModal.tsx +++ b/web/src/components/dex/RemoveLiquidityModal.tsx @@ -67,7 +67,7 @@ export const RemoveLiquidityModal: React.FC = ({ // This is a simplified version - you'd need to track LP tokens properly setLpTokenBalance('0'); // Placeholder } catch (error) { - console.error('Failed to fetch LP balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch LP balance:', error); setLpTokenBalance('0'); } }; @@ -154,7 +154,7 @@ export const RemoveLiquidityModal: React.FC = ({ } ); } catch (error) { - console.error('Remove liquidity failed:', error); + if (import.meta.env.DEV) console.error('Remove liquidity failed:', error); setErrorMessage(error instanceof Error ? error.message : 'Transaction failed'); setTxStatus('error'); } diff --git a/web/src/components/dex/SwapInterface.tsx b/web/src/components/dex/SwapInterface.tsx index 970c47a2..59667054 100644 --- a/web/src/components/dex/SwapInterface.tsx +++ b/web/src/components/dex/SwapInterface.tsx @@ -82,7 +82,7 @@ export const SwapInterface: React.FC = ({ pools }) => { const freeBalance = balance.data.free.toString(); setFromBalance(freeBalance); } catch (error) { - console.error('Failed to fetch HEZ balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch HEZ balance:', error); setFromBalance('0'); } } else if (fromAssetId !== null) { @@ -90,7 +90,7 @@ export const SwapInterface: React.FC = ({ pools }) => { const balanceData = await api.query.assets.account(fromAssetId, account); setFromBalance(balanceData.isSome ? balanceData.unwrap().balance.toString() : '0'); } catch (error) { - console.error('Failed to fetch from balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch from balance:', error); setFromBalance('0'); } } @@ -102,7 +102,7 @@ export const SwapInterface: React.FC = ({ pools }) => { const freeBalance = balance.data.free.toString(); setToBalance(freeBalance); } catch (error) { - console.error('Failed to fetch HEZ balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch HEZ balance:', error); setToBalance('0'); } } else if (toAssetId !== null) { @@ -110,7 +110,7 @@ export const SwapInterface: React.FC = ({ pools }) => { const balanceData = await api.query.assets.account(toAssetId, account); setToBalance(balanceData.isSome ? balanceData.unwrap().balance.toString() : '0'); } catch (error) { - console.error('Failed to fetch to balance:', error); + if (import.meta.env.DEV) console.error('Failed to fetch to balance:', error); setToBalance('0'); } } @@ -139,7 +139,7 @@ export const SwapInterface: React.FC = ({ pools }) => { setToAmount(toAmountDisplay); } catch (error) { - console.error('Failed to calculate output:', error); + if (import.meta.env.DEV) console.error('Failed to calculate output:', error); setToAmount(''); } }, [fromAmount, activePool, fromTokenInfo, toTokenInfo, fromAssetId, toAssetId]); @@ -217,7 +217,7 @@ export const SwapInterface: React.FC = ({ pools }) => { toTokenInfo.decimals ); - console.log('💰 Swap transaction:', { + if (import.meta.env.DEV) console.log('💰 Swap transaction:', { from: fromToken, to: toToken, amount: fromAmount, @@ -321,7 +321,7 @@ export const SwapInterface: React.FC = ({ pools }) => { } ); } catch (error) { - console.error('Swap failed:', error); + if (import.meta.env.DEV) console.error('Swap failed:', error); setErrorMessage(error instanceof Error ? error.message : 'Transaction failed'); setTxStatus('error'); toast({ diff --git a/web/src/components/forum/DiscussionThread.tsx b/web/src/components/forum/DiscussionThread.tsx index 771f130e..207d7a16 100644 --- a/web/src/components/forum/DiscussionThread.tsx +++ b/web/src/components/forum/DiscussionThread.tsx @@ -104,7 +104,7 @@ export function DiscussionThread({ proposalId }: { proposalId: string }) { const handleSentimentUpdate = (data: { proposalId: string; sentiment: Record }) => { if (data.proposalId === proposalId) { // Update sentiment visualization in parent component - console.log('Sentiment updated:', data.sentiment); + if (import.meta.env.DEV) console.log('Sentiment updated:', data.sentiment); } }; diff --git a/web/src/components/governance/GovernanceOverview.tsx b/web/src/components/governance/GovernanceOverview.tsx index 3751a868..f6333e4a 100644 --- a/web/src/components/governance/GovernanceOverview.tsx +++ b/web/src/components/governance/GovernanceOverview.tsx @@ -39,22 +39,22 @@ const GovernanceOverview: React.FC = () => { useEffect(() => { const fetchGovernanceData = async () => { if (!api || !isApiReady) { - console.log('API not ready for governance data'); + if (import.meta.env.DEV) console.log('API not ready for governance data'); return; } try { - console.log('📊 Fetching governance data from blockchain...'); + if (import.meta.env.DEV) console.log('📊 Fetching governance data from blockchain...'); setLoading(true); // Fetch active referenda (proposals) let activeProposals = 0; try { const referendaCount = await api.query.referenda.referendumCount(); - console.log('Referenda count:', referendaCount.toNumber()); + if (import.meta.env.DEV) console.log('Referenda count:', referendaCount.toNumber()); activeProposals = referendaCount.toNumber(); } catch (err) { - console.warn('Failed to fetch referenda count:', err); + if (import.meta.env.DEV) console.warn('Failed to fetch referenda count:', err); } // Fetch treasury balance @@ -65,9 +65,9 @@ const GovernanceOverview: React.FC = () => { ); const balance = treasuryAccount.data.free.toString(); treasuryBalance = `${formatBalance(balance)} HEZ`; - console.log('Treasury balance:', treasuryBalance); + if (import.meta.env.DEV) console.log('Treasury balance:', treasuryBalance); } catch (err) { - console.warn('Failed to fetch treasury balance:', err); + if (import.meta.env.DEV) console.warn('Failed to fetch treasury balance:', err); } // Fetch council members @@ -75,9 +75,9 @@ const GovernanceOverview: React.FC = () => { try { const members = await api.query.council.members(); parliamentMembers = members.length; - console.log('Council members:', parliamentMembers); + if (import.meta.env.DEV) console.log('Council members:', parliamentMembers); } catch (err) { - console.warn('Failed to fetch council members:', err); + if (import.meta.env.DEV) console.warn('Failed to fetch council members:', err); } // Update stats @@ -92,13 +92,13 @@ const GovernanceOverview: React.FC = () => { treasuryBalance }); - console.log('✅ Governance data updated:', { + if (import.meta.env.DEV) console.log('✅ Governance data updated:', { activeProposals, parliamentMembers, treasuryBalance }); } catch (error) { - console.error('Failed to fetch governance data:', error); + if (import.meta.env.DEV) console.error('Failed to fetch governance data:', error); } finally { setLoading(false); } diff --git a/web/src/components/p2p/AdList.tsx b/web/src/components/p2p/AdList.tsx index 7cc5392e..9cf6fa33 100644 --- a/web/src/components/p2p/AdList.tsx +++ b/web/src/components/p2p/AdList.tsx @@ -70,7 +70,7 @@ export function AdList({ type }: AdListProps) { setOffers(enrichedOffers); } catch (error) { - console.error('Fetch offers error:', error); + if (import.meta.env.DEV) console.error('Fetch offers error:', error); } finally { setLoading(false); } diff --git a/web/src/components/p2p/CreateAd.tsx b/web/src/components/p2p/CreateAd.tsx index ba47def8..ee9cc10c 100644 --- a/web/src/components/p2p/CreateAd.tsx +++ b/web/src/components/p2p/CreateAd.tsx @@ -139,7 +139,7 @@ export function CreateAd({ onAdCreated }: CreateAdProps) { toast.success('Ad created successfully!'); onAdCreated(); } catch (error) { - console.error('Create ad error:', error); + if (import.meta.env.DEV) console.error('Create ad error:', error); // Error toast already shown in createFiatOffer } finally { setLoading(false); diff --git a/web/src/components/p2p/TradeModal.tsx b/web/src/components/p2p/TradeModal.tsx index 421b3501..91afc9dc 100644 --- a/web/src/components/p2p/TradeModal.tsx +++ b/web/src/components/p2p/TradeModal.tsx @@ -73,7 +73,7 @@ export function TradeModal({ offer, onClose }: TradeModalProps) { // TODO: Navigate to trade page // navigate(`/p2p/trade/${tradeId}`); } catch (error) { - console.error('Accept offer error:', error); + if (import.meta.env.DEV) console.error('Accept offer error:', error); // Error toast already shown in acceptFiatOffer } finally { setLoading(false); diff --git a/web/src/components/perwerde/CourseCreator.tsx b/web/src/components/perwerde/CourseCreator.tsx index 366f5149..33b6f688 100644 --- a/web/src/components/perwerde/CourseCreator.tsx +++ b/web/src/components/perwerde/CourseCreator.tsx @@ -56,7 +56,7 @@ export function CourseCreator({ onCourseCreated }: CourseCreatorProps) { setDescription(''); setContent(''); } catch (error) { - console.error('Failed to create course:', error); + if (import.meta.env.DEV) console.error('Failed to create course:', error); // toast already shown in createCourse() } finally { setLoading(false); diff --git a/web/src/components/perwerde/CourseList.tsx b/web/src/components/perwerde/CourseList.tsx index f9621c4a..f6faa21c 100644 --- a/web/src/components/perwerde/CourseList.tsx +++ b/web/src/components/perwerde/CourseList.tsx @@ -26,7 +26,7 @@ export function CourseList({ enrolledCourseIds, onEnroll }: CourseListProps) { const activeCourses = await getCourses('Active'); setCourses(activeCourses); } catch (error) { - console.error('Failed to fetch courses:', error); + if (import.meta.env.DEV) console.error('Failed to fetch courses:', error); toast({ title: 'Error', description: 'Failed to fetch courses', @@ -54,7 +54,7 @@ export function CourseList({ enrolledCourseIds, onEnroll }: CourseListProps) { await enrollInCourse(api, selectedAccount, courseId); onEnroll(); } catch (error) { - console.error('Enroll failed:', error); + if (import.meta.env.DEV) console.error('Enroll failed:', error); } }; diff --git a/web/src/components/perwerde/StudentDashboard.tsx b/web/src/components/perwerde/StudentDashboard.tsx index 7f63667a..f018b173 100644 --- a/web/src/components/perwerde/StudentDashboard.tsx +++ b/web/src/components/perwerde/StudentDashboard.tsx @@ -29,7 +29,7 @@ export function StudentDashboard({ enrollments, loading, onCourseCompleted }: St await completeCourse(api, selectedAccount, courseId, points); onCourseCompleted(); } catch (error) { - console.error('Failed to complete course:', error); + if (import.meta.env.DEV) console.error('Failed to complete course:', error); } }; diff --git a/web/src/components/referral/InviteUserModal.tsx b/web/src/components/referral/InviteUserModal.tsx index af716d62..3a5aac83 100644 --- a/web/src/components/referral/InviteUserModal.tsx +++ b/web/src/components/referral/InviteUserModal.tsx @@ -46,7 +46,7 @@ export const InviteUserModal: React.FC = ({ isOpen, onClos setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (error) { - console.error('Failed to copy:', error); + if (import.meta.env.DEV) console.error('Failed to copy:', error); } }; @@ -82,7 +82,7 @@ export const InviteUserModal: React.FC = ({ isOpen, onClos const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log(`Initiating referral from ${selectedAccount.address} to ${inviteeAddress}...`); + if (import.meta.env.DEV) console.log(`Initiating referral from ${selectedAccount.address} to ${inviteeAddress}...`); const tx = api.tx.referral.initiateReferral(inviteeAddress); @@ -95,21 +95,21 @@ export const InviteUserModal: React.FC = ({ isOpen, onClos } else { errorMessage = dispatchError.toString(); } - console.error(errorMessage); + if (import.meta.env.DEV) console.error(errorMessage); setInitiateError(errorMessage); setInitiating(false); return; } if (status.isInBlock || status.isFinalized) { - console.log('Referral initiated successfully!'); + if (import.meta.env.DEV) console.log('Referral initiated successfully!'); setInitiateSuccess(true); setInitiating(false); setInviteeAddress(''); } }); } catch (err: unknown) { - console.error('Failed to initiate referral:', err); + if (import.meta.env.DEV) console.error('Failed to initiate referral:', err); setInitiateError(err.message || 'Failed to initiate referral'); setInitiating(false); } diff --git a/web/src/components/security/PermissionEditor.tsx b/web/src/components/security/PermissionEditor.tsx index 81c17eb2..9f0e92b8 100644 --- a/web/src/components/security/PermissionEditor.tsx +++ b/web/src/components/security/PermissionEditor.tsx @@ -79,7 +79,7 @@ export function PermissionEditor() { setSelectedRole(data[0]); } } catch { - console.error('Error loading roles:', error); + if (import.meta.env.DEV) console.error('Error loading roles:', error); toast({ title: 'Error', description: 'Failed to load roles', diff --git a/web/src/components/security/SecurityAudit.tsx b/web/src/components/security/SecurityAudit.tsx index 0c9bd345..0ecff378 100644 --- a/web/src/components/security/SecurityAudit.tsx +++ b/web/src/components/security/SecurityAudit.tsx @@ -92,7 +92,7 @@ export function SecurityAudit() { setAuditLogs(logs || []); } catch (error) { - console.error('Error loading security data:', error); + if (import.meta.env.DEV) console.error('Error loading security data:', error); } finally { setLoading(false); } diff --git a/web/src/components/security/SessionMonitor.tsx b/web/src/components/security/SessionMonitor.tsx index b3257827..9458d12e 100644 --- a/web/src/components/security/SessionMonitor.tsx +++ b/web/src/components/security/SessionMonitor.tsx @@ -45,7 +45,7 @@ export function SessionMonitor() { if (error) throw error; setSessions(data || []); } catch { - console.error('Error loading sessions:', error); + if (import.meta.env.DEV) console.error('Error loading sessions:', error); } finally { setLoading(false); } diff --git a/web/src/components/staking/StakingDashboard.tsx b/web/src/components/staking/StakingDashboard.tsx index 98c082ee..07a8b204 100644 --- a/web/src/components/staking/StakingDashboard.tsx +++ b/web/src/components/staking/StakingDashboard.tsx @@ -62,14 +62,14 @@ export const StakingDashboard: React.FC = () => { setMinNominatorBond(minBond); setBondingDuration(duration); // Track current era for future use - console.log('Current era:', era); + if (import.meta.env.DEV) console.log('Current era:', era); // Pre-select current nominations if any if (info.nominations.length > 0) { setSelectedValidators(info.nominations); } } catch (error) { - console.error('Failed to fetch staking data:', error); + if (import.meta.env.DEV) console.error('Failed to fetch staking data:', error); toast.error('Failed to fetch staking information'); } finally { setIsLoadingData(false); @@ -113,7 +113,7 @@ export const StakingDashboard: React.FC = () => { { signer: injector.signer }, ({ status, dispatchError }) => { if (status.isInBlock) { - console.log('Transaction in block:', status.asInBlock.toHex()); + if (import.meta.env.DEV) console.log('Transaction in block:', status.asInBlock.toHex()); if (dispatchError) { handleBlockchainError(dispatchError, api, toast); @@ -134,7 +134,7 @@ export const StakingDashboard: React.FC = () => { } ); } catch (error) { - console.error('Bond failed:', error); + if (import.meta.env.DEV) console.error('Bond failed:', error); toast.error(error instanceof Error ? error.message : 'Failed to bond tokens'); setIsLoading(false); } @@ -176,7 +176,7 @@ export const StakingDashboard: React.FC = () => { } ); } catch (error) { - console.error('Nomination failed:', error); + if (import.meta.env.DEV) console.error('Nomination failed:', error); toast.error(error instanceof Error ? error.message : 'Failed to nominate validators'); setIsLoading(false); } @@ -221,7 +221,7 @@ export const StakingDashboard: React.FC = () => { } ); } catch (error) { - console.error('Unbond failed:', error); + if (import.meta.env.DEV) console.error('Unbond failed:', error); toast.error(error instanceof Error ? error.message : 'Failed to unbond tokens'); setIsLoading(false); } @@ -269,7 +269,7 @@ export const StakingDashboard: React.FC = () => { } ); } catch (error) { - console.error('Withdrawal failed:', error); + if (import.meta.env.DEV) console.error('Withdrawal failed:', error); toast.error(error instanceof Error ? error.message : 'Failed to withdraw tokens'); setIsLoading(false); } @@ -315,7 +315,7 @@ export const StakingDashboard: React.FC = () => { } ); } catch (error) { - console.error('Start score tracking failed:', error); + if (import.meta.env.DEV) console.error('Start score tracking failed:', error); toast.error(error instanceof Error ? error.message : 'Failed to start score tracking'); setIsLoading(false); } diff --git a/web/src/components/staking/ValidatorPoolDashboard.tsx b/web/src/components/staking/ValidatorPoolDashboard.tsx index ab2d3714..1bfebed7 100644 --- a/web/src/components/staking/ValidatorPoolDashboard.tsx +++ b/web/src/components/staking/ValidatorPoolDashboard.tsx @@ -48,7 +48,7 @@ export function ValidatorPoolDashboard() { setPoolMember(memberData); } } catch (error) { - console.error('Failed to fetch validator pool data:', error); + if (import.meta.env.DEV) console.error('Failed to fetch validator pool data:', error); toast.error('Failed to fetch pool data'); } finally { setLoading(false); @@ -67,7 +67,7 @@ export function ValidatorPoolDashboard() { toast.success(`Joined the ${category} pool`); fetchData(); } catch (error) { - console.error('Join pool error:', error); + if (import.meta.env.DEV) console.error('Join pool error:', error); // Error toast already shown in joinValidatorPool } finally { setActionLoading(false); @@ -82,7 +82,7 @@ export function ValidatorPoolDashboard() { toast.success('Left the validator pool'); fetchData(); } catch (error) { - console.error('Leave pool error:', error); + if (import.meta.env.DEV) console.error('Leave pool error:', error); // Error toast already shown in leaveValidatorPool } finally { setActionLoading(false); @@ -97,7 +97,7 @@ export function ValidatorPoolDashboard() { toast.success(`Switched to ${newCategory}`); fetchData(); } catch (error) { - console.error('Switch category error:', error); + if (import.meta.env.DEV) console.error('Switch category error:', error); // Error toast already shown in updateValidatorCategory } finally { setActionLoading(false); diff --git a/web/src/components/wallet/MultiSigWallet.tsx b/web/src/components/wallet/MultiSigWallet.tsx index d192c028..7548ae6f 100644 --- a/web/src/components/wallet/MultiSigWallet.tsx +++ b/web/src/components/wallet/MultiSigWallet.tsx @@ -50,11 +50,11 @@ export const MultiSigWallet: React.FC = () => { ]; const handleCreateTransaction = () => { - console.log('Creating multi-sig transaction:', { amount, recipient, description }); + if (import.meta.env.DEV) console.log('Creating multi-sig transaction:', { amount, recipient, description }); }; const handleSign = (txId: string) => { - console.log('Signing transaction:', txId); + if (import.meta.env.DEV) console.log('Signing transaction:', txId); }; return ( diff --git a/web/src/components/wallet/WalletModal.tsx b/web/src/components/wallet/WalletModal.tsx index fa2f1946..ffb5af0b 100644 --- a/web/src/components/wallet/WalletModal.tsx +++ b/web/src/components/wallet/WalletModal.tsx @@ -80,7 +80,7 @@ export const WalletModal: React.FC = ({ isOpen, onClose }) => const userScores = await getAllScores(api, selectedAccount.address); setScores(userScores); } catch (err) { - console.error('Failed to fetch scores:', err); + if (import.meta.env.DEV) console.error('Failed to fetch scores:', err); setScores({ trustScore: 0, referralScore: 0, diff --git a/web/src/contexts/AuthContext.tsx b/web/src/contexts/AuthContext.tsx index 67651ad5..215d1ca0 100644 --- a/web/src/contexts/AuthContext.tsx +++ b/web/src/contexts/AuthContext.tsx @@ -59,7 +59,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children const inactiveTime = now - lastActivityTime; if (inactiveTime >= SESSION_TIMEOUT_MS) { - console.log('⏱️ Session timeout - logging out due to inactivity'); + if (import.meta.env.DEV) console.log('⏱️ Session timeout - logging out due to inactivity'); await signOut(); } }, [user]); @@ -142,11 +142,11 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children try { // PRIMARY: Check wallet-based admin (blockchain auth) const connectedWallet = localStorage.getItem('selectedWallet'); - console.log('🔍 Admin check - Connected wallet:', connectedWallet); - console.log('🔍 Admin check - Whitelist:', ADMIN_WALLETS); + if (import.meta.env.DEV) console.log('🔍 Admin check - Connected wallet:', connectedWallet); + if (import.meta.env.DEV) console.log('🔍 Admin check - Whitelist:', ADMIN_WALLETS); if (connectedWallet && ADMIN_WALLETS.includes(connectedWallet)) { - console.log('✅ Admin access granted (wallet-based)'); + if (import.meta.env.DEV) console.log('✅ Admin access granted (wallet-based)'); setIsAdmin(true); return true; } @@ -161,17 +161,17 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children .maybeSingle(); if (!error && data && ['admin', 'super_admin'].includes(data.role)) { - console.log('✅ Admin access granted (Supabase-based)'); + if (import.meta.env.DEV) console.log('✅ Admin access granted (Supabase-based)'); setIsAdmin(true); return true; } } - console.log('❌ Admin access denied'); + if (import.meta.env.DEV) console.log('❌ Admin access denied'); setIsAdmin(false); return false; } catch { - console.error('Admin check error:', err); + if (import.meta.env.DEV) console.error('Admin check error:', err); setIsAdmin(false); return false; } @@ -224,7 +224,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children if (referralCode) { // You can add logic here to reward the referrer // For example, update their referral count or add rewards - console.log(`User registered with referral code: ${referralCode}`); + if (import.meta.env.DEV) console.log(`User registered with referral code: ${referralCode}`); } } diff --git a/web/src/contexts/DashboardContext.tsx b/web/src/contexts/DashboardContext.tsx index a0adfbaf..98cdd6db 100644 --- a/web/src/contexts/DashboardContext.tsx +++ b/web/src/contexts/DashboardContext.tsx @@ -49,13 +49,13 @@ export function DashboardProvider({ children }: { children: ReactNode }) { .maybeSingle(); if (error) { - console.warn('Profile fetch error (this is normal if Supabase is not configured):', error.message); + if (import.meta.env.DEV) console.warn('Profile fetch error (this is normal if Supabase is not configured):', error.message); return; } setProfile(data); } catch (error) { - console.warn('Error fetching profile (this is normal if Supabase is not configured):', error); + if (import.meta.env.DEV) console.warn('Error fetching profile (this is normal if Supabase is not configured):', error); } finally { setLoading(false); } @@ -72,7 +72,7 @@ export function DashboardProvider({ children }: { children: ReactNode }) { const details = await getAllTikiNFTDetails(api, selectedAccount.address); setNftDetails(details); } catch (error) { - console.error('Error fetching data:', error); + if (import.meta.env.DEV) console.error('Error fetching data:', error); } finally { setLoading(false); } diff --git a/web/src/contexts/IdentityContext.tsx b/web/src/contexts/IdentityContext.tsx index 713b3bbc..8e033522 100644 --- a/web/src/contexts/IdentityContext.tsx +++ b/web/src/contexts/IdentityContext.tsx @@ -86,7 +86,7 @@ export function IdentityProvider({ children }: { children: React.ReactNode }) { setProfile(updatedProfile); localStorage.setItem(`identity_${profile.address}`, JSON.stringify(updatedProfile)); } catch (error) { - console.error('KYC verification failed:', error); + if (import.meta.env.DEV) console.error('KYC verification failed:', error); } finally { setIsVerifying(false); } diff --git a/web/src/contexts/PolkadotContext.tsx b/web/src/contexts/PolkadotContext.tsx index 34961c27..12a09819 100644 --- a/web/src/contexts/PolkadotContext.tsx +++ b/web/src/contexts/PolkadotContext.tsx @@ -38,7 +38,9 @@ export const PolkadotProvider: React.FC = ({ setSelectedAccount(account); if (account) { localStorage.setItem('selectedWallet', account.address); - console.log('💾 Wallet saved:', account.address); + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.log('💾 Wallet saved:', account.address); + } window.dispatchEvent(new Event('walletChanged')); } else { localStorage.removeItem('selectedWallet'); @@ -46,38 +48,61 @@ export const PolkadotProvider: React.FC = ({ } }; - // Initialize Polkadot API + // Initialize Polkadot API with fallback endpoints useEffect(() => { + const FALLBACK_ENDPOINTS = [ + endpoint, + import.meta.env.VITE_WS_ENDPOINT_FALLBACK_1, + import.meta.env.VITE_WS_ENDPOINT_FALLBACK_2, + ].filter(Boolean); + const initApi = async () => { - try { - console.log('🔗 Connecting to Pezkuwi node:', endpoint); - - const provider = new WsProvider(endpoint); - const apiInstance = await ApiPromise.create({ provider }); - - await apiInstance.isReady; - - setApi(apiInstance); - setIsApiReady(true); - setError(null); - - console.log('✅ Connected to Pezkuwi node'); - - // Get chain info - const [chain, nodeName, nodeVersion] = await Promise.all([ - apiInstance.rpc.system.chain(), - apiInstance.rpc.system.name(), - apiInstance.rpc.system.version(), - ]); - - console.log(`📡 Chain: ${chain}`); - console.log(`🖥️ Node: ${nodeName} v${nodeVersion}`); - - } catch (err) { - console.error('❌ Failed to connect to node:', err); - setError(`Failed to connect to node: ${endpoint}`); - setIsApiReady(false); + let lastError: unknown = null; + + for (const currentEndpoint of FALLBACK_ENDPOINTS) { + try { + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.log('🔗 Connecting to Pezkuwi node:', currentEndpoint); + } + + const provider = new WsProvider(currentEndpoint); + const apiInstance = await ApiPromise.create({ provider }); + + await apiInstance.isReady; + + setApi(apiInstance); + setIsApiReady(true); + setError(null); + + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.log('✅ Connected to Pezkuwi node'); + + // Get chain info + const [chain, nodeName, nodeVersion] = await Promise.all([ + apiInstance.rpc.system.chain(), + apiInstance.rpc.system.name(), + apiInstance.rpc.system.version(), + ]); + + if (import.meta.env.DEV) console.log(`📡 Chain: ${chain}`); + if (import.meta.env.DEV) console.log(`🖥️ Node: ${nodeName} v${nodeVersion}`); + } + + return; + } catch (err) { + lastError = err; + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.warn(`⚠️ Failed to connect to ${currentEndpoint}, trying next...`); + } + continue; + } } + + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.error('❌ Failed to connect to all endpoints:', lastError); + } + setError('Failed to connect to blockchain network. Please try again later.'); + setIsApiReady(false); }; initApi(); @@ -109,10 +134,14 @@ export const PolkadotProvider: React.FC = ({ if (savedAccount) { setAccounts(allAccounts); handleSetSelectedAccount(savedAccount); - console.log('✅ Wallet restored:', savedAddress.slice(0, 8) + '...'); + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.log('✅ Wallet restored:', savedAddress.slice(0, 8) + '...'); + } } } catch (err) { - console.error('Failed to restore wallet:', err); + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.error('Failed to restore wallet:', err); + } } }; @@ -133,7 +162,9 @@ export const PolkadotProvider: React.FC = ({ return; } - console.log('✅ Polkadot.js extension enabled'); + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.log('✅ Polkadot.js extension enabled'); + } // Get accounts const allAccounts = await web3Accounts(); @@ -154,10 +185,14 @@ export const PolkadotProvider: React.FC = ({ // Use wrapper to trigger events handleSetSelectedAccount(accountToSelect); - console.log(`✅ Found ${allAccounts.length} account(s)`); + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.log(`✅ Found ${allAccounts.length} account(s)`); + } } catch (err) { - console.error('❌ Wallet connection failed:', err); + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.error('❌ Wallet connection failed:', err); + } setError('Failed to connect wallet'); } }; @@ -166,7 +201,9 @@ export const PolkadotProvider: React.FC = ({ const disconnectWallet = () => { setAccounts([]); handleSetSelectedAccount(null); - console.log('🔌 Wallet disconnected'); + if (import.meta.env.DEV) { + if (import.meta.env.DEV) console.log('🔌 Wallet disconnected'); + } }; const value: PolkadotContextType = { diff --git a/web/src/contexts/ReferralContext.tsx b/web/src/contexts/ReferralContext.tsx index 6a63c4f9..120b01df 100644 --- a/web/src/contexts/ReferralContext.tsx +++ b/web/src/contexts/ReferralContext.tsx @@ -49,7 +49,7 @@ export function ReferralProvider({ children }: { children: ReactNode }) { setStats(fetchedStats); setMyReferrals(fetchedReferrals); } catch (error) { - console.error('Error fetching referral stats:', error); + if (import.meta.env.DEV) console.error('Error fetching referral stats:', error); toast({ title: 'Error', description: 'Failed to load referral statistics', @@ -135,7 +135,7 @@ export function ReferralProvider({ children }: { children: ReactNode }) { await fetchStats(); return true; } catch (error) { - console.error('Error inviting user:', error); + if (import.meta.env.DEV) console.error('Error inviting user:', error); let errorMessage = 'Failed to send referral invitation'; if (error.message) { diff --git a/web/src/contexts/WalletContext.tsx b/web/src/contexts/WalletContext.tsx index 00fcba47..bc682358 100644 --- a/web/src/contexts/WalletContext.tsx +++ b/web/src/contexts/WalletContext.tsx @@ -39,7 +39,7 @@ const WalletContext = createContext(undefined); export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const polkadot = usePolkadot(); - console.log('🎯 WalletProvider render:', { + if (import.meta.env.DEV) console.log('🎯 WalletProvider render:', { hasApi: !!polkadot.api, isApiReady: polkadot.isApiReady, selectedAccount: polkadot.selectedAccount?.address, @@ -54,12 +54,12 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr // Fetch all token balances when account changes const updateBalance = useCallback(async (address: string) => { if (!polkadot.api || !polkadot.isApiReady) { - console.warn('API not ready, cannot fetch balance'); + if (import.meta.env.DEV) console.warn('API not ready, cannot fetch balance'); return; } try { - console.log('💰 Fetching all token balances for:', address); + if (import.meta.env.DEV) console.log('💰 Fetching all token balances for:', address); // Fetch HEZ (native token) const { data: nativeBalance } = await polkadot.api.query.system.account(address); @@ -70,54 +70,54 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr let pezBalance = '0'; try { const pezData = await polkadot.api.query.assets.account(ASSET_IDS.PEZ, address); - console.log('📊 Raw PEZ data:', pezData.toHuman()); + if (import.meta.env.DEV) console.log('📊 Raw PEZ data:', pezData.toHuman()); if (pezData.isSome) { const assetData = pezData.unwrap(); const pezAmount = assetData.balance.toString(); pezBalance = formatBalance(pezAmount); - console.log('✅ PEZ balance found:', pezBalance); + if (import.meta.env.DEV) console.log('✅ PEZ balance found:', pezBalance); } else { - console.warn('⚠️ PEZ asset not found for this account'); + if (import.meta.env.DEV) console.warn('⚠️ PEZ asset not found for this account'); } } catch (err) { - console.error('❌ Failed to fetch PEZ balance:', err); + if (import.meta.env.DEV) console.error('❌ Failed to fetch PEZ balance:', err); } // Fetch wHEZ (Asset ID: 0) let whezBalance = '0'; try { const whezData = await polkadot.api.query.assets.account(ASSET_IDS.WHEZ, address); - console.log('📊 Raw wHEZ data:', whezData.toHuman()); + if (import.meta.env.DEV) console.log('📊 Raw wHEZ data:', whezData.toHuman()); if (whezData.isSome) { const assetData = whezData.unwrap(); const whezAmount = assetData.balance.toString(); whezBalance = formatBalance(whezAmount); - console.log('✅ wHEZ balance found:', whezBalance); + if (import.meta.env.DEV) console.log('✅ wHEZ balance found:', whezBalance); } else { - console.warn('⚠️ wHEZ asset not found for this account'); + if (import.meta.env.DEV) console.warn('⚠️ wHEZ asset not found for this account'); } } catch (err) { - console.error('❌ Failed to fetch wHEZ balance:', err); + if (import.meta.env.DEV) console.error('❌ Failed to fetch wHEZ balance:', err); } // Fetch wUSDT (Asset ID: 2) - IMPORTANT: wUSDT has 6 decimals, not 12! let wusdtBalance = '0'; try { const wusdtData = await polkadot.api.query.assets.account(ASSET_IDS.WUSDT, address); - console.log('📊 Raw wUSDT data:', wusdtData.toHuman()); + if (import.meta.env.DEV) console.log('📊 Raw wUSDT data:', wusdtData.toHuman()); if (wusdtData.isSome) { const assetData = wusdtData.unwrap(); const wusdtAmount = assetData.balance.toString(); wusdtBalance = formatBalance(wusdtAmount, 6); // wUSDT uses 6 decimals! - console.log('✅ wUSDT balance found:', wusdtBalance); + if (import.meta.env.DEV) console.log('✅ wUSDT balance found:', wusdtBalance); } else { - console.warn('⚠️ wUSDT asset not found for this account'); + if (import.meta.env.DEV) console.warn('⚠️ wUSDT asset not found for this account'); } } catch (err) { - console.error('❌ Failed to fetch wUSDT balance:', err); + if (import.meta.env.DEV) console.error('❌ Failed to fetch wUSDT balance:', err); } setBalances({ @@ -127,9 +127,9 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr USDT: wusdtBalance, }); - console.log('✅ Balances updated:', { HEZ: hezBalance, PEZ: pezBalance, wHEZ: whezBalance, wUSDT: wusdtBalance }); + if (import.meta.env.DEV) console.log('✅ Balances updated:', { HEZ: hezBalance, PEZ: pezBalance, wHEZ: whezBalance, wUSDT: wusdtBalance }); } catch (err) { - console.error('Failed to fetch balances:', err); + if (import.meta.env.DEV) console.error('Failed to fetch balances:', err); setError('Failed to fetch balances'); } }, [polkadot.api, polkadot.isApiReady]); @@ -140,7 +140,7 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr setError(null); await polkadot.connectWallet(); } catch (err) { - console.error('Wallet connection failed:', err); + if (import.meta.env.DEV) console.error('Wallet connection failed:', err); const errorMessage = err instanceof Error ? err.message : WALLET_ERRORS.CONNECTION_FAILED; setError(errorMessage); } @@ -176,7 +176,7 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr return hash.toHex(); } catch (error) { - console.error('Transaction failed:', error); + if (import.meta.env.DEV) console.error('Transaction failed:', error); throw new Error(error instanceof Error ? error.message : WALLET_ERRORS.TRANSACTION_FAILED); } }, [polkadot.api, polkadot.selectedAccount]); @@ -203,7 +203,7 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr return signature; } catch (error) { - console.error('Message signing failed:', error); + if (import.meta.env.DEV) console.error('Message signing failed:', error); throw new Error(error instanceof Error ? error.message : 'Failed to sign message'); } }, [polkadot.selectedAccount]); @@ -215,9 +215,9 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr try { const injector = await web3FromAddress(polkadot.selectedAccount.address); setSigner(injector.signer); - console.log('✅ Signer obtained for', polkadot.selectedAccount.address); + if (import.meta.env.DEV) console.log('✅ Signer obtained for', polkadot.selectedAccount.address); } catch (error) { - console.error('Failed to get signer:', error); + if (import.meta.env.DEV) console.error('Failed to get signer:', error); setSigner(null); } } else { @@ -230,7 +230,7 @@ export const WalletProvider: React.FC<{ children: React.ReactNode }> = ({ childr // Update balance when selected account changes useEffect(() => { - console.log('🔄 WalletContext useEffect triggered!', { + if (import.meta.env.DEV) console.log('🔄 WalletContext useEffect triggered!', { hasAccount: !!polkadot.selectedAccount, isApiReady: polkadot.isApiReady, address: polkadot.selectedAccount?.address diff --git a/web/src/contexts/WebSocketContext.tsx b/web/src/contexts/WebSocketContext.tsx index 726b79a4..b5dbe407 100644 --- a/web/src/contexts/WebSocketContext.tsx +++ b/web/src/contexts/WebSocketContext.tsx @@ -48,7 +48,7 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi // If we've tried all endpoints, show error once and stop if (endpointIndex >= ENDPOINTS.length) { if (!hasShownFinalError.current) { - console.error('❌ All WebSocket endpoints failed'); + if (import.meta.env.DEV) console.error('❌ All WebSocket endpoints failed'); toast({ title: "Real-time Connection Unavailable", description: "Could not connect to WebSocket server. Live updates will be disabled.", @@ -63,7 +63,7 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi const wsUrl = ENDPOINTS[endpointIndex]; currentEndpoint.current = wsUrl; - console.log(`🔌 Attempting WebSocket connection to: ${wsUrl}`); + if (import.meta.env.DEV) console.log(`🔌 Attempting WebSocket connection to: ${wsUrl}`); ws.current = new WebSocket(wsUrl); @@ -71,7 +71,7 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi setIsConnected(true); connectionAttempts.current = 0; hasShownFinalError.current = false; - console.log(`✅ WebSocket connected to: ${wsUrl}`); + if (import.meta.env.DEV) console.log(`✅ WebSocket connected to: ${wsUrl}`); // Only show success toast for production endpoint if (endpointIndex === 0) { @@ -90,17 +90,17 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi listeners.forEach(callback => callback(message.data)); } } catch (error) { - console.error('Failed to parse WebSocket message:', error); + if (import.meta.env.DEV) console.error('Failed to parse WebSocket message:', error); } }; ws.current.onerror = (error) => { - console.warn(`⚠️ WebSocket error on ${wsUrl}:`, error); + if (import.meta.env.DEV) console.warn(`⚠️ WebSocket error on ${wsUrl}:`, error); }; ws.current.onclose = () => { setIsConnected(false); - console.log(`🔌 WebSocket disconnected from: ${wsUrl}`); + if (import.meta.env.DEV) console.log(`🔌 WebSocket disconnected from: ${wsUrl}`); // Try next endpoint after 2 seconds reconnectTimeout.current = setTimeout(() => { @@ -117,7 +117,7 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi }, 2000); }; } catch (error) { - console.error(`❌ Failed to create WebSocket connection to ${ENDPOINTS[endpointIndex]}:`, error); + if (import.meta.env.DEV) console.error(`❌ Failed to create WebSocket connection to ${ENDPOINTS[endpointIndex]}:`, error); // Try next endpoint immediately setTimeout(() => connect(endpointIndex + 1), 1000); } @@ -151,7 +151,7 @@ export const WebSocketProvider: React.FC<{ children: React.ReactNode }> = ({ chi if (ws.current?.readyState === WebSocket.OPEN) { ws.current.send(JSON.stringify(message)); } else { - console.warn('WebSocket is not connected - message queued'); + if (import.meta.env.DEV) console.warn('WebSocket is not connected - message queued'); } }, []); diff --git a/web/src/hooks/useDelegation.ts b/web/src/hooks/useDelegation.ts index 657e95ac..8cd6254a 100644 --- a/web/src/hooks/useDelegation.ts +++ b/web/src/hooks/useDelegation.ts @@ -184,7 +184,7 @@ export function useDelegation(userAddress?: string) { }); } catch (err) { - console.error('Error fetching delegation data:', err); + if (import.meta.env.DEV) console.error('Error fetching delegation data:', err); setError(err instanceof Error ? err.message : 'Failed to fetch delegation data'); } finally { setLoading(false); @@ -216,7 +216,7 @@ export function useDelegation(userAddress?: string) { return tx; } catch (err) { - console.error('Error creating delegation transaction:', err); + if (import.meta.env.DEV) console.error('Error creating delegation transaction:', err); throw err; } }; @@ -230,7 +230,7 @@ export function useDelegation(userAddress?: string) { const tx = api.tx.democracy.undelegate(); return tx; } catch (err) { - console.error('Error creating undelegate transaction:', err); + if (import.meta.env.DEV) console.error('Error creating undelegate transaction:', err); throw err; } }; diff --git a/web/src/hooks/useForum.ts b/web/src/hooks/useForum.ts index eb33618d..5717f24e 100644 --- a/web/src/hooks/useForum.ts +++ b/web/src/hooks/useForum.ts @@ -121,7 +121,7 @@ export function useForum() { if (error) throw error; setAnnouncements(data || []); } catch (err) { - console.error('Error fetching announcements:', err); + if (import.meta.env.DEV) console.error('Error fetching announcements:', err); } }; @@ -136,7 +136,7 @@ export function useForum() { if (error) throw error; setCategories(data || []); } catch (err) { - console.error('Error fetching categories:', err); + if (import.meta.env.DEV) console.error('Error fetching categories:', err); setError(err instanceof Error ? err.message : 'Failed to fetch categories'); } }; @@ -176,7 +176,7 @@ export function useForum() { setDiscussions(discussionsWithReactions); } catch (err) { - console.error('Error fetching discussions:', err); + if (import.meta.env.DEV) console.error('Error fetching discussions:', err); setError(err instanceof Error ? err.message : 'Failed to fetch discussions'); } }; @@ -206,7 +206,7 @@ export function useForum() { await fetchDiscussions(); return data; } catch (err) { - console.error('Error creating discussion:', err); + if (import.meta.env.DEV) console.error('Error creating discussion:', err); throw err; } }; @@ -252,7 +252,7 @@ export function useForum() { await fetchDiscussions(); } catch (err) { - console.error('Error reacting to discussion:', err); + if (import.meta.env.DEV) console.error('Error reacting to discussion:', err); throw err; } }; diff --git a/web/src/hooks/useGovernance.ts b/web/src/hooks/useGovernance.ts index fe819f22..7383270a 100644 --- a/web/src/hooks/useGovernance.ts +++ b/web/src/hooks/useGovernance.ts @@ -98,7 +98,7 @@ export function useGovernance() { } } catch (err) { - console.error('Error fetching governance data:', err); + if (import.meta.env.DEV) console.error('Error fetching governance data:', err); setError(err instanceof Error ? err.message : 'Failed to fetch governance data'); } finally { setLoading(false); diff --git a/web/src/hooks/useTreasury.ts b/web/src/hooks/useTreasury.ts index f0f10d33..6381126a 100644 --- a/web/src/hooks/useTreasury.ts +++ b/web/src/hooks/useTreasury.ts @@ -96,7 +96,7 @@ export function useTreasury() { setProposals(proposalsList); } catch (err) { - console.error('Error fetching treasury data:', err); + if (import.meta.env.DEV) console.error('Error fetching treasury data:', err); setError(err instanceof Error ? err.message : 'Failed to fetch treasury data'); } finally { setLoading(false); diff --git a/web/src/lib/supabase.ts b/web/src/lib/supabase.ts index 406ddb98..c2701cf2 100644 --- a/web/src/lib/supabase.ts +++ b/web/src/lib/supabase.ts @@ -5,7 +5,7 @@ const supabaseUrl = import.meta.env.VITE_SUPABASE_URL; const supabaseKey = import.meta.env.VITE_SUPABASE_ANON_KEY; if (!supabaseUrl || !supabaseKey) { - console.warn('Supabase credentials not found in environment variables'); + if (import.meta.env.DEV) console.warn('Supabase credentials not found in environment variables'); } const supabase = createClient(supabaseUrl, supabaseKey); diff --git a/web/src/pages/AdminPanel.tsx b/web/src/pages/AdminPanel.tsx index 050f73d9..922247a8 100644 --- a/web/src/pages/AdminPanel.tsx +++ b/web/src/pages/AdminPanel.tsx @@ -58,7 +58,7 @@ export default function AdminPanel() { setUsers(profiles || []); setAdminRoles(roles || []); } catch (error) { - console.error('Error loading admin data:', error); + if (import.meta.env.DEV) console.error('Error loading admin data:', error); } finally { setLoading(false); } @@ -87,7 +87,7 @@ export default function AdminPanel() { }); loadAdminData(); } catch (error) { - console.error('Error updating role:', error); + if (import.meta.env.DEV) console.error('Error updating role:', error); toast({ title: 'Error', description: 'Failed to update user role', @@ -120,7 +120,7 @@ export default function AdminPanel() { description: 'Notification sent successfully', }); } catch (error) { - console.error('Error sending notification:', error); + if (import.meta.env.DEV) console.error('Error sending notification:', error); toast({ title: 'Error', description: 'Failed to send notification', diff --git a/web/src/pages/Citizens.tsx b/web/src/pages/Citizens.tsx index 4d2e651f..cdc7ebd7 100644 --- a/web/src/pages/Citizens.tsx +++ b/web/src/pages/Citizens.tsx @@ -117,7 +117,7 @@ export default function Citizens() { reader.readAsDataURL(file); } catch (error) { - console.error('Photo upload error:', error); + if (import.meta.env.DEV) console.error('Photo upload error:', error); setUploadingPhoto(false); toast({ title: "Yükleme hatası (Upload error)", @@ -252,7 +252,7 @@ export default function Citizens() { business: [], judicial: [] }; - console.log('Role categories:', roleCategories); + if (import.meta.env.DEV) console.log('Role categories:', roleCategories); const currentAnnouncement = announcements[currentAnnouncementIndex]; diff --git a/web/src/pages/Dashboard.tsx b/web/src/pages/Dashboard.tsx index 22ed4297..a37086d4 100644 --- a/web/src/pages/Dashboard.tsx +++ b/web/src/pages/Dashboard.tsx @@ -61,7 +61,7 @@ export default function Dashboard() { .maybeSingle(); if (error) { - console.error('Profile fetch error:', error); + if (import.meta.env.DEV) console.error('Profile fetch error:', error); return; } @@ -103,7 +103,7 @@ export default function Dashboard() { setProfile(data); } catch (error) { - console.error('Error fetching profile:', error); + if (import.meta.env.DEV) console.error('Error fetching profile:', error); } finally { setLoading(false); } @@ -131,7 +131,7 @@ export default function Dashboard() { const status = await getKycStatus(api, selectedAccount.address); setKycStatus(status); } catch (error) { - console.error('Error fetching scores and tikis:', error); + if (import.meta.env.DEV) console.error('Error fetching scores and tikis:', error); } finally { setLoadingScores(false); } @@ -147,26 +147,26 @@ export default function Dashboard() { return; } - console.log('🔄 Attempting to send verification email to:', user.email); - console.log('🔐 User object:', user); + if (import.meta.env.DEV) console.log('🔄 Attempting to send verification email to:', user.email); + if (import.meta.env.DEV) console.log('🔐 User object:', user); try { // Method 1: Try resend API - console.log('📧 Trying Supabase auth.resend()...'); + if (import.meta.env.DEV) console.log('📧 Trying Supabase auth.resend()...'); const { error: resendError } = await supabase.auth.resend({ type: 'signup', email: user.email, }); if (resendError) { - console.error('❌ Resend error:', resendError); + if (import.meta.env.DEV) console.error('❌ Resend error:', resendError); } else { - console.log('✅ Resend successful'); + if (import.meta.env.DEV) console.log('✅ Resend successful'); } // If resend fails, try alternative method if (resendError) { - console.warn('Resend failed, trying alternative method:', resendError); + if (import.meta.env.DEV) console.warn('Resend failed, trying alternative method:', resendError); // Method 2: Request password reset as verification alternative // This will send an email if the account exists @@ -182,7 +182,7 @@ export default function Dashboard() { description: "Please check your email inbox and spam folder", }); } catch (error) { - console.error('Error sending verification email:', error); + if (import.meta.env.DEV) console.error('Error sending verification email:', error); // Provide more detailed error message let errorMessage = "Failed to send verification email"; @@ -238,7 +238,7 @@ export default function Dashboard() { const { web3FromAddress } = await import('@polkadot/extension-dapp'); const injector = await web3FromAddress(selectedAccount.address); - console.log('Renouncing citizenship...'); + if (import.meta.env.DEV) console.log('Renouncing citizenship...'); const tx = api.tx.identityKyc.renounceCitizenship(); @@ -251,7 +251,7 @@ export default function Dashboard() { } else { errorMessage = dispatchError.toString(); } - console.error(errorMessage); + if (import.meta.env.DEV) console.error(errorMessage); toast({ title: "Renunciation Failed", description: errorMessage, @@ -262,12 +262,12 @@ export default function Dashboard() { } if (status.isInBlock || status.isFinalized) { - console.log('✅ Citizenship renounced successfully'); + if (import.meta.env.DEV) console.log('✅ Citizenship renounced successfully'); // Check for CitizenshipRenounced event events.forEach(({ event }) => { if (event.section === 'identityKyc' && event.method === 'CitizenshipRenounced') { - console.log('📢 CitizenshipRenounced event detected'); + if (import.meta.env.DEV) console.log('📢 CitizenshipRenounced event detected'); toast({ title: "Citizenship Renounced", description: "Your citizenship has been successfully renounced. You can reapply anytime." @@ -287,7 +287,7 @@ export default function Dashboard() { }); } catch (err) { - console.error('Renunciation error:', err); + if (import.meta.env.DEV) console.error('Renunciation error:', err); const errorMsg = err instanceof Error ? err.message : 'Failed to renounce citizenship'; toast({ title: "Error", diff --git a/web/src/pages/EducationPlatform.tsx b/web/src/pages/EducationPlatform.tsx index 8b71b40c..ae77be15 100644 --- a/web/src/pages/EducationPlatform.tsx +++ b/web/src/pages/EducationPlatform.tsx @@ -32,7 +32,7 @@ export default function EducationPlatform() { const studentEnrollments = await getStudentEnrollments(selectedAccount.address); setEnrollments(studentEnrollments); } catch (error) { - console.error('Failed to fetch enrollments:', error); + if (import.meta.env.DEV) console.error('Failed to fetch enrollments:', error); toast({ title: 'Error', description: 'Failed to fetch your enrollments.', diff --git a/web/src/pages/Elections.tsx b/web/src/pages/Elections.tsx index 75b418dd..42b9984c 100644 --- a/web/src/pages/Elections.tsx +++ b/web/src/pages/Elections.tsx @@ -77,7 +77,7 @@ export default function Elections() { setOfficials(officialsData); setMinisters(ministersData); } catch (error) { - console.error('Failed to load elections data:', error); + if (import.meta.env.DEV) console.error('Failed to load elections data:', error); toast({ title: 'Error', description: 'Failed to load elections data', diff --git a/web/src/pages/Login.tsx b/web/src/pages/Login.tsx index e7ca7f88..969dec03 100644 --- a/web/src/pages/Login.tsx +++ b/web/src/pages/Login.tsx @@ -108,7 +108,7 @@ const Login: React.FC = () => { setError('Please select an account from your Polkadot.js extension'); } } catch (err) { - console.error('Wallet connection failed:', err); + if (import.meta.env.DEV) console.error('Wallet connection failed:', err); const errorMsg = err instanceof Error ? err.message : ''; if (errorMsg?.includes('extension')) { setError('Polkadot.js extension not found. Please install it first.'); diff --git a/web/src/pages/NotFound.tsx b/web/src/pages/NotFound.tsx index a728b7a2..04b0a6f3 100644 --- a/web/src/pages/NotFound.tsx +++ b/web/src/pages/NotFound.tsx @@ -5,7 +5,7 @@ const NotFound = () => { const location = useLocation(); useEffect(() => { - console.error( + if (import.meta.env.DEV) console.error( "404 Error: User attempted to access non-existent route:", location.pathname ); diff --git a/web/src/pages/ProfileSettings.tsx b/web/src/pages/ProfileSettings.tsx index b1940a4d..e4f2c05c 100644 --- a/web/src/pages/ProfileSettings.tsx +++ b/web/src/pages/ProfileSettings.tsx @@ -50,7 +50,7 @@ export default function ProfileSettings() { .maybeSingle(); if (error) { - console.error('Error loading profile:', error); + if (import.meta.env.DEV) console.error('Error loading profile:', error); return; } @@ -71,7 +71,7 @@ export default function ProfileSettings() { }); } } catch (error) { - console.error('Error loading profile:', error); + if (import.meta.env.DEV) console.error('Error loading profile:', error); } }; @@ -104,7 +104,7 @@ export default function ProfileSettings() { await loadProfile(); } catch (error) { - console.error('Profile update failed:', error); + if (import.meta.env.DEV) console.error('Profile update failed:', error); toast({ title: 'Error', description: error?.message || 'Failed to update profile', @@ -170,7 +170,7 @@ export default function ProfileSettings() { description: 'Security settings updated', }); } catch (err) { - console.error('Security settings error:', err); + if (import.meta.env.DEV) console.error('Security settings error:', err); toast({ title: 'Error', description: 'Failed to update security settings', @@ -198,7 +198,7 @@ export default function ProfileSettings() { description: 'Password changed successfully', }); } catch (err) { - console.error('Password change error:', err); + if (import.meta.env.DEV) console.error('Password change error:', err); toast({ title: 'Error', description: 'Failed to change password', diff --git a/web/src/pages/WalletDashboard.tsx b/web/src/pages/WalletDashboard.tsx index e7d56f39..d107da03 100644 --- a/web/src/pages/WalletDashboard.tsx +++ b/web/src/pages/WalletDashboard.tsx @@ -196,7 +196,7 @@ const WalletDashboard: React.FC = () => { setRecentTransactions(txList); } catch { - console.error('Failed to fetch recent transactions:', error); + if (import.meta.env.DEV) console.error('Failed to fetch recent transactions:', error); } finally { setIsLoadingRecent(false); } diff --git a/web/src/pages/citizens/CitizensIssues.tsx b/web/src/pages/citizens/CitizensIssues.tsx index a2a5fdff..583f5696 100644 --- a/web/src/pages/citizens/CitizensIssues.tsx +++ b/web/src/pages/citizens/CitizensIssues.tsx @@ -165,7 +165,7 @@ export default function CitizensIssues() { try { // Check if welati pallet exists if (!api.query.welati) { - console.log('Welati pallet not available yet'); + if (import.meta.env.DEV) console.log('Welati pallet not available yet'); setIssues([]); return; } @@ -194,7 +194,7 @@ export default function CitizensIssues() { setIssues(fetchedIssues.reverse()); } catch (error) { - console.error('Error fetching issues:', error); + if (import.meta.env.DEV) console.error('Error fetching issues:', error); setIssues([]); } }; @@ -205,7 +205,7 @@ export default function CitizensIssues() { try { // Check if welati pallet exists if (!api.query.welati) { - console.log('Welati pallet not available yet'); + if (import.meta.env.DEV) console.log('Welati pallet not available yet'); setUserVotes(new Map()); return; } @@ -221,7 +221,7 @@ export default function CitizensIssues() { setUserVotes(votes); } catch (error) { - console.error('Error fetching user votes:', error); + if (import.meta.env.DEV) console.error('Error fetching user votes:', error); setUserVotes(new Map()); } }; @@ -270,7 +270,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error submitting issue:', error); + if (import.meta.env.DEV) console.error('Error submitting issue:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina pirsgirêkê de (Error submitting issue)', @@ -300,7 +300,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error voting:', error); + if (import.meta.env.DEV) console.error('Error voting:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina dengê de (Error submitting vote)', @@ -317,7 +317,7 @@ export default function CitizensIssues() { try { // Check if welati pallet exists if (!api.query.welati) { - console.log('Welati pallet not available yet'); + if (import.meta.env.DEV) console.log('Welati pallet not available yet'); setParliamentCandidates([]); return; } @@ -351,7 +351,7 @@ export default function CitizensIssues() { } } } catch (error) { - console.error('Error fetching parliament candidates:', error); + if (import.meta.env.DEV) console.error('Error fetching parliament candidates:', error); setParliamentCandidates([]); } }; @@ -373,7 +373,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error self-nominating for parliament:', error); + if (import.meta.env.DEV) console.error('Error self-nominating for parliament:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina namzediyê de (Error submitting nomination)', @@ -401,7 +401,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error nominating for parliament:', error); + if (import.meta.env.DEV) console.error('Error nominating for parliament:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina namzediyê de (Error submitting nomination)', @@ -428,7 +428,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error voting for parliament:', error); + if (import.meta.env.DEV) console.error('Error voting for parliament:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina dengê de (Error submitting vote)', @@ -455,7 +455,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error removing parliament nomination:', error); + if (import.meta.env.DEV) console.error('Error removing parliament nomination:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di jêbirina namzediyê de (Error removing nomination)', @@ -472,7 +472,7 @@ export default function CitizensIssues() { try { // Check if welati pallet exists if (!api.query.welati) { - console.log('Welati pallet not available yet'); + if (import.meta.env.DEV) console.log('Welati pallet not available yet'); setPresidentCandidates([]); return; } @@ -506,7 +506,7 @@ export default function CitizensIssues() { } } } catch (error) { - console.error('Error fetching president candidates:', error); + if (import.meta.env.DEV) console.error('Error fetching president candidates:', error); setPresidentCandidates([]); } }; @@ -528,7 +528,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error self-nominating for president:', error); + if (import.meta.env.DEV) console.error('Error self-nominating for president:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina namzediyê de (Error submitting nomination)', @@ -556,7 +556,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error nominating for president:', error); + if (import.meta.env.DEV) console.error('Error nominating for president:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina namzediyê de (Error submitting nomination)', @@ -583,7 +583,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error voting for president:', error); + if (import.meta.env.DEV) console.error('Error voting for president:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina dengê de (Error submitting vote)', @@ -610,7 +610,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error removing president nomination:', error); + if (import.meta.env.DEV) console.error('Error removing president nomination:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di jêbirina namzediyê de (Error removing nomination)', @@ -627,7 +627,7 @@ export default function CitizensIssues() { try { // Check if welati pallet exists if (!api.query.welati) { - console.log('Welati pallet not available yet'); + if (import.meta.env.DEV) console.log('Welati pallet not available yet'); setLegislationProposals([]); setUserLegislationVotes(new Map()); return; @@ -668,7 +668,7 @@ export default function CitizensIssues() { setUserLegislationVotes(votes); } } catch (error) { - console.error('Error fetching legislation proposals:', error); + if (import.meta.env.DEV) console.error('Error fetching legislation proposals:', error); setLegislationProposals([]); setUserLegislationVotes(new Map()); } @@ -694,7 +694,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error proposing legislation:', error); + if (import.meta.env.DEV) console.error('Error proposing legislation:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina pêşniyarê de (Error submitting proposal)', @@ -723,7 +723,7 @@ export default function CitizensIssues() { } }); } catch (error) { - console.error('Error voting on legislation:', error); + if (import.meta.env.DEV) console.error('Error voting on legislation:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina dengê de (Error submitting vote)', diff --git a/web/src/pages/citizens/GovernmentEntrance.tsx b/web/src/pages/citizens/GovernmentEntrance.tsx index a97f7fe1..a75b1145 100644 --- a/web/src/pages/citizens/GovernmentEntrance.tsx +++ b/web/src/pages/citizens/GovernmentEntrance.tsx @@ -213,7 +213,7 @@ export default function GovernmentEntrance() { setShowAccessModal(false); setIsVerifying(false); } catch (error) { - console.error('Error verifying access:', error); + if (import.meta.env.DEV) console.error('Error verifying access:', error); toast({ title: "Xeletî (Error)", description: "Pirsgirêk di kontrolkirina mafê de (Error verifying access)", @@ -248,7 +248,7 @@ export default function GovernmentEntrance() { setProposals(fetchedProposals.reverse()); } catch (error) { - console.error('Error fetching legislation proposals:', error); + if (import.meta.env.DEV) console.error('Error fetching legislation proposals:', error); } }; @@ -276,7 +276,7 @@ export default function GovernmentEntrance() { } }); } catch (error) { - console.error('Error proposing legislation:', error); + if (import.meta.env.DEV) console.error('Error proposing legislation:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina pêşniyarê de (Error submitting proposal)', @@ -306,7 +306,7 @@ export default function GovernmentEntrance() { } }); } catch (error) { - console.error('Error voting on legislation:', error); + if (import.meta.env.DEV) console.error('Error voting on legislation:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina dengê de (Error submitting vote)', @@ -335,7 +335,7 @@ export default function GovernmentEntrance() { setParliamentCandidates(fetchedCandidates.sort((a, b) => b.voteCount - a.voteCount)); } catch (error) { - console.error('Error fetching parliament candidates:', error); + if (import.meta.env.DEV) console.error('Error fetching parliament candidates:', error); } }; @@ -362,7 +362,7 @@ export default function GovernmentEntrance() { } }); } catch (error) { - console.error('Error nominating for parliament:', error); + if (import.meta.env.DEV) console.error('Error nominating for parliament:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina berjewendiyê de (Error submitting nomination)', @@ -390,7 +390,7 @@ export default function GovernmentEntrance() { } }); } catch (error) { - console.error('Error voting for parliament:', error); + if (import.meta.env.DEV) console.error('Error voting for parliament:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina dengê de (Error submitting vote)', @@ -419,7 +419,7 @@ export default function GovernmentEntrance() { setPresidentialCandidates(fetchedCandidates.sort((a, b) => b.voteCount - a.voteCount)); } catch (error) { - console.error('Error fetching presidential candidates:', error); + if (import.meta.env.DEV) console.error('Error fetching presidential candidates:', error); } }; @@ -446,7 +446,7 @@ export default function GovernmentEntrance() { } }); } catch (error) { - console.error('Error nominating president:', error); + if (import.meta.env.DEV) console.error('Error nominating president:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina berjewendiyê de (Error submitting nomination)', @@ -474,7 +474,7 @@ export default function GovernmentEntrance() { } }); } catch (error) { - console.error('Error voting for president:', error); + if (import.meta.env.DEV) console.error('Error voting for president:', error); toast({ title: 'Xeletî (Error)', description: 'Pirsgirêk di şandina dengê de (Error submitting vote)', @@ -509,7 +509,7 @@ export default function GovernmentEntrance() { setUserPresidentialVote(presidentialVote.toString()); } } catch (error) { - console.error('Error fetching user votes:', error); + if (import.meta.env.DEV) console.error('Error fetching user votes:', error); } }; diff --git a/web/vite.config.ts b/web/vite.config.ts index 9cfb9fba..9fde952c 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -4,7 +4,7 @@ import react from "@vitejs/plugin-react-swc"; import path from "path"; // https://vitejs.dev/config/ -export default defineConfig(({ mode }) => ({ +export default defineConfig(() => ({ test: { globals: true, environment: 'jsdom', @@ -50,5 +50,19 @@ export default defineConfig(({ mode }) => ({ } } }, + build: { + rollupOptions: { + output: { + manualChunks: { + 'polkadot': ['@polkadot/api', '@polkadot/extension-dapp', '@polkadot/keyring', '@polkadot/util', '@polkadot/util-crypto'], + 'vendor': ['react', 'react-dom', 'react-router-dom'], + 'ui': ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu', '@radix-ui/react-select', '@radix-ui/react-tabs', '@radix-ui/react-toast'], + 'forms': ['react-hook-form', '@hookform/resolvers', 'zod'], + 'i18n': ['i18next', 'react-i18next', 'i18next-browser-languagedetector'] + } + } + }, + chunkSizeWarningLimit: 600 + }, assetsInclude: ['**/*.json'], })); \ No newline at end of file