Fix: TeleBot variant callbacks now use CallbackDataMapper to decode short IDs - fixes GUID parsing errors
This commit is contained in:
parent
76707eb565
commit
0801fb004c
@ -1268,11 +1268,16 @@ namespace TeleBot.Handlers
|
|||||||
private async Task HandleSelectVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
|
private async Task HandleSelectVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
|
||||||
{
|
{
|
||||||
// Format: selectvar:productId:quantity:multiBuyId
|
// Format: selectvar:productId:quantity:multiBuyId
|
||||||
var productId = Guid.Parse(data[1]);
|
// Use mapper to decode short IDs back to GUIDs
|
||||||
var quantity = int.Parse(data[2]);
|
var (_, productId, quantity, multiBuyId) = _mapper.ParseCallback(string.Join(":", data));
|
||||||
var multiBuyId = data.Length > 3 && data[3] != "null" ? data[3] : null;
|
|
||||||
|
|
||||||
var product = await _shopService.GetProductAsync(productId);
|
if (!productId.HasValue || !quantity.HasValue)
|
||||||
|
{
|
||||||
|
_logger.LogError("Invalid callback data for selectvar: {Data}", string.Join(":", data));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var product = await _shopService.GetProductAsync(productId.Value);
|
||||||
if (product == null)
|
if (product == null)
|
||||||
{
|
{
|
||||||
await bot.SendTextMessageAsync(message.Chat.Id, "Product not found.");
|
await bot.SendTextMessageAsync(message.Chat.Id, "Product not found.");
|
||||||
@ -1281,14 +1286,14 @@ namespace TeleBot.Handlers
|
|||||||
|
|
||||||
// Clear any previous selections
|
// Clear any previous selections
|
||||||
session.TempData["selected_variants"] = new List<string>();
|
session.TempData["selected_variants"] = new List<string>();
|
||||||
session.TempData["current_product"] = productId;
|
session.TempData["current_product"] = productId.Value;
|
||||||
session.TempData["current_quantity"] = quantity;
|
session.TempData["current_quantity"] = quantity.Value;
|
||||||
session.TempData["current_multibuy"] = multiBuyId;
|
session.TempData["current_multibuy"] = multiBuyId?.ToString();
|
||||||
|
|
||||||
await bot.EditMessageReplyMarkupAsync(
|
await bot.EditMessageReplyMarkupAsync(
|
||||||
message.Chat.Id,
|
message.Chat.Id,
|
||||||
message.MessageId,
|
message.MessageId,
|
||||||
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity, multiBuyId)
|
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity.Value, multiBuyId?.ToString())
|
||||||
);
|
);
|
||||||
|
|
||||||
session.State = SessionState.SelectingVariants;
|
session.State = SessionState.SelectingVariants;
|
||||||
@ -1297,10 +1302,17 @@ namespace TeleBot.Handlers
|
|||||||
private async Task HandleSetVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
|
private async Task HandleSetVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
|
||||||
{
|
{
|
||||||
// Format: setvariant:productId:variantName (for single item)
|
// Format: setvariant:productId:variantName (for single item)
|
||||||
var productId = Guid.Parse(data[1]);
|
// Use mapper to decode short IDs back to GUIDs
|
||||||
|
var (_, productId, _, _) = _mapper.ParseCallback(string.Join(":", data.Take(2)));
|
||||||
var variantName = data[2];
|
var variantName = data[2];
|
||||||
|
|
||||||
var product = await _shopService.GetProductAsync(productId);
|
if (!productId.HasValue)
|
||||||
|
{
|
||||||
|
_logger.LogError("Invalid callback data for setvariant: {Data}", string.Join(":", data));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var product = await _shopService.GetProductAsync(productId.Value);
|
||||||
if (product == null) return;
|
if (product == null) return;
|
||||||
|
|
||||||
// For single item, replace selection
|
// For single item, replace selection
|
||||||
@ -1325,12 +1337,17 @@ namespace TeleBot.Handlers
|
|||||||
private async Task HandleAddVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
|
private async Task HandleAddVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
|
||||||
{
|
{
|
||||||
// Format: addvariant:productId:quantity:variantName:multiBuyId (for multi-buy)
|
// Format: addvariant:productId:quantity:variantName:multiBuyId (for multi-buy)
|
||||||
var productId = Guid.Parse(data[1]);
|
// Use mapper to decode short IDs back to GUIDs
|
||||||
var quantity = int.Parse(data[2]);
|
var (_, productId, quantity, multiBuyId) = _mapper.ParseCallback(string.Join(":", data.Take(4)));
|
||||||
var variantName = data[3];
|
var variantName = data[3];
|
||||||
var multiBuyId = data.Length > 4 && data[4] != "null" ? data[4] : null;
|
|
||||||
|
|
||||||
var product = await _shopService.GetProductAsync(productId);
|
if (!productId.HasValue || !quantity.HasValue)
|
||||||
|
{
|
||||||
|
_logger.LogError("Invalid callback data for addvariant: {Data}", string.Join(":", data));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var product = await _shopService.GetProductAsync(productId.Value);
|
||||||
if (product == null) return;
|
if (product == null) return;
|
||||||
|
|
||||||
// Get current selections
|
// Get current selections
|
||||||
@ -1339,7 +1356,7 @@ namespace TeleBot.Handlers
|
|||||||
: new List<string>();
|
: new List<string>();
|
||||||
|
|
||||||
// Add variant if not at quantity limit
|
// Add variant if not at quantity limit
|
||||||
if (selectedVariants.Count < quantity)
|
if (selectedVariants.Count < quantity.Value)
|
||||||
{
|
{
|
||||||
selectedVariants.Add(variantName);
|
selectedVariants.Add(variantName);
|
||||||
session.TempData["selected_variants"] = selectedVariants;
|
session.TempData["selected_variants"] = selectedVariants;
|
||||||
@ -1348,34 +1365,39 @@ namespace TeleBot.Handlers
|
|||||||
await bot.EditMessageReplyMarkupAsync(
|
await bot.EditMessageReplyMarkupAsync(
|
||||||
message.Chat.Id,
|
message.Chat.Id,
|
||||||
message.MessageId,
|
message.MessageId,
|
||||||
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity, multiBuyId, selectedVariants)
|
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity.Value, multiBuyId?.ToString(), selectedVariants)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task HandleConfirmVariant(ITelegramBotClient bot, CallbackQuery callbackQuery, UserSession session, string[] data)
|
private async Task HandleConfirmVariant(ITelegramBotClient bot, CallbackQuery callbackQuery, UserSession session, string[] data)
|
||||||
{
|
{
|
||||||
// Format: confirmvar:productId:quantity:multiBuyId:variantList
|
// Format: confirmvar:productId:quantity:multiBuyId:variantList
|
||||||
var productId = Guid.Parse(data[1]);
|
// Use mapper to decode short IDs back to GUIDs
|
||||||
var quantity = int.Parse(data[2]);
|
var (_, productId, quantity, multiBuyId) = _mapper.ParseCallback(string.Join(":", data.Take(4)));
|
||||||
var multiBuyId = data[3] != "null" ? Guid.Parse(data[3]) : (Guid?)null;
|
|
||||||
var variantString = data[4];
|
var variantString = data[4];
|
||||||
var selectedVariants = variantString.Split(',').ToList();
|
var selectedVariants = variantString.Split(',').ToList();
|
||||||
|
|
||||||
var product = await _shopService.GetProductAsync(productId);
|
if (!productId.HasValue || !quantity.HasValue)
|
||||||
|
{
|
||||||
|
_logger.LogError("Invalid callback data for confirmvar: {Data}", string.Join(":", data));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var product = await _shopService.GetProductAsync(productId.Value);
|
||||||
if (product == null) return;
|
if (product == null) return;
|
||||||
|
|
||||||
// Add to cart with selected variants
|
// Add to cart with selected variants
|
||||||
var cartItem = session.Cart.AddItem(product, quantity, multiBuyId, variantId: null, selectedVariants);
|
var cartItem = session.Cart.AddItem(product, quantity.Value, multiBuyId, variantId: null, selectedVariants);
|
||||||
|
|
||||||
// Show success message
|
// Show success message
|
||||||
await bot.AnswerCallbackQueryAsync(
|
await bot.AnswerCallbackQueryAsync(
|
||||||
callbackQuery.Id,
|
callbackQuery.Id,
|
||||||
$"✅ Added {quantity}x {product.Name} with {string.Join(", ", selectedVariants)} to cart!",
|
$"✅ Added {quantity.Value}x {product.Name} with {string.Join(", ", selectedVariants)} to cart!",
|
||||||
showAlert: true
|
showAlert: true
|
||||||
);
|
);
|
||||||
|
|
||||||
// Return to product view
|
// Return to product view
|
||||||
await HandleProductDetail(bot, callbackQuery.Message!, session, productId);
|
await HandleProductDetail(bot, callbackQuery.Message!, session, productId.Value);
|
||||||
|
|
||||||
// Clear temp data
|
// Clear temp data
|
||||||
session.TempData.Remove("selected_variants");
|
session.TempData.Remove("selected_variants");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user