107 lines
2.8 KiB
Python
107 lines
2.8 KiB
Python
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()
|