49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from .context import ContextData, CallbackCommand
|
|
|
|
|
|
def save_navigation_context(
|
|
callback_data: ContextData, state_data: dict
|
|
) -> list[ContextData]:
|
|
stack = [
|
|
ContextData.unpack(item) for item in state_data.get("navigation_stack", [])
|
|
]
|
|
data_nc = state_data.get("navigation_context")
|
|
navigation_context = ContextData.unpack(data_nc) if data_nc else None
|
|
if callback_data.back:
|
|
callback_data.back = False
|
|
if stack:
|
|
stack.pop()
|
|
else:
|
|
if (
|
|
stack
|
|
and navigation_context
|
|
and navigation_context.command == callback_data.command
|
|
and navigation_context.command != CallbackCommand.USER_COMMAND
|
|
):
|
|
navigation_context = callback_data
|
|
elif navigation_context:
|
|
stack.append(navigation_context)
|
|
|
|
state_data["navigation_stack"] = [item.pack() for item in stack]
|
|
state_data["navigation_context"] = callback_data.pack()
|
|
|
|
return stack
|
|
|
|
|
|
def pop_navigation_context(stack: list[ContextData]) -> ContextData | None:
|
|
if stack:
|
|
data = stack[-1]
|
|
data.back = True
|
|
return data
|
|
|
|
|
|
def get_navigation_context(
|
|
state_data: dict,
|
|
) -> tuple[list[ContextData], ContextData | None]:
|
|
data_nc = state_data.get("navigation_context")
|
|
context = ContextData.unpack(data_nc) if data_nc else None
|
|
return (
|
|
[ContextData.unpack(item) for item in state_data.get("navigation_stack", [])],
|
|
context,
|
|
)
|