Files
ELM/src/elm/components/AvatarEditBox.py
T
Typhus 1753d67752 prerelease/0.6.0 (#1)
Co-authored-by: David Rodenkirchen <drodenkirchen@linetco.com>
Reviewed-on: #1
2026-05-27 23:17:52 +00:00

87 lines
3.7 KiB
Python

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
)