"Complete-product-UX-improvements-with-navigation-and-category-enhancements"

This commit is contained in:
sysadmin 2025-08-28 12:18:45 +01:00
parent 7e364b2a44
commit 9714e9d37b
4 changed files with 89 additions and 15 deletions

Binary file not shown.

View File

@ -194,13 +194,47 @@ namespace TeleBot.Handlers
var category = categories.FirstOrDefault(c => c.Id == categoryId);
var products = await _shopService.GetProductsAsync(categoryId, 1);
// Edit the original message to show category header (bigger, more prominent)
var headerText = $"🛍️ **{category?.Name ?? "Unknown Category"} PRODUCTS**\n\n📋 Browse individual products below:";
await bot.EditMessageTextAsync(
message.Chat.Id,
message.MessageId,
MessageFormatter.FormatProductList(products, category?.Name),
headerText,
parseMode: Telegram.Bot.Types.Enums.ParseMode.Markdown,
replyMarkup: MenuBuilder.ProductListMenu(products, categoryId, 1)
replyMarkup: MenuBuilder.CategoryNavigationMenu(categoryId)
);
// Send individual product bubbles
if (products.Items.Any())
{
foreach (var product in products.Items)
{
await bot.SendTextMessageAsync(
message.Chat.Id,
MessageFormatter.FormatSingleProduct(product),
parseMode: Telegram.Bot.Types.Enums.ParseMode.Markdown,
replyMarkup: MenuBuilder.SingleProductMenu(product.Id)
);
}
// Send navigation message after all products
await bot.SendTextMessageAsync(
message.Chat.Id,
"🔽 *Navigation*",
parseMode: Telegram.Bot.Types.Enums.ParseMode.Markdown,
replyMarkup: MenuBuilder.ProductNavigationMenu(categoryId)
);
}
else
{
await bot.SendTextMessageAsync(
message.Chat.Id,
"No products available in this category.",
replyMarkup: MenuBuilder.BackToCategoriesMenu()
);
}
session.State = SessionState.ViewingProducts;
}
@ -244,6 +278,14 @@ namespace TeleBot.Handlers
replyMarkup: MenuBuilder.SingleProductMenu(product.Id)
);
}
// Send navigation message after all products
await bot.SendTextMessageAsync(
message.Chat.Id,
"🔽 *Navigation*",
parseMode: Telegram.Bot.Types.Enums.ParseMode.Markdown,
replyMarkup: MenuBuilder.ProductNavigationMenu(categoryId)
);
}
else
{

View File

@ -28,9 +28,11 @@ namespace TeleBot.UI
foreach (var category in categories)
{
// Add description to category button text
var categoryText = GetCategoryDisplayText(category.Name, category.Description);
buttons.Add(new[] {
InlineKeyboardButton.WithCallbackData(
$"📁 {category.Name}",
categoryText,
$"category:{category.Id}"
)
});
@ -352,5 +354,45 @@ namespace TeleBot.UI
}
});
}
public static InlineKeyboardMarkup ProductNavigationMenu(Guid? categoryId)
{
return new InlineKeyboardMarkup(new[]
{
new[] {
InlineKeyboardButton.WithCallbackData("⬅️ Back to Categories", "browse"),
InlineKeyboardButton.WithCallbackData("🛒 View Cart", "cart")
},
new[] {
InlineKeyboardButton.WithCallbackData("🏠 Main Menu", "menu")
}
});
}
private static string GetCategoryDisplayText(string categoryName, string? description)
{
var emoji = categoryName.ToLower() switch
{
var name when name.Contains("electronics") => "📱",
var name when name.Contains("clothing") || name.Contains("fashion") => "👕",
var name when name.Contains("books") || name.Contains("book") => "📚",
var name when name.Contains("home") || name.Contains("house") => "🏠",
var name when name.Contains("sports") || name.Contains("fitness") => "⚽",
var name when name.Contains("beauty") || name.Contains("cosmetics") => "💄",
var name when name.Contains("food") || name.Contains("grocery") => "🍎",
_ => "📦"
};
if (!string.IsNullOrEmpty(description))
{
// Truncate description for button
var shortDesc = description.Length > 40
? description.Substring(0, 37) + "..."
: description;
return $"{emoji} {categoryName}\n{shortDesc}";
}
return $"{emoji} {categoryName}";
}
}
}

View File

@ -30,18 +30,8 @@ namespace TeleBot.UI
public static string FormatCategories(List<Category> categories)
{
var sb = new StringBuilder();
sb.AppendLine("📁 *Product Categories*\n");
foreach (var category in categories)
{
sb.AppendLine($"• *{category.Name}*");
if (!string.IsNullOrEmpty(category.Description))
{
sb.AppendLine($" _{category.Description}_");
}
}
sb.AppendLine("\nSelect a category to browse products:");
sb.AppendLine("🛍️ **PRODUCT CATEGORIES**\n");
sb.AppendLine("🔽 Choose a category to start shopping:");
return sb.ToString();
}