mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
[dyad] wrote 4 file(s)
This commit is contained in:
1 parent
209c48ee6b
commit
0bcffed331
4 files changed
+96
-12
No files matched your search
@@ -28,7 +28,10 @@ const App = () => {
|
||||
// Vérifier le token au démarrage
|
||||
const checkAuth = async () => {
|
||||
try {
|
||||
// Vérifier si le token est valide
|
||||
if (AuthService.getToken()) {
|
||||
await AuthService.checkTokenValidity();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error checking token validity:", error);
|
||||
} finally {
|
||||
|
||||
+72
-7
@@ -12,6 +12,7 @@ import AuthService from "@/services/AuthService";
|
||||
import AdminService from "@/services/AdminService";
|
||||
import NotesService, { Note } from "@/services/NotesService";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { showError } from "@/utils/toast";
|
||||
|
||||
interface UserType {
|
||||
id: number;
|
||||
@@ -30,27 +31,45 @@ const Index = () => {
|
||||
const navigate = useNavigate();
|
||||
|
||||
useEffect(() => {
|
||||
// Récupérer l'utilisateur et vérifier l'authentification
|
||||
const userFromAuth = AuthService.getUser();
|
||||
if (userFromAuth) {
|
||||
setUser(userFromAuth);
|
||||
loadNotes();
|
||||
loadNotes().catch(err => {
|
||||
console.error("Erreur lors du chargement des notes:", err);
|
||||
showError("Erreur lors du chargement des notes");
|
||||
});
|
||||
} else {
|
||||
navigate("/login");
|
||||
}
|
||||
}, [navigate]);
|
||||
|
||||
const loadNotes = async () => {
|
||||
try {
|
||||
const fetchedNotes = await NotesService.getNotes();
|
||||
setNotes(fetchedNotes || []);
|
||||
if (fetchedNotes && fetchedNotes.length > 0) {
|
||||
if (Array.isArray(fetchedNotes)) {
|
||||
setNotes(fetchedNotes);
|
||||
if (fetchedNotes.length > 0) {
|
||||
setCurrentNote(fetchedNotes[0]);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors du chargement des notes:", error);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
const loadUsers = async () => {
|
||||
if (user?.is_admin) {
|
||||
try {
|
||||
const fetchedUsers = await AdminService.getUsers();
|
||||
setUsers(fetchedUsers || []);
|
||||
if (Array.isArray(fetchedUsers)) {
|
||||
setUsers(fetchedUsers);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors du chargement des utilisateurs:", error);
|
||||
showError("Erreur lors du chargement des utilisateurs");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -60,16 +79,22 @@ const Index = () => {
|
||||
};
|
||||
|
||||
const handleCreateNote = async () => {
|
||||
try {
|
||||
const newNote = await NotesService.createNote("Nouvelle note");
|
||||
if (newNote) {
|
||||
setNotes([newNote, ...notes]);
|
||||
setCurrentNote(newNote);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la création de la note:", error);
|
||||
showError("Erreur lors de la création de la note");
|
||||
}
|
||||
};
|
||||
|
||||
const handleUpdateNote = async (updatedFields: Partial<Note>) => {
|
||||
if (!currentNote) return;
|
||||
|
||||
try {
|
||||
const updatedNote = {
|
||||
...currentNote,
|
||||
...updatedFields,
|
||||
@@ -83,12 +108,17 @@ const Index = () => {
|
||||
setCurrentNote(updatedNote);
|
||||
setNotes(notes.map(note => note.id === updatedNote.id ? updatedNote : note));
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la mise à jour de la note:", error);
|
||||
showError("Erreur lors de la mise à jour de la note");
|
||||
}
|
||||
};
|
||||
|
||||
const handleDeleteNote = async () => {
|
||||
if (!currentNote?.id) return;
|
||||
|
||||
if (window.confirm("Êtes-vous sûr de vouloir supprimer cette note ?")) {
|
||||
try {
|
||||
const success = await NotesService.deleteNote(currentNote.id);
|
||||
|
||||
if (success) {
|
||||
@@ -96,6 +126,10 @@ const Index = () => {
|
||||
setNotes(updatedNotes);
|
||||
setCurrentNote(updatedNotes.length > 0 ? updatedNotes[0] : null);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la suppression de la note:", error);
|
||||
showError("Erreur lors de la suppression de la note");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -108,35 +142,55 @@ const Index = () => {
|
||||
|
||||
const isAdmin = window.confirm("Donner les droits administrateur ?");
|
||||
|
||||
try {
|
||||
const newUser = await AdminService.createUser(username, password, isAdmin);
|
||||
if (newUser) {
|
||||
loadUsers();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la création de l'utilisateur:", error);
|
||||
showError("Erreur lors de la création de l'utilisateur");
|
||||
}
|
||||
};
|
||||
|
||||
const handleChangePassword = async (userId: number) => {
|
||||
const password = prompt("Nouveau mot de passe:");
|
||||
if (!password) return;
|
||||
|
||||
try {
|
||||
const success = await AdminService.updateUserPassword(userId, password);
|
||||
if (success) {
|
||||
loadUsers();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la modification du mot de passe:", error);
|
||||
showError("Erreur lors de la modification du mot de passe");
|
||||
}
|
||||
};
|
||||
|
||||
const handleToggleAdmin = async (userId: number, currentStatus: boolean) => {
|
||||
try {
|
||||
const success = await AdminService.toggleAdminStatus(userId, currentStatus);
|
||||
if (success) {
|
||||
loadUsers();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la modification des droits:", error);
|
||||
showError("Erreur lors de la modification des droits");
|
||||
}
|
||||
};
|
||||
|
||||
const handleDeleteUser = async (userId: number) => {
|
||||
if (window.confirm("Êtes-vous sûr de vouloir supprimer cet utilisateur ?")) {
|
||||
try {
|
||||
const success = await AdminService.deleteUser(userId);
|
||||
if (success) {
|
||||
loadUsers();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la suppression de l'utilisateur:", error);
|
||||
showError("Erreur lors de la suppression de l'utilisateur");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -150,7 +204,7 @@ const Index = () => {
|
||||
const filteredNotes = notes.filter(note =>
|
||||
(activeTab === "all" || (activeTab === "archived" && note.archived)) &&
|
||||
(searchQuery === "" ||
|
||||
note.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
||||
(note.title && note.title.toLowerCase().includes(searchQuery.toLowerCase())) ||
|
||||
(note.content && note.content.toLowerCase().includes(searchQuery.toLowerCase())))
|
||||
);
|
||||
|
||||
@@ -185,7 +239,7 @@ const Index = () => {
|
||||
<Button variant="ghost" className="flex items-center gap-2">
|
||||
<Avatar className="h-8 w-8">
|
||||
<AvatarFallback className="bg-primary/10 text-primary">
|
||||
{user.username?.charAt(0).toUpperCase() || "U"}
|
||||
{user.username ? user.username.charAt(0).toUpperCase() : "U"}
|
||||
</AvatarFallback>
|
||||
</Avatar>
|
||||
<span className="font-medium">{user.username}</span>
|
||||
@@ -399,13 +453,19 @@ const Index = () => {
|
||||
className="hidden"
|
||||
onChange={async (e) => {
|
||||
if (e.target.files && e.target.files[0] && currentNote.id) {
|
||||
try {
|
||||
const image = await NotesService.uploadImage(currentNote.id, e.target.files[0]);
|
||||
if (image) {
|
||||
const updatedImages = [...(currentNote.images || []), image];
|
||||
handleUpdateNote({ images: updatedImages });
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de l'upload de l'image:", error);
|
||||
showError("Erreur lors de l'upload de l'image");
|
||||
} finally {
|
||||
e.target.value = '';
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</label>
|
||||
@@ -426,11 +486,16 @@ const Index = () => {
|
||||
className="absolute top-1 right-1 h-6 w-6 rounded-full"
|
||||
onClick={async () => {
|
||||
if (image.id && currentNote.id) {
|
||||
try {
|
||||
const success = await NotesService.deleteImage(currentNote.id, image.id);
|
||||
if (success) {
|
||||
const updatedImages = (currentNote.images || []).filter((_, i) => i !== index);
|
||||
handleUpdateNote({ images: updatedImages });
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Erreur lors de la suppression de l'image:", error);
|
||||
showError("Erreur lors de la suppression de l'image");
|
||||
}
|
||||
}
|
||||
}}
|
||||
>
|
||||
@@ -495,7 +560,7 @@ const Index = () => {
|
||||
<CardContent className="p-4 flex items-center justify-between">
|
||||
<div className="flex items-center gap-3">
|
||||
<Avatar>
|
||||
<AvatarFallback>{user.username.charAt(0).toUpperCase()}</AvatarFallback>
|
||||
<AvatarFallback>{user.username ? user.username.charAt(0).toUpperCase() : "U"}</AvatarFallback>
|
||||
</Avatar>
|
||||
<div>
|
||||
<p className="font-medium">{user.username}</p>
|
||||
|
||||
@@ -19,7 +19,14 @@ class AdminService {
|
||||
throw new Error("Erreur lors de la récupération des utilisateurs");
|
||||
}
|
||||
|
||||
return await response.json();
|
||||
const users = await response.json();
|
||||
|
||||
// Vérifier que les données sont un tableau
|
||||
if (!Array.isArray(users)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return users;
|
||||
} catch (error) {
|
||||
showError(error instanceof Error ? error.message : "Erreur serveur");
|
||||
return [];
|
||||
@@ -107,4 +114,6 @@ class AdminService {
|
||||
}
|
||||
}
|
||||
|
||||
export default new AdminService();
|
||||
// Créer une instance unique
|
||||
const adminServiceInstance = new AdminService();
|
||||
export default adminServiceInstance;
|
||||
@@ -51,11 +51,16 @@ class AuthService {
|
||||
|
||||
this.token = data.token;
|
||||
this.user = data.user;
|
||||
localStorage.setItem("token", this.token || "");
|
||||
localStorage.setItem("user", JSON.stringify(this.user || {}));
|
||||
|
||||
// Vérifier que les données sont valides avant de les stocker
|
||||
if (this.token && this.user) {
|
||||
localStorage.setItem("token", this.token);
|
||||
localStorage.setItem("user", JSON.stringify(this.user));
|
||||
showSuccess("Connexion réussie");
|
||||
return true;
|
||||
} else {
|
||||
throw new Error("Données d'authentification invalides");
|
||||
}
|
||||
} catch (error) {
|
||||
showError(error instanceof Error ? error.message : "Erreur de connexion");
|
||||
return false;
|
||||
@@ -91,4 +96,6 @@ class AuthService {
|
||||
}
|
||||
}
|
||||
|
||||
export default new AuthService();
|
||||
// Créer une instance unique
|
||||
const authServiceInstance = new AuthService();
|
||||
export default authServiceInstance;
|
||||
Reference in new issue
Block a user