feat(subscription): add expiry recovery flow

This commit is contained in:
chengma
2026-07-23 16:03:08 +08:00
parent b05c370250
commit c02866e610
7 changed files with 276 additions and 17 deletions
+18
View File
@@ -66,6 +66,7 @@ class SettingsTab(QWidget):
"""Tab 5: AI model definitions stored in data/config/ai_models.json."""
settingsSaved = Signal(str)
subscriptionCheckRequested = Signal()
BACKEND_ITEMS = [
("默认网关", "cmhub"),
@@ -279,6 +280,9 @@ class SettingsTab(QWidget):
self.cdp_ready_timeout_spin.setObjectName("cdpReadyTimeoutSpin")
self.cdp_ready_timeout_spin.setRange(1, 3600)
self.save_config_button = QPushButton("保存设置")
self.subscription_check_button = QPushButton("重新检测会员状态")
self.subscription_check_button.setObjectName("subscriptionCheckButton")
self.subscription_check_button.setToolTip("重新查询当前 cmhub 账号的会员套餐状态")
self.unsaved_changes_label = QLabel("● 未保存更改")
self.unsaved_changes_label.setObjectName("settingsUnsavedChangesLabel")
self.unsaved_changes_label.setStyleSheet("color: #bc4c00; font-weight: 600;")
@@ -455,6 +459,7 @@ class SettingsTab(QWidget):
save_settings_layout.addWidget(self.save_config_button)
save_settings_layout.addWidget(self.unsaved_changes_label)
save_settings_layout.addStretch(1)
save_settings_layout.addWidget(self.subscription_check_button)
panel_layout.addLayout(save_settings_layout)
panel_layout.addStretch(1)
@@ -490,6 +495,9 @@ class SettingsTab(QWidget):
self.chrome_path_browse_button.clicked.connect(self.browse_chrome_path)
self.chrome_path_detect_button.clicked.connect(self.detect_chrome_path)
self.save_config_button.clicked.connect(self.save_app_settings)
self.subscription_check_button.clicked.connect(
self._request_subscription_check
)
self._connect_dirty_signals()
with self._dirty_tracking_suspended():
@@ -548,6 +556,16 @@ class SettingsTab(QWidget):
def _set_status(self, message, level=None):
_emit_status(self.status_callback, message, level=level)
def _request_subscription_check(self, checked=False):
self.subscriptionCheckRequested.emit()
def set_subscription_check_running(self, running):
running = bool(running)
self.subscription_check_button.setEnabled(not running)
self.subscription_check_button.setText(
"正在检测会员状态..." if running else "重新检测会员状态"
)
@contextmanager
def _dirty_tracking_suspended(self):
self._suspend_dirty += 1