9s-fe-core
Version:
Core functionalities for authentication, configuration, and repository management.
148 lines (147 loc) • 6.63 kB
JavaScript
;
'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;