Fix all shadow deprecation warnings across entire mobile app

- Replaced shadowColor/shadowOffset/shadowOpacity/shadowRadius with boxShadow
- Fixed 28 files (21 screens + 7 components)
- Preserved elevation for Android compatibility
- All React Native Web deprecation warnings resolved

Files fixed:
- All screen components
- All reusable components
- Navigation components
- Modal components
This commit is contained in:
2026-01-14 15:05:10 +03:00
parent 9090e0fc2b
commit 8d30519efc
231 changed files with 30234 additions and 62124 deletions
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Wallet, TrendingUp, ArrowDownRight, RefreshCw, Award, Plus, Coins, Send, Shield, Users } from 'lucide-react';
import { Button } from '@/components/ui/button';
@@ -18,7 +18,7 @@ interface TokenBalance {
}
export const AccountBalance: React.FC = () => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const [balance, setBalance] = useState<{
free: string;
reserved: string;
+2 -2
View File
@@ -1,7 +1,7 @@
import React, { useState, useEffect } from 'react';
import { X, Plus, Info, AlertCircle } from 'lucide-react';
import { web3FromAddress } from '@pezkuwi/extension-dapp';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { Button } from '@/components/ui/button';
import { Alert, AlertDescription } from '@/components/ui/alert';
@@ -54,7 +54,7 @@ export const AddLiquidityModal: React.FC<AddLiquidityModalProps> = ({
asset0 = 0, // Default to wHEZ
asset1 = 1 // Default to PEZ
}) => {
const { api, selectedAccount, isApiReady } = usePolkadot();
const { api, selectedAccount, isApiReady } = usePezkuwi();
const { balances, refreshBalances } = useWallet();
const [amount0, setAmount0] = useState('');
+2 -2
View File
@@ -28,7 +28,7 @@ import { StakingDashboard } from './staking/StakingDashboard';
import { MultiSigWallet } from './wallet/MultiSigWallet';
import { useWallet } from '@/contexts/WalletContext';
import { supabase } from '@/lib/supabase';
import { PolkadotWalletButton } from './PolkadotWalletButton';
import { PezkuwiWalletButton } from './PezkuwiWalletButton';
import { DEXDashboard } from './dex/DEXDashboard';
import { P2PDashboard } from './p2p/P2PDashboard';
import EducationPlatform from '../pages/EducationPlatform';
@@ -286,7 +286,7 @@ const AppLayout: React.FC = () => {
<NotificationBell />
<LanguageSwitcher />
<PolkadotWalletButton />
<PezkuwiWalletButton />
</div>
</div>
</div>
+31 -6
View File
@@ -1,12 +1,14 @@
import React, { useState, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { ChevronRight, Shield } from 'lucide-react';
import { usePolkadot } from '../contexts/PolkadotContext';
import { ChevronRight, Shield, Smartphone } from 'lucide-react';
import { usePezkuwi } from '../contexts/PezkuwiContext';
import { useWallet } from '../contexts/WalletContext'; // Import useWallet
import { formatBalance } from '@pezkuwi/lib/wallet';
const HeroSection: React.FC = () => {
const { t } = useTranslation();
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { selectedAccount } = useWallet(); // Use selectedAccount from WalletContext
const [stats, setStats] = useState({
activeProposals: 0,
totalVoters: 0,
@@ -18,6 +20,20 @@ const HeroSection: React.FC = () => {
const fetchStats = async () => {
if (!api || !isApiReady) return;
let currentTrustScore = 0; // Default if not fetched or no account
if (selectedAccount?.address) {
try {
// Assuming pallet-staking-score has a storage item for trust scores
// The exact query might need adjustment based on chain metadata
const rawTrustScore = await api.query.stakingScore.trustScore(selectedAccount.address);
// Assuming trustScore is a simple number or a wrapper around it
currentTrustScore = rawTrustScore.isSome ? rawTrustScore.unwrap().toNumber() : 0;
} catch (err) {
if (import.meta.env.DEV) console.warn('Failed to fetch trust score:', err);
currentTrustScore = 0;
}
}
try {
// Fetch active referenda
let activeProposals = 0;
@@ -60,13 +76,14 @@ const HeroSection: React.FC = () => {
activeProposals,
totalVoters,
tokensStaked,
trustScore: 0 // TODO: Calculate trust score
trustScore: currentTrustScore
});
if (import.meta.env.DEV) console.log('✅ Hero stats updated:', {
activeProposals,
totalVoters,
tokensStaked
tokensStaked,
trustScore: currentTrustScore
});
} catch (error) {
if (import.meta.env.DEV) console.error('Failed to fetch hero stats:', error);
@@ -74,7 +91,7 @@ const HeroSection: React.FC = () => {
};
fetchStats();
}, [api, isApiReady]);
}, [api, isApiReady, selectedAccount]); // Add selectedAccount to dependencies
return (
<section className="relative min-h-screen flex items-center justify-start overflow-hidden bg-gray-950">
@@ -133,6 +150,14 @@ const HeroSection: React.FC = () => {
{t('hero.exploreGovernance', 'Explore Governance')}
<ChevronRight className="ml-2 w-5 h-5 group-hover:translate-x-1 transition-transform" />
</button>
<a
href="/pezkuwi-wallet.apk"
download="pezkuwi-wallet.apk"
className="px-8 py-4 bg-gradient-to-r from-blue-600 to-blue-700 text-white font-bold rounded-lg hover:shadow-lg hover:shadow-blue-500/50 transition-all transform hover:scale-105 flex items-center justify-center group"
>
<Smartphone className="mr-2 w-5 h-5" />
{t('hero.downloadWallet', 'Download Mobile Wallet')}
</a>
<button
onClick={() => document.getElementById('governance')?.scrollIntoView({ behavior: 'smooth' })}
className="px-8 py-4 bg-gray-900/80 backdrop-blur-sm text-white font-semibold rounded-lg border border-gray-700 hover:bg-gray-800 hover:border-gray-600 transition-all"
+2 -2
View File
@@ -3,7 +3,7 @@ import { Shield, Users, CheckCircle, XCircle, ExternalLink } from 'lucide-react'
import { Card } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { Alert, AlertDescription } from '@/components/ui/alert';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import {
getMultisigMemberInfo,
calculateMultisigAddress,
@@ -31,7 +31,7 @@ export const MultisigMembers: React.FC<MultisigMembersProps> = ({
specificAddresses = {},
showMultisigAddress = true,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const [members, setMembers] = useState<MultisigMember[]>([]);
const [multisigAddress, setMultisigAddress] = useState('');
const [loading, setLoading] = useState(true);
+2 -2
View File
@@ -1,11 +1,11 @@
import React, { useEffect, useState } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { Activity, Wifi, WifiOff, Users, Box, TrendingUp } from 'lucide-react';
export const NetworkStats: React.FC = () => {
const { api, isApiReady, error } = usePolkadot();
const { api, isApiReady, error } = usePezkuwi();
const [blockNumber, setBlockNumber] = useState<number>(0);
const [blockHash, setBlockHash] = useState<string>('');
const [finalizedBlock, setFinalizedBlock] = useState<number>(0);
+2 -2
View File
@@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { Loader2, Award, Crown, Shield, Users } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { getUserTikis } from '@pezkuwi/lib/citizenship-workflow';
import type { TikiInfo } from '@pezkuwi/lib/citizenship-workflow';
@@ -39,7 +39,7 @@ const getRoleBadgeColor = (role: string) => {
};
export const NftList: React.FC = () => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const [tikis, setTikis] = useState<TikiInfo[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import {
@@ -12,7 +12,7 @@ import {
import { Wallet, Check, ExternalLink, Copy, LogOut } from 'lucide-react';
import { useToast } from '@/hooks/use-toast';
export const PolkadotWalletButton: React.FC = () => {
export const PezkuwiWalletButton: React.FC = () => {
const {
accounts,
selectedAccount,
@@ -20,7 +20,7 @@ export const PolkadotWalletButton: React.FC = () => {
connectWallet,
disconnectWallet,
error
} = usePolkadot();
} = usePezkuwi();
const [isOpen, setIsOpen] = useState(false);
const { toast } = useToast();
+2 -2
View File
@@ -6,7 +6,7 @@ import { Alert, AlertDescription } from '@/components/ui/alert';
import { Badge } from '@/components/ui/badge';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { ASSET_IDS, getAssetSymbol } from '@pezkuwi/lib/wallet';
import { AddLiquidityModal } from '@/components/AddLiquidityModal';
import { RemoveLiquidityModal } from '@/components/RemoveLiquidityModal';
@@ -43,7 +43,7 @@ interface LPPosition {
}
const PoolDashboard = () => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const [poolData, setPoolData] = useState<PoolData | null>(null);
const [lpPosition, setLPPosition] = useState<LPPosition | null>(null);
+2 -2
View File
@@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react';
import { Navigate } from 'react-router-dom';
import { useAuth } from '@/contexts/AuthContext';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Loader2, Wallet } from 'lucide-react';
import { Button } from '@/components/ui/button';
@@ -15,7 +15,7 @@ export const ProtectedRoute: React.FC<ProtectedRouteProps> = ({
requireAdmin = false
}) => {
const { user, loading, isAdmin } = useAuth();
const { selectedAccount, connectWallet } = usePolkadot();
const { selectedAccount, connectWallet } = usePezkuwi();
const [walletRestoreChecked, setWalletRestoreChecked] = useState(false);
const [forceUpdate, setForceUpdate] = useState(0);
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import {
Dialog,
DialogContent,
@@ -18,7 +18,7 @@ interface ReceiveModalProps {
}
export const ReceiveModal: React.FC<ReceiveModalProps> = ({ isOpen, onClose }) => {
const { selectedAccount } = usePolkadot();
const { selectedAccount } = usePezkuwi();
const { toast } = useToast();
const [copied, setCopied] = useState(false);
const [qrCodeDataUrl, setQrCodeDataUrl] = useState<string>('');
+2 -2
View File
@@ -1,7 +1,7 @@
import React, { useState, useEffect } from 'react';
import { X, Minus, AlertCircle, Info } from 'lucide-react';
import { web3FromAddress } from '@pezkuwi/extension-dapp';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { Button } from '@/components/ui/button';
import { Alert, AlertDescription } from '@/components/ui/alert';
@@ -42,7 +42,7 @@ export const RemoveLiquidityModal: React.FC<RemoveLiquidityModalProps> = ({
asset0,
asset1,
}) => {
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const { refreshBalances } = useWallet();
const [percentage, setPercentage] = useState(100);
+2 -2
View File
@@ -5,7 +5,7 @@ import { Badge } from '@/components/ui/badge';
import { Alert, AlertDescription } from '@/components/ui/alert';
import { Button } from '@/components/ui/button';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { getWUSDTTotalSupply, checkReserveHealth, formatWUSDT } from '@pezkuwi/lib/usdt';
import { MultisigMembers } from './MultisigMembers';
@@ -18,7 +18,7 @@ export const ReservesDashboard: React.FC<ReservesDashboardProps> = ({
specificAddresses = {},
offChainReserveAmount = 0,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const [wusdtSupply, setWusdtSupply] = useState(0);
const [offChainReserve, setOffChainReserve] = useState(offChainReserveAmount);
+5 -5
View File
@@ -5,7 +5,7 @@
import React, { useEffect, useState, ReactNode } from 'react';
import { Navigate } from 'react-router-dom';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useAuth } from '@/contexts/AuthContext';
import {
checkCitizenStatus,
@@ -59,7 +59,7 @@ export const CitizenRoute: React.FC<RouteGuardProps> = ({
children,
fallbackPath = '/be-citizen',
}) => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const {} = useAuth();
const [isCitizen, setIsCitizen] = useState<boolean | null>(null);
const [loading, setLoading] = useState(true);
@@ -149,7 +149,7 @@ export const ValidatorRoute: React.FC<RouteGuardProps> = ({
children,
fallbackPath = '/staking',
}) => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const [isValidator, setIsValidator] = useState<boolean | null>(null);
const [loading, setLoading] = useState(true);
@@ -240,7 +240,7 @@ export const EducatorRoute: React.FC<RouteGuardProps> = ({
children,
fallbackPath = '/education',
}) => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const [isEducator, setIsEducator] = useState<boolean | null>(null);
const [loading, setLoading] = useState(true);
@@ -337,7 +337,7 @@ export const ModeratorRoute: React.FC<RouteGuardProps> = ({
children,
fallbackPath = '/',
}) => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const [isModerator, setIsModerator] = useState<boolean | null>(null);
const [loading, setLoading] = useState(true);
+2 -2
View File
@@ -7,7 +7,7 @@ import { Alert, AlertDescription } from '@/components/ui/alert';
import { Badge } from '@/components/ui/badge';
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { ASSET_IDS, formatBalance, parseAmount } from '@pezkuwi/lib/wallet';
import { useToast } from '@/hooks/use-toast';
@@ -22,7 +22,7 @@ const AVAILABLE_TOKENS = [
] as const;
const TokenSwap = () => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const { balances, refreshBalances } = useWallet();
const { toast } = useToast();
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import {
Dialog,
DialogContent,
@@ -30,7 +30,7 @@ interface Transaction {
}
export const TransactionHistory: React.FC<TransactionHistoryProps> = ({ isOpen, onClose }) => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const { toast } = useToast();
const [transactions, setTransactions] = useState<Transaction[]>([]);
const [isLoading, setIsLoading] = useState(false);
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import {
Dialog,
DialogContent,
@@ -66,7 +66,7 @@ const TOKENS: Token[] = [
];
export const TransferModal: React.FC<TransferModalProps> = ({ isOpen, onClose, selectedAsset }) => {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const { toast } = useToast();
const [selectedToken, setSelectedToken] = useState<TokenType>('HEZ');
+2 -2
View File
@@ -1,7 +1,7 @@
import React, { useState, useEffect } from 'react';
import { X, ArrowDown, ArrowUp, AlertCircle, Info, Clock, CheckCircle2 } from 'lucide-react';
import { web3FromAddress } from '@pezkuwi/extension-dapp';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { Button } from '@/components/ui/button';
import { Alert, AlertDescription } from '@/components/ui/alert';
@@ -28,7 +28,7 @@ export const USDTBridge: React.FC<USDTBridgeProps> = ({
onClose,
specificAddresses = {},
}) => {
const { api, selectedAccount, isApiReady } = usePolkadot();
const { api, selectedAccount, isApiReady } = usePezkuwi();
const { refreshBalances } = useWallet();
const [depositAmount, setDepositAmount] = useState('');
@@ -3,13 +3,13 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { useToast } from '@/hooks/use-toast';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Loader2, Plus, CheckCircle, AlertTriangle, Shield } from 'lucide-react';
import { COMMISSIONS } from '@/config/commissions';
import { Alert, AlertDescription } from '@/components/ui/alert';
export function CommissionSetupTab() {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const { toast } = useToast();
const [loading, setLoading] = useState(true);
@@ -3,7 +3,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { useToast } from '@/hooks/use-toast';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Loader2, ThumbsUp, ThumbsDown, Clock, RefreshCw } from 'lucide-react';
import {
Table,
@@ -26,7 +26,7 @@ interface Proposal {
}
export function CommissionVotingTab() {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const { toast } = useToast();
const [loading, setLoading] = useState(true);
+2 -2
View File
@@ -3,7 +3,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { useToast } from '@/hooks/use-toast';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Loader2, CheckCircle, XCircle, Clock, User, Mail, FileText, AlertTriangle } from 'lucide-react';
import { COMMISSIONS } from '@/config/commissions';
import {
@@ -37,7 +37,7 @@ interface IdentityInfo {
}
export function KycApprovalTab() {
const { api, isApiReady, selectedAccount, connectWallet } = usePolkadot();
const { api, isApiReady, selectedAccount, connectWallet } = usePezkuwi();
const { toast } = useToast();
const [loading, setLoading] = useState(true);
@@ -11,7 +11,7 @@
*/
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import {
X,
@@ -65,7 +65,7 @@ export const XCMConfigurationWizard: React.FC<XCMConfigurationWizardProps> = ({
onClose,
onSuccess,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const { toast } = useToast();
@@ -5,7 +5,7 @@ import { Label } from '@/components/ui/label';
import { Alert, AlertDescription } from '@/components/ui/alert';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Loader2, CheckCircle, AlertTriangle, Shield } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { verifyCitizenNumber } from '@pezkuwi/lib/tiki';
import { generateAuthChallenge, signChallenge, verifySignature, saveCitizenSession } from '@pezkuwi/lib/citizenship-workflow';
import type { AuthChallenge } from '@pezkuwi/lib/citizenship-workflow';
@@ -15,7 +15,7 @@ interface ExistingCitizenAuthProps {
}
export const ExistingCitizenAuth: React.FC<ExistingCitizenAuthProps> = ({ onClose }) => {
const { api, isApiReady, selectedAccount, connectWallet } = usePolkadot();
const { api, isApiReady, selectedAccount, connectWallet } = usePezkuwi();
const [citizenNumber, setCitizenNumber] = useState('');
const [step, setStep] = useState<'input' | 'verifying' | 'signing' | 'success' | 'error'>('input');
@@ -9,7 +9,7 @@ import { Alert, AlertDescription } from '@/components/ui/alert';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
import { Checkbox } from '@/components/ui/checkbox';
import { Loader2, AlertTriangle, CheckCircle, User, Users as UsersIcon, MapPin, Briefcase, Mail, Check, X, AlertCircle } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import type { CitizenshipData, Region, MaritalStatus } from '@pezkuwi/lib/citizenship-workflow';
import { FOUNDER_ADDRESS, submitKycApplication, subscribeToKycApproval, getKycStatus } from '@pezkuwi/lib/citizenship-workflow';
import { generateCommitmentHash, generateNullifierHash, encryptData, saveLocalCitizenshipData, uploadToIPFS } from '@pezkuwi/lib/citizenship-workflow';
@@ -22,7 +22,7 @@ interface NewCitizenApplicationProps {
type FormData = Omit<CitizenshipData, 'walletAddress' | 'timestamp'>;
export const NewCitizenApplication: React.FC<NewCitizenApplicationProps> = ({ onClose, referrerAddress }) => {
const { api, isApiReady, selectedAccount, connectWallet } = usePolkadot();
const { api, isApiReady, selectedAccount, connectWallet } = usePezkuwi();
const { register, handleSubmit, watch, setValue, formState: { errors } } = useForm<FormData>();
const [submitting, setSubmitting] = useState(false);
@@ -3,7 +3,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { useToast } from '@/hooks/use-toast';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Loader2, ThumbsUp, ThumbsDown, Vote } from 'lucide-react';
interface Proposal {
@@ -17,7 +17,7 @@ interface Proposal {
}
export function CommissionProposalsCard() {
const { api, isApiReady, selectedAccount } = usePolkadot();
const { api, isApiReady, selectedAccount } = usePezkuwi();
const { toast } = useToast();
const [loading, setLoading] = useState(true);
@@ -10,13 +10,13 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@
import { Users, TrendingUp, Shield, Clock, ChevronRight, Award, Activity } from 'lucide-react';
import DelegateProfile from './DelegateProfile';
import { useDelegation } from '@/hooks/useDelegation';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { formatNumber } from '@/lib/utils';
import { LoadingState } from '@pezkuwi/components/AsyncComponent';
const DelegationManager: React.FC = () => {
const { t } = useTranslation();
const { selectedAccount } = usePolkadot();
const { selectedAccount } = usePezkuwi();
const { delegates, userDelegations, stats, loading, error } = useDelegation(selectedAccount?.address);
const [selectedDelegate, setSelectedDelegate] = useState<Record<string, unknown> | null>(null);
const [delegationAmount, setDelegationAmount] = useState('');
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { X, Plus, AlertCircle, Loader2, CheckCircle, Info } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -21,7 +21,7 @@ export const AddLiquidityModal: React.FC<AddLiquidityModalProps> = ({
onClose,
onSuccess,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const [amount1Input, setAmount1Input] = useState('');
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { X, Plus, AlertCircle, Loader2, CheckCircle } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -20,7 +20,7 @@ export const CreatePoolModal: React.FC<CreatePoolModalProps> = ({
onClose,
onSuccess,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const [asset1Id, setAsset1Id] = useState<number | null>(null);
+2 -2
View File
@@ -1,7 +1,7 @@
import React, { useState } from 'react';
// import { useNavigate } from 'react-router-dom';
import { useWallet } from '@/contexts/WalletContext';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import TokenSwap from '@/components/TokenSwap';
import PoolDashboard from '@/components/PoolDashboard';
@@ -14,7 +14,7 @@ import { isFounderWallet } from '@pezkuwi/utils/auth';
export const DEXDashboard: React.FC = () => {
const { account } = useWallet();
const { sudoKey } = usePolkadot();
const { sudoKey } = usePezkuwi();
const [activeTab, setActiveTab] = useState('swap');
// Admin modal states
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { X, AlertCircle, Loader2, CheckCircle, Info } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -22,7 +22,7 @@ export const InitializeHezPoolModal: React.FC<InitializeHezPoolModalProps> = ({
onClose,
onSuccess,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const { toast } = useToast();
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { X, AlertCircle, Loader2, CheckCircle, Info } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -25,7 +25,7 @@ export const InitializeUsdtModal: React.FC<InitializeUsdtModalProps> = ({
onClose,
onSuccess,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const { toast } = useToast();
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
@@ -22,7 +22,7 @@ export const PoolBrowser: React.FC<PoolBrowserProps> = ({
onSwap,
onCreatePool,
}) => {
const { api, isApiReady, sudoKey } = usePolkadot();
const { api, isApiReady, sudoKey } = usePezkuwi();
const { account } = useWallet();
const [pools, setPools] = useState<PoolInfo[]>([]);
const [loading, setLoading] = useState(true);
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { X, Minus, AlertCircle, Loader2, CheckCircle, Info } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -21,7 +21,7 @@ export const RemoveLiquidityModal: React.FC<RemoveLiquidityModalProps> = ({
onClose,
onSuccess,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const [lpTokenBalance, setLpTokenBalance] = useState<string>('0');
+2 -2
View File
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { ArrowDownUp, AlertCircle, Loader2, Info, Settings, AlertTriangle } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -32,7 +32,7 @@ const USER_TOKENS = [
] as const;
export const SwapInterface: React.FC<SwapInterfaceProps> = ({ pools }) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const { toast } = useToast();
@@ -1,6 +1,6 @@
// Force reload for mock XCM update
import React, { useState, useEffect, useCallback } from 'react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { X, AlertCircle, Loader2, CheckCircle, Info, ExternalLink, Zap } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -34,7 +34,7 @@ export const XCMBridgeSetupModal: React.FC<XCMBridgeSetupModalProps> = ({
onClose,
onSuccess,
}) => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const { toast } = useToast();
@@ -5,7 +5,7 @@ import { Badge } from '@/components/ui/badge';
import { Progress } from '@/components/ui/progress';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Vote, Trophy, AlertCircle, CheckCircle, Users, Clock, Activity, Loader2 } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import {
getActiveElections,
@@ -28,7 +28,7 @@ interface ElectionWithCandidates extends ElectionInfo {
}
const ElectionsInterface: React.FC = () => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, signer } = useWallet();
const [elections, setElections] = useState<ElectionWithCandidates[]>([]);
const [completedResults, setCompletedResults] = useState<ElectionResult[]>([]);
@@ -3,7 +3,7 @@ import { Card, CardContent } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { FileText, Users, Trophy, CheckCircle, XCircle, Clock, Activity, Loader2, TrendingUp, Calendar } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import {
getElectionResults,
getGovernanceStats,
@@ -25,7 +25,7 @@ interface CompletedProposal {
}
const GovernanceHistory: React.FC = () => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const [completedElections, setCompletedElections] = useState<ElectionResult[]>([]);
const [completedProposals, setCompletedProposals] = useState<CompletedProposal[]>([]);
const [stats, setStats] = useState<GovernanceMetrics | null>(null);
@@ -7,7 +7,7 @@ import {
import { Card, CardContent, CardHeader, CardTitle } from '../ui/card';
import { Badge } from '../ui/badge';
import { Progress } from '../ui/progress';
import { usePolkadot } from '../../contexts/PolkadotContext';
import { usePezkuwi } from '../../contexts/PezkuwiContext';
import { formatBalance } from '@pezkuwi/lib/wallet';
import { LoadingState } from '@pezkuwi/components/AsyncComponent';
@@ -23,7 +23,7 @@ interface GovernanceStats {
}
const GovernanceOverview: React.FC = () => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const [stats, setStats] = useState<GovernanceStats>({
activeProposals: 0,
activeElections: 0,
+2 -2
View File
@@ -4,7 +4,7 @@ import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Vote, FileText, Users, CheckCircle, XCircle, Clock, Activity, Loader2, Wallet } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { formatNumber } from '@/lib/utils';
@@ -35,7 +35,7 @@ interface DelegationInfo {
}
const MyVotes: React.FC = () => {
const { api, isApiReady } = usePolkadot();
const { api, isApiReady } = usePezkuwi();
const { account, isConnected } = useWallet();
const [proposalVotes, setProposalVotes] = useState<ProposalVote[]>([]);
const [electionVotes, setElectionVotes] = useState<ElectionVote[]>([]);
+2 -2
View File
@@ -28,7 +28,7 @@ import {
QrCode,
Wallet
} from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { toast } from 'sonner';
import {
@@ -46,7 +46,7 @@ interface DepositModalProps {
type DepositStep = 'select' | 'send' | 'verify' | 'success';
export function DepositModal({ isOpen, onClose, onSuccess }: DepositModalProps) {
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const { balances, signTransaction } = useWallet();
const [step, setStep] = useState<DepositStep>('select');
+16 -10
View File
@@ -220,16 +220,22 @@ export function DisputeModal({
reference_id: dispute.id,
});
// Create notification for admin (user-100 / platform admin)
// In production, this would be a specific admin role
await supabase.from('p2p_notifications').insert({
user_id: counterpartyId, // TODO: Replace with actual admin user ID
type: 'dispute_opened',
title: 'New Dispute Requires Attention',
message: `Dispute #${dispute.id.slice(0, 8)} opened. Trade: ${tradeId.slice(0, 8)}`,
reference_type: 'dispute',
reference_id: dispute.id,
});
// Fetch admin user IDs and create notifications for each admin
const { data: adminIds, error: adminError } = await supabase.rpc('get_admin_user_ids');
if (adminError) {
console.error('Failed to fetch admin IDs:', adminError);
// Continue without admin notifications if fetching fails, but log the error
} else if (adminIds && adminIds.length > 0) {
const adminNotifications = adminIds.map((admin: { user_id: string }) => ({
user_id: admin.user_id,
type: 'dispute_opened',
title: 'New Dispute Requires Attention',
message: `Dispute #${dispute.id.slice(0, 8)} opened. Trade: ${tradeId.slice(0, 8)}`,
reference_type: 'dispute',
reference_id: dispute.id,
}));
await supabase.from('p2p_notifications').insert(adminNotifications);
}
toast.success('Dispute opened successfully');
onClose();
+2 -2
View File
@@ -14,7 +14,7 @@ import { Label } from '@/components/ui/label';
import { Alert, AlertDescription } from '@/components/ui/alert';
import { Loader2, AlertTriangle, Clock } from 'lucide-react';
import { useAuth } from '@/contexts/AuthContext';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { toast } from 'sonner';
import { acceptFiatOffer, type P2PFiatOffer } from '@shared/lib/p2p-fiat';
@@ -26,7 +26,7 @@ interface TradeModalProps {
export function TradeModal({ offer, onClose }: TradeModalProps) {
const navigate = useNavigate();
const { user } = useAuth();
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const [amount, setAmount] = useState('');
const [loading, setLoading] = useState(false);
+2 -2
View File
@@ -28,7 +28,7 @@ import {
Clock,
Info
} from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { toast } from 'sonner';
import {
getInternalBalances,
@@ -48,7 +48,7 @@ interface WithdrawModalProps {
type WithdrawStep = 'form' | 'confirm' | 'success';
export function WithdrawModal({ isOpen, onClose, onSuccess }: WithdrawModalProps) {
const { selectedAccount } = usePolkadot();
const { selectedAccount } = usePezkuwi();
const [step, setStep] = useState<WithdrawStep>('form');
const [token, setToken] = useState<CryptoToken>('HEZ');
@@ -4,7 +4,7 @@ import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Textarea } from '@/components/ui/textarea';
import { Label } from '@/components/ui/label';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { toast } from 'sonner';
import { createCourse } from '@shared/lib/perwerde';
import { uploadToIPFS } from '@shared/lib/ipfs';
@@ -15,7 +15,7 @@ interface CourseCreatorProps {
}
export function CourseCreator({ onCourseCreated }: CourseCreatorProps) {
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const [name, setName] = useState('');
const [description, setDescription] = useState('');
const [content, setContent] = useState('');
+2 -2
View File
@@ -3,7 +3,7 @@ import { Card, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { GraduationCap, BookOpen, ExternalLink, Play } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { toast } from 'sonner';
import { LoadingState } from '@shared/components/AsyncComponent';
import { getCourses, enrollInCourse, type Course } from '@shared/lib/perwerde';
@@ -15,7 +15,7 @@ interface CourseListProps {
}
export function CourseList({ enrolledCourseIds, onEnroll }: CourseListProps) {
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const [courses, setCourses] = useState<Course[]>([]);
const [loading, setLoading] = useState(true);
@@ -3,7 +3,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { BookOpen, CheckCircle, Award } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { toast } from 'sonner';
import { LoadingState } from '@shared/components/AsyncComponent';
import { completeCourse, type Enrollment } from '@shared/lib/perwerde';
@@ -15,7 +15,7 @@ interface StudentDashboardProps {
}
export function StudentDashboard({ enrollments, loading, onCourseCompleted }: StudentDashboardProps) {
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const handleComplete = async (courseId: number) => {
if (!api || !selectedAccount) {
@@ -3,7 +3,7 @@ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } f
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import {
Copy,
Check,
@@ -21,7 +21,7 @@ interface InviteUserModalProps {
}
export const InviteUserModal: React.FC<InviteUserModalProps> = ({ isOpen, onClose }) => {
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const [copied, setCopied] = useState(false);
const [inviteeAddress, setInviteeAddress] = useState('');
const [initiating, setInitiating] = useState(false);
@@ -7,7 +7,7 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { Alert, AlertDescription } from '@/components/ui/alert';
// import { Badge } from '@/components/ui/badge';
import { AlertCircle, CheckCircle2 } from 'lucide-react';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { useWallet } from '@/contexts/WalletContext';
import { toast } from 'sonner';
import { web3FromAddress } from '@pezkuwi/extension-dapp';
@@ -25,7 +25,7 @@ import { ValidatorPoolDashboard } from './ValidatorPoolDashboard';
import { handleBlockchainError, handleBlockchainSuccess } from '@pezkuwi/lib/error-handler';
export const StakingDashboard: React.FC = () => {
const { api, selectedAccount, isApiReady } = usePolkadot();
const { api, selectedAccount, isApiReady } = usePezkuwi();
const { balances, refreshBalances } = useWallet();
const [stakingInfo, setStakingInfo] = useState<StakingInfo | null>(null);
@@ -1,7 +1,7 @@
import React, { useState, useEffect, useCallback } from 'react';
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { toast } from 'sonner';
import {
getPoolMember,
@@ -16,7 +16,7 @@ import { Loader2, Users, UserCheck, UserX } from 'lucide-react';
import { PoolCategorySelector } from './PoolCategorySelector';
export function ValidatorPoolDashboard() {
const { api, selectedAccount } = usePolkadot();
const { api, selectedAccount } = usePezkuwi();
const [poolMember, setPoolMember] = useState<ValidatorPoolCategory | null>(null);
const [poolSize, setPoolSize] = useState(0);
const [validatorCount, setValidatorCount] = useState(0);
+2 -2
View File
@@ -8,7 +8,7 @@ import {
DialogTitle,
} from '@/components/ui/dialog';
import { Button } from '@/components/ui/button';
import { usePolkadot } from '@/contexts/PolkadotContext';
import { usePezkuwi } from '@/contexts/PezkuwiContext';
import { formatAddress } from '@pezkuwi/lib/wallet';
import { getAllScores, type UserScores } from '@pezkuwi/lib/scores';
@@ -27,7 +27,7 @@ export const WalletModal: React.FC<WalletModalProps> = ({ isOpen, onClose }) =>
api,
isApiReady,
error
} = usePolkadot();
} = usePezkuwi();
const [copied, setCopied] = useState(false);
const [scores, setScores] = useState<UserScores>({