Source code for bauiv1lib.store
# Released under the MIT License. See LICENSE for details.
#
"""Shiny new doc-ui based store."""
from __future__ import annotations # Docs-generation hack.
from typing import override, assert_never, TYPE_CHECKING
import bacommon.docui.routes.classicstore as sroutes
from bauiv1lib.docui import TypedDocUIController
import bauiv1 as bui
from bauiv1 import _classicassets
from bauiv1 import _builtinassets
if TYPE_CHECKING:
import bacommon.docui.v2
import bacommon.docui.routes.classicstore
from bacommon.docui import DocUIResponse
from bauiv1lib.docui import DocUILocalAction
[docs]
class StoreUIController(
TypedDocUIController[sroutes.AnyStoreRoute, sroutes.AnyStoreLocalAction]
):
"""DocUI setup for store."""
[docs]
@override
@classmethod
def get_route_type(
cls,
) -> type[bacommon.docui.routes.classicstore.StoreRoute]:
return sroutes.StoreRoute
[docs]
@override
@classmethod
def get_local_action_type(
cls,
) -> type[bacommon.docui.routes.classicstore.StoreLocalAction]:
return sroutes.StoreLocalAction
[docs]
@override
def fulfill_route(
self, route: bacommon.docui.routes.classicstore.AnyStoreRoute
) -> DocUIResponse:
return self.fulfill_request_cloud(route, 'classicstore')
[docs]
@override
def fulfill_unrouted_request(
self, request: bacommon.docui.v2.Request, error: str
) -> DocUIResponse:
# Something newer than us from the server; let it handle it.
return self.fulfill_request_cloud(request, 'classicstore')
[docs]
@override
def run_local_action(
self,
action: bacommon.docui.routes.classicstore.AnyStoreLocalAction,
context: DocUILocalAction,
) -> None:
match action:
case sroutes.GetTokens():
self._get_tokens(context)
case sroutes.RestorePurchases():
self._restore_purchases()
case _:
assert_never(action)
def _restore_purchases(self) -> None:
plus = bui.app.plus
assert plus is not None
# We should always be signed in here. Make noise if not.
if plus.accounts.primary is None:
bui.screenmessage(
_classicassets.strings.ui.not_signed_in_status, color=(1, 0, 0)
)
_builtinassets.audio.error.get().play()
return
plus.restore_purchases()
def _get_tokens(self, action: DocUILocalAction) -> None:
from bauiv1lib.gettokens import show_get_tokens_window
bui.play_swish()
show_get_tokens_window(origin_widget=bui.existing(action.widget))
# Docs-generation hack; import some stuff that we likely only forward-declared
# in our actual source code so that docs tools can find it.
from typing import (Coroutine, Any, Literal, Callable,
Generator, Awaitable, Sequence, Self, TypeIs)
import asyncio
from concurrent.futures import Future
from pathlib import Path
from enum import Enum