Files

91 lines
2.3 KiB
Python

from aiogram import Router, F
from aiogram.types import CallbackQuery, Message
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from sqlalchemy.ext.asyncio import AsyncSession
from config import PAGE_SIZE
from misc.kb.client import render_cart
from misc.kb.common import return_menu
from services.orders import OrderService
router = Router()
@router.callback_query(F.data == "cart")
async def cart_init(
cb: CallbackQuery,
state: FSMContext,
session: AsyncSession,
order_service: OrderService,
):
await state.clear()
cart = await order_service.build_pagination_cart_dto(
session, customer=cb.from_user.id
)
if not len(cart.items):
await cb.message.edit_text("🛒 Корзина пуста.", reply_markup=return_menu)
return
await cb.message.edit_text(
f"total: {cart.total}₽ | {len(cart.items)}",
reply_markup=render_cart(
cart.items[:PAGE_SIZE],
show_next=len(cart.items) > PAGE_SIZE,
show_purchase=bool(len(cart.items)),
),
)
@router.message(Command("cart"))
async def cart_cmd(
msg: Message,
state: FSMContext,
session: AsyncSession,
order_service: OrderService,
):
await state.clear()
cart = await order_service.build_pagination_cart_dto(
session, customer=msg.from_user.id
)
if not len(cart.items):
await msg.answer("🛒 Корзина пуста.", reply_markup=return_menu)
return
await msg.answer(
f"total: {cart.total}",
reply_markup=render_cart(
cart.items[:PAGE_SIZE],
show_next=len(cart.items) > PAGE_SIZE,
show_purchase=bool(len(cart.items)),
),
)
@router.callback_query(F.data.startswith("cart:"))
async def cart_pagination(
cb: CallbackQuery,
state: FSMContext,
session: AsyncSession,
order_service: OrderService,
):
await state.clear()
page = int(cb.data.split(":")[1])
cart = await order_service.build_pagination_cart_dto(
session, customer=cb.from_user.id, offset=page * PAGE_SIZE
)
await cb.message.edit_reply_markup(
reply_markup=render_cart(
cart.items[:PAGE_SIZE],
page=page,
show_next=len(cart.items) > PAGE_SIZE,
show_prev=page > 0,
),
)