/// Immutable domain model representing an authenticated Winded user. /// /// This is a pure-Dart model intentionally decoupled from Firebase types so /// the rest of the app can depend on it without pulling in firebase_auth. class AppUser { const AppUser({ required this.uid, required this.email, this.displayName, this.photoUrl, }); final String uid; final String email; final String? displayName; final String? photoUrl; AppUser copyWith({ String? uid, String? email, String? displayName, String? photoUrl, }) { return AppUser( uid: uid ?? this.uid, email: email ?? this.email, displayName: displayName ?? this.displayName, photoUrl: photoUrl ?? this.photoUrl, ); } @override bool operator ==(Object other) { if (identical(this, other)) return true; return other is AppUser && other.uid == uid && other.email == email && other.displayName == displayName && other.photoUrl == photoUrl; } @override int get hashCode => Object.hash(uid, email, displayName, photoUrl); @override String toString() => 'AppUser(uid: $uid, email: $email, displayName: $displayName)'; }