# Frontend Integration Guide (Nuxt.js / Next.js) ## 🎯 Architecture ``` Frontend (Nuxt/Next.js) Backend (Django) Port: 3000 Port: 8000 ├── Pages/Routes ├── API Endpoints ├── UI/UX ├── Authentication ├── API Calls ├── Database └── Token Storage └── Business Logic ``` --- ## 📧 Email Links Flow ### How It Works: 1. **User registers** → Backend sends email 2. **Email contains** → Frontend URL (http://localhost:3000/activate/...) 3. **User clicks link** → Opens Frontend page 4. **Frontend JavaScript** → Calls Backend API 5. **Backend** → Activates account, returns response 6. **Frontend** → Shows success message ### Email Link Format: ``` Activation: http://localhost:3000/activate/{uid}/{token}/ Password Reset: http://localhost:3000/password-reset/{uid}/{token}/ ``` --- ## 🚀 Nuxt.js Implementation ### 1. Environment Variables (`.env`) ```bash # Nuxt.js .env NUXT_PUBLIC_API_BASE=http://localhost:8000/api/v1 ``` ### 2. Nuxt Config (`nuxt.config.ts`) ```typescript export default defineNuxtConfig({ runtimeConfig: { public: { apiBase: process.env.NUXT_PUBLIC_API_BASE || 'http://localhost:8000/api/v1' } }, // CORS configuration for development nitro: { devProxy: { '/api': { target: 'http://localhost:8000', changeOrigin: true } } } }) ``` ### 3. API Composable (`composables/useApi.ts`) ```typescript export const useApi = () => { const config = useRuntimeConfig() const apiBase = config.public.apiBase return { apiBase, async fetch(endpoint: string, options: any = {}) { return await $fetch(`${apiBase}${endpoint}`, options) } } } ``` ### 4. Auth Composable (`composables/useAuth.ts`) ```typescript export const useAuth = () => { const { apiBase } = useApi() const router = useRouter() // Register const register = async (userData: { email: string password: string re_password: string first_name: string last_name: string }) => { return await $fetch(`${apiBase}/auth/users/`, { method: 'POST', body: userData }) } // Activate Account const activate = async (uid: string, token: string) => { return await $fetch(`${apiBase}/auth/users/activation/`, { method: 'POST', body: { uid, token } }) } // Login const login = async (email: string, password: string) => { const data = await $fetch(`${apiBase}/auth/jwt/create/`, { method: 'POST', body: { email, password } }) // Save tokens localStorage.setItem('access_token', data.access) localStorage.setItem('refresh_token', data.refresh) return data } // Social Login const socialLogin = async (provider: string, accessToken: string) => { const data = await $fetch(`${apiBase}/auth/social/${provider}/`, { method: 'POST', body: { access_token: accessToken } }) // Save JWT tokens localStorage.setItem('access_token', data.access) localStorage.setItem('refresh_token', data.refresh) return data } // Get Current User const getUser = async () => { const token = localStorage.getItem('access_token') if (!token) return null return await $fetch(`${apiBase}/auth/users/me/`, { headers: { Authorization: `Bearer ${token}` } }) } // Logout const logout = () => { localStorage.removeItem('access_token') localStorage.removeItem('refresh_token') router.push('/login') } return { register, activate, login, socialLogin, getUser, logout } } ``` ### 5. Activation Page (`pages/activate/[uid]/[token].vue`) ```vue ``` ### 6. Register Page (`pages/register.vue`) ```vue ``` ### 7. Login Page (`pages/login.vue`) ```vue ``` --- ## 🔐 Protected Pages (Middleware) ### Auth Middleware (`middleware/auth.ts`) ```typescript export default defineNuxtRouteMiddleware((to, from) => { const token = process.client ? localStorage.getItem('access_token') : null if (!token) { return navigateTo('/login') } }) ``` ### Dashboard Page (`pages/dashboard.vue`) ```vue ``` --- ## 🌐 Next.js Implementation Very similar to Nuxt.js, just adjust the syntax: ```typescript // app/activate/[uid]/[token]/page.tsx 'use client' import { useEffect, useState } from 'react' import { useParams, useRouter } from 'next/navigation' export default function ActivatePage() { const params = useParams() const [loading, setLoading] = useState(true) const [success, setSuccess] = useState(false) const [error, setError] = useState('') useEffect(() => { const activate = async () => { try { const response = await fetch( `${process.env.NEXT_PUBLIC_API_BASE}/auth/users/activation/`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ uid: params.uid, token: params.token }) } ) if (response.ok) { setSuccess(true) } else { const data = await response.json() setError(data.detail || 'Activation failed') } } catch (e) { setError('Network error') } finally { setLoading(false) } } activate() }, [params]) if (loading) return
Activating...
if (success) return
✅ Account Activated!
return
❌ {error}
} ``` --- ## 📝 Summary ### Email Links: - Activation: `http://localhost:3000/activate/{uid}/{token}/` - Password Reset: `http://localhost:3000/password-reset/{uid}/{token}/` ### API Endpoints (Backend): - Register: `POST http://localhost:8000/api/v1/auth/users/` - Activate: `POST http://localhost:8000/api/v1/auth/users/activation/` - Login: `POST http://localhost:8000/api/v1/auth/jwt/create/` - Social Login: `POST http://localhost:8000/api/v1/auth/social/{provider}/` - Current User: `GET http://localhost:8000/api/v1/auth/users/me/` ### Production URLs: - Frontend: `https://yourdomain.com` - Backend: `https://api.yourdomain.com` Update `DOMAIN` in Django settings for production! --- **Happy Coding! 🚀**