From 705d96511d816c6f906fac2a1bfd4b33b514a2bf Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 4 Oct 2025 03:06:09 +0300 Subject: [PATCH] profile patch --- app/ui/views/profile_view.py | 46 +++++++++++++++++++++++++++++ app/ui/views/search_results_view.py | 12 +++++++- app/ui/views/yobble_home_view.py | 44 ++++++++++++++++++++++++++- 3 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 app/ui/views/profile_view.py diff --git a/app/ui/views/profile_view.py b/app/ui/views/profile_view.py new file mode 100644 index 0000000..f4f83cc --- /dev/null +++ b/app/ui/views/profile_view.py @@ -0,0 +1,46 @@ +from PySide6.QtCore import Qt, Signal +from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QPushButton, QHBoxLayout, QScrollArea + + +class ProfileView(QWidget): + start_chat_clicked = Signal(dict) # payload with user data + follow_clicked = Signal(dict) + + def __init__(self, user: dict, parent=None): + super().__init__(parent) + self.user = user or {} + + root = QVBoxLayout(self) + root.setContentsMargins(16, 12, 16, 12) + root.setSpacing(8) + + # Header info + login = self.user.get("login") or "user" + full_name = self.user.get("full_name") or self.user.get("custom_name") or "" + bio = (self.user.get("profile") or {}).get("bio") if isinstance(self.user.get("profile"), dict) else None + + self.login_label = QLabel(f"@{login}") + self.login_label.setObjectName("ProfileLogin") + self.name_label = QLabel(full_name) + self.name_label.setObjectName("ProfileName") + + root.addWidget(self.login_label) + if full_name: + root.addWidget(self.name_label) + + if bio: + bio_label = QLabel(str(bio)) + bio_label.setWordWrap(True) + root.addWidget(bio_label) + + # Actions + actions = QHBoxLayout() + self.message_btn = QPushButton("Написать сообщение") + self.follow_btn = QPushButton("Подписаться") + actions.addWidget(self.message_btn) + actions.addWidget(self.follow_btn) + root.addLayout(actions) + + self.message_btn.clicked.connect(lambda: self.start_chat_clicked.emit(self.user)) + self.follow_btn.clicked.connect(lambda: self.follow_clicked.emit(self.user)) + diff --git a/app/ui/views/search_results_view.py b/app/ui/views/search_results_view.py index d484014..ebd7cd5 100644 --- a/app/ui/views/search_results_view.py +++ b/app/ui/views/search_results_view.py @@ -39,7 +39,17 @@ class SearchResultsView(QWidget): for u in users: title = u.login subtitle = u.full_name or u.custom_name or "Пользователь" - self._add_chat_like_item(title, subtitle, timestamp="", payload={"type": "user", "user_id": str(u.user_id)}) + payload = { + "type": "user", + "user": { + "user_id": str(u.user_id), + "login": u.login, + "full_name": getattr(u, 'full_name', None), + "custom_name": getattr(u, 'custom_name', None), + "profile": getattr(u, 'profile', None) + } + } + self._add_chat_like_item(title, subtitle, timestamp="", payload=payload) # Groups groups = groups diff --git a/app/ui/views/yobble_home_view.py b/app/ui/views/yobble_home_view.py index 128d00d..7dbc10b 100644 --- a/app/ui/views/yobble_home_view.py +++ b/app/ui/views/yobble_home_view.py @@ -14,6 +14,7 @@ from app.core.dialogs import show_themed_messagebox from app.ui.views.side_menu_view import SideMenuView from app.ui.views.chat_list_view import ChatListView from app.ui.views.search_results_view import SearchResultsView +from app.ui.views.profile_view import ProfileView from app.core.services.auth_service import get_user_role from app.core.database import get_current_access_token from app.core.localizer import localizer @@ -252,7 +253,7 @@ class YobbleHomeView(QWidget): self.back_button.setObjectName("BackButton") self.back_button.setFocusPolicy(Qt.NoFocus) self.back_button.setCursor(Qt.PointingHandCursor) - self.back_button.clicked.connect(self.close_chat_view) + self.back_button.clicked.connect(self.on_back_clicked) self.back_button.hide() top_bar_layout.addWidget(self.back_button) @@ -414,6 +415,7 @@ class YobbleHomeView(QWidget): # Страница результатов поиска self.search_results_view = SearchResultsView() self.content_stack.addWidget(self.search_results_view) + self.search_results_view.result_selected.connect(self.on_search_result_selected) def update_chat_list(self, chat_data): """ @@ -714,6 +716,7 @@ class YobbleHomeView(QWidget): groups_cnt = len(getattr(data, 'groups', []) or []) channels_cnt = len(getattr(data, 'channels', []) or []) messages_cnt = len(getattr(data, 'messages', []) or []) + print("data", data) # self.show_notification(localizer.translate( # f"Найдено: пользователи {users_cnt}, беседы {groups_cnt}, паблики {channels_cnt}, сообщения {messages_cnt}" # )) @@ -728,6 +731,37 @@ class YobbleHomeView(QWidget): except Exception: pass + def on_search_result_selected(self, payload: dict): + t = (payload or {}).get("type") + if t == "user": + user = (payload or {}).get("user") or {} + return self.open_profile_view(user) + # TODO: handle group/channel/message + + def open_profile_view(self, user: dict): + try: + self.profile_view = ProfileView(user) + self.bottom_bar.hide() + self.burger_menu_button.hide() + self.back_button.show() + self.content_stack.addWidget(self.profile_view) + self.content_stack.setCurrentWidget(self.profile_view) + except Exception as e: + self.show_notification(str(e), is_error=True) + + def close_profile_view(self): + self.content_stack.setCurrentWidget(self.search_results_view) + self.bottom_bar.show() + self.burger_menu_button.show() + self.back_button.hide() + if hasattr(self, 'profile_view') and self.profile_view: + try: + self.content_stack.removeWidget(self.profile_view) + except Exception: + pass + self.profile_view.deleteLater() + self.profile_view = None + def handle_notification_click(self): """Пустышка для кнопки уведомлений.""" show_themed_messagebox( @@ -737,6 +771,14 @@ class YobbleHomeView(QWidget): "🔔 Центр уведомлений пока в разработке." ) + def on_back_clicked(self): + if getattr(self, 'profile_view', None): + self.close_profile_view() + return + if getattr(self, 'chat_view', None): + self.close_chat_view() + return + def get_stylesheet(self): """Возвращает QSS стили для компонента в зависимости от темы.""" is_dark = theme_manager.is_dark()