profile patch

This commit is contained in:
unknown 2025-10-04 03:06:09 +03:00
parent a38f39ca63
commit 705d96511d
3 changed files with 100 additions and 2 deletions

View 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))

View File

@ -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

View File

@ -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()