diff --git a/TeleBot/TeleBot/Handlers/CallbackHandler.cs b/TeleBot/TeleBot/Handlers/CallbackHandler.cs index 35db0c2..197fad2 100644 --- a/TeleBot/TeleBot/Handlers/CallbackHandler.cs +++ b/TeleBot/TeleBot/Handlers/CallbackHandler.cs @@ -176,6 +176,10 @@ namespace TeleBot.Handlers await HandleViewPayment(bot, callbackQuery.Message, session, Guid.Parse(data[1]), callbackQuery.From); break; + case "retry_payment": + await HandleRetryPayment(bot, callbackQuery.Message, session, Guid.Parse(data[1])); + break; + case "reviews": await HandleViewReviews(bot, callbackQuery.Message, session); break; @@ -990,9 +994,10 @@ namespace TeleBot.Handlers $"This might be due to:\n" + $"• Payment gateway temporarily unavailable\n" + $"• Network connectivity issues\n\n" + - $"Your cart has been restored. Please try again.", + $"Order ID: {orderId}\n" + + $"You can retry payment creation or your cart has been restored.", Telegram.Bot.Types.Enums.ParseMode.Markdown, - _menuBuilder.CartMenu(session.Cart) + _menuBuilder.PaymentFailedMenu(orderId, session.Cart) ); return; } @@ -1030,9 +1035,10 @@ namespace TeleBot.Handlers $"❌ *Payment System Error*\n\n" + $"Sorry, there was a technical issue creating your {currency} payment.\n\n" + $"Our payment system may be undergoing maintenance.\n" + - $"Your cart has been restored. Please try again later.", + $"Order ID: {orderId}\n" + + $"You can retry payment or your cart has been restored.", Telegram.Bot.Types.Enums.ParseMode.Markdown, - _menuBuilder.CartMenu(session.Cart) + _menuBuilder.PaymentFailedMenu(orderId, session.Cart) ); return; } @@ -1176,6 +1182,25 @@ namespace TeleBot.Handlers session.State = SessionState.ViewingOrder; } + private async Task HandleRetryPayment(ITelegramBotClient bot, Message message, UserSession session, Guid orderId) + { + // Store order ID for payment retry + session.TempData["current_order_id"] = orderId; + + // Show payment currency selection again + var currencies = await _shopService.GetAvailableCurrenciesAsync(); + + await bot.EditMessageTextAsync( + message.Chat.Id, + message.MessageId, + $"💰 *Select Payment Method*\n\n" + + $"Order ID: {orderId.ToString().Substring(orderId.ToString().Length - 8).ToUpper()}\n\n" + + $"Choose your preferred cryptocurrency:", + parseMode: Telegram.Bot.Types.Enums.ParseMode.Markdown, + replyMarkup: MenuBuilder.PaymentCurrencyMenu(currencies, orderId) + ); + } + private async Task HandleViewPayment(ITelegramBotClient bot, Message message, UserSession session, Guid orderId, User telegramUser) { var order = await _shopService.GetCustomerOrderAsync( @@ -1334,8 +1359,56 @@ namespace TeleBot.Handlers private async Task HandleRefreshConversation(ITelegramBotClient bot, CallbackQuery callbackQuery, UserSession session) { - await ShowCustomerConversationInCallback(bot, callbackQuery, session); - await bot.AnswerCallbackQueryAsync(callbackQuery.Id, "Messages refreshed"); + try + { + var user = callbackQuery.From; + + // Get conversation history for this customer + var messages = await _shopService.GetCustomerConversationAsync( + user.Id, + user.Username ?? "", + $"{user.FirstName} {user.LastName}".Trim(), + user.FirstName ?? "", + user.LastName ?? "" + ); + + var conversationText = "💬 *Your Messages*\n\n"; + + if (messages?.Any() == true) + { + conversationText += "Recent conversation:\n\n"; + + foreach (var msg in messages.OrderBy(m => m.CreatedAt).TakeLast(8)) // Show last 8 messages + { + var isFromBusiness = msg.Direction == 0; // AdminToCustomer + var sender = isFromBusiness ? "🏪 Shop" : "👤 You"; + var time = msg.CreatedAt.ToString("MMM dd, HH:mm"); + + conversationText += $"*{sender}* _{time}_\n{msg.Content}\n\n"; + } + + conversationText += "_Type your message or use buttons below._"; + + // Send new message instead of editing to preserve history + await bot.SendTextMessageAsync( + callbackQuery.Message!.Chat.Id, + conversationText, + parseMode: Telegram.Bot.Types.Enums.ParseMode.Markdown, + replyMarkup: MenuBuilder.ConversationMenu() + ); + + await bot.AnswerCallbackQueryAsync(callbackQuery.Id, "Messages refreshed"); + } + else + { + await bot.AnswerCallbackQueryAsync(callbackQuery.Id, "No new messages", showAlert: false); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error refreshing conversation"); + await bot.AnswerCallbackQueryAsync(callbackQuery.Id, "Error refreshing messages", showAlert: true); + } } private async Task HandleExitChat(ITelegramBotClient bot, CallbackQuery callbackQuery, UserSession session) diff --git a/TeleBot/TeleBot/UI/MenuBuilder.cs b/TeleBot/TeleBot/UI/MenuBuilder.cs index 075678d..259fc42 100644 --- a/TeleBot/TeleBot/UI/MenuBuilder.cs +++ b/TeleBot/TeleBot/UI/MenuBuilder.cs @@ -24,8 +24,7 @@ namespace TeleBot.UI new[] { InlineKeyboardButton.WithCallbackData("🛒 View Basket", "cart") }, new[] { InlineKeyboardButton.WithCallbackData("📦 My Orders", "orders") }, new[] { InlineKeyboardButton.WithCallbackData("⭐ Reviews", "reviews") }, - new[] { InlineKeyboardButton.WithCallbackData("💬 Support", "support") }, - new[] { InlineKeyboardButton.WithCallbackData("❓ Help", "help") } + new[] { InlineKeyboardButton.WithCallbackData("💬 Support", "support") } }); } @@ -228,6 +227,32 @@ namespace TeleBot.UI return new InlineKeyboardMarkup(buttons); } + public InlineKeyboardMarkup PaymentFailedMenu(Guid orderId, ShoppingCart cart) + { + var buttons = new List + { + new[] + { + InlineKeyboardButton.WithCallbackData("🔄 Retry Payment", $"retry_payment:{orderId}") + } + }; + + if (!cart.IsEmpty()) + { + buttons.Add(new[] + { + InlineKeyboardButton.WithCallbackData("🛒 View Basket", "cart") + }); + } + + buttons.Add(new[] + { + InlineKeyboardButton.WithCallbackData("🏠 Main Menu", "menu") + }); + + return new InlineKeyboardMarkup(buttons); + } + public InlineKeyboardMarkup CartMenu(ShoppingCart cart) { var buttons = new List();