Feature Support - Contact & Tickets
Vue d'ensemble
Le feature Support permet aux utilisateurs de contacter le support technique directement depuis l'application mobile. Les utilisateurs peuvent signaler des bugs, demander de l'aide, suggérer des fonctionnalités ou poser des questions techniques.
Fonctionnalités
Pour les utilisateurs (Mobile App)
-
Formulaire de contact structuré
- Sélection de catégorie (Bug, Feature, Question, Technique, Autre)
- Champ sujet (obligatoire, min 5 caractères)
- Message détaillé (obligatoire, min 20 caractères)
- Capture automatique des informations système
-
Catégories disponibles
- 🐛 Bug : Signaler un dysfonctionnement
- ✨ Feature : Suggérer une nouvelle fonctionnalité
- ❓ Question : Poser une question ou demander de l'aide
- ⚙️ Technique : Problème de configuration
- 💬 Autre : Autres demandes
-
Informations système automatiques
- Version de l'application
- Numéro de build
- Plateforme (iOS/Android)
- Version du système d'exploitation
-
Confirmation visuelle
- Dialog de succès après l'envoi
- Message de confirmation
Pour les administrateurs (Admin Dashboard)
Les tickets sont stockés dans Supabase et peuvent être gérés via votre dashboard admin.
Fonctionnalités recommandées pour l'admin:
- Liste de tous les tickets avec filtres (statut, catégorie, date)
- Vue détaillée d'un ticket
- Réponse aux tickets
- Changement de statut (Pending → In Progress → Resolved → Closed)
- Statistiques (temps de réponse moyen, tickets par catégorie, etc.)
Architecture
Structure des dossiers
lib/features/support/
├── domain/
│ ├── entities/
│ │ └── support_ticket.dart # Entité SupportTicket + enums
│ └── repositories/
│ └── support_repository.dart # Interface du repository
├── data/
│ └── repositories/
│ └── support_repository_impl.dart # Implémentation Supabase
├── presentation/
│ └── pages/
│ └── contact_support_page.dart # Page de contact
├── SUPPORT_DATABASE.md # Documentation de la base de données
└── README.md # Ce fichier
Entités principales
SupportTicket
class SupportTicket {
final String id;
final String userId;
final String userEmail;
final SupportTicketCategory category;
final String subject;
final String message;
final SupportTicketStatus status;
final Map<String, dynamic> systemInfo;
final DateTime createdAt;
final DateTime? updatedAt;
final String? adminResponse;
final DateTime? respondedAt;
}
SupportTicketCategory (Enum)
bug,feature,question,technical,other
SupportTicketStatus (Enum)
pending,in_progress,resolved,closed
Utilisation
Navigation vers la page de contact
La page est accessible depuis Paramètres → Support → Contacter le support.
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const ContactSupportPage(),
),
);
Créer un ticket programmatiquement
final repository = SupportRepositoryImpl(SupabaseConfig.client);
final ticket = SupportTicket(
id: const Uuid().v4(),
userId: currentUser.id,
userEmail: currentUser.email,
category: SupportTicketCategory.bug,
subject: 'Problème de synchronisation',
message: 'Les données ne se synchronisent pas...',
status: SupportTicketStatus.pending,
systemInfo: {
'app_version': '1.0.0',
'platform': 'android',
},
createdAt: DateTime.now(),
);
await repository.createTicket(ticket);
Récupérer les tickets d'un utilisateur
final tickets = await repository.getUserTickets();
Base de données
Table Supabase: support_tickets
Voir le fichier SUPPORT_DATABASE.md pour la documentation complète de la structure de la table, les requêtes SQL, et la configuration des RLS (Row Level Security).
Commandes rapides:
-- Créer la table
CREATE TABLE support_tickets (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
user_email TEXT NOT NULL,
category TEXT NOT NULL,
subject TEXT NOT NULL,
message TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
system_info JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ,
admin_response TEXT,
responded_at TIMESTAMPTZ,
is_read_by_user BOOLEAN NOT NULL DEFAULT false,
is_read_by_admin BOOLEAN NOT NULL DEFAULT false
);
-- Activer RLS
ALTER TABLE support_tickets ENABLE ROW LEVEL SECURITY;
Prochaines améliorations possibles
Phase 1 (Mobile)
- ✅ Formulaire de contact
- ✅ Catégorisation des tickets
- ✅ Capture des infos système
- ⬜ Historique des tickets dans l'app
- ⬜ Notifications push quand l'admin répond
- ⬜ Badge "nouveau" sur l'icône support
Phase 2 (Admin Dashboard)
- ⬜ Liste des tickets avec filtres
- ⬜ Vue détaillée d'un ticket
- ⬜ Réponse aux tickets
- ⬜ Changement de statut
- ⬜ Statistiques et métriques
Phase 3 (Avancé)
- ⬜ Chat en temps réel (Supabase Realtime)
- ⬜ Pièces jointes (screenshots)
- ⬜ Templates de réponses pour l'admin
- ⬜ Satisfaction client (rating après résolution)
- ⬜ FAQ automatique basée sur les tickets fréquents
Configuration requise
Dépendances
supabase_flutter: Client Supabaseuuid: Génération d'IDs uniquespackage_info_plus: Récupération des infos de l'app
Permissions
Aucune permission spéciale n'est requise sur le device.
Variables d'environnement
Aucune variable spécifique. Le client Supabase doit être configuré dans core/config/supabase_config.dart.
Tests
Tests manuels
- Ouvrir Paramètres → Support → Contacter le support
- Sélectionner une catégorie
- Remplir le sujet (min 5 caractères)
- Remplir le message (min 20 caractères)
- Envoyer
- Vérifier le message de confirmation
- Vérifier dans Supabase que le ticket a été créé
Tests à implémenter
- Unit tests pour
SupportTicketentity - Unit tests pour
SupportRepository - Widget tests pour
ContactSupportPage - Integration tests pour le flow complet
Troubleshooting
Le ticket ne s'envoie pas
- Vérifier la connexion Supabase
- Vérifier que la table
support_ticketsexiste - Vérifier les RLS policies (Row Level Security)
- Vérifier que l'utilisateur est bien connecté
Les informations système ne sont pas capturées
- Vérifier que
package_info_plusest bien installé - Sur iOS, vérifier les permissions dans Info.plist
- Vérifier les logs d'erreur dans
_getSystemInfo()
L'utilisateur ne reçoit pas d'email de confirmation
Par défaut, aucun email n'est envoyé. Pour implémenter les emails:
- Créer une Edge Function Supabase
- Ajouter un trigger PostgreSQL
- Ou utiliser un service tiers (SendGrid, Mailgun, etc.)
Support et contribution
Pour toute question sur ce feature:
- Voir la documentation Supabase: https://supabase.com/docs
- Voir le code source dans
lib/features/support/ - Contacter l'équipe de développement
Licence
Ce feature fait partie de l'application KazaCalendar Mobile.