diff --git a/package.json b/package.json index 50a09a5..8cd9fd7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pezkuwi-telegram-miniapp", - "version": "1.0.227", + "version": "1.0.228", "type": "module", "description": "Pezkuwichain Telegram Mini App - Forum, Announcements, Rewards", "author": "Pezkuwichain Team", diff --git a/src/components/p2p/DepositWithdrawModal.tsx b/src/components/p2p/DepositWithdrawModal.tsx index 7070b89..6dff4b9 100644 --- a/src/components/p2p/DepositWithdrawModal.tsx +++ b/src/components/p2p/DepositWithdrawModal.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import { X, ArrowDownToLine, @@ -51,6 +51,13 @@ export function DepositWithdrawModal({ const [activeTab, setActiveTab] = useState<'deposit' | 'withdraw'>(initialTab); + // Sync tab when modal opens with a different initialTab + useEffect(() => { + if (isOpen) { + setActiveTab(initialTab); + } + }, [isOpen, initialTab]); + // Deposit state const [depositToken, setDepositToken] = useState<'HEZ' | 'PEZ'>('HEZ'); const [depositAmount, setDepositAmount] = useState(''); @@ -231,7 +238,7 @@ export function DepositWithdrawModal({ {/* Modal */}
handleAccept(offer)} className={cn( 'px-3 py-1.5 text-xs font-medium rounded-lg transition-colors', - adType === 'buy' + adType === 'sell' ? 'bg-green-500 hover:bg-green-600 text-white' : 'bg-red-500 hover:bg-red-600 text-white' )} > - {adType === 'buy' ? t('p2p.buy') : t('p2p.sell')} + {adType === 'sell' ? t('p2p.buy') : t('p2p.sell')}
diff --git a/src/index.css b/src/index.css index 8312845..4ae2f97 100644 --- a/src/index.css +++ b/src/index.css @@ -14,6 +14,8 @@ --muted-foreground: 215 20.2% 65.1%; --accent: 217.2 32.6% 17.5%; --accent-foreground: 210 40% 98%; + --card: 222.2 84% 6.5%; + --card-foreground: 210 40% 98%; --border: 217.2 32.6% 17.5%; --radius: 0.75rem; } diff --git a/src/sections/P2P.tsx b/src/sections/P2P.tsx index 092c7e1..3fefbdc 100644 --- a/src/sections/P2P.tsx +++ b/src/sections/P2P.tsx @@ -195,7 +195,7 @@ export function P2PSection() { onClick={() => handleTabChange(tab.id)} className={cn( 'flex-1 py-2 text-xs font-medium rounded-lg transition-colors', - activeTab === tab.id ? 'bg-card text-foreground shadow-sm' : 'text-muted-foreground' + activeTab === tab.id ? 'bg-cyan-500/20 text-cyan-400 shadow-sm' : 'text-muted-foreground' )} > {tab.label} diff --git a/src/version.json b/src/version.json index d032c45..2622079 100644 --- a/src/version.json +++ b/src/version.json @@ -1,5 +1,5 @@ { - "version": "1.0.227", - "buildTime": "2026-02-26T17:26:18.861Z", - "buildNumber": 1772126778862 + "version": "1.0.228", + "buildTime": "2026-02-26T21:44:34.122Z", + "buildNumber": 1772142274123 } diff --git a/supabase/functions/accept-p2p-offer/index.ts b/supabase/functions/accept-p2p-offer/index.ts index f93e9bc..83a02df 100644 --- a/supabase/functions/accept-p2p-offer/index.ts +++ b/supabase/functions/accept-p2p-offer/index.ts @@ -95,9 +95,13 @@ serve(async (req) => { const body: AcceptP2POfferRequest = await req.json(); const { sessionToken, offerId, amount, buyerWallet } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -112,7 +116,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -144,8 +152,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/announcement-reaction/index.ts b/supabase/functions/announcement-reaction/index.ts index f41767c..39f3c19 100644 --- a/supabase/functions/announcement-reaction/index.ts +++ b/supabase/functions/announcement-reaction/index.ts @@ -81,16 +81,24 @@ serve(async (req) => { const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); - if (!botToken) { + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, }); } - const telegramUser = validateInitData(initData, botToken); + let telegramUser: TelegramUser | null = null; + for (const bt of botTokens) { + telegramUser = validateInitData(initData, bt); + if (telegramUser) break; + } if (!telegramUser) { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { status: 401, diff --git a/supabase/functions/create-offer-telegram/index.ts b/supabase/functions/create-offer-telegram/index.ts index b35d1ad..7b1b311 100644 --- a/supabase/functions/create-offer-telegram/index.ts +++ b/supabase/functions/create-offer-telegram/index.ts @@ -114,9 +114,13 @@ serve(async (req) => { adType = 'sell', } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -131,7 +135,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -156,8 +164,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/get-deposit-code/index.ts b/supabase/functions/get-deposit-code/index.ts index b862be8..539a5b3 100644 --- a/supabase/functions/get-deposit-code/index.ts +++ b/supabase/functions/get-deposit-code/index.ts @@ -83,16 +83,24 @@ serve(async (req) => { const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); - if (!botToken) { + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, }); } - const telegramUser = validateInitData(initData, botToken); + let telegramUser: TelegramUser | null = null; + for (const bt of botTokens) { + telegramUser = validateInitData(initData, bt); + if (telegramUser) break; + } if (!telegramUser) { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { status: 401, diff --git a/supabase/functions/get-deposit-info/index.ts b/supabase/functions/get-deposit-info/index.ts index c7ff87c..09e25c6 100644 --- a/supabase/functions/get-deposit-info/index.ts +++ b/supabase/functions/get-deposit-info/index.ts @@ -165,17 +165,25 @@ serve(async (req) => { const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); const tronHdMnemonic = Deno.env.get('DEPOSIT_TRON_HD_MNEMONIC'); - if (!botToken) { + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, }); } - const telegramUser = validateInitData(initData, botToken); + let telegramUser: TelegramUser | null = null; + for (const bt of botTokens) { + telegramUser = validateInitData(initData, bt); + if (telegramUser) break; + } if (!telegramUser) { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { status: 401, diff --git a/supabase/functions/get-deposits/index.ts b/supabase/functions/get-deposits/index.ts index e518483..3933af4 100644 --- a/supabase/functions/get-deposits/index.ts +++ b/supabase/functions/get-deposits/index.ts @@ -74,16 +74,24 @@ serve(async (req) => { const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); - if (!botToken) { + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, }); } - const telegramUser = validateInitData(initData, botToken); + let telegramUser: TelegramUser | null = null; + for (const bt of botTokens) { + telegramUser = validateInitData(initData, bt); + if (telegramUser) break; + } if (!telegramUser) { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { status: 401, diff --git a/supabase/functions/get-internal-balance/index.ts b/supabase/functions/get-internal-balance/index.ts index 240096d..d324b4f 100644 --- a/supabase/functions/get-internal-balance/index.ts +++ b/supabase/functions/get-internal-balance/index.ts @@ -93,8 +93,12 @@ serve(async (req) => { const { sessionToken } = body; // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -109,7 +113,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -127,7 +135,7 @@ serve(async (req) => { const { data: { users: authUsers }, } = await supabase.auth.admin.listUsers({ perPage: 1000 }); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/get-my-offers/index.ts b/supabase/functions/get-my-offers/index.ts index cd4d231..96bd94d 100644 --- a/supabase/functions/get-my-offers/index.ts +++ b/supabase/functions/get-my-offers/index.ts @@ -93,9 +93,13 @@ serve(async (req) => { const body: GetMyOffersRequest = await req.json(); const { sessionToken, status } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -110,7 +114,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -127,8 +135,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response( diff --git a/supabase/functions/get-p2p-offers/index.ts b/supabase/functions/get-p2p-offers/index.ts index 0a32edf..07c30c3 100644 --- a/supabase/functions/get-p2p-offers/index.ts +++ b/supabase/functions/get-p2p-offers/index.ts @@ -105,8 +105,12 @@ serve(async (req) => { } = body; // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -121,7 +125,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -139,7 +147,7 @@ serve(async (req) => { const { data: { users: authUsers }, } = await supabase.auth.admin.listUsers({ perPage: 1000 }); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/get-p2p-trades/index.ts b/supabase/functions/get-p2p-trades/index.ts index 5407f6a..54a5dfe 100644 --- a/supabase/functions/get-p2p-trades/index.ts +++ b/supabase/functions/get-p2p-trades/index.ts @@ -93,9 +93,13 @@ serve(async (req) => { const body: GetP2PTradesRequest = await req.json(); const { sessionToken, status } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -110,7 +114,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -127,8 +135,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/get-payment-methods/index.ts b/supabase/functions/get-payment-methods/index.ts index a18a714..892f420 100644 --- a/supabase/functions/get-payment-methods/index.ts +++ b/supabase/functions/get-payment-methods/index.ts @@ -93,9 +93,13 @@ serve(async (req) => { const body: GetPaymentMethodsRequest = await req.json(); const { sessionToken, currency } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -110,7 +114,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -127,8 +135,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/p2p-dispute/index.ts b/supabase/functions/p2p-dispute/index.ts index 819cb2b..d8b6194 100644 --- a/supabase/functions/p2p-dispute/index.ts +++ b/supabase/functions/p2p-dispute/index.ts @@ -99,9 +99,13 @@ serve(async (req) => { const body: P2PDisputeRequest = await req.json(); const { sessionToken, action, tradeId, reason, category, evidenceUrl, evidenceType, description } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -116,7 +120,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -148,8 +156,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/p2p-messages/index.ts b/supabase/functions/p2p-messages/index.ts index 95fb91f..3437b3c 100644 --- a/supabase/functions/p2p-messages/index.ts +++ b/supabase/functions/p2p-messages/index.ts @@ -95,9 +95,13 @@ serve(async (req) => { const body: P2PMessagesRequest = await req.json(); const { sessionToken, action, tradeId, message } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -112,7 +116,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -144,8 +152,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/request-withdraw-telegram/index.ts b/supabase/functions/request-withdraw-telegram/index.ts index 5a7940b..bd309a7 100644 --- a/supabase/functions/request-withdraw-telegram/index.ts +++ b/supabase/functions/request-withdraw-telegram/index.ts @@ -114,9 +114,13 @@ serve(async (req) => { const { sessionToken, token, amount, walletAddress } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response( JSON.stringify({ success: false, error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } } @@ -131,7 +135,11 @@ serve(async (req) => { ); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response( JSON.stringify({ success: false, error: 'Invalid or expired session token' }), diff --git a/supabase/functions/save-wallet-address/index.ts b/supabase/functions/save-wallet-address/index.ts index 03db4ba..0c92274 100644 --- a/supabase/functions/save-wallet-address/index.ts +++ b/supabase/functions/save-wallet-address/index.ts @@ -102,16 +102,24 @@ serve(async (req) => { const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); - if (!botToken) { + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, }); } - const telegramUser = validateInitData(initData, botToken); + let telegramUser: TelegramUser | null = null; + for (const bt of botTokens) { + telegramUser = validateInitData(initData, bt); + if (telegramUser) break; + } if (!telegramUser) { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { status: 401, diff --git a/supabase/functions/trade-action/index.ts b/supabase/functions/trade-action/index.ts index b067313..863e2f4 100644 --- a/supabase/functions/trade-action/index.ts +++ b/supabase/functions/trade-action/index.ts @@ -99,9 +99,13 @@ serve(async (req) => { const body: TradeActionRequest = await req.json(); const { sessionToken, tradeId, action, payload } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -116,7 +120,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { status: 401, @@ -149,8 +157,8 @@ serve(async (req) => { const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const { data: { users: authUsers }, - } = await supabase.auth.admin.listUsers(); - const authUser = authUsers?.find((u) => u.email === telegramEmail); + } = await supabase.auth.admin.listUsers({ perPage: 1000 }); + const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail); if (!authUser) { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { diff --git a/supabase/functions/verify-deposit-telegram/index.ts b/supabase/functions/verify-deposit-telegram/index.ts index 5d80b19..57ddc02 100644 --- a/supabase/functions/verify-deposit-telegram/index.ts +++ b/supabase/functions/verify-deposit-telegram/index.ts @@ -318,9 +318,13 @@ serve(async (req) => { } const { sessionToken, txHash, token, expectedAmount, blockNumber } = body; - // Get bot token for session verification - const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); - if (!botToken) { + // Get bot tokens for session verification (dual bot support) + const botTokens: string[] = []; + const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); + const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD'); + if (_mainToken) botTokens.push(_mainToken); + if (_krdToken) botTokens.push(_krdToken); + if (botTokens.length === 0) { return new Response(JSON.stringify({ success: false, error: 'Server configuration error' }), { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' }, @@ -335,7 +339,11 @@ serve(async (req) => { }); } - const telegramId = verifySessionToken(sessionToken, botToken); + let telegramId: number | null = null; + for (const bt of botTokens) { + telegramId = verifySessionToken(sessionToken, bt); + if (telegramId) break; + } if (!telegramId) { return new Response( JSON.stringify({ success: false, error: 'Invalid or expired session token' }), diff --git a/tailwind.config.js b/tailwind.config.js index 02fded4..05630d2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -24,6 +24,10 @@ export default { DEFAULT: 'hsl(var(--accent))', foreground: 'hsl(var(--accent-foreground))', }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, }, borderRadius: { lg: 'var(--radius)',