feat: Implement Twitter (X) login using OAuth 2.0 PKCE flow via webview.

This commit is contained in:
pradeepkumar
2026-03-26 11:53:36 +05:30
parent 22187c8b13
commit 0466341f62
8 changed files with 272 additions and 49 deletions

View File

@@ -10,7 +10,6 @@ import 'package:real_estate_mobile/features/auth/data/auth_repository.dart';
import 'package:real_estate_mobile/features/auth/data/models/register_request.dart';
import 'package:real_estate_mobile/features/auth/data/models/user_model.dart';
import 'package:real_estate_mobile/features/messaging/data/socket_service.dart';
import 'package:twitter_login/twitter_login.dart';
// Auth state
enum AuthStatus { initial, loading, authenticated, error }
@@ -291,7 +290,8 @@ class AuthNotifier extends StateNotifier<AuthState> {
}
}
Future<void> signInWithTwitter() async {
/// Complete Twitter/X login after webview returns user data.
Future<void> completeTwitterLogin(Map<String, dynamic> twitterUser) async {
state = state.copyWith(
status: AuthStatus.loading,
errorMessage: null,
@@ -299,35 +299,12 @@ class AuthNotifier extends StateNotifier<AuthState> {
);
try {
final twitterLogin = TwitterLogin(
apiKey: 'eWEzaDJ0al9lX1diOGY0ejRYeXM6MTpjaQ',
apiSecretKey: 'HadGMSRKKswfXOajbmggrnmLAn9cxJsl8GtFxGHqjX-CJ0A2Tu',
redirectURI: 'request://',
);
final authResult = await twitterLogin.login();
if (authResult.status == TwitterLoginStatus.cancelledByUser) {
state = state.copyWith(status: AuthStatus.initial);
return;
}
if (authResult.status != TwitterLoginStatus.loggedIn) {
state = state.copyWith(
status: AuthStatus.error,
errorMessage: authResult.errorMessage ?? 'Twitter login failed',
);
return;
}
final twitterUser = authResult.user!;
final user = await _repository.socialAuth(
provider: 'twitter',
providerId: twitterUser.id.toString(),
email: '${twitterUser.screenName}@twitter.placeholder',
name: twitterUser.name,
avatar: twitterUser.thumbnailImage,
providerId: twitterUser['id'] as String,
email: '${twitterUser['username']}@x.com',
name: twitterUser['name'] as String?,
avatar: twitterUser['avatar'] as String?,
);
state = state.copyWith(
@@ -345,7 +322,7 @@ class AuthNotifier extends StateNotifier<AuthState> {
debugPrint('Twitter sign-in error: $e');
state = state.copyWith(
status: AuthStatus.error,
errorMessage: 'Twitter sign-in failed. Please try again.',
errorMessage: 'X/Twitter sign-in failed. Please try again.',
);
}
}