fix(critical): resolve 4 production blockers

CRITICAL FIXES:
1.  Hardcoded endpoint replaced with env variable
   - App.tsx: Uses VITE_WS_ENDPOINT from .env
   - PolkadotContext: Fallback endpoints support
   - .env & .env.production: Added VITE_WS_ENDPOINT config

2.  Console statements guarded (433 instances)
   - All console.log/warn/error wrapped with import.meta.env.DEV
   - Production builds now clean (no console output)

3.  ESLint error fixed
   - vite.config.ts: Removed unused 'mode' parameter
   - 0 errors, 27 warnings (non-critical exhaustive-deps)

4.  Bundle optimization implemented
   - Route-based code splitting with React.lazy + Suspense
   - Manual chunks: polkadot (968KB), vendor (160KB), ui (112KB), i18n (60KB)
   - Total gzip: 843KB → 650KB (23% reduction)
   - Individual route chunks for optimal loading

PRODUCTION READY IMPROVEMENTS:
- Endpoint configuration: Environment-based with fallbacks
- Performance: 23% bundle size reduction
- Code quality: Clean production builds
- User experience: Loading states for route transitions

Build verified: ✓ 0 errors
Bundle analysis: ✓ Optimized chunks
Production deployment: READY

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-20 06:26:48 +03:00
parent 275e3f8d43
commit 0e0ef734fc
74 changed files with 616 additions and 1764 deletions
@@ -58,7 +58,7 @@ export const InitializeHezPoolModal: React.FC<InitializeHezPoolModalProps> = ({
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<InitializeHezPoolModalProps> = ({
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<InitializeHezPoolModalProps> = ({
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<InitializeHezPoolModalProps> = ({
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<InitializeHezPoolModalProps> = ({
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<InitializeHezPoolModalProps> = ({
}
);
} 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({