Organize shared code across web, mobile, and SDK UI projects

Centralized common code into shared/ folder to eliminate duplication and
improve maintainability across all three frontend projects (web, mobile,
pezkuwi-sdk-ui).

Changes:
- Added token types and constants to shared/types/tokens.ts
  - TokenInfo, PoolInfo, SwapQuote, and other DEX types
  - KNOWN_TOKENS with HEZ, PEZ, wUSDT definitions
  - Token logos (🟡🟣💵)

- Added Kurdistan color palette to shared/constants/
  - Kesk, Sor, Zer, Spî, Reş color definitions

- Added TOKEN_DISPLAY_SYMBOLS mapping (USDT vs wUSDT)

- Updated blockchain configuration in shared/blockchain/polkadot.ts
  - Added beta testnet endpoint (wss://beta-rpc.pezkuwi.art)
  - Defined DEFAULT_ENDPOINT constant

- Moved i18n to shared/i18n/
  - Centralized translation files for 6 languages (EN, TR, KMR, CKB, AR, FA)
  - Added LANGUAGES configuration with RTL support
  - Created isRTL() helper function

- Updated web and mobile to import from shared
  - web/src/types/dex.ts now re-exports from shared
  - web/src/contexts/PolkadotContext.tsx uses DEFAULT_ENDPOINT
  - mobile/src/i18n/index.ts uses shared translations
  - mobile/src/contexts/PolkadotContext.tsx uses DEFAULT_ENDPOINT

- Updated shared/README.md with comprehensive documentation

This architecture reduces code duplication and ensures consistency across
all frontend projects.
This commit is contained in:
Claude
2025-11-14 19:48:43 +00:00
parent 9c6b10a502
commit 81fe0e8ab7
17 changed files with 684 additions and 147 deletions
+2 -1
View File
@@ -2,6 +2,7 @@ import React, { createContext, useContext, useEffect, useState, ReactNode } from
import { ApiPromise, WsProvider } from '@polkadot/api';
import { web3Accounts, web3Enable, web3FromAddress } from '@polkadot/extension-dapp';
import type { InjectedAccountWithMeta } from '@polkadot/extension-inject/types';
import { DEFAULT_ENDPOINT } from '../../../shared/blockchain/polkadot';
interface PolkadotContextType {
api: ApiPromise | null;
@@ -24,7 +25,7 @@ interface PolkadotProviderProps {
export const PolkadotProvider: React.FC<PolkadotProviderProps> = ({
children,
endpoint = 'wss://beta-rpc.pezkuwi.art' // Beta testnet RPC
endpoint = DEFAULT_ENDPOINT // Beta testnet RPC from shared config
}) => {
const [api, setApi] = useState<ApiPromise | null>(null);
const [isApiReady, setIsApiReady] = useState(false);
+13 -107
View File
@@ -1,108 +1,14 @@
export interface TokenInfo {
id: number;
symbol: string;
name: string;
decimals: number;
logo?: string;
}
// Re-export shared types and constants
export {
type TokenInfo,
type PoolInfo,
type UserLiquidityPosition,
type SwapQuote,
type AddLiquidityParams,
type RemoveLiquidityParams,
type SwapParams,
type PoolCreationParams,
TransactionStatus,
} from '../../../shared/types/tokens';
export interface PoolInfo {
id: string; // asset1-asset2 pair
asset1: number;
asset2: number;
asset1Symbol: string;
asset2Symbol: string;
asset1Decimals: number;
asset2Decimals: number;
reserve1: string; // Raw balance string
reserve2: string;
lpTokenSupply: string;
volume24h?: string;
tvl?: string;
apr7d?: string;
feeRate?: string;
}
export interface UserLiquidityPosition {
poolId: string;
asset1: number;
asset2: number;
lpTokenBalance: string;
shareOfPool: string; // Percentage as string (e.g., "2.5")
asset1Amount: string;
asset2Amount: string;
valueUSD?: string;
feesEarned?: string;
}
export interface SwapQuote {
amountIn: string;
amountOut: string;
path: number[]; // Asset IDs in route
priceImpact: string; // Percentage as string
minimumReceived: string; // After slippage
route: string; // Human readable (e.g., "wHEZ → PEZ → wUSDT")
}
export interface AddLiquidityParams {
asset1: number;
asset2: number;
amount1: string;
amount2: string;
amount1Min: string;
amount2Min: string;
recipient: string;
}
export interface RemoveLiquidityParams {
asset1: number;
asset2: number;
lpTokenAmount: string;
amount1Min: string;
amount2Min: string;
recipient: string;
}
export interface SwapParams {
path: number[];
amountIn: string;
amountOutMin: string;
recipient: string;
deadline?: number;
}
export interface PoolCreationParams {
asset1: number;
asset2: number;
feeRate?: number;
}
// Known tokens on testnet
export const KNOWN_TOKENS: Record<number, TokenInfo> = {
0: {
id: 0,
symbol: 'wHEZ',
name: 'Wrapped HEZ',
decimals: 12,
},
1: {
id: 1,
symbol: 'PEZ',
name: 'Pezkuwi Token',
decimals: 12,
},
2: {
id: 2,
symbol: 'wUSDT',
name: 'Wrapped USDT',
decimals: 6,
},
};
// Transaction status
export enum TransactionStatus {
IDLE = 'idle',
PENDING = 'pending',
SUCCESS = 'success',
ERROR = 'error',
}
export { KNOWN_TOKENS, TOKEN_DISPLAY_SYMBOLS } from '../../../shared/constants';