Enhance payment method history handling and navigation

- Added a new keyboard function to facilitate navigation back to specific payment method details.
- Updated the payment method history handler to utilize the new back navigation option, improving user experience when no payment history is available.
- Enhanced error handling for extracting payment method IDs from callback data to ensure smoother navigation.
This commit is contained in:
machka-pasla
2025-09-04 17:44:31 +03:00
parent a510ab1021
commit 793412c472
2 changed files with 23 additions and 3 deletions
+15 -3
View File
@@ -14,7 +14,7 @@ from bot.keyboards.inline.user_keyboards import (
get_payment_url_keyboard, get_back_to_main_menu_markup,
get_payment_methods_manage_keyboard, get_payment_method_delete_confirm_keyboard,
get_payment_method_details_keyboard, get_bind_url_keyboard,
get_payment_methods_list_keyboard, get_back_to_payment_methods_keyboard)
get_payment_methods_list_keyboard, get_back_to_payment_methods_keyboard, get_back_to_payment_method_details_keyboard)
from bot.services.yookassa_service import YooKassaService
from db.dal import user_billing_dal
from bot.services.stars_service import StarsService
@@ -763,7 +763,14 @@ async def payment_method_history(callback: types.CallbackQuery, settings: Settin
payments = await payment_dal.get_recent_payment_logs_with_user(session, limit=10, offset=0)
user_payments = [p for p in payments if p.user_id == callback.from_user.id]
if not user_payments:
await callback.message.edit_text(_("payment_method_no_history"), reply_markup=get_payment_methods_manage_keyboard(current_lang, i18n, has_card=True))
# Try to get pm_id from context to go one step back
pm_id = ""
try:
_, _, pm_id = callback.data.split(":", 2)
except Exception:
pm_id = ""
back_markup = get_back_to_payment_method_details_keyboard(pm_id, current_lang, i18n) if pm_id else get_payment_methods_manage_keyboard(current_lang, i18n, has_card=True)
await callback.message.edit_text(_("payment_method_no_history"), reply_markup=back_markup)
return
# Show subscription purchase titles instead of raw provider/status
def _format_item(p):
@@ -773,7 +780,12 @@ async def payment_method_history(callback: types.CallbackQuery, settings: Settin
lines = [_format_item(p) for p in user_payments]
text = _("payment_method_tx_history_title") + "\n\n" + "\n".join(lines)
await callback.message.edit_text(text, reply_markup=get_payment_methods_manage_keyboard(current_lang, i18n, has_card=True))
try:
_, _, pm_id = callback.data.split(":", 2)
except Exception:
pm_id = ""
back_markup = get_back_to_payment_method_details_keyboard(pm_id, current_lang, i18n) if pm_id else get_payment_methods_manage_keyboard(current_lang, i18n, has_card=True)
await callback.message.edit_text(text, reply_markup=back_markup)
@router.callback_query(F.data.startswith("pm:list:"))
+8
View File
@@ -320,3 +320,11 @@ def get_back_to_payment_methods_keyboard(lang: str, i18n_instance) -> InlineKeyb
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text=_(key="back_to_main_menu_button"), callback_data="pm:list:0"))
return builder.as_markup()
def get_back_to_payment_method_details_keyboard(pm_id: str, lang: str, i18n_instance) -> InlineKeyboardMarkup:
_ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs)
builder = InlineKeyboardBuilder()
# Back one step: return to specific payment method details
builder.row(InlineKeyboardButton(text=_(key="back_to_main_menu_button"), callback_data=f"pm:view:{pm_id}"))
return builder.as_markup()