from aiogram import F, Router from aiogram.filters import Command from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery, Message 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( "🌸 Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π² Π·Π°ΠΊΠ°Π·Π΅ Π½ΠΈΠΆΠ΅!\n\n" f"Π‘ΡƒΠΌΠΌΠ°: {cart.total}β‚½", 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( "🌸 Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π² Π·Π°ΠΊΠ°Π·Π΅ Π½ΠΈΠΆΠ΅!\n\n" f"Π‘ΡƒΠΌΠΌΠ°: {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, ), )