UNPKG

9s-fe-core

Version:

Core functionalities for authentication, configuration, and repository management.

148 lines (147 loc) 6.63 kB
"use strict"; 'use client'; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.useAuth = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const FirebaseProvider_1 = require("../providers/FirebaseProvider"); const react_1 = require("react"); const navigation_1 = require("next/navigation"); const auth_repository_1 = require("./auth_repository"); const base_storage_1 = __importDefault(require("../utils/base_storage")); const AuthContext = (0, react_1.createContext)(undefined); const useAuth = () => { const context = (0, react_1.useContext)(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }; exports.useAuth = useAuth; const AuthProvider = ({ children, loginPath, defaultProtectedPath, onLoginSuccess, onLogout, }) => { const { requestPermissionAndGetToken } = (0, FirebaseProvider_1.useFirebase)(); // Đặt hook ở đây const [isAuthenticated, setIsAuthenticated] = (0, react_1.useState)(false); const [user, setUser] = (0, react_1.useState)(null); const [isLoading, setIsLoading] = (0, react_1.useState)(true); const router = (0, navigation_1.useRouter)(); const pathname = (0, navigation_1.usePathname)(); const getLocalePath = (path) => { const localeMatch = pathname.match(/^\/([a-z]{2})(\/|$)/); const currentLocale = localeMatch ? localeMatch[1] : ''; return currentLocale ? `/${currentLocale}${path}` : path; }; const refreshUserProfile = (0, react_1.useCallback)(() => __awaiter(void 0, void 0, void 0, function* () { const token = base_storage_1.default.getToken(); if (!token) return null; try { const userProfile = yield auth_repository_1.authRepository.getUserProfile(); if (userProfile.status === 200 && userProfile.dataResponse) { const profileData = userProfile.dataResponse; const updatedUser = Object.assign({}, profileData); setUser(updatedUser); setIsAuthenticated(true); return profileData; } else { throw new Error('Failed to fetch user profile'); } } catch (error) { console.error('Error refreshing user profile:', error); return null; } }), []); // Thay vì dependency vào refreshUserProfile, ta dùng một biến kiểm tra const checkAuth = (0, react_1.useCallback)(() => __awaiter(void 0, void 0, void 0, function* () { console.log('checkAuth:', JSON.stringify('checkAuth', null, 2)); const token = base_storage_1.default.getToken(); if (token) { try { const profileData = yield refreshUserProfile(); if (profileData) { const localizedLoginPath = getLocalePath(loginPath); if (pathname === localizedLoginPath) { router.push(getLocalePath(defaultProtectedPath)); } } else { base_storage_1.default.removeToken(); setIsAuthenticated(false); router.push(getLocalePath(loginPath)); } } catch (error) { console.error('Error verifying authentication:', error); base_storage_1.default.removeToken(); setIsAuthenticated(false); router.push(getLocalePath(loginPath)); } } else { const isPublicPath = pathname.includes(loginPath) || pathname.includes('/forgot-password') || pathname.includes('/reset-confirm') || pathname.includes('/verify-forgot-password'); if (!isPublicPath) { router.push(getLocalePath(loginPath)); } } setIsLoading(false); }), [pathname, router, loginPath, defaultProtectedPath, refreshUserProfile]); (0, react_1.useEffect)(() => { // Gọi hàm checkAuth 1 lần khi component mount hoặc các dependency thay đổi như pathname checkAuth(); }, []); const login = (loginResponse) => __awaiter(void 0, void 0, void 0, function* () { base_storage_1.default.setToken(loginResponse.access_token, loginResponse.refresh_token); const initialUser = Object.assign({}, loginResponse); setUser(initialUser); setIsAuthenticated(true); const profileData = yield refreshUserProfile(); if (profileData && onLoginSuccess) { const fullUser = Object.assign(Object.assign({}, initialUser), profileData); onLoginSuccess(fullUser); } // Sử dụng requestPermissionAndGetToken từ useFirebase try { const deviceToken = yield requestPermissionAndGetToken(); if (deviceToken) { console.log('Notification permission granted. Token:', deviceToken); } } catch (error) { console.error('Failed to get notification permission:', error); } router.push(getLocalePath(defaultProtectedPath)); }); const logout = () => { base_storage_1.default.removeToken(); setUser(null); setIsAuthenticated(false); router.push(getLocalePath(loginPath)); if (onLogout) { onLogout(); } }; return ((0, jsx_runtime_1.jsx)(AuthContext.Provider, { value: { isAuthenticated, user, login, logout, isLoading, refreshUserProfile, }, children: isLoading ? null : children })); }; exports.default = AuthProvider;