Replace Telegram widget with bot login
All checks were successful
Build and deploy Flutter Web / build (push) Successful in 2m22s

This commit is contained in:
Ruslan Bakiev
2026-05-08 19:32:01 +07:00
parent cd62a0a428
commit 5f33a5e880
9 changed files with 276 additions and 95 deletions

View File

@@ -11,6 +11,7 @@ class MapflowApi {
http.Client? client,
String? telegramInitData,
String? telegramLoginData,
String? mapflowSessionToken,
String endpoint = const String.fromEnvironment(
'API_BASE_URL',
defaultValue: '/graphql',
@@ -19,21 +20,43 @@ class MapflowApi {
_telegramInitData = telegramInitData ?? telegram_auth.telegramInitData(),
_telegramLoginData =
telegramLoginData ?? telegram_auth.telegramLoginData(),
_mapflowSessionToken =
mapflowSessionToken ?? telegram_auth.mapflowSessionToken(),
_endpoint = Uri.base.resolve(endpoint);
final http.Client _client;
final String _telegramInitData;
final String _telegramLoginData;
final String _mapflowSessionToken;
final Uri _endpoint;
bool get hasTelegramAuth =>
_telegramInitData.isNotEmpty || _telegramLoginData.isNotEmpty;
_telegramInitData.isNotEmpty ||
_telegramLoginData.isNotEmpty ||
_mapflowSessionToken.isNotEmpty;
Future<AppUser?> authenticateTelegram() async {
if (!hasTelegramAuth) {
return null;
}
if (_mapflowSessionToken.isNotEmpty) {
final data = await _graphql('''
query Me {
me {
id
telegramId
username
firstName
lastName
photoUrl
languageCode
}
}
''');
return AppUser.fromJson(data['me'] as Map<String, dynamic>);
}
if (_telegramLoginData.isNotEmpty) {
final loginData = jsonDecode(_telegramLoginData) as Map<String, dynamic>;
final data = await _graphql(
@@ -88,6 +111,49 @@ class MapflowApi {
return AppUser.fromJson(user);
}
Future<TelegramBotLogin> startTelegramBotLogin() async {
final data = await _graphql('''
mutation StartTelegramBotLogin {
startTelegramBotLogin {
token
botUrl
expiresAt
}
}
''');
return TelegramBotLogin.fromJson(
data['startTelegramBotLogin'] as Map<String, dynamic>,
);
}
Future<TelegramBotLoginStatus> fetchTelegramBotLoginStatus(
String token,
) async {
final data = await _graphql(
'''
query TelegramBotLoginStatus(\$token: String!) {
telegramBotLoginStatus(token: \$token) {
status
sessionToken
user {
id
telegramId
username
firstName
lastName
photoUrl
languageCode
}
}
}
''',
variables: {'token': token},
);
return TelegramBotLoginStatus.fromJson(
data['telegramBotLoginStatus'] as Map<String, dynamic>,
);
}
Future<List<PlaceRecommendation>> fetchPlaces() async {
final data = await _graphql('''
query Places {
@@ -168,6 +234,8 @@ class MapflowApi {
'x-telegram-init-data': _telegramInitData,
if (_telegramLoginData.isNotEmpty)
'x-telegram-login-data': _telegramLoginData,
if (_mapflowSessionToken.isNotEmpty)
'x-mapflow-session-token': _mapflowSessionToken,
},
body: jsonEncode({'query': query, 'variables': variables ?? {}}),
);