Files
ai-contract-platform/mobile/lib/features/contracts/application/contract_template_controller.dart
T
yuqei 3df85fdb04 feat: land phase15 legal docs and commercial ops
Includes legal document generation workflows, prompt governance runtime wiring, legal change impact scans, operation KPI dashboards, invoice files, sales follow-up events, mobile review polish, deployment automation, and updated project docs.
2026-05-21 14:42:44 +08:00

53 lines
1.6 KiB
Dart

import 'package:flutter/foundation.dart';
import '../../../shared/network/api_client.dart';
import '../../../shared/storage/session_store.dart';
import '../domain/contract_models.dart';
class ContractTemplateController {
ContractTemplateController({ApiClient? apiClient})
: _apiClient = apiClient ?? const ApiClient();
final ApiClient _apiClient;
final ValueNotifier<bool> isLoading = ValueNotifier<bool>(false);
final ValueNotifier<String?> errorMessage = ValueNotifier<String?>(null);
final ValueNotifier<List<ContractTemplateItem>> items =
ValueNotifier<List<ContractTemplateItem>>(<ContractTemplateItem>[]);
Future<void> load({String? contractType}) async {
final session = SessionStore.current;
if (session == null || !session.isAuthenticated) {
errorMessage.value = '请先登录后查看合同模板';
return;
}
isLoading.value = true;
errorMessage.value = null;
try {
items.value = await _apiClient.listContractTemplates(
session.accessToken,
contractType: contractType,
);
} on ApiException catch (error) {
if (error.isUnauthorized) {
await SessionStore.clear();
errorMessage.value = '登录已过期,请重新登录';
} else {
errorMessage.value = error.message;
}
} catch (_) {
errorMessage.value = '获取模板列表失败,请稍后重试';
items.value = <ContractTemplateItem>[];
} finally {
isLoading.value = false;
}
}
void dispose() {
isLoading.dispose();
errorMessage.dispose();
items.dispose();
}
}