From b57d582f6adfe8b6cf4e6fa7a0a326279b7cd15a Mon Sep 17 00:00:00 2001 From: minibits-cash Date: Thu, 29 Jan 2026 10:10:10 +0100 Subject: [PATCH] Add delete pending incoming transactions feature - Add deleteIncomingPending action to TransactionsStore - Add getIncomingPendingCount and deleteIncomingPending to sqlite - Update TranHistoryScreen with UI for deleting pending incoming - Add i18n translations for the new feature Co-Authored-By: Claude Opus 4.5 --- src/i18n_messages/en.json | 3 ++ src/i18n_messages/es.json | 3 ++ src/i18n_messages/pt.json | 3 ++ src/i18n_messages/sk.json | 3 ++ src/models/TransactionsStore.ts | 22 ++++++++++++ src/screens/TranHistoryScreen.tsx | 41 ++++++++++++++++++--- src/services/sqlite.ts | 59 ++++++++++++++++++++++++++++--- 7 files changed, 124 insertions(+), 10 deletions(-) diff --git a/src/i18n_messages/en.json b/src/i18n_messages/en.json index f38b3c73..8bf61313 100644 --- a/src/i18n_messages/en.json +++ b/src/i18n_messages/en.json @@ -623,6 +623,9 @@ "tranHistory_deleteErroredDesc": "This will delete %{count} transactions with errors", "tranHistory_deleteExpired": "Delete expired", "tranHistory_deleteExpiredDesc": "This will delete %{count} expired transactions", + "tranHistory_deleteIncomingPending": "Delete pending incoming", + "tranHistory_deleteIncomingPendingDesc": "This will delete %{count} pending incoming transaction", + "tranHistory_deleteIncomingPendingDesc_plural": "This will delete %{count} pending incoming transactions", "tranHistory_deleteReverted": "Delete reverted", "tranHistory_deleteRevertedDesc": "This will delete %{count} reverted transactions", "tranHistory_listIsComplete": "List is complete", diff --git a/src/i18n_messages/es.json b/src/i18n_messages/es.json index 124ebe8c..0ad2d196 100644 --- a/src/i18n_messages/es.json +++ b/src/i18n_messages/es.json @@ -620,6 +620,9 @@ "tranHistory_deleteErroredDesc": "Esto eliminará %{count} transacciones con errores", "tranHistory_deleteExpired": "Eliminar caducado", "tranHistory_deleteExpiredDesc": "Esto eliminará %{count} transacciones vencidas", + "tranHistory_deleteIncomingPending": "Eliminar pendientes entrantes", + "tranHistory_deleteIncomingPendingDesc": "Esto eliminará %{count} transacción entrante pendiente", + "tranHistory_deleteIncomingPendingDesc_plural": "Esto eliminará %{count} transacciones entrantes pendientes", "tranHistory_deleteReverted": "Eliminación revertida", "tranHistory_deleteRevertedDesc": "Esto eliminará %{count} transacciones revertidas", "tranHistory_listIsComplete": "La lista está completa", diff --git a/src/i18n_messages/pt.json b/src/i18n_messages/pt.json index dc3e7261..b38fd25f 100644 --- a/src/i18n_messages/pt.json +++ b/src/i18n_messages/pt.json @@ -621,6 +621,9 @@ "tranHistory_deleteErroredDesc": "Isso excluirá %{count} transações com erros", "tranHistory_deleteExpired": "Excluir expirado", "tranHistory_deleteExpiredDesc": "Isso excluirá %{count} transações expiradas", + "tranHistory_deleteIncomingPending": "Excluir pendentes recebidas", + "tranHistory_deleteIncomingPendingDesc": "Isso excluirá %{count} transação recebida pendente", + "tranHistory_deleteIncomingPendingDesc_plural": "Isso excluirá %{count} transações recebidas pendentes", "tranHistory_deleteReverted": "Excluir revertido", "tranHistory_deleteRevertedDesc": "Isso excluirá %{count} transações revertidas", "tranHistory_listIsComplete": "Lista completa", diff --git a/src/i18n_messages/sk.json b/src/i18n_messages/sk.json index 29157ce2..0e9ee8d7 100644 --- a/src/i18n_messages/sk.json +++ b/src/i18n_messages/sk.json @@ -621,6 +621,9 @@ "tranHistory_deleteErroredDesc": "Toto zmaže %{count} chybných transakcií", "tranHistory_deleteExpired": "Zmaž expirované", "tranHistory_deleteExpiredDesc": "Toto zmaže %{count} expirovaných transakcií", + "tranHistory_deleteIncomingPending": "Zmaž čakajúce prichádzajúce", + "tranHistory_deleteIncomingPendingDesc": "Toto zmaže %{count} čakajúcu prichádzajúcu transakciu", + "tranHistory_deleteIncomingPendingDesc_plural": "Toto zmaže %{count} čakajúcich prichádzajúcich transakcií", "tranHistory_deleteReverted": "Zmaž vrátené", "tranHistory_deleteRevertedDesc": "Toto zmaže %{count} vrátených transakcií", "tranHistory_listIsComplete": "Zoznam je ukončený", diff --git a/src/models/TransactionsStore.ts b/src/models/TransactionsStore.ts index 523e25e9..ac7e956e 100644 --- a/src/models/TransactionsStore.ts +++ b/src/models/TransactionsStore.ts @@ -10,6 +10,7 @@ import { TransactionModel, Transaction, TransactionStatus, + TransactionType, } from './Transaction' import { Database } from '../services' import { log } from '../services/logService' @@ -262,6 +263,27 @@ export const TransactionsStoreModel = types return Database.deleteTransactionsByStatus(status) }, + deleteIncomingPending() { + const toDelete: number[] = [] + + self.transactionsMap.forEach((tx, key) => { + const isPendingIncoming = tx.status === TransactionStatus.PENDING && + (tx.type === TransactionType.RECEIVE || tx.type === TransactionType.RECEIVE_BY_PAYMENT_REQUEST) + + if (isPendingIncoming) { + toDelete.push(tx.id) + self.transactionsMap.delete(key as string) + } + }) + + if (toDelete.length > 0) { + self.history.replace(self.history.filter(t => !toDelete.includes(t.id))) + self.recentByUnit.replace(self.recentByUnit.filter(t => !toDelete.includes(t.id))) + } + + return Database.deleteIncomingPending() + }, + })) .actions(self => ({ diff --git a/src/screens/TranHistoryScreen.tsx b/src/screens/TranHistoryScreen.tsx index 3dd26a2a..6928e757 100644 --- a/src/screens/TranHistoryScreen.tsx +++ b/src/screens/TranHistoryScreen.tsx @@ -62,6 +62,7 @@ export const TranHistoryScreen = observer(function TranHistoryScreen({ route }: const [expiredDbCount, setExpiredDbCount] = useState(0) const [erroredDbCount, setErroredDbCount] = useState(0) const [revertedDbCount, setRevertedDbCount] = useState(0) + const [incomingPendingDbCount, setIncomingPendingDbCount] = useState(0) const [isAll, setIsAll] = useState(false) const [pendingIsAll, setPendingIsAll] = useState(false) @@ -71,11 +72,12 @@ export const TranHistoryScreen = observer(function TranHistoryScreen({ route }: const countByStatus = Database.getTransactionsCount() log.trace('Database transaction counts', {countByStatus}) - + setPendingDbCount(countByStatus[TransactionStatus.PENDING] || 0) setExpiredDbCount(countByStatus[TransactionStatus.EXPIRED] || 0) setErroredDbCount(countByStatus[TransactionStatus.ERROR] || 0) setRevertedDbCount(countByStatus[TransactionStatus.REVERTED] || 0) + setIncomingPendingDbCount(Database.getIncomingPendingCount()) setTotalDbCount(countByStatus.total) // Preload transactions to model in case they are not there @@ -204,18 +206,38 @@ export const TranHistoryScreen = observer(function TranHistoryScreen({ route }: try { toggleDeleteModal() setIsLoading(true) - transactionsStore.deleteByStatus(status) + transactionsStore.deleteByStatus(status) const countByStatus = Database.getTransactionsCount() setPendingDbCount(countByStatus[TransactionStatus.PENDING] || 0) setExpiredDbCount(countByStatus[TransactionStatus.EXPIRED] || 0) setErroredDbCount(countByStatus[TransactionStatus.ERROR] || 0) setRevertedDbCount(countByStatus[TransactionStatus.REVERTED] || 0) - setTotalDbCount(countByStatus.total) + setIncomingPendingDbCount(Database.getIncomingPendingCount()) + setTotalDbCount(countByStatus.total) setIsLoading(false) } catch (e: any) { handleError(e) - } + } + } + + const onDeleteIncomingPending = function () { + try { + toggleDeleteModal() + setIsLoading(true) + transactionsStore.deleteIncomingPending() + const countByStatus = Database.getTransactionsCount() + + setPendingDbCount(countByStatus[TransactionStatus.PENDING] || 0) + setExpiredDbCount(countByStatus[TransactionStatus.EXPIRED] || 0) + setErroredDbCount(countByStatus[TransactionStatus.ERROR] || 0) + setRevertedDbCount(countByStatus[TransactionStatus.REVERTED] || 0) + setIncomingPendingDbCount(Database.getIncomingPendingCount()) + setTotalDbCount(countByStatus.total) + setIsLoading(false) + } catch (e: any) { + handleError(e) + } } const handleError = function (e: AppError): void { @@ -358,9 +380,18 @@ export const TranHistoryScreen = observer(function TranHistoryScreen({ route }: +