68 lines
1.8 KiB
Dart
68 lines
1.8 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
|
|
import '../payment/license_service.dart';
|
|
import '../payment/models.dart';
|
|
import '../payment/order_api.dart';
|
|
|
|
/// 主界面状态:到期时间展示 + 搜索入口强制校验 + 退出登录
|
|
class HomeViewModel extends ChangeNotifier {
|
|
final LicenseService licenseService;
|
|
|
|
LicenseStatus? _license;
|
|
bool _loading = true;
|
|
bool _verifying = false;
|
|
String? _error;
|
|
bool _sessionExpired = false;
|
|
|
|
LicenseStatus? get license => _license;
|
|
bool get loading => _loading;
|
|
bool get verifying => _verifying;
|
|
String? get error => _error;
|
|
bool get sessionExpired => _sessionExpired;
|
|
|
|
HomeViewModel({required this.licenseService});
|
|
|
|
/// 进入主界面/支付返回后刷新(本地缓存优先,服务端为准)
|
|
Future<void> refresh() async {
|
|
_loading = true;
|
|
_error = null;
|
|
notifyListeners();
|
|
try {
|
|
_license = await licenseService.check();
|
|
} catch (_) {
|
|
// check 内部已兜底,这里仅防御
|
|
} finally {
|
|
_loading = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
/// 搜索按钮:强制服务端校验授权,active 才允许进入相机。
|
|
/// 网络失败/会话失效一律不放行;返回值表示是否可进入。
|
|
Future<bool> verifyForCamera() async {
|
|
_verifying = true;
|
|
_sessionExpired = false;
|
|
_error = null;
|
|
notifyListeners();
|
|
try {
|
|
final license = await licenseService.verifyServer();
|
|
_license = license;
|
|
return license.isActive;
|
|
} on SessionExpiredException {
|
|
_sessionExpired = true;
|
|
return false;
|
|
} on OrderApiException catch (e) {
|
|
_error = e.message;
|
|
return false;
|
|
} finally {
|
|
_verifying = false;
|
|
notifyListeners();
|
|
}
|
|
}
|
|
|
|
void clearSessionExpired() {
|
|
_sessionExpired = false;
|
|
notifyListeners();
|
|
}
|
|
}
|