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