117 lines
3.3 KiB
TypeScript
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;
|
|
}
|
|
|