- Replace flutter_appauth with custom WebView implementation to resolve deep link issues - Add KeycloakWebViewAuthService with integrated WebView for seamless authentication - Configure Android manifest for HTTP cleartext traffic support - Add network security config for development environment (192.168.1.11) - Update Keycloak client to use HTTP callback endpoint (http://192.168.1.11:8080/auth/callback) - Remove obsolete keycloak_auth_service.dart and temporary scripts - Clean up dependencies and regenerate injection configuration - Tested successfully on multiple Android devices (Xiaomi 2201116TG, SM A725F) BREAKING CHANGE: Authentication flow now uses WebView instead of external browser - Users will see Keycloak login page within the app instead of browser redirect - Resolves ERR_CLEARTEXT_NOT_PERMITTED and deep link state management issues - Maintains full OIDC compliance with PKCE flow and secure token storage Technical improvements: - WebView with custom navigation delegate for callback handling - Automatic token extraction and user info parsing from JWT - Proper error handling and user feedback - Consistent authentication state management across app lifecycle
97 lines
2.1 KiB
Dart
97 lines
2.1 KiB
Dart
import 'package:equatable/equatable.dart';
|
|
import '../../../../core/models/membre_model.dart';
|
|
|
|
/// Événements pour le BLoC des membres
|
|
abstract class MembresEvent extends Equatable {
|
|
const MembresEvent();
|
|
|
|
@override
|
|
List<Object?> get props => [];
|
|
}
|
|
|
|
/// Événement pour charger la liste des membres
|
|
class LoadMembres extends MembresEvent {
|
|
const LoadMembres();
|
|
}
|
|
|
|
/// Événement pour rafraîchir la liste des membres
|
|
class RefreshMembres extends MembresEvent {
|
|
const RefreshMembres();
|
|
}
|
|
|
|
/// Événement pour rechercher des membres
|
|
class SearchMembres extends MembresEvent {
|
|
const SearchMembres(this.query);
|
|
|
|
final String query;
|
|
|
|
@override
|
|
List<Object?> get props => [query];
|
|
}
|
|
|
|
/// Événement pour recherche avancée des membres avec filtres multiples
|
|
class AdvancedSearchMembres extends MembresEvent {
|
|
const AdvancedSearchMembres(this.filters);
|
|
|
|
final Map<String, dynamic> filters;
|
|
|
|
@override
|
|
List<Object?> get props => [filters];
|
|
}
|
|
|
|
/// Événement pour charger un membre spécifique
|
|
class LoadMembreById extends MembresEvent {
|
|
const LoadMembreById(this.id);
|
|
|
|
final String id;
|
|
|
|
@override
|
|
List<Object?> get props => [id];
|
|
}
|
|
|
|
/// Événement pour créer un nouveau membre
|
|
class CreateMembre extends MembresEvent {
|
|
const CreateMembre(this.membre);
|
|
|
|
final MembreModel membre;
|
|
|
|
@override
|
|
List<Object?> get props => [membre];
|
|
}
|
|
|
|
/// Événement pour mettre à jour un membre
|
|
class UpdateMembre extends MembresEvent {
|
|
const UpdateMembre(this.id, this.membre);
|
|
|
|
final String id;
|
|
final MembreModel membre;
|
|
|
|
@override
|
|
List<Object?> get props => [id, membre];
|
|
}
|
|
|
|
/// Événement pour supprimer un membre
|
|
class DeleteMembre extends MembresEvent {
|
|
const DeleteMembre(this.id);
|
|
|
|
final String id;
|
|
|
|
@override
|
|
List<Object?> get props => [id];
|
|
}
|
|
|
|
/// Événement pour charger les statistiques des membres
|
|
class LoadMembresStats extends MembresEvent {
|
|
const LoadMembresStats();
|
|
}
|
|
|
|
/// Événement pour effacer les erreurs
|
|
class ClearMembresError extends MembresEvent {
|
|
const ClearMembresError();
|
|
}
|
|
|
|
/// Événement pour réinitialiser l'état
|
|
class ResetMembresState extends MembresEvent {
|
|
const ResetMembresState();
|
|
}
|