fix(web): live collator/nominator counts after AHM + reliable B2B redirect (#15)

Staking migrated to Asset Hub (AHM), but the landing page still read
nominators from the relay (api.query.staking.counterForNominators),
which is now empty there — so the count showed '—'. Collators were read
from collatorSelection.candidates (empty; collators are invulnerables)
and only on Asset Hub, missing the People chain set.

- Nominators: query Asset Hub staking.counterForNominators (verified 30).
- Collators: count collatorSelection.invulnerables on both Asset Hub and
  People chain (2 + 2), tracked per-chain and summed.
- NetworkStats.tsx already used the correct sources; this aligns the
  landing page with it.

B2B button (/bereketli SSO interstitial): if there is no Supabase session
or the token exchange fails, redirect to https://bereketli.pezkiwi.app
instead of stranding the user on app.pezkuwichain.io/bereketli. (The
backend CORS allowlist was also missing app.pezkuwichain.io; fixed
server-side so the SSO exchange itself now succeeds.)
This commit is contained in:
SatoshiQaziMuhammed authored and GitHub committed 2026-06-11 16:41:14 -07:00
1 parent 2cbfd21539
commit d6ace14e70
2 files changed
+29 -28

No files matched your search

+8 -20
View File
@@ -1,4 +1,4 @@
import { useEffect, useState } from 'react';
import { useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { supabase } from '@/lib/supabase';
import { Loader2 } from 'lucide-react';
@@ -12,7 +12,6 @@ const BEREKETLI_API = `${BEREKETLI_URL}/v1`;
*/
export default function Bereketli() {
const { t } = useTranslation();
const [error, setError] = useState('');
useEffect(() => {
(async () => {
@@ -20,8 +19,10 @@ export default function Bereketli() {
const {
data: { session },
} = await supabase.auth.getSession();
// Not signed in: skip SSO and send the user to the Bereketli site,
// which handles its own login. Never dead-end on this interstitial.
if (!session?.access_token) {
setError(t('bereketli.noSession', 'Lütfen önce giriş yapın'));
window.location.href = BEREKETLI_URL;
return;
}
@@ -46,27 +47,14 @@ export default function Bereketli() {
});
window.location.href = `${BEREKETLI_URL}/app?auth=${btoa(params.toString())}`;
} catch (err) {
setError(err instanceof Error ? err.message : 'Bağlantı hatası');
// SSO failed (expired token, network, etc.) — fall back to the public
// Bereketli site instead of stranding the user on app.pezkuwichain.io.
if (import.meta.env.DEV) console.warn('Bereketli SSO failed, falling back:', err);
window.location.href = BEREKETLI_URL;
}
})();
}, [t]);
if (error) {
return (
<div className="min-h-screen bg-gray-950 flex items-center justify-center px-6">
<div className="text-center space-y-4">
<p className="text-red-400 text-sm">{error}</p>
<a
href="/"
className="inline-block px-4 py-2 bg-green-600 text-white rounded-lg text-sm"
>
{t('common.backToHome', 'Ana Sayfaya Dön')}
</a>
</div>
</div>
);
}
return (
<div className="min-h-screen bg-gray-950 flex items-center justify-center">
<div className="text-center space-y-3">