Add Docker support and containerization

- Add Dockerfile for Next.js application
- Configure standalone output for Docker
- Add .dockerignore file
- Add docker-compose.yml for easy deployment
- Update next.config.ts for Docker compatibility
This commit is contained in:
nmemmert committed 2025-10-22 12:42:41 -04:00
1 parent 91d417159d
commit fba1097380
20 files changed
+6085 -253

No files matched your search

+59
View File
@@ -0,0 +1,59 @@
'use client';
import { createContext, useContext, useEffect, useState, ReactNode } from 'react';
import { User, signInWithEmailAndPassword, signOut, onAuthStateChanged, createUserWithEmailAndPassword } from 'firebase/auth';
import { auth } from '@/lib/firebase';
interface AuthContextType {
user: User | null;
login: (email: string, password: string) => Promise<void>;
signup: (email: string, password: string) => Promise<void>;
logout: () => Promise<void>;
loading: boolean;
isAdmin: boolean;
}
const AuthContext = createContext<AuthContextType | undefined>(undefined);
export function AuthProvider({ children }: { children: ReactNode }) {
const [user, setUser] = useState<User | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (user) => {
setUser(user);
setLoading(false);
});
return unsubscribe;
}, []);
// Configure admin email addresses here - only these users will have admin access
const adminEmails = ['nate@necloud.us', 'nmemmert@outlook.com'];
const isAdmin = user ? adminEmails.includes(user.email || '') : false;
const login = async (email: string, password: string) => {
await signInWithEmailAndPassword(auth, email, password);
};
const signup = async (email: string, password: string) => {
await createUserWithEmailAndPassword(auth, email, password);
};
const logout = async () => {
await signOut(auth);
};
return (
<AuthContext.Provider value={{ user, login, signup, logout, loading, isAdmin }}>
{children}
</AuthContext.Provider>
);
}
export function useAuth() {
const context = useContext(AuthContext);
if (context === undefined) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
}