diff --git a/web/src/pages/Bereketli.tsx b/web/src/pages/Bereketli.tsx index d8a74895..53f479d1 100644 --- a/web/src/pages/Bereketli.tsx +++ b/web/src/pages/Bereketli.tsx @@ -1,163 +1,79 @@ -import { useState, useEffect, useRef, useCallback } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { useIsMobile } from '@/hooks/use-mobile'; -import MobileShell from '@/components/MobileShell'; import { supabase } from '@/lib/supabase'; -import { Loader2, RefreshCw } from 'lucide-react'; +import { Loader2 } from 'lucide-react'; const BEREKETLI_URL = 'https://bereketli.pezkiwi.app'; const BEREKETLI_API = `${BEREKETLI_URL}/v1`; -const CACHE_KEY = 'pwap_bereketli_tokens'; - -interface CachedTokens { - access_token: string; - refresh_token: string; - timestamp: number; -} +/** + * Exchanges the PWAP Supabase token for a Bereketli JWT, + * then redirects the user to bereketli.pezkiwi.app/app with the token. + */ export default function Bereketli() { const { t } = useTranslation(); - const navigate = useNavigate(); - const isMobile = useIsMobile(); - const iframeRef = useRef(null); - const [loading, setLoading] = useState(true); - const [error, setError] = useState(null); - const [tokens, setTokens] = useState(null); + const [error, setError] = useState(''); - const exchangeToken = useCallback(async () => { - setLoading(true); - setError(null); - - try { - // Check cache first (valid for 10 minutes) - const cached = localStorage.getItem(CACHE_KEY); - if (cached) { - const parsed: CachedTokens = JSON.parse(cached); - if (Date.now() - parsed.timestamp < 10 * 60 * 1000) { - setTokens(parsed); - setLoading(false); + useEffect(() => { + (async () => { + try { + const { + data: { session }, + } = await supabase.auth.getSession(); + if (!session?.access_token) { + setError(t('bereketli.noSession', 'Lütfen önce giriş yapın')); return; } + + // Exchange Supabase token for Bereketli JWT + const res = await fetch(`${BEREKETLI_API}/auth/exchange`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ supabase_token: session.access_token }), + }); + + if (!res.ok) { + const err = await res.json().catch(() => ({})); + throw new Error(err.message || `Exchange failed (${res.status})`); + } + + const data = await res.json(); + + // Redirect to Bereketli app with tokens as URL hash (not visible to server) + const params = new URLSearchParams({ + t: data.access_token, + r: data.refresh_token, + }); + window.location.href = `${BEREKETLI_URL}/app?auth=${btoa(params.toString())}`; + } catch (err) { + setError(err instanceof Error ? err.message : 'Bağlantı hatası'); } - - // Get Supabase session - const { data: { session } } = await supabase.auth.getSession(); - if (!session?.access_token) { - setError(t('bereketli.noSession', 'Please login first')); - setLoading(false); - return; - } - - // Exchange Supabase token for Bereketli token - const res = await fetch(`${BEREKETLI_API}/auth/exchange`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ supabase_token: session.access_token }), - }); - - if (!res.ok) { - const err = await res.json().catch(() => ({})); - throw new Error(err.message || `Exchange failed (${res.status})`); - } - - const data = await res.json(); - const newTokens: CachedTokens = { - access_token: data.access_token, - refresh_token: data.refresh_token, - timestamp: Date.now(), - }; - - localStorage.setItem(CACHE_KEY, JSON.stringify(newTokens)); - setTokens(newTokens); - } catch (err) { - setError(err instanceof Error ? err.message : 'Token exchange failed'); - } finally { - setLoading(false); - } + })(); }, [t]); - useEffect(() => { - exchangeToken(); - }, [exchangeToken]); - - // Send tokens to iframe after it loads - const handleIframeLoad = useCallback(() => { - if (!tokens || !iframeRef.current?.contentWindow) return; - iframeRef.current.contentWindow.postMessage({ - type: 'bereketli:auth-inject', - access_token: tokens.access_token, - refresh_token: tokens.refresh_token, - }, BEREKETLI_URL); - }, [tokens]); - - // Listen for messages from iframe - useEffect(() => { - const handleMessage = (event: MessageEvent) => { - if (event.origin !== BEREKETLI_URL) return; - if (event.data?.type === 'bereketli:auth-required') { - // Token expired, re-exchange - localStorage.removeItem(CACHE_KEY); - exchangeToken(); - } - }; - window.addEventListener('message', handleMessage); - return () => window.removeEventListener('message', handleMessage); - }, [exchangeToken]); - - const content = ( -
- {loading ? ( -
-
- -

{t('bereketli.connecting', 'Connecting to Bereketli...')}

-
-
- ) : error ? ( -
-
-

{error}

- -
-
- ) : ( -