bober-bbq-bot/bot/handlers/cart.py
byrsapty 0eabebaca3 Initial commit: Bober BBQ Telegram bot + backend + admin + Mini App
Flask API/admin backend, aiogram bot with delivery/pickup FSM flows,
monobank payment integration, and a Vite/React Telegram Mini App for
menu browsing and cart management.
2026-08-08 15:50:50 +03:00

71 lines
2.5 KiB
Python

from aiogram import F, Router
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery, Message
from bot.handlers.delivery import start_delivery_flow
from bot.handlers.pickup import start_pickup_flow
from bot.keyboards import BTN_CART, cart_keyboard
from bot.services.cart_service import change_quantity, clear_cart, get_cart_items, remove_item, render_cart_text
router = Router(name="cart")
async def _render_cart(user_id: int):
items = get_cart_items(user_id)
return render_cart_text(items), cart_keyboard(items)
@router.message(F.text == BTN_CART)
async def show_cart(message: Message):
text, keyboard = await _render_cart(message.from_user.id)
await message.answer(text, reply_markup=keyboard)
@router.callback_query(F.data == "noop")
async def noop(callback: CallbackQuery):
await callback.answer()
@router.callback_query(F.data.startswith("cart:inc:"))
async def cart_inc(callback: CallbackQuery):
product_id = int(callback.data.split(":")[2])
change_quantity(callback.from_user.id, product_id, +1)
await _refresh_cart_message(callback)
@router.callback_query(F.data.startswith("cart:dec:"))
async def cart_dec(callback: CallbackQuery):
product_id = int(callback.data.split(":")[2])
change_quantity(callback.from_user.id, product_id, -1)
await _refresh_cart_message(callback)
@router.callback_query(F.data.startswith("cart:del:"))
async def cart_del(callback: CallbackQuery):
product_id = int(callback.data.split(":")[2])
remove_item(callback.from_user.id, product_id)
await _refresh_cart_message(callback)
@router.callback_query(F.data == "cart:clear")
async def cart_clear(callback: CallbackQuery):
clear_cart(callback.from_user.id)
await _refresh_cart_message(callback)
async def _refresh_cart_message(callback: CallbackQuery):
text, keyboard = await _render_cart(callback.from_user.id)
await callback.message.edit_text(text, reply_markup=keyboard)
await callback.answer()
@router.callback_query(F.data == "cart:checkout:delivery")
async def checkout_delivery(callback: CallbackQuery, state: FSMContext):
await callback.answer()
await start_delivery_flow(callback.bot, callback.from_user.id, callback.message.chat.id, state)
@router.callback_query(F.data == "cart:checkout:pickup")
async def checkout_pickup(callback: CallbackQuery, state: FSMContext):
await callback.answer()
await start_pickup_flow(callback.bot, callback.from_user.id, callback.message.chat.id, state)