109 lines
4.6 KiB
Python
109 lines
4.6 KiB
Python
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)
|
||
|
||
if self.login_view:
|
||
self.login_view.close()
|
||
self.removeWidget(self.login_view)
|
||
self.login_view = None
|
||
|
||
self.yobble_home_view = YobbleHomeView(username=username)
|
||
|
||
# Подключаем сигналы к слотам в 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(token=token, offset=0, limit=50)
|
||
|
||
if success:
|
||
# Отправляем данные в основной поток через сигнал
|
||
self.chats_loaded.emit(data)
|
||
else:
|
||
# Отправляем ошибку в основной поток через сигнал
|
||
self.notification_requested.emit(f"Не удалось загрузить чаты: {data}", True)
|