from __future__ import annotations import logging from asyncio import sleep from rio import Component, Column, Row, Text, Spacer, page, Rectangle, QueryParameter, ProgressCircle from rio.event import on_populate from elm.services import AccountingService logger = logging.getLogger(__name__.split(".")[-1]) @page(name="PayPal Return", url_segment="return-paypal") class PayPalReturnPage(Component): token: QueryParameter[str] = "No Value" in_progress: bool = True error_message: str = "" success_message: str = "" @on_populate async def on_populate(self) -> None: result = await self.session[AccountingService].finalize_paypal_process(self.token) await sleep(1) if result: self.in_progress = False self.success_message = "Aufladung erfolgreich. Du kannst dieses Fenster schließen." else: self.in_progress = False self.error_message = "Es ist ein Fehler aufgetreten, bitte kontaktiere uns" def build(self) -> Component: col_contents = [] if self.in_progress: col_contents.append(ProgressCircle(min_size=5, color=self.session.theme.primary_color)) col_contents.append(Text("Wir prüfen deine Aufladung", overflow="wrap", justify="center")) else: if self.error_message: col_contents.append(Text(self.error_message, overflow="wrap", justify="center", fill=self.session.theme.danger_color)) elif self.success_message: col_contents.append(Text(self.success_message, overflow="wrap", justify="center", fill=self.session.theme.success_color)) return Row( Rectangle( content=Column( Rectangle( content=Rectangle( content=Text("Paypal Aufladung", margin=0.5, selectable=False, overflow="wrap"), fill=self.session.theme.header_box_background_color, margin=0.4 ), stroke_width=0.1, stroke_color=self.session.theme.box_border_color, ), Column( *col_contents, margin=1, spacing=1 ), Spacer() ), fill=self.session.theme.box_color, stroke_width=0.1, stroke_color=self.session.theme.box_border_color, min_width=1 if self.session.is_mobile() else 25 ), align_x=0.5, align_y=0.5 )