VIBN Frontend for Coolify deployment
This commit is contained in:
116
lib/firebase/auth.ts
Normal file
116
lib/firebase/auth.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
import {
|
||||
signInWithEmailAndPassword,
|
||||
createUserWithEmailAndPassword,
|
||||
signInWithPopup,
|
||||
GoogleAuthProvider,
|
||||
GithubAuthProvider,
|
||||
signOut as firebaseSignOut,
|
||||
onAuthStateChanged,
|
||||
User
|
||||
} from 'firebase/auth';
|
||||
import { auth } from './config';
|
||||
import { createUser, getUser } from './collections';
|
||||
|
||||
// Providers
|
||||
const googleProvider = new GoogleAuthProvider();
|
||||
const githubProvider = new GithubAuthProvider();
|
||||
|
||||
// Sign up with email/password
|
||||
export async function signUpWithEmail(email: string, password: string, displayName: string) {
|
||||
try {
|
||||
const userCredential = await createUserWithEmailAndPassword(auth, email, password);
|
||||
const user = userCredential.user;
|
||||
|
||||
// Create user document in Firestore
|
||||
// Generate workspace from email or name
|
||||
const workspace = displayName.toLowerCase().replace(/\s+/g, '-') + '-account';
|
||||
|
||||
await createUser(user.uid, {
|
||||
email: user.email!,
|
||||
displayName: displayName,
|
||||
workspace: workspace,
|
||||
});
|
||||
|
||||
return { user, workspace };
|
||||
} catch (error: any) {
|
||||
throw new Error(error.message || 'Failed to create account');
|
||||
}
|
||||
}
|
||||
|
||||
// Sign in with email/password
|
||||
export async function signInWithEmail(email: string, password: string) {
|
||||
try {
|
||||
const userCredential = await signInWithEmailAndPassword(auth, email, password);
|
||||
return userCredential.user;
|
||||
} catch (error: any) {
|
||||
throw new Error(error.message || 'Failed to sign in');
|
||||
}
|
||||
}
|
||||
|
||||
// Sign in with Google
|
||||
export async function signInWithGoogle() {
|
||||
try {
|
||||
const result = await signInWithPopup(auth, googleProvider);
|
||||
const user = result.user;
|
||||
|
||||
// Check if user exists, if not create
|
||||
const existingUser = await getUser(user.uid);
|
||||
if (!existingUser) {
|
||||
const workspace = (user.displayName || user.email!.split('@')[0]).toLowerCase().replace(/\s+/g, '-') + '-account';
|
||||
await createUser(user.uid, {
|
||||
email: user.email!,
|
||||
displayName: user.displayName || undefined,
|
||||
photoURL: user.photoURL || undefined,
|
||||
workspace: workspace,
|
||||
});
|
||||
}
|
||||
|
||||
return user;
|
||||
} catch (error: any) {
|
||||
throw new Error(error.message || 'Failed to sign in with Google');
|
||||
}
|
||||
}
|
||||
|
||||
// Sign in with GitHub
|
||||
export async function signInWithGitHub() {
|
||||
try {
|
||||
const result = await signInWithPopup(auth, githubProvider);
|
||||
const user = result.user;
|
||||
|
||||
// Check if user exists, if not create
|
||||
const existingUser = await getUser(user.uid);
|
||||
if (!existingUser) {
|
||||
const workspace = (user.displayName || user.email!.split('@')[0]).toLowerCase().replace(/\s+/g, '-') + '-account';
|
||||
await createUser(user.uid, {
|
||||
email: user.email!,
|
||||
displayName: user.displayName || undefined,
|
||||
photoURL: user.photoURL || undefined,
|
||||
workspace: workspace,
|
||||
});
|
||||
}
|
||||
|
||||
return user;
|
||||
} catch (error: any) {
|
||||
throw new Error(error.message || 'Failed to sign in with GitHub');
|
||||
}
|
||||
}
|
||||
|
||||
// Sign out
|
||||
export async function signOut() {
|
||||
try {
|
||||
await firebaseSignOut(auth);
|
||||
} catch (error: any) {
|
||||
throw new Error(error.message || 'Failed to sign out');
|
||||
}
|
||||
}
|
||||
|
||||
// Listen to auth state changes
|
||||
export function onAuthChange(callback: (user: User | null) => void) {
|
||||
return onAuthStateChanged(auth, callback);
|
||||
}
|
||||
|
||||
// Get current user
|
||||
export function getCurrentUser(): User | null {
|
||||
return auth.currentUser;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user