Files
shveitechbot/misc/kb/client.py

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()