diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8351474..64c9354 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 @@ -27,8 +27,42 @@ jobs: node-version: 20 cache: npm + - name: Create CI environment file + run: | + cat <<'EOF' > .env + # Frontend (Vite) - Using placeholder values for CI build + VITE_FIREBASE_API_KEY= + VITE_FIREBASE_AUTH_DOMAIN= + VITE_FIREBASE_PROJECT_ID= + VITE_FIREBASE_STORAGE_BUCKET= + VITE_FIREBASE_MESSAGING_SENDER_ID= + VITE_FIREBASE_APP_ID= + VITE_FIREBASE_MEASUREMENT_ID= + VITE_FIREBASE_RECAPTCHA_SITE_KEY= + VITE_GOOGLE_OAUTH_CLIENT_ID= + VITE_GEMINI_API_KEY= + VITE_PUBLIC_ONCHAINKIT_API_KEY= + VITE_BASE_RPC_URL=https://sepolia.base.org + VITE_FRACTAL_RECIPE_CONTRACT_ADDRESS= + VITE_FRACTAL_RECIPE_DEPLOY_BLOCK=0 + + # Backend (server) - Using minimal values for build + PORT=4000 + JWT_SECRET=ci-secret + JWT_TTL_SECONDS=3600 + CORS_ORIGIN=http://localhost:5173 + FIREBASE_PROJECT_ID=ci + FIREBASE_CLIENT_EMAIL= + FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----\n" + GOOGLE_OAUTH_CLIENT_ID= + PASSWORD_MIN_LENGTH=10 + PWD_RESET_OTP_TTL_MS=600000 + PWD_RESET_MAX_ATTEMPTS=5 + GITHUB_WEBHOOK_SECRET=ci-webhook-secret + EOF + - name: Install dependencies - run: npm install + run: npm ci - name: Build project run: npm run build diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index 1dc0e1e..162e695 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -57,7 +57,7 @@ jobs: PASSWORD_MIN_LENGTH=10 PWD_RESET_OTP_TTL_MS=600000 PWD_RESET_MAX_ATTEMPTS=5 - WEBHOOK_SECRET=ci-webhook-secret + GITHUB_WEBHOOK_SECRET=ci-webhook-secret EOF - name: Install dependencies diff --git a/components/auth/EmailLinkAuthExample.tsx b/components/auth/EmailLinkAuthExample.tsx index 1a40691..1a9faa4 100644 --- a/components/auth/EmailLinkAuthExample.tsx +++ b/components/auth/EmailLinkAuthExample.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useCallback } from 'react'; import type { ActionCodeSettings } from 'firebase/auth'; import { sendMagicLink, @@ -19,14 +19,37 @@ export function EmailLinkAuthExample() { const [error, setError] = useState(''); const [isCompletingSignIn, setIsCompletingSignIn] = useState(false); + const handleCompleteSignIn = useCallback(async (providedEmail?: string) => { + setError(''); + setStatus('Completing sign-in...'); + + try { + const result = await completeEmailSignIn(providedEmail || email); + + setStatus(`Successfully signed in as ${result.user.email}`); + // Handle successful sign-in (e.g., redirect to dashboard) + + } catch (err) { + const errorMessage = err instanceof Error ? err.message : 'Failed to complete sign-in'; + + // If email is missing, prompt user to enter it + if (errorMessage.includes('Email address is required')) { + setError('Please enter your email to complete sign-in'); + setIsCompletingSignIn(true); + } else { + setError(errorMessage); + } + setStatus(''); + } + }, [email]); + useEffect(() => { // Check if current URL is a sign-in link if (isMagicLink()) { setIsCompletingSignIn(true); void handleCompleteSignIn(); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + const handleSendLink = async () => { setError(''); @@ -55,29 +78,6 @@ export function EmailLinkAuthExample() { } }; - const handleCompleteSignIn = async (providedEmail?: string) => { - setError(''); - setStatus('Completing sign-in...'); - - try { - const result = await finishMagicLink(providedEmail || email); - - setStatus(`Successfully signed in as ${result.user.email}`); - // Handle successful sign-in (e.g., redirect to dashboard) - - } catch (err) { - const errorMessage = err instanceof Error ? err.message : 'Failed to complete sign-in'; - - // If email is missing, prompt user to enter it - if (errorMessage.includes('Email address is required')) { - setError('Please enter your email to complete sign-in'); - setIsCompletingSignIn(true); - } else { - setError(errorMessage); - } - setStatus(''); - } - }; if (isCompletingSignIn) { return (