Adds user ID to SMS messages
Ensures SMS messages are associated with a specific user by adding a `userId` field to the `SmsMessage` model and passing the user ID when retrieving SMS messages. This change ensures that SMS messages are correctly linked to the user they belong to, which is necessary for filtering and displaying the appropriate messages. It retrieves the user ID from the `UserCubit` state. Handles the case where the user state is not loaded, emitting an error state.
This commit is contained in:
@@ -31,8 +31,13 @@ class SmsCubit extends Cubit<SmsState> {
|
||||
try {
|
||||
final hasPermissions = await _smsService.requestPermissions();
|
||||
if (hasPermissions) {
|
||||
final messages = await _smsService.getLastSmsMessages(10);
|
||||
emit(SmsLoaded(messages));
|
||||
final userState = _userCubit.state;
|
||||
if (userState is UserLoaded) {
|
||||
final messages = await _smsService.getLastSmsMessages(10, userState.user!.id);
|
||||
emit(SmsLoaded(messages));
|
||||
} else {
|
||||
emit(SmsError("User not loaded"));
|
||||
}
|
||||
} else {
|
||||
emit(SmsPermissionDenied());
|
||||
}
|
||||
@@ -51,20 +56,24 @@ class SmsCubit extends Cubit<SmsState> {
|
||||
if (hasPermissions) {
|
||||
// Комментарий: Получаем текущего пользователя из состояния UserCubit.
|
||||
final userState = _userCubit.state;
|
||||
final user = userState is UserLoaded ? userState.user : null;
|
||||
if (userState is UserLoaded) {
|
||||
final user = userState.user;
|
||||
|
||||
// Комментарий: Получаем все SMS-сообщения с момента последней синхронизации.
|
||||
final messages = await _smsService.getSmsMessagesSince(DateTime.now());
|
||||
// Комментарий: Получаем все SMS-сообщения с момента последней синхронизации.
|
||||
final messages = await _smsService.getSmsMessagesSince(user!.lastSmsSyncTime, user.id);
|
||||
|
||||
// Комментарий: Сохраняем новые сообщения через репозиторий и создаем транзакции.
|
||||
await _smsRepository.addAll(messages);
|
||||
for (final message in messages) {
|
||||
// Комментарий: Пытаемся создать транзакцию из SMS.
|
||||
_createTransactionFromSms(message);
|
||||
// Комментарий: Сохраняем новые сообщения через репозиторий и создаем транзакции.
|
||||
await _smsRepository.addAll(messages);
|
||||
for (final message in messages) {
|
||||
// Комментарий: Пытаемся создать транзакцию из SMS.
|
||||
_createTransactionFromSms(message);
|
||||
}
|
||||
|
||||
// Комментарий: Устанавливаем состояние успешной загрузки.
|
||||
emit(SmsLoaded(messages));
|
||||
} else {
|
||||
emit(SmsError("User not loaded"));
|
||||
}
|
||||
|
||||
// Комментарий: Устанавливаем состояние успешной загрузки.
|
||||
emit(SmsLoaded(messages));
|
||||
} else {
|
||||
// Комментарий: Если разрешение не получено, устанавливаем состояние "в доступе отказано".
|
||||
emit(SmsPermissionDenied());
|
||||
|
||||
@@ -25,7 +25,7 @@ class UserCubit extends Cubit<UserState> {
|
||||
final ITransactionRepository _transactionRepository;
|
||||
final Logger _logger = Logger(
|
||||
printer: PrettyPrinter(
|
||||
methodCount: 15, // Number of method calls to be displayed
|
||||
methodCount: 2, // Number of method calls to be displayed
|
||||
errorMethodCount: 8, // Number of method calls if stacktrace is provided
|
||||
lineLength: 120, // Width of the output
|
||||
colors: true, // Colorful log messages
|
||||
@@ -70,9 +70,12 @@ class UserCubit extends Cubit<UserState> {
|
||||
emit(UserLoading(progress: 1.0, message: 'Завершение...'));
|
||||
await Future.delayed(const Duration(milliseconds: 300));
|
||||
emit(UserLoaded(currentUser));
|
||||
|
||||
} catch (e, stack) {
|
||||
_logger.e('--- UserCubit: FATAL ERROR in _init ---', error: e, stackTrace: stack);
|
||||
_logger.e(
|
||||
'--- UserCubit: FATAL ERROR in _init ---',
|
||||
error: e,
|
||||
stackTrace: stack,
|
||||
);
|
||||
emit(UserError('Ошибка загрузки пользователя: ${e.toString()}'));
|
||||
}
|
||||
}
|
||||
@@ -106,8 +109,6 @@ class UserCubit extends Cubit<UserState> {
|
||||
await _transactionRepository.addAll(
|
||||
TransactionUtils.getSampleTransactions(userId),
|
||||
);
|
||||
|
||||
_logger.i('Initial data created for user: $userId');
|
||||
} catch (e, stack) {
|
||||
_logger.e(
|
||||
'Error creating initial data for user: $userId',
|
||||
|
||||
@@ -21,22 +21,28 @@ class SmsMessage extends HiveObject {
|
||||
@HiveField(4)
|
||||
String? transactionId;
|
||||
|
||||
// Комментарий: Добавлено поле для связи с пользователем.
|
||||
@HiveField(5)
|
||||
final String userId;
|
||||
|
||||
SmsMessage({
|
||||
String? id,
|
||||
this.body,
|
||||
this.sender,
|
||||
this.date,
|
||||
this.transactionId,
|
||||
required this.userId,
|
||||
}) : id = id ?? IdGenerator.generateId();
|
||||
|
||||
// Комментарий: Добавляем метод для обновления transactionId
|
||||
SmsMessage copyWith({String? transactionId}) {
|
||||
SmsMessage copyWith({String? transactionId, String? userId}) {
|
||||
return SmsMessage(
|
||||
id: id,
|
||||
body: body,
|
||||
sender: sender,
|
||||
date: date,
|
||||
transactionId: transactionId ?? this.transactionId,
|
||||
userId: userId ?? this.userId,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,13 +22,14 @@ class SmsMessageAdapter extends TypeAdapter<SmsMessage> {
|
||||
sender: fields[2] as String?,
|
||||
date: fields[3] as DateTime?,
|
||||
transactionId: fields[4] as String?,
|
||||
userId: fields[5] as String,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, SmsMessage obj) {
|
||||
writer
|
||||
..writeByte(5)
|
||||
..writeByte(6)
|
||||
..writeByte(0)
|
||||
..write(obj.id)
|
||||
..writeByte(1)
|
||||
@@ -38,7 +39,9 @@ class SmsMessageAdapter extends TypeAdapter<SmsMessage> {
|
||||
..writeByte(3)
|
||||
..write(obj.date)
|
||||
..writeByte(4)
|
||||
..write(obj.transactionId);
|
||||
..write(obj.transactionId)
|
||||
..writeByte(5)
|
||||
..write(obj.userId);
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -23,7 +23,7 @@ class SmsService {
|
||||
///
|
||||
/// Возвращает список объектов [SmsMessage].
|
||||
/// В случае ошибки или отсутствия разрешений, возвращает пустой список.
|
||||
Future<List<SmsMessage>> getLastSmsMessages(int count) async {
|
||||
Future<List<SmsMessage>> getLastSmsMessages(int count, String userId) async {
|
||||
final bool? permissionsGranted =
|
||||
await _telephony.requestPhoneAndSmsPermissions;
|
||||
if (permissionsGranted ?? false) {
|
||||
@@ -36,13 +36,14 @@ class SmsService {
|
||||
body: msg.body,
|
||||
sender: msg.address,
|
||||
date: DateTime.fromMillisecondsSinceEpoch(msg.date ?? 0),
|
||||
userId: userId,
|
||||
)).toList();
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
// Комментарий: Метод для получения SMS-сообщений с определенной даты.
|
||||
Future<List<SmsMessage>> getSmsMessagesSince(DateTime sinceDate) async {
|
||||
Future<List<SmsMessage>> getSmsMessagesSince(DateTime sinceDate, String userId) async {
|
||||
final bool? permissionsGranted = await _telephony.requestPhoneAndSmsPermissions;
|
||||
if (permissionsGranted ?? false) {
|
||||
final List<telephony_package.SmsMessage> messages = await _telephony.getInboxSms(
|
||||
@@ -56,6 +57,7 @@ class SmsService {
|
||||
body: msg.body,
|
||||
sender: msg.address,
|
||||
date: DateTime.fromMillisecondsSinceEpoch(msg.date ?? 0),
|
||||
userId: userId,
|
||||
))
|
||||
.toList();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user