import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import '../auth/auth_store.dart';
import '../auth/http_client.dart';
class WebDashboardSnapshot {
const WebDashboardSnapshot({
required this.customers,
required this.jobs,
required this.employees,
});
final int customers;
final int jobs;
final int employees;
}
enum WebDashboardStatus { idle, loading, loaded, unavailable, error }
class WebDashboardStore extends ChangeNotifier {
WebDashboardStore({http.Client? client, String? baseUrl})
: _client = client ?? createPlatformClient(),
baseUrl =
(baseUrl ??
const String.fromEnvironment(
'MACHWEIS_API_BASE_URL',
defaultValue: 'https://machweisapi.haselhuhn-media.com',
))
.replaceFirst(RegExp(r'/$'), '');
static final instance = WebDashboardStore();
final http.Client _client;
final String baseUrl;
WebDashboardStatus status = WebDashboardStatus.idle;
WebDashboardSnapshot? snapshot;
String? error;
bool _loading = false;
Future<void> load() async {
if (!kIsWeb || _loading || AuthStore.instance.session == null) {
if (!kIsWeb) status = WebDashboardStatus.unavailable;
return;
}
_loading = true;
status = WebDashboardStatus.loading;
error = null;
notifyListeners();
try {
final customers = await _count('/api/v1/customers');
final jobs = await _count('/api/v1/jobs');
final employees = await _count('/api/v1/employees');
snapshot = WebDashboardSnapshot(
customers: customers,
jobs: jobs,
employees: employees,
);
status = WebDashboardStatus.loaded;
} on _Unauthorized {
try {
await AuthStore.instance.accessToken(forceRefresh: true);
final customers = await _count('/api/v1/customers');
final jobs = await _count('/api/v1/jobs');
final employees = await _count('/api/v1/employees');
snapshot = WebDashboardSnapshot(
customers: customers,
jobs: jobs,
employees: employees,
);
status = WebDashboardStatus.loaded;
} on Object {
status = WebDashboardStatus.error;
error = 'Die Dashboard-Daten konnten nicht geladen werden.';
}
} on Object {
status = WebDashboardStatus.error;
error = 'Die Dashboard-Daten konnten nicht geladen werden.';
} finally {
_loading = false;
notifyListeners();
}
}
Future<int> _count(String path) async {
final response = await _client.get(Uri.parse('$baseUrl$path'));
if (response.statusCode == 401) throw _Unauthorized();
if (response.statusCode < 200 || response.statusCode >= 300) {
throw StateError('Dashboard request failed.');
}
final body = jsonDecode(response.body) as Map<String, dynamic>;
final data = body['data'] as Map<String, dynamic>? ?? const {};
final items = data['items'];
return items is List ? items.length : 0;
}
}
class _Unauthorized implements Exception {}
