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.
71 lines
2.5 KiB
Python
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)
|