from typing import Optional, Callable from rio import Component, Column, Text, TextStyle, Button, Spacer, Row, ProgressCircle class SeatingPurchaseBox(Component): show: bool seat_id: str is_loading: bool confirm_cb: Callable cancel_cb: Callable error_msg: Optional[str] = None success_msg: Optional[str] = None def build(self) -> Component: if not self.show: return Spacer() if self.is_loading: return Column( ProgressCircle( color="secondary", align_x=0.5, margin_top=2, margin_bottom=2 ), min_height=10 ) if self.success_msg: return Column( Text(f"{self.success_msg}", margin=1, style=TextStyle(fill=self.session.theme.success_color, font_size=1.1), overflow="wrap", justify="center"), Row( Button( Text("Zurück", margin=1, style=TextStyle(fill=self.session.theme.success_color, font_size=1.1), overflow="wrap", justify="center" ), shape="rounded", style="plain-text", on_press=self.cancel_cb ) ), min_height=10 ) if self.error_msg: return Column( Text(f"{self.error_msg}", margin=1, style=TextStyle(fill=self.session.theme.danger_color, font_size=1.1), overflow="wrap", justify="center"), Row( Button( Text("Zurück", margin=1, style=TextStyle(fill=self.session.theme.danger_color, font_size=1.1), overflow="wrap", justify="center" ), shape="rounded", style="plain-text", on_press=self.cancel_cb ) ), min_height=10 ) return Column( Text(f"Sitzplatz {self.seat_id} verbindlich buchen?", margin=1, style=TextStyle(fill=self.session.theme.neutral_color, font_size=1.4), overflow="wrap", justify="center"), Row( Button( Text("Nein", margin=1, style=TextStyle(fill=self.session.theme.danger_color, font_size=1.1), overflow="wrap", justify="center" ), shape="rounded", style="plain-text", on_press=self.cancel_cb ), Button( Text("Ja", margin=1, style=TextStyle(fill=self.session.theme.success_color, font_size=1.1), overflow="wrap", justify="center" ), shape="rounded", style="minor", on_press=self.confirm_cb ) ), min_height=10 )