feat: introduce new app routes with modular structure and enhanced features
Added modular app routes including `login`, `dashboard`, `categories`, `trends`, and `upload`. Introduced reusable components such as `ContentList`, `ContentSkeleton`, and `AppSidebar` for improved UI consistency. Enhanced authentication with `AuthProvider` and implemented lazy loading, dynamic layouts, and infinite scrolling for better performance.
This commit is contained in:
99
frontend/src/providers/auth-provider.tsx
Normal file
99
frontend/src/providers/auth-provider.tsx
Normal file
@@ -0,0 +1,99 @@
|
||||
"use client";
|
||||
|
||||
import * as React from "react";
|
||||
import { UserService } from "@/services/user.service";
|
||||
import { AuthService } from "@/services/auth.service";
|
||||
import type { User } from "@/types/user";
|
||||
import { useRouter } from "next/navigation";
|
||||
import { toast } from "sonner";
|
||||
|
||||
interface AuthContextType {
|
||||
user: User | null;
|
||||
isLoading: boolean;
|
||||
isAuthenticated: boolean;
|
||||
login: (email: string, password: string) => Promise<void>;
|
||||
register: (payload: any) => Promise<void>;
|
||||
logout: () => Promise<void>;
|
||||
refreshUser: () => Promise<void>;
|
||||
}
|
||||
|
||||
const AuthContext = React.createContext<AuthContextType | null>(null);
|
||||
|
||||
export function AuthProvider({ children }: { children: React.ReactNode }) {
|
||||
const [user, setUser] = React.useState<User | null>(null);
|
||||
const [isLoading, setIsLoading] = React.useState(true);
|
||||
const router = useRouter();
|
||||
|
||||
const refreshUser = React.useCallback(async () => {
|
||||
try {
|
||||
const userData = await UserService.getMe();
|
||||
setUser(userData);
|
||||
} catch (error) {
|
||||
setUser(null);
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
React.useEffect(() => {
|
||||
refreshUser();
|
||||
}, [refreshUser]);
|
||||
|
||||
const login = async (email: string, password: string) => {
|
||||
try {
|
||||
await AuthService.login(email, password);
|
||||
await refreshUser();
|
||||
toast.success("Connexion réussie !");
|
||||
router.push("/");
|
||||
} catch (error: any) {
|
||||
toast.error(error.response?.data?.message || "Erreur de connexion");
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
const register = async (payload: any) => {
|
||||
try {
|
||||
await AuthService.register(payload);
|
||||
toast.success("Inscription réussie ! Vous pouvez maintenant vous connecter.");
|
||||
router.push("/login");
|
||||
} catch (error: any) {
|
||||
toast.error(error.response?.data?.message || "Erreur d'inscription");
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
const logout = async () => {
|
||||
try {
|
||||
await AuthService.logout();
|
||||
setUser(null);
|
||||
toast.success("Déconnexion réussie");
|
||||
router.push("/");
|
||||
} catch (error) {
|
||||
toast.error("Erreur lors de la déconnexion");
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<AuthContext.Provider
|
||||
value={{
|
||||
user,
|
||||
isLoading,
|
||||
isAuthenticated: !!user,
|
||||
login,
|
||||
register,
|
||||
logout,
|
||||
refreshUser,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</AuthContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
export const useAuth = () => {
|
||||
const context = React.useContext(AuthContext);
|
||||
if (!context) {
|
||||
throw new Error("useAuth must be used within an AuthProvider");
|
||||
}
|
||||
return context;
|
||||
};
|
||||
Reference in New Issue
Block a user