To implement a custom hook for handling user authentication with Firebase in a Next.js application, you can follow these general steps. This assumes that you have already set up Firebase in your Next.js project. If not, you'll need to set up Firebase by installing the Firebase SDK and configuring it with your Firebase project credentials.
bashnpm install firebase react-firebase-hooks
firebase.js
) to initialize Firebase in your Next.js app:javascript// firebase.js
import firebase from 'firebase/app';
import 'firebase/auth';
const firebaseConfig = {
apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,
authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,
projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,
storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET,
messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID,
appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID,
};
if (!firebase.apps.length) {
firebase.initializeApp(firebaseConfig);
}
export const auth = firebase.auth();
export const googleProvider = new firebase.auth.GoogleAuthProvider();
Make sure to replace NEXT_PUBLIC_FIREBASE_*
with your actual Firebase configuration values.
useAuth.js
):javascript// useAuth.js
import { useEffect, useState } from 'react';
import { auth } from './firebase';
export const useAuth = () => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged((user) => {
setUser(user);
setLoading(false);
});
return () => unsubscribe();
}, []);
const signInWithGoogle = async () => {
try {
await auth.signInWithPopup(googleProvider);
} catch (error) {
console.error(error.message);
}
};
const signOut = async () => {
try {
await auth.signOut();
} catch (error) {
console.error(error.message);
}
};
return { user, loading, signInWithGoogle, signOut };
};
This hook uses the onAuthStateChanged
method to listen for changes in the user's authentication state.
javascript// Example usage in a component
import { useAuth } from '../hooks/useAuth';
function MyComponent() {
const { user, loading, signInWithGoogle, signOut } = useAuth();
if (loading) {
return <p>Loading...</p>;
}
return (
<div>
{user ? (
<div>
<p>Welcome, {user.displayName}!</p>
<button onClick={signOut}>Sign out</button>
</div>
) : (
<button onClick={signInWithGoogle}>Sign in with Google</button>
)}
</div>
);
}
export default MyComponent;
This example component demonstrates how to use the useAuth
hook to conditionally render content based on the user's authentication status. The signInWithGoogle
and signOut
functions handle authentication actions.
Remember to handle the Firebase authentication state changes in your pages or layout components. You can then use the useAuth
hook to access the user's authentication status and perform actions accordingly.