profile patch
This commit is contained in:
		
							parent
							
								
									a38f39ca63
								
							
						
					
					
						commit
						705d96511d
					
				
							
								
								
									
										46
									
								
								app/ui/views/profile_view.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								app/ui/views/profile_view.py
									
									
									
									
									
										Normal file
									
								
							@ -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))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -39,7 +39,17 @@ class SearchResultsView(QWidget):
 | 
				
			|||||||
            for u in users:
 | 
					            for u in users:
 | 
				
			||||||
                title = u.login
 | 
					                title = u.login
 | 
				
			||||||
                subtitle = u.full_name or u.custom_name or "Пользователь"
 | 
					                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 = groups
 | 
					        groups = groups
 | 
				
			||||||
 | 
				
			|||||||
@ -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.side_menu_view import SideMenuView
 | 
				
			||||||
from app.ui.views.chat_list_view import ChatListView
 | 
					from app.ui.views.chat_list_view import ChatListView
 | 
				
			||||||
from app.ui.views.search_results_view import SearchResultsView
 | 
					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.services.auth_service import get_user_role
 | 
				
			||||||
from app.core.database import get_current_access_token
 | 
					from app.core.database import get_current_access_token
 | 
				
			||||||
from app.core.localizer import localizer
 | 
					from app.core.localizer import localizer
 | 
				
			||||||
@ -252,7 +253,7 @@ class YobbleHomeView(QWidget):
 | 
				
			|||||||
        self.back_button.setObjectName("BackButton")
 | 
					        self.back_button.setObjectName("BackButton")
 | 
				
			||||||
        self.back_button.setFocusPolicy(Qt.NoFocus)
 | 
					        self.back_button.setFocusPolicy(Qt.NoFocus)
 | 
				
			||||||
        self.back_button.setCursor(Qt.PointingHandCursor)
 | 
					        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()
 | 
					        self.back_button.hide()
 | 
				
			||||||
        top_bar_layout.addWidget(self.back_button)
 | 
					        top_bar_layout.addWidget(self.back_button)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -414,6 +415,7 @@ class YobbleHomeView(QWidget):
 | 
				
			|||||||
        # Страница результатов поиска
 | 
					        # Страница результатов поиска
 | 
				
			||||||
        self.search_results_view = SearchResultsView()
 | 
					        self.search_results_view = SearchResultsView()
 | 
				
			||||||
        self.content_stack.addWidget(self.search_results_view)
 | 
					        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):
 | 
					    def update_chat_list(self, chat_data):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
@ -714,6 +716,7 @@ class YobbleHomeView(QWidget):
 | 
				
			|||||||
        groups_cnt = len(getattr(data, 'groups', []) or [])
 | 
					        groups_cnt = len(getattr(data, 'groups', []) or [])
 | 
				
			||||||
        channels_cnt = len(getattr(data, 'channels', []) or [])
 | 
					        channels_cnt = len(getattr(data, 'channels', []) or [])
 | 
				
			||||||
        messages_cnt = len(getattr(data, 'messages', []) or [])
 | 
					        messages_cnt = len(getattr(data, 'messages', []) or [])
 | 
				
			||||||
 | 
					        print("data", data)
 | 
				
			||||||
        # self.show_notification(localizer.translate(
 | 
					        # self.show_notification(localizer.translate(
 | 
				
			||||||
        #     f"Найдено: пользователи {users_cnt}, беседы {groups_cnt}, паблики {channels_cnt}, сообщения {messages_cnt}"
 | 
					        #     f"Найдено: пользователи {users_cnt}, беседы {groups_cnt}, паблики {channels_cnt}, сообщения {messages_cnt}"
 | 
				
			||||||
        # ))
 | 
					        # ))
 | 
				
			||||||
@ -728,6 +731,37 @@ class YobbleHomeView(QWidget):
 | 
				
			|||||||
        except Exception:
 | 
					        except Exception:
 | 
				
			||||||
            pass
 | 
					            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):
 | 
					    def handle_notification_click(self):
 | 
				
			||||||
        """Пустышка для кнопки уведомлений."""
 | 
					        """Пустышка для кнопки уведомлений."""
 | 
				
			||||||
        show_themed_messagebox(
 | 
					        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):
 | 
					    def get_stylesheet(self):
 | 
				
			||||||
        """Возвращает QSS стили для компонента в зависимости от темы."""
 | 
					        """Возвращает QSS стили для компонента в зависимости от темы."""
 | 
				
			||||||
        is_dark = theme_manager.is_dark()
 | 
					        is_dark = theme_manager.is_dark()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user