fix navigation

This commit is contained in:
Alexander Kalinovsky
2025-02-05 16:06:44 +01:00
parent 61d55e186e
commit 873e74f1ba
3 changed files with 35 additions and 18 deletions

View File

@@ -1,4 +1,9 @@
from aiogram.types import Message, CallbackQuery from aiogram.types import Message, CallbackQuery
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from qbot.main import QBotApp
from ..context import CallbackCommand from ..context import CallbackCommand
from ....utils.navigation import ( from ....utils.navigation import (
@@ -44,8 +49,11 @@ async def route_callback(message: Message | CallbackQuery, back: bool = True, **
elif context.command == CallbackCommand.USER_COMMAND: elif context.command == CallbackCommand.USER_COMMAND:
import qbot.bot.handlers.user_handlers.main as user_handler import qbot.bot.handlers.user_handlers.main as user_handler
app: "QBotApp" = kwargs["app"]
cmd = app.bot_commands.get(context.user_command.split("&")[0])
await user_handler.cammand_handler( await user_handler.cammand_handler(
message, from_callback_query=True, **kwargs message=message, cmd=cmd, **kwargs
) )
else: else:
raise ValueError(f"Unknown command {context.command}") raise ValueError(f"Unknown command {context.command}")

View File

@@ -335,12 +335,13 @@ async def process_field_edit_callback(message: Message | CallbackQuery, **kwargs
"callback_data": ContextData( "callback_data": ContextData(
command=CallbackCommand.USER_COMMAND, command=CallbackCommand.USER_COMMAND,
user_command=callback_data.user_command, user_command=callback_data.user_command,
data=callback_data.data,
) )
} }
) )
return await cammand_handler(message=message, **kwargs) cmd=app.bot_commands.get(callback_data.user_command.split("&")[0])
return await cammand_handler(message=message, cmd=cmd, **kwargs)
clear_state(state_data=state_data) clear_state(state_data=state_data)

View File

@@ -14,7 +14,7 @@ from qbot.bot.handlers.editors.main import field_editor
from qbot.bot.handlers.common.routing import route_callback from qbot.bot.handlers.common.routing import route_callback
from qbot.utils.serialization import deserialize from qbot.utils.serialization import deserialize
from qbot.utils.main import get_send_message from qbot.utils.main import get_send_message
from qbot.model.descriptors import CommandCallbackContext from qbot.model.descriptors import BotCommand, CommandCallbackContext
from qbot.model.settings import Settings from qbot.model.settings import Settings
if TYPE_CHECKING: if TYPE_CHECKING:
@@ -37,7 +37,7 @@ async def command_text(message: Message, **kwargs):
state_data = await state.get_data() state_data = await state.get_data()
kwargs["state_data"] = state_data kwargs["state_data"] = state_data
await cammand_handler(message=message, callback_data=callback_data, **kwargs) await process_command_handler(message=message, callback_data=callback_data, **kwargs)
@router.callback_query(ContextData.filter(F.command == CallbackCommand.USER_COMMAND)) @router.callback_query(ContextData.filter(F.command == CallbackCommand.USER_COMMAND))
@@ -46,19 +46,36 @@ async def command_callback(message: CallbackQuery, **kwargs):
state_data = await state.get_data() state_data = await state.get_data()
kwargs["state_data"] = state_data kwargs["state_data"] = state_data
await cammand_handler(message=message, **kwargs) await process_command_handler(message=message, **kwargs)
async def cammand_handler(message: Message | CallbackQuery, **kwargs): async def process_command_handler(message: Message | CallbackQuery, **kwargs):
callback_data: ContextData = kwargs["callback_data"]
state: FSMContext = kwargs["state"]
state_data: dict = kwargs["state_data"] state_data: dict = kwargs["state_data"]
callback_data: ContextData = kwargs["callback_data"]
app: "QBotApp" = kwargs["app"] app: "QBotApp" = kwargs["app"]
cmd = app.bot_commands.get(callback_data.user_command.split("&")[0]) cmd = app.bot_commands.get(callback_data.user_command.split("&")[0])
if cmd is None: if cmd is None:
return return
if cmd.clear_navigation:
state_data.pop("navigation_stack", None)
state_data.pop("navigation_context", None)
if cmd.register_navigation:
clear_state(state_data=state_data)
save_navigation_context(callback_data=callback_data, state_data=state_data)
await cammand_handler(message=message, cmd=cmd, **kwargs)
async def cammand_handler(message: Message | CallbackQuery, cmd: BotCommand, **kwargs):
callback_data: ContextData = kwargs["callback_data"]
state: FSMContext = kwargs["state"]
state_data: dict = kwargs["state_data"]
app: "QBotApp" = kwargs["app"]
entity_data_dict: dict = state_data.get("entity_data") entity_data_dict: dict = state_data.get("entity_data")
form_data = ( form_data = (
{ {
@@ -106,20 +123,11 @@ async def cammand_handler(message: Message | CallbackQuery, **kwargs):
return await field_editor(message=message, **kwargs) return await field_editor(message=message, **kwargs)
if cmd.clear_navigation:
state_data.pop("navigation_stack", None)
state_data.pop("navigation_context", None)
if cmd.register_navigation:
clear_state(state_data=state_data)
save_navigation_context(callback_data=callback_data, state_data=state_data)
await cmd.handler(callback_context) await cmd.handler(callback_context)
if callback_context.register_navigation: if callback_context.register_navigation:
await state.set_data(state_data) await state.set_data(state_data)
# if command.register_navigation:
stack, navigation_context = get_navigation_context(state_data=state_data) stack, navigation_context = get_navigation_context(state_data=state_data)
back_callback_data = pop_navigation_context(stack=stack) back_callback_data = pop_navigation_context(stack=stack)
if back_callback_data: if back_callback_data: