fixes multiple issus

This commit is contained in:
otsmr 2026-04-22 18:14:11 +02:00
parent c9a704c44f
commit c197cb797e
5 changed files with 53 additions and 18 deletions

View file

@ -198,6 +198,8 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
messageHistories,
)..where((t) => t.messageId.equals(messageId))).go();
await twonlyDB.receiptsDao.deleteReceiptsByMessageId(messageId);
await (update(messages)..where(
(t) => t.messageId.equals(messageId),
))
@ -344,7 +346,7 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
);
}
final rowId = await into(messages).insertOnConflictUpdate(insertMessage);
await into(messages).insertOnConflictUpdate(insertMessage);
await twonlyDB.groupsDao.updateGroup(
message.groupId.value,
@ -365,9 +367,11 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
);
}
final messageId = insertMessage.messageId.value;
return await (select(
messages,
)..where((t) => t.rowId.equals(rowId))).getSingle();
)..where((t) => t.messageId.equals(messageId))).getSingle();
} catch (e) {
Log.error('Could not insert message: $e');
return null;

View file

@ -54,6 +54,13 @@ class ReceiptsDao extends DatabaseAccessor<TwonlyDB> with _$ReceiptsDaoMixin {
.go();
}
Future<void> deleteReceiptsByMessageId(String messageId) async {
await (delete(receipts)..where(
(t) => t.messageId.equals(messageId),
))
.go();
}
Future<void> deleteReceiptForUser(int contactId) async {
await (delete(receipts)..where(
(t) => t.contactId.equals(contactId),
@ -91,10 +98,11 @@ class ReceiptsDao extends DatabaseAccessor<TwonlyDB> with _$ReceiptsDaoMixin {
receiptId: Value(uuid.v4()),
);
}
final id = await into(receipts).insert(insertEntry);
await into(receipts).insert(insertEntry);
final receiptId = insertEntry.receiptId.value;
return await (select(
receipts,
)..where((t) => t.rowId.equals(id))).getSingle();
)..where((t) => t.receiptId.equals(receiptId))).getSingle();
} catch (e) {
// ignore error, receipts is already in the database...
return null;

View file

@ -178,9 +178,15 @@ Future<void> handleMedia(
unawaited(startDownloadMedia(mediaFile!, false));
} else {
if (mediaFile == null && message == null) {
Log.error(
'Could not insert new message as both the message and mediaFile are empty.',
);
} else if (mediaFile == null) {
Log.error('Could not insert new message as the mediaFile is empty.');
} else {
Log.error('Could not insert new message as the message is empty.');
}
}
}

View file

@ -60,12 +60,23 @@ Future<void> reuploadMediaFiles() async {
final content = EncryptedContent.fromBuffer(receipt.message);
if (content.hasMedia()) {
messageId = content.media.senderMessageId;
final messageExists = await twonlyDB.messagesDao
.getMessageById(messageId)
.getSingleOrNull();
if (messageExists != null) {
await twonlyDB.receiptsDao.updateReceipt(
receipt.receiptId,
ReceiptsCompanion(
messageId: Value(messageId),
),
);
} else {
Log.info(
'Message $messageId not found in DB for receipt recovery. Deleting stale receipt.',
);
await twonlyDB.receiptsDao.deleteReceipt(receipt.receiptId);
continue;
}
}
} catch (e) {
Log.error(e);
@ -110,8 +121,8 @@ Future<void> reuploadMediaFiles() async {
await twonlyDB.messagesDao.deleteMessagesById(messageId);
}
await twonlyDB.receiptsDao.deleteReceipt(receipt.receiptId);
Log.error(
'Message not found for reupload of the receipt (${message == null} - ${message?.mediaId}).',
Log.warn(
'Message not found for reupload of the receipt, likely deleted from sender (${message == null} - ${message?.mediaId}).',
);
continue;
}

View file

@ -198,8 +198,8 @@ class MainCameraController {
focusPointOffset = Offset(localPosition.dx, localPosition.dy);
final dx = localPosition.dx / box.size.width;
final dy = localPosition.dy / box.size.height;
final dx = (localPosition.dx / box.size.width).clamp(0.0, 1.0);
final dy = (localPosition.dy / box.size.height).clamp(0.0, 1.0);
setState();
@ -208,8 +208,14 @@ class MainCameraController {
await cameraController?.setFocusPoint(Offset(dx, dy));
await cameraController?.setFocusMode(FocusMode.auto);
} catch (e) {
if (e is CameraException &&
(e.code == 'setFocusPointFailed' ||
e.code == 'setFocusModeFailed')) {
Log.info('Focus point or mode not supported on this device');
} else {
Log.error(e);
}
}
// display the focus point at least 500ms
await Future.delayed(const Duration(milliseconds: 500));