135 lines
3.5 KiB
Dart
135 lines
3.5 KiB
Dart
import 'package:jwt_decoder/jwt_decoder.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
|
import 'package:chepuhagram/core/constants.dart';
|
|
import 'package:http/http.dart' as http;
|
|
import 'dart:convert';
|
|
|
|
class ApiService extends ChangeNotifier {
|
|
final _client = http.Client();
|
|
final _storage = const FlutterSecureStorage();
|
|
|
|
Future<bool> refreshToken() async {
|
|
notifyListeners();
|
|
|
|
try {
|
|
final refreshToken = await _storage.read(key: 'refresh_token');
|
|
final response = await _client.post(
|
|
Uri.http(AppConstants.baseUrl, 'auth/refresh'),
|
|
body: jsonEncode({'refresh_token': refreshToken}),
|
|
headers: {'Content-Type': 'application/json'},
|
|
);
|
|
|
|
final decodedResponse =
|
|
jsonDecode(utf8.decode(response.bodyBytes)) as Map;
|
|
|
|
if (response.statusCode == 200) {
|
|
await _storage.write(
|
|
key: 'access_token',
|
|
value: decodedResponse['access_token'],
|
|
);
|
|
await _storage.write(
|
|
key: 'refresh_token',
|
|
value: decodedResponse['refresh_token'],
|
|
);
|
|
notifyListeners();
|
|
return true;
|
|
} else {
|
|
notifyListeners();
|
|
return false;
|
|
}
|
|
} catch (e) {
|
|
notifyListeners();
|
|
rethrow;
|
|
}
|
|
}
|
|
|
|
Future<String?> getAccessToken() async {
|
|
String? token = await _storage.read(key: 'access_token');
|
|
|
|
if (token != null) {
|
|
bool isExpiredSoon =
|
|
JwtDecoder.isExpired(token) ||
|
|
JwtDecoder.getRemainingTime(token).inMinutes < 2;
|
|
|
|
if (isExpiredSoon) {
|
|
bool refreshed = await refreshToken();
|
|
if (refreshed) {
|
|
token = await _storage.read(key: 'access_token');
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
return token;
|
|
}
|
|
|
|
Future<bool> updateFcmToken(String fcmtoken) async {
|
|
notifyListeners();
|
|
|
|
try {
|
|
final token = await getAccessToken();
|
|
final response = await _client.post(
|
|
Uri.http(AppConstants.baseUrl, 'auth/update-fcm', {'token': fcmtoken}),
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'Bearer $token',
|
|
},
|
|
);
|
|
|
|
if (response.statusCode == 200) {
|
|
return true;
|
|
} else {
|
|
print("Ошибка установки ключа: ${response.statusCode}");
|
|
return false;
|
|
}
|
|
} catch (e) {
|
|
rethrow;
|
|
} finally {
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<bool> setPublicKey(String publicKey) async {
|
|
notifyListeners();
|
|
|
|
try {
|
|
final token = await getAccessToken();
|
|
final response = await _client.post(
|
|
Uri.http(AppConstants.baseUrl, 'auth/set-public-key'),
|
|
body: jsonEncode({'public_key': publicKey}),
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': 'Bearer $token',
|
|
},
|
|
);
|
|
|
|
if (response.statusCode == 200) {
|
|
return true;
|
|
} else {
|
|
print("Ошибка установки ключа: ${response.statusCode}");
|
|
return false;
|
|
}
|
|
} catch (e) {
|
|
rethrow;
|
|
} finally {
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
Future<List<dynamic>> getChatHistory(int contactId) async {
|
|
final token = await getAccessToken();
|
|
final response = await http.get(
|
|
Uri.http(
|
|
AppConstants.baseUrl,
|
|
'messages/history/${contactId.toString()}',
|
|
),
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
"Authorization": "Bearer $token",
|
|
},
|
|
);
|
|
return jsonDecode(response.body) as List<dynamic>;
|
|
}
|
|
}
|