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 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 ) await cb.message.edit_text( f"total: {cart.total}₽", reply_markup=render_cart( cart.items[:PAGE_SIZE], show_next=len(cart.items) > PAGE_SIZE ), ) @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 ) await msg.answer( f"total: {cart.total}₽", reply_markup=render_cart( cart.items[:PAGE_SIZE], show_next=len(cart.items) > PAGE_SIZE ), ) @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, ), )