import streamlit as st from utils.admin import supabase import bcrypt from utils.notification_handler import notify_security_alert #import du module de notifications (envoie une notification de sécurité en cas de modifications des données de l"utilisateur) # Configuration de la page st.set_page_config( page_title="Profil Utilisateur", page_icon="👤", layout="centered" ) st.title("Mon Profil") # Vérification de l'authentification if 'user' not in st.session_state: st.error("Vous devez être connecté pour accéder à cette page.") st.stop() # Récupérer les informations actuelles de l'utilisateur user_id = st.session_state['user']['id'] user_info = supabase.table("users").select("*").eq("id", user_id).execute() current_user = user_info.data[0] if user_info.data else None # Section Informations Personnelles st.header("📋 Informations Personnelles") with st.form("personal_info_form"): col1, col2 = st.columns(2) with col1: new_nom = st.text_input("Nom", value=current_user.get('nom', '')) with col2: new_prenom = st.text_input("Prénom", value=current_user.get('prenom', '')) # Informations professionnelles st.subheader("Informations professionnelles") professional_info = current_user.get('professional_info', {}) if isinstance(professional_info, str): import json professional_info = json.loads(professional_info) new_profession = st.text_input( "Profession", value=professional_info.get('profession', '') ) new_entreprise = st.text_input( "Entreprise", value=professional_info.get('entreprise', '') ) submit_personal = st.form_submit_button("Mettre à jour mes informations") if submit_personal: try: # Préparer les données à mettre à jour update_data = { "nom": new_nom, "prenom": new_prenom, "professional_info": { "profession": new_profession, "entreprise": new_entreprise } } # Mettre à jour dans la base de données supabase.table("users").update(update_data).eq("id", user_id).execute() st.success("✅ Informations personnelles mises à jour avec succès!") st.rerun() # Recharger la page pour afficher les nouvelles informations # Notifier l'utilisateur except Exception as e: st.error(f"Une erreur est survenue : {str(e)}") notify_security_alert(user_id, # notifier l'utilisateur du changement de ses impofrmations personnelles "Vos informations personnelles ont été mises à jour." ) # Section Email et Mot de passe st.header("🔐 Email et Mot de passe") with st.form("security_form"): # Email new_email = st.text_input("Email", value=current_user.get('email', '')) # Mot de passe st.subheader("Changer le mot de passe") current_password = st.text_input("Mot de passe actuel", type="password") new_password = st.text_input("Nouveau mot de passe", type="password") confirm_password = st.text_input("Confirmer le nouveau mot de passe", type="password") submit_security = st.form_submit_button("Mettre à jour les informations de sécurité") if submit_security: try: update_data = {} # Vérifier si l'email a changé if new_email != current_user.get('email'): # Vérifier si le nouvel email existe déjà existing_email = supabase.table("users").select("id").eq("email", new_email).neq("id", user_id).execute() if existing_email.data: st.error("Cet email est déjà utilisé par un autre utilisateur.") else: update_data["email"] = new_email # Vérifier si le mot de passe doit être mis à jour if current_password and new_password and confirm_password: # Vérifier l'ancien mot de passe if not bcrypt.checkpw(current_password.encode(), current_user['password'].encode()): st.error("Le mot de passe actuel est incorrect.") elif new_password != confirm_password: st.error("Les nouveaux mots de passe ne correspondent pas.") elif len(new_password) < 8: st.error("Le nouveau mot de passe doit contenir au moins 8 caractères.") else: # Hasher le nouveau mot de passe hashed_password = bcrypt.hashpw(new_password.encode(), bcrypt.gensalt()).decode() update_data["password"] = hashed_password # Effectuer la mise à jour si nécessaire if update_data: supabase.table("users").update(update_data).eq("id", user_id).execute() st.success("✅ Informations de sécurité mises à jour avec succès!") if "email" in update_data: st.warning("⚠️ Votre email a été modifié. Vous devrez vous reconnecter.") st.session_state.clear() st.rerun() else: st.info("Aucune modification à effectuer.") except Exception as e: st.error(f"Une erreur est survenue : {str(e)}") # Section Préférences de Notification st.header("🔔 Préférences de Notification") # Récupérer les préférences actuelles notification_prefs = supabase.table("notification_preferences").select("*").eq("user_id", user_id).execute() current_prefs = notification_prefs.data[0] if notification_prefs.data else { "email_notifications": True, "security_alerts": True, "assistant_updates": True, "daily_summary": False } with st.form("notification_preferences_form"): st.markdown("Choisissez les notifications que vous souhaitez recevoir :") email_notif = st.toggle( "Notifications par email", value=current_prefs.get("email_notifications", True), help="Recevoir les notifications par email" ) security_alerts = st.toggle( "Alertes de sécurité", value=current_prefs.get("security_alerts", True), help="Notifications concernant la sécurité de votre compte" ) assistant_updates = st.toggle( "Mises à jour des assistants", value=current_prefs.get("assistant_updates", True), help="Notifications sur les nouvelles fonctionnalités des assistants" ) daily_summary = st.toggle( "Résumé quotidien", value=current_prefs.get("daily_summary", False), help="Recevoir un résumé quotidien de vos interactions avec les assistants" ) submit_notif = st.form_submit_button("Enregistrer mes préférences") if submit_notif: try: # Préparer les données notif_data = { "user_id": user_id, "email_notifications": email_notif, "security_alerts": security_alerts, "assistant_updates": assistant_updates, "daily_summary": daily_summary, "updated_at": "NOW()" } # Vérifier si des préférences existent déjà if notification_prefs.data: # Mettre à jour les préférences existantes supabase.table("notification_preferences").update(notif_data).eq("user_id", user_id).execute() else: # Créer de nouvelles préférences notif_data["created_at"] = "NOW()" supabase.table("notification_preferences").insert(notif_data).execute() st.success("✅ Préférences de notification mises à jour avec succès!") except Exception as e: st.error(f"Une erreur est survenue : {str(e)}") # Maintenant que nous avons implémenté le système de préférences de notification dans le fichoer actuel, nous ajoutons la fonctionnalité pour envoyer effectivement ces notifications aux utilisateurs. # Nous créyons un nouveau module pour gérer l'envoi des notifications. # Voici les étapes : # Créez un nouveau fichier utils/notification_handler.py qui gérera l'envoi des notifications. # tester les notification (fonctions temporaires à supprimer en prod) st.header("🧪 Test des Notifications") test_col1, test_col2 = st.columns(2) with test_col1: with st.form("test_security_notification"): st.subheader("Test Alerte de Sécurité") test_security_msg = st.text_input( "Message de test (sécurité)", value="Ceci est un test d'alerte de sécurité" ) if st.form_submit_button("Tester Alerte Sécurité"): from utils.notification_handler import notify_security_alert if notify_security_alert(user_id, test_security_msg): st.success("✅ Notification de sécurité envoyée!") else: st.error("❌ Erreur lors de l'envoi de la notification") with test_col2: with st.form("test_assistant_notification"): st.subheader("Test Mise à jour Assistant") test_assistant_msg = st.text_input( "Message de test (assistant)", value="Ceci est un test de mise à jour assistant" ) if st.form_submit_button("Tester Notification Assistant"): from utils.notification_handler import notify_assistant_update if notify_assistant_update(user_id, test_assistant_msg): st.success("✅ Notification assistant envoyée!") else: st.error("❌ Erreur lors de l'envoi de la notification") # Test du résumé quotidien with st.form("test_daily_summary"): st.subheader("Test Résumé Quotidien") test_summary = { "conversations": 5, "questions": 15, "usage_time": 45 } st.write("Données de test :") st.json(test_summary) if st.form_submit_button("Tester Résumé Quotidien"): from utils.notification_handler import send_daily_summary if send_daily_summary(user_id, test_summary): st.success("✅ Résumé quotidien envoyé!") else: st.error("❌ Erreur lors de l'envoi du résumé")