88 lines
2.7 KiB
JavaScript
88 lines
2.7 KiB
JavaScript
// js/firebase/auth.js
|
|
import { auth, provider } from './config.js';
|
|
import { signInWithPopup, signOut as firebaseSignOut, onAuthStateChanged } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-auth.js";
|
|
import { syncManager } from './sync.js';
|
|
|
|
export class AuthManager {
|
|
constructor() {
|
|
this.user = null;
|
|
this.unsubscribe = null;
|
|
this.init();
|
|
}
|
|
|
|
init() {
|
|
if (!auth) return;
|
|
|
|
this.unsubscribe = onAuthStateChanged(auth, (user) => {
|
|
this.user = user;
|
|
this.updateUI(user);
|
|
|
|
if (user) {
|
|
console.log("User logged in:", user.uid);
|
|
syncManager.initialize(user);
|
|
} else {
|
|
console.log("User logged out");
|
|
syncManager.disconnect();
|
|
}
|
|
});
|
|
}
|
|
|
|
async signInWithGoogle() {
|
|
if (!auth) {
|
|
alert("Firebase is not configured. Please check console.");
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const result = await signInWithPopup(auth, provider);
|
|
// The onAuthStateChanged listener will handle the rest
|
|
return result.user;
|
|
} catch (error) {
|
|
console.error("Login failed:", error);
|
|
alert(`Login failed: ${error.message}`);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async signOut() {
|
|
if (!auth) return;
|
|
|
|
try {
|
|
await firebaseSignOut(auth);
|
|
// The onAuthStateChanged listener will handle the rest
|
|
} catch (error) {
|
|
console.error("Logout failed:", error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
updateUI(user) {
|
|
const connectBtn = document.getElementById('firebase-connect-btn');
|
|
const clearDataBtn = document.getElementById('firebase-clear-cloud-btn');
|
|
const statusText = document.getElementById('firebase-status');
|
|
const container = document.getElementById('firebase-controls');
|
|
|
|
if (!connectBtn) return; // UI might not be rendered yet
|
|
|
|
if (user) {
|
|
connectBtn.textContent = 'Sign Out';
|
|
connectBtn.classList.add('danger');
|
|
connectBtn.onclick = () => this.signOut();
|
|
|
|
if (clearDataBtn) clearDataBtn.style.display = 'block';
|
|
|
|
if (statusText) statusText.textContent = `Signed in as ${user.email}`;
|
|
|
|
} else {
|
|
connectBtn.textContent = 'Connect with Google';
|
|
connectBtn.classList.remove('danger');
|
|
connectBtn.onclick = () => this.signInWithGoogle();
|
|
|
|
if (clearDataBtn) clearDataBtn.style.display = 'none';
|
|
|
|
if (statusText) statusText.textContent = 'Sync your library across devices';
|
|
}
|
|
}
|
|
}
|
|
|
|
export const authManager = new AuthManager();
|