diff --git a/.github/workflows/deploy_lambda.yml b/.github/workflows/deploy_lambda.yml index 4505584..344b854 100644 --- a/.github/workflows/deploy_lambda.yml +++ b/.github/workflows/deploy_lambda.yml @@ -2,8 +2,6 @@ name: Deploy to Lambda on: push: - branches: - - main jobs: deploy: diff --git a/src/lambda_function.py b/src/lambda_function.py index fd0bd5a..66fb49e 100644 --- a/src/lambda_function.py +++ b/src/lambda_function.py @@ -169,6 +169,7 @@ def lambda_handler(event, context): code=event["code"], ) logging.info(response) + return {"success": True} elif event.get("end_to_end_test"): user = get_user(os.environ["JAMIES_ATHLETE_ID"]) diff --git a/web/src/app/components/SignUp.tsx b/web/src/app/components/SignUp.tsx index 9aa0c43..4e15205 100644 --- a/web/src/app/components/SignUp.tsx +++ b/web/src/app/components/SignUp.tsx @@ -10,14 +10,16 @@ export default function SignUp({ onClose }: SignUpProps): JSX.Element { const [email, setEmail] = useState(''); const [preferences, setPreferences] = useState(''); - const handleSignUp = (event: React.FormEvent) => { + const handleSignUp = (event: React.FormEvent): void => { event.preventDefault(); localStorage.setItem('email', email); localStorage.setItem('preferences', preferences); - const stravaAuthUrl = `https://www.strava.com/oauth/authorize?client_id=95101&redirect_uri=http://localhost:3000/verify&response_type=code&approval_prompt=auto&scope=read_all,profile:read_all,activity:read_all`; + const redirectUri = 'http://localhost:3000/'; + const stravaAuthUrl = `https://www.strava.com/oauth/authorize?client_id=95101&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code&approval_prompt=auto&scope=read_all,profile:read_all,activity:read_all`; window.location.href = stravaAuthUrl; }; + return (
diff --git a/web/src/app/page.tsx b/web/src/app/page.tsx index 42da615..528c0b6 100644 --- a/web/src/app/page.tsx +++ b/web/src/app/page.tsx @@ -1,10 +1,23 @@ 'use client'; import Image from 'next/image'; +import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; import Footer from './components/Footer'; import Navbar from './components/Navbar'; export default function Home(): JSX.Element { + const router = useRouter(); + + useEffect(() => { + const params = new URLSearchParams(window.location.search); + const code = params.get('code'); + + if (code) { + router.push(`/verify?code=${code}`); + } + }, [router]); + return ( <> @@ -39,4 +52,4 @@ export default function Home(): JSX.Element { ); -} \ No newline at end of file +} diff --git a/web/src/app/verify/page.tsx b/web/src/app/verify/page.tsx index 3397256..f9e9ee5 100644 --- a/web/src/app/verify/page.tsx +++ b/web/src/app/verify/page.tsx @@ -1,44 +1,67 @@ 'use client'; import { useRouter, useSearchParams } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; -export default function Verify() { +export default function Verify(): JSX.Element { const [status, setStatus] = useState<'verifying' | 'success' | 'error'>('verifying'); const router = useRouter(); + const { push } = router; const searchParams = useSearchParams(); + const code = searchParams.get('code'); + const isInitialMount = useRef(true); useEffect(() => { - const code = searchParams.get('code'); - const email = localStorage.getItem('email'); - const preferences = localStorage.getItem('preferences'); + if (isInitialMount.current) { + isInitialMount.current = false; // Prevent re-triggering after the first render - if (code && email && preferences) { - fetch('https://your-api-endpoint.com/signup', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ code, email, preferences }), - }) - .then(response => response.json()) - .then(data => { - if (data.success) { - setStatus('success'); - localStorage.removeItem('email'); - localStorage.removeItem('preferences'); - setTimeout(() => router.push('/'), 2000); - } else { - setStatus('error'); - } + const email = localStorage.getItem('email'); + const preferences = localStorage.getItem('preferences'); + + console.log('useEffect triggered'); + console.log('Retrieved email:', email); + console.log('Retrieved preferences:', preferences); + console.log('Retrieved code:', code); + + if (code && email && preferences) { + console.log('All required data is present. Proceeding with fetch request.'); + fetch('https://lwg77yq7dd.execute-api.us-east-1.amazonaws.com/prod/signup', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ email, preferences, code }) }) - .catch(() => { - setStatus('error'); - }); - } else { - setStatus('error'); + .then(response => { + console.log('Fetch response received:', response); + return response.json(); + }) + .then(data => { + console.log('Parsed response data:', data); + if (data.success) { + console.log('Verification successful'); + setStatus('success'); + localStorage.removeItem('email'); + localStorage.removeItem('preferences'); + setTimeout(() => { + console.log('Redirecting to home page'); + push('/'); + }, 2000); + } else { + console.log('Verification failed'); + setStatus('error'); + } + }) + .catch(error => { + console.error('Fetch error:', error); + setStatus('error'); + }); + } else { + console.log('Missing required data. Setting status to error.'); + setStatus('error'); + } } - }, [searchParams, router]); + }, [code, push]); // depend on `code` to ensure updates on URL changes return (
@@ -49,4 +72,4 @@ export default function Verify() {
); -} \ No newline at end of file +}