Files

117 lines
3.3 KiB
TypeScript

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;
}