// frontend/lib/auth.js // frontend/lib/auth.js 'use client'; import { createContext, useState, useContext, useEffect } from 'react'; import api from './api'; // 1. Import cookieDriver ที่คุณมีอยู่แล้ว ซึ่งเป็นวิธีที่ถูกต้อง import { cookieDriver } from '@/app/_auth/drivers/cookieDriver'; const AuthContext = createContext(null); const COOKIE_NAME = "access_token"; export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const initializeAuth = async () => { // 2. อ่าน token จาก cookie ด้วย cookieDriver.get() const token = cookieDriver.get(COOKIE_NAME); if (token) { try { api.defaults.headers.Authorization = `Bearer ${token}`; // สมมติว่ามี endpoint /auth/me สำหรับดึงข้อมูลผู้ใช้ const response = await api.get('/auth/me'); setUser(response.data.user || response.data); // รองรับทั้งสองรูปแบบ } catch (error) { console.error("Failed to initialize auth from cookie:", error); cookieDriver.remove(COOKIE_NAME); delete api.defaults.headers.Authorization; } } setLoading(false); }; initializeAuth(); }, []); const login = async (credentials) => { const response = await api.post('/auth/login', credentials); const { token, user } = response.data; // 3. ตั้งค่า token ใน cookie ด้วย cookieDriver.set() cookieDriver.set(COOKIE_NAME, token, { expires: 7, secure: true, sameSite: 'strict' }); api.defaults.headers.Authorization = `Bearer ${token}`; setUser(user); return user; }; const logout = () => { // 4. ลบ token ออกจาก cookie ด้วย cookieDriver.remove() cookieDriver.remove(COOKIE_NAME); delete api.defaults.headers.Authorization; setUser(null); window.location.href = '/login'; }; const value = { user, isAuthenticated: !!user, loading, login, logout }; return ( {!loading && children} ); } export const useAuth = () => { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; };