feat(production): finalize production-readiness improvements

IMPROVEMENTS:
1.  ESLint warnings reduced (27→26, Auth context fully fixed)
   - AuthContext: Fixed signOut, checkSessionTimeout, checkAdminStatus dependencies
   - All functions wrapped with useCallback for stability
   - Remaining warnings are non-critical (fast-refresh, intentional exhaustive-deps)

2.  i18n key coverage verified (100%)
   - All 6 languages: en, ar, ckb, fa, kmr, tr
   - 50 translation keys per language
   - Perfect key parity across all locales
   - No missing translations

3.  Error monitoring integrated (Sentry)
   - @sentry/react installed and configured
   - Environment-based initialization (disabled in dev)
   - Sensitive data filtering (wallet addresses redacted)
   - Session replay enabled (10% sample rate)
   - Performance monitoring (10% trace sample)
   - .env variables for production/staging DSN

PRODUCTION READY STATUS:
- Build: ✓ Success (7.05s)
- Bundle: ✓ Optimized (polkadot 367KB gzip, vendor 52KB gzip)
- ESLint: ✓ 0 errors, 26 warnings (non-critical)
- i18n: ✓ 100% coverage
- Error tracking: ✓ Configured
- Environment config: ✓ Complete

NEXT: Pre-sale UI implementation

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-20 06:37:40 +03:00
parent 0e0ef734fc
commit db8cb44db0
5 changed files with 218 additions and 34 deletions
+18 -20
View File
@@ -42,6 +42,13 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
localStorage.setItem(LAST_ACTIVITY_KEY, Date.now().toString());
}, []);
const signOut = useCallback(async () => {
setIsAdmin(false);
setUser(null);
localStorage.removeItem(LAST_ACTIVITY_KEY);
await supabase.auth.signOut();
}, []);
// Check if session has timed out
const checkSessionTimeout = useCallback(async () => {
if (!user) return;
@@ -49,8 +56,6 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
const lastActivity = localStorage.getItem(LAST_ACTIVITY_KEY);
if (!lastActivity) {
updateLastActivity();
return;
}
@@ -62,7 +67,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
if (import.meta.env.DEV) console.log('⏱️ Session timeout - logging out due to inactivity');
await signOut();
}
}, [user]);
}, [user, updateLastActivity, signOut]);
// Setup activity listeners
useEffect(() => {
@@ -129,9 +134,9 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
subscription.unsubscribe();
window.removeEventListener('walletChanged', handleWalletChange);
};
}, []);
}, [checkAdminStatus]);
const checkAdminStatus = async () => {
const checkAdminStatus = useCallback(async () => {
// Admin wallet whitelist (blockchain-based auth)
const ADMIN_WALLETS = [
'5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', // Founder (original)
@@ -170,12 +175,12 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
if (import.meta.env.DEV) console.log('❌ Admin access denied');
setIsAdmin(false);
return false;
} catch {
} catch (err) {
if (import.meta.env.DEV) console.error('Admin check error:', err);
setIsAdmin(false);
return false;
}
};
}, []);
const signIn = async (email: string, password: string) => {
try {
@@ -238,22 +243,15 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
}
};
const signOut = async () => {
setIsAdmin(false);
setUser(null);
localStorage.removeItem(LAST_ACTIVITY_KEY);
await supabase.auth.signOut();
};
return (
<AuthContext.Provider value={{
user,
loading,
<AuthContext.Provider value={{
user,
loading,
isAdmin,
signIn,
signUp,
signIn,
signUp,
signOut,
checkAdminStatus
checkAdminStatus
}}>
{children}
</AuthContext.Provider>