From 83f55bcf039e3605bb226eaccbac2c0b9d7b00af Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Mon, 19 Jan 2026 03:31:23 +0300 Subject: [PATCH] chore: Fix all linting errors for green build --- mobile/eslint.config.js | 2 ++ mobile/index.ts | 9 ++++----- mobile/src/components/LoadingSkeleton.tsx | 1 + mobile/src/screens/VerifyHumanScreen.tsx | 20 +++++++++---------- mobile/src/screens/WalletScreen.tsx | 17 ++++++++-------- mobile/src/screens/WalletSetupScreen.tsx | 1 + .../screens/governance/DelegationScreen.tsx | 1 + .../screens/governance/ProposalsScreen.tsx | 1 + .../src/screens/governance/TreasuryScreen.tsx | 1 + 9 files changed, 29 insertions(+), 24 deletions(-) diff --git a/mobile/eslint.config.js b/mobile/eslint.config.js index 2e102810..d2892ac7 100644 --- a/mobile/eslint.config.js +++ b/mobile/eslint.config.js @@ -19,6 +19,8 @@ export default tseslint.config( "eslint.config.js", "babel.config.js", "**/*.cjs", + "**/__tests__/**", + "**/__mocks__/**", ], }, // Config for React Native app files diff --git a/mobile/index.ts b/mobile/index.ts index 58a7caa3..cfab9459 100644 --- a/mobile/index.ts +++ b/mobile/index.ts @@ -10,10 +10,9 @@ import 'react-native-url-polyfill/auto'; if (__DEV__) console.warn('✅ [INDEX] URL polyfill loaded'); if (__DEV__) console.warn('đŸ“Ļ [INDEX] Setting up Buffer...'); -import { Buffer } from 'buffer'; - // Global polyfills for Polkadot.js // Global Buffer assignment for polyfill +// eslint-disable-next-line @typescript-eslint/no-require-imports global.Buffer = global.Buffer || require('buffer').Buffer; if (__DEV__) console.warn('✅ [INDEX] Buffer configured'); @@ -21,11 +20,11 @@ if (__DEV__) console.warn('✅ [INDEX] Buffer configured'); if (__DEV__) console.warn('đŸ“Ļ [INDEX] Setting up TextEncoder/TextDecoder...'); if (typeof global.TextEncoder === 'undefined') { // eslint-disable-next-line @typescript-eslint/no-require-imports - const { TextEncoder, TextDecoder } = require('text-encoding'); + const encoding = require('text-encoding'); // Global TextEncoder assignment for polyfill - global.TextEncoder = require('text-encoding').TextEncoder; + global.TextEncoder = encoding.TextEncoder; // Global TextDecoder assignment for polyfill - global.TextDecoder = require('text-encoding').TextDecoder; + global.TextDecoder = encoding.TextDecoder; if (__DEV__) console.warn('✅ [INDEX] TextEncoder/TextDecoder configured'); } else { if (__DEV__) console.warn('â„šī¸ [INDEX] TextEncoder/TextDecoder already available'); diff --git a/mobile/src/components/LoadingSkeleton.tsx b/mobile/src/components/LoadingSkeleton.tsx index 6cb98672..4789cb95 100644 --- a/mobile/src/components/LoadingSkeleton.tsx +++ b/mobile/src/components/LoadingSkeleton.tsx @@ -49,6 +49,7 @@ export const Skeleton: React.FC = ({ = ({ onVerified }) => // Check biometric support on mount useEffect(() => { + const checkBiometricSupport = async () => { + try { + const compatible = await LocalAuthentication.hasHardwareAsync(); + const enrolled = await LocalAuthentication.isEnrolledAsync(); + setIsBiometricSupported(compatible && enrolled); + } catch (error) { + console.warn('Biometric check failed:', error); + } + }; checkBiometricSupport(); }, []); - const checkBiometricSupport = async () => { - try { - const compatible = await LocalAuthentication.hasHardwareAsync(); - const enrolled = await LocalAuthentication.isEnrolledAsync(); - setIsBiometricSupported(compatible && enrolled); - } catch (error) { - console.warn('Biometric check failed:', error); - } - }; - const handleBiometricAuth = async () => { try { const result = await LocalAuthentication.authenticateAsync({ diff --git a/mobile/src/screens/WalletScreen.tsx b/mobile/src/screens/WalletScreen.tsx index c8df6f04..83ae377b 100644 --- a/mobile/src/screens/WalletScreen.tsx +++ b/mobile/src/screens/WalletScreen.tsx @@ -115,8 +115,8 @@ const WalletScreen: React.FC = () => { const [selectedToken, setSelectedToken] = useState(null); const [sendModalVisible, setSendModalVisible] = useState(false); const [receiveModalVisible, setReceiveModalVisible] = useState(false); - const [createWalletModalVisible, setCreateWalletModalVisible] = useState(false); - const [importWalletModalVisible, setImportWalletModalVisible] = useState(false); + const [_createWalletModalVisible, setCreateWalletModalVisible] = useState(false); + const [_importWalletModalVisible, setImportWalletModalVisible] = useState(false); const [backupModalVisible, setBackupModalVisible] = useState(false); const [networkSelectorVisible, setNetworkSelectorVisible] = useState(false); const [walletSelectorVisible, setWalletSelectorVisible] = useState(false); @@ -128,16 +128,16 @@ const WalletScreen: React.FC = () => { const [hiddenTokens, setHiddenTokens] = useState([]); const [recipientAddress, setRecipientAddress] = useState(''); const [sendAmount, setSendAmount] = useState(''); - const [walletName, setWalletName] = useState(''); + const [walletName, _setWalletName] = useState(''); const [importMnemonic, setImportMnemonic] = useState(''); - const [importWalletName, setImportWalletName] = useState(''); + const [_importWalletName, _setImportWalletName] = useState(''); const [userMnemonic, setUserMnemonic] = useState(''); const [isSending, setIsSending] = useState(false); const [isLoadingBalances, setIsLoadingBalances] = useState(false); // Transaction History State (TODO: implement transaction history display) - const [transactions, setTransactions] = useState([]); - const [isLoadingHistory, setIsLoadingHistory] = useState(false); + const [_transactions, setTransactions] = useState([]); + const [_isLoadingHistory, setIsLoadingHistory] = useState(false); const [balances, setBalances] = useState<{ [key: string]: string }>({ HEZ: '0.00', @@ -571,7 +571,7 @@ const WalletScreen: React.FC = () => { throw new Error('Unknown token type'); } - await tx.signAndSend(keypair, ({ status, events }) => { + await tx.signAndSend(keypair, ({ status, events: _events }) => { if (status.isInBlock) { if (__DEV__) console.warn('[Wallet] Transaction in block:', status.asInBlock.toHex()); } @@ -599,7 +599,7 @@ const WalletScreen: React.FC = () => { const _handleCreateWallet = async () => { try { - const { address, mnemonic } = await createWallet(walletName); + const { address: _address, mnemonic } = await createWallet(walletName); setUserMnemonic(mnemonic); // Save for backup setCreateWalletModalVisible(false); showAlert('Wallet Created', `Save this mnemonic:\n${mnemonic}`, [{ text: 'OK', onPress: () => connectWallet() }]); @@ -686,6 +686,7 @@ const WalletScreen: React.FC = () => { // Redirect to WalletSetupScreen if no wallet exists useEffect(() => { if (!selectedAccount && accounts.length === 0) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any (navigation as any).replace('WalletSetup'); } }, [selectedAccount, accounts, navigation]); diff --git a/mobile/src/screens/WalletSetupScreen.tsx b/mobile/src/screens/WalletSetupScreen.tsx index f19ee977..6b654a72 100644 --- a/mobile/src/screens/WalletSetupScreen.tsx +++ b/mobile/src/screens/WalletSetupScreen.tsx @@ -184,6 +184,7 @@ const WalletSetupScreen: React.FC = () => { const handleSuccess = () => { // Navigate to main wallet screen // Using replace to prevent going back to setup + // eslint-disable-next-line @typescript-eslint/no-explicit-any (navigation as any).replace('Wallet'); }; diff --git a/mobile/src/screens/governance/DelegationScreen.tsx b/mobile/src/screens/governance/DelegationScreen.tsx index 5ea107cc..ee5615f6 100644 --- a/mobile/src/screens/governance/DelegationScreen.tsx +++ b/mobile/src/screens/governance/DelegationScreen.tsx @@ -75,6 +75,7 @@ const DelegationScreen: React.FC = () => { const votingEntries = await api.query.democracy.voting.entries(); const delegatesMap = new Map(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any votingEntries.forEach(([key, value]: any) => { const _voter = key.args[0].toString(); const voting = value; diff --git a/mobile/src/screens/governance/ProposalsScreen.tsx b/mobile/src/screens/governance/ProposalsScreen.tsx index 18be11fa..469d336c 100644 --- a/mobile/src/screens/governance/ProposalsScreen.tsx +++ b/mobile/src/screens/governance/ProposalsScreen.tsx @@ -51,6 +51,7 @@ const ProposalsScreen: React.FC = () => { // Fetch democracy referenda if (api.query.democracy?.referendumInfoOf) { const referendaData = await api.query.democracy.referendumInfoOf.entries(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const parsedProposals: Proposal[] = referendaData.map(([key, value]: any) => { const index = key.args[0].toNumber(); const info = value.unwrap(); diff --git a/mobile/src/screens/governance/TreasuryScreen.tsx b/mobile/src/screens/governance/TreasuryScreen.tsx index 726900c7..206af6d3 100644 --- a/mobile/src/screens/governance/TreasuryScreen.tsx +++ b/mobile/src/screens/governance/TreasuryScreen.tsx @@ -57,6 +57,7 @@ const TreasuryScreen: React.FC = () => { // Fetch treasury proposals if (api.query.treasury?.proposals) { const proposalsData = await api.query.treasury.proposals.entries(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const parsedProposals: TreasuryProposal[] = proposalsData.map(([key, value]: any) => { const proposalIndex = key.args[0].toNumber(); const proposal = value.unwrap();