Skip to content

feat: permitir limpiar facturas pendientes desde el historial #112

Description

@Delgado74

Descripción

Actualmente, cuando una factura Lightning se queda en estado pendiente (por ejemplo, porque el usuario salió de la pantalla de recibir, el timeout de monitoreo expiró, o la factura nunca se pagó), la transacción sigue apareciendo en el historial sin que el usuario pueda hacer nada para ocultarla.

Issue relacionado: #107 (facturas creadas desde "Recibir" aparecían en el historial). Ese problema se resolvió con los PRs #108 y #111 para el flujo de creación de facturas, pero no cubre el caso general de cualquier transacción pendiente que el usuario quiera limpiar manualmente desde el historial.

Comportamiento esperado

El usuario debe poder eliminar del historial una transacción pendiente directamente desde la pantalla de historial, con las siguientes acciones:

  1. La transacción se oculta del listado (deja de mostrarse)
  2. Se registra el payment_hash en un store local persistente (ClearedInvoiceStore) para que no reaparezca al recargar o reiniciar la app
  3. Opcionalmente, se intenta cancelar la factura en el servidor LNBits via DELETE /api/v1/payments/{paymentHash} (sin bloquear la UI si falla)

Base técnica

El PR #111 (abierto) ya implementa la infraestructura necesaria:

  • ClearedInvoiceStore — persistencia local de hashes limpiados vía SharedPreferences
  • InvoiceService.cancelInvoice() — intento de cancelación en servidor LNBits
  • Filtro en _filteredTransactions de HistoryScreen para excluir transacciones cuyo hash está en el store

Ese PR cubre solo el caso de facturas creadas desde la pantalla "Recibir". Este issue propone extenderlo para que desde el historial se pueda invocar la misma lógica sobre cualquier transacción pendiente.

Alternativas de implementación

Opción A — Botón en el bottom sheet de detalles (Recomendada)

Al hacer tap en una transacción pendiente → se abre el modal de detalles actual → agregar un botón "Limpiar del historial" al final del modal (visible solo cuando transaction.isPending && transaction.paymentHash != null).

Pros:

  • Consistente con el flujo actual de interacción (tap → detalles)
  • No añade complejidad visual a la lista
  • Fácil de implementar

Contra:

  • Requiere un tap adicional para llegar al botón

Opción B — Swipe-to-dismiss en cards pendientes

Las transacciones pendientes se pueden deslizar (swipe) a la izquierda o derecha para limpiarlas, con confirmación.

Pros:

  • Acción rápida, gesto natural en móvil
  • Visible sin taps adicionales

Contra:

  • Puede activarse por accidente (requiere confirmación)
  • Menos discoverable para nuevos usuarios

Opción C — Combinación: swipe + botón en detalles

Ambas opciones disponibles. Swipe para acción rápida, botón en detalles para descubribilidad.

Archivos a modificar

Archivo Cambio
lib/screens/7history_screen.dart Agregar botón/swipe para limpiar facturas pendientes
lib/l10n/app_es.arb Nuevos strings de localización
lib/l10n/app_en.arb Nuevos strings de localización

(El resto de archivos ya están cubiertos por el PR #111)

Nuevos strings de localización necesarios

Key ES EN
clear_pending_invoice "Limpiar del historial" "Clear from history"
clear_pending_confirm_title "¿Limpiar factura pendiente?" "Clear pending invoice?"
clear_pending_confirm_message "Esta transacción pendiente se eliminará del historial. La factura seguirá existiendo en LNBits hasta su expiración." "This pending transaction will be removed from history. The invoice will remain on LNBits until it expires."
invoice_cleared_from_history "Factura eliminada del historial" "Invoice removed from history"

Pregunta al equipo

¿Cuál opción de interacción prefieren para limpiar transacciones pendientes desde el historial?

  • Opción A: Botón dentro del modal de detalles (tap → detalles → botón "Limpiar")
  • Opción B: Swipe-to-dismiss en la card de la transacción pendiente
  • Opción C: Ambas (swipe + botón en detalles)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions