from PySide6.QtWidgets import QStackedWidget from PySide6.QtCore import Signal from app.ui.views.login_view import LoginView from app.ui.views.yobble_home_view import YobbleHomeView from typing import Optional from threading import Thread import time import asyncio from app.core.database import get_last_login, get_session, set_last_login # Импортируем сервис чатов from app.core.services.chat_service import get_private_chats class MainController(QStackedWidget): # Сигнал для показа уведомлений из любого потока # (message, is_error) notification_requested = Signal(str, bool) # Сигнал для передачи загруженных данных чата в основной поток chats_loaded = Signal(object) def __init__(self): super().__init__() self.login_view: Optional[LoginView] = None self.yobble_home_view: Optional[YobbleHomeView] = None self.init_app() def init_app(self): """Проверяет наличие сессии для автологина.""" last_login = get_last_login() if last_login: session = get_session(last_login) if session: self.handle_login_success(last_login) return self.show_login() def show_login(self): self.login_view = LoginView(on_login=self.handle_login_success) self.addWidget(self.login_view) self.setCurrentWidget(self.login_view) self.login_view.show() def handle_login_success(self, username: str): """Обрабатывает успешный вход в систему.""" set_last_login(username) session = get_session(username) user_id = session["user_id"] if session else None if not user_id: self.show_login() self.notification_requested.emit("Не удалось получить ID пользователя из сессии.", True) return if self.login_view: self.login_view.close() self.removeWidget(self.login_view) self.login_view = None self.yobble_home_view = YobbleHomeView(username=username, current_user_id=user_id) # Подключаем сигналы к слотам в YobbleHomeView self.notification_requested.connect(self.yobble_home_view.show_notification) self.chats_loaded.connect(self.yobble_home_view.update_chat_list) self.addWidget(self.yobble_home_view) self.setCurrentWidget(self.yobble_home_view) self.yobble_home_view.show() Thread(target=self.update_data_from_server, args=(username,), daemon=True).start() def update_data_from_server(self, username: str): """ В фоновом режиме обновляет данные с сервера. """ time.sleep(2) print(f"[Sync] Обновляем данные для пользователя: {username}") if self.yobble_home_view: print("[Sync] Запускаем предзагрузку прав доступа...") try: # `preload_permissions` теперь возвращает кортеж (успех, данные) # asyncio.run() выполняет async функцию и возвращает её результат asyncio.run(self.yobble_home_view.preload_permissions()) # Загружаем список чатов print("[Sync] Загружаем список чатов...") asyncio.run(self.load_chats(username)) except Exception as e: error_message = f"Ошибка предзагрузки: {e}" print(f"[Sync] {error_message}") # Отправляем сигнал вместо прямого вызова self.notification_requested.emit(error_message, True) async def load_chats(self, username: str): """ Загружает список чатов для пользователя. """ session = get_session(username) # print("debug session", session) # if not session or 'access_token' not in session: # self.notification_requested.emit("Сессия не найдена, не могу загрузить чаты.", True) # return token = session['access_token'] success, data = await get_private_chats(login=username, token=token, offset=0, limit=50) if success: # Отправляем данные в основной поток через сигнал self.chats_loaded.emit(data) else: # Отправляем ошибку в основной поток через сигнал self.notification_requested.emit(f"Не удалось загрузить чаты: {data}", True) print("data", data)