from typing import Optional from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup from aiogram.utils.keyboard import InlineKeyboardBuilder from db.models import Category from db.models.products import Product def cart_btn(user_id: int) -> InlineKeyboardButton: return InlineKeyboardButton( text="🛒 Корзина ()", callback_data="cart" ) # TODO: Database integration, get cart items count def get_back_to_catalogue( cat_id: int, *, text: Optional[str] = "⬅️ Назад" ) -> InlineKeyboardMarkup: return InlineKeyboardBuilder( [[InlineKeyboardButton(text=text, callback_data=f"cat:{cat_id}")]] ).as_markup() def main_menu_kb(user_id: int) -> InlineKeyboardMarkup: return InlineKeyboardBuilder( [ [ InlineKeyboardButton(text="📦 Каталог", callback_data="cat:root"), InlineKeyboardButton(text="🔍", callback_data="find"), ], [cart_btn(user_id)], ] ).as_markup() def render_category( children: list[Category], parent_id: Optional[int] = None, show_menu: bool = False, ) -> InlineKeyboardMarkup: btns = [ InlineKeyboardButton( text=category.name, callback_data=f"cat:{category.id}", ) for category in children ] nav = [] if parent_id is not None: nav.append( InlineKeyboardButton(text="⬅️ Назад", callback_data=f"cat:{parent_id}") ) if show_menu: nav.append(InlineKeyboardButton(text="⬅️ Назад", callback_data="menu:main")) return InlineKeyboardBuilder( [btns[i : i + 2] for i in range(0, len(children), 2)] + [nav], ).as_markup() def render_products( products: list[Product], *, cat_id: int, page: int = 0, show_prev: Optional[bool] = False, show_next: Optional[bool] = False, ) -> InlineKeyboardMarkup: btns = [ [InlineKeyboardButton(text=product.name, callback_data=f"product:{product.id}")] for product in products ] nav = [] if show_prev: nav.append( InlineKeyboardButton( text="⬅️", callback_data=f"products:{cat_id}:{page - 1}" ) ) nav.append(InlineKeyboardButton(text=str(page), callback_data="...")) if show_next: nav.append( InlineKeyboardButton( text="➡️", callback_data=f"products:{cat_id}:{page + 1}" ) ) return InlineKeyboardBuilder( [ [ InlineKeyboardButton( text="⬅️ Назад", callback_data=f"cat:{cat_id}", ) ] ] + btns + [nav] ).as_markup()