from rio import Component, Rectangle, Color, Column, Image, Text, Spacer, NoFileSelectedError from elm.components import ElmButton from elm.types import UserSession from elm.services import ConfigurationService, UserService class AvatarEditBox(Component): avatar_info_text: str = "" avatar_info_text_is_error: bool = False async def upload_new_pfp(self) -> None: try: new_pfp = await self.session.pick_file(file_types=("png", "jpg", "jpeg"), multiple=False) except NoFileSelectedError: self.avatar_info_text = "Keine Datei ausgewählt!" self.avatar_info_text_is_error = True return if new_pfp.size_in_bytes > 2 * 1_000_000: self.avatar_info_text = "Bild zu groß! (> 2MB)" self.avatar_info_text_is_error = True return image_data = await new_pfp.read_bytes() user = await self.session[UserService].get_user(self.session[UserSession].user_name) if user is not None: user.user_picture = image_data await user.save() self.session[UserSession].profile_picture = image_data self.avatar_info_text = "Erfolgreich aktualisiert" self.avatar_info_text_is_error = False else: self.avatar_info_text = "Unbekannter Fehler" self.avatar_info_text_is_error = True async def delete_current_pfp(self) -> None: user = await self.session[UserService].get_user(self.session[UserSession].user_name) if user is not None: user.user_picture = None await user.save() self.session[UserSession].profile_picture = None self.avatar_info_text = "Erfolgreich gelöscht" self.avatar_info_text_is_error = False else: self.avatar_info_text = "Unbekannter Fehler" self.avatar_info_text_is_error = True def build(self) -> Component: return Rectangle( content=Column( Rectangle( content=Rectangle( content=Text("Avatar", 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( Image( image=self.session[UserSession].profile_picture if self.session[UserSession].profile_picture is not None else self.session[ConfigurationService].DEFAULT_PROFILE_PICTURE, min_width=10, min_height=10, grow_x=False, grow_y=False, corner_radius=0.3 ), Text( text=self.avatar_info_text, overflow="wrap", justify="center", fill=self.session.theme.danger_color if self.avatar_info_text_is_error else self.session.theme.success_color ), ElmButton(text="Bild hochladen", style="small" if self.session.is_mobile() else "normal", on_press=self.upload_new_pfp), ElmButton(text="Bild löschen", style="small" if self.session.is_mobile() else "normal", on_press=self.delete_current_pfp), Spacer(), margin=1, spacing=1 ) ), fill=self.session.theme.box_color, stroke_width=0.1, stroke_color=self.session.theme.box_border_color, min_height=15 )