from copy import copy, deepcopy from typing import Optional, Callable from rio import * from src.ez_lan_manager import ConfigurationService, UserService, LocalDataService from src.ez_lan_manager.components.DesktopNavigationButton import DesktopNavigationButton from src.ez_lan_manager.components.UserInfoAndLoginBox import UserInfoAndLoginBox from src.ez_lan_manager.services.LocalDataService import LocalData from src.ez_lan_manager.types.SessionStorage import SessionStorage from src.ez_lan_manager.types.User import User class DesktopNavigation(Component): user: Optional[User] = None force_login_box_refresh: list[Callable] = [] @event.on_populate async def async_init(self) -> None: self.session[SessionStorage].subscribe_to_logged_in_or_out_event(str(self.__class__), self.async_init) local_data = self.session[LocalData] if local_data.stored_session_token: session_ = self.session[LocalDataService].verify_token(local_data.stored_session_token) if session_: self.session.detach(SessionStorage) self.session.attach(session_) self.user = await self.session[UserService].get_user(session_.user_id) try: # Hack-around, maybe fix in the future self.force_login_box_refresh[-1]() except IndexError: pass return if self.session[SessionStorage].user_id: self.user = await self.session[UserService].get_user(self.session[SessionStorage].user_id) else: self.user = None def build(self) -> Component: lan_info = self.session[ConfigurationService].get_lan_info() user_info_and_login_box = UserInfoAndLoginBox() self.force_login_box_refresh.append(user_info_and_login_box.force_refresh) user_navigation = [ DesktopNavigationButton("News", "./news"), Spacer(min_height=1), DesktopNavigationButton(f"Über {lan_info.name} {lan_info.iteration}", "./overview"), DesktopNavigationButton("Ticket kaufen", "./buy_ticket"), DesktopNavigationButton("Sitzplan", "./seating"), DesktopNavigationButton("Catering", "./catering"), DesktopNavigationButton("Teilnehmer", "./guests"), DesktopNavigationButton("Turniere", "./tournaments"), DesktopNavigationButton("FAQ", "./faq"), DesktopNavigationButton("Regeln & AGB", "./rules-gtc"), Spacer(min_height=1), DesktopNavigationButton("Discord", "https://discord.gg/8gTjg34yyH", open_new_tab=True), DesktopNavigationButton("Die EZ GG e.V.", "https://ezgg-ev.de/about", open_new_tab=True), DesktopNavigationButton("Kontakt", "./contact"), DesktopNavigationButton("Impressum & DSGVO", "./imprint"), Spacer(min_height=1) ] team_navigation = [ Text("Verwaltung", align_x=0.5, margin_top=0.3, style=TextStyle(fill=Color.from_hex("F0EADE"), font_size=1.2)), Text("Vorsichtig sein!", align_x=0.5, margin_top=0.3, style=TextStyle(fill=self.session.theme.danger_color, font_size=0.6)), DesktopNavigationButton("News", "./manage-news", is_team_navigation=True), DesktopNavigationButton("Benutzer", "./manage-users", is_team_navigation=True), DesktopNavigationButton("Catering", "./manage-catering", is_team_navigation=True), DesktopNavigationButton("Turniere", "./manage-tournaments", is_team_navigation=True), Spacer(min_height=1), Revealer( header="Normale Navigation", content=Column(*user_navigation), header_style=TextStyle(fill=self.session.theme.primary_color, font_size=0.9) ) ] if self.user is not None and self.user.is_team_member else [] nav_to_use = copy(team_navigation) if self.user is not None and self.user.is_team_member else copy(user_navigation) return Card( Column( Text(lan_info.name, align_x=0.5, margin_top=0.3, style=TextStyle(fill=self.session.theme.hud_color, font_size=2.5)), Text(f"Edition {lan_info.iteration}", align_x=0.5, style=TextStyle(fill=self.session.theme.hud_color, font_size=1.2), margin_top=0.3, margin_bottom=2), user_info_and_login_box, *nav_to_use, align_y=0 ), color=self.session.theme.neutral_color, min_width=15, grow_y=True, corner_radius=(0.5, 0, 0, 0), margin_right=0.1 )