Files
kooltab/lib/viewmodels/registration_view_model.dart
T
2026-10-08 04:12:36 +02:00

108 lines
2.6 KiB
Dart

import 'package:flutter/foundation.dart';
import '../models/venue.dart';
import '../services/kooltap_api_client.dart';
import '../services/remote_sync_service.dart';
enum RegistrationStep {
initial,
loadingVenues,
venuesLoaded,
error,
registering,
registered,
}
class RegistrationViewModel extends ChangeNotifier {
final KoolTapApiClient apiClient;
final RemoteSyncService syncService;
RegistrationViewModel({required this.apiClient, required this.syncService});
RegistrationStep _step = RegistrationStep.initial;
RegistrationStep get step => _step;
List<Venue> _venues = [];
List<Venue> get venues => _venues;
Venue? _selectedVenue;
Venue? get selectedVenue => _selectedVenue;
/// Server-provided, so shown as-is.
String? _errorMessage;
String? get errorMessage => _errorMessage;
void selectVenue(Venue venue) {
_selectedVenue = venue;
notifyListeners();
}
Future<void> fetchVenues() async {
_step = RegistrationStep.loadingVenues;
_errorMessage = null;
notifyListeners();
try {
_venues = await apiClient.getVenues();
_step = RegistrationStep.venuesLoaded;
} on Exception catch (e) {
debugPrint('RegistrationViewModel: fetchVenues error: $e');
_errorMessage = e.toString();
_step = RegistrationStep.error;
}
notifyListeners();
}
Future<bool> registerDevice({
required String deviceName,
required String registrationCode,
}) async {
final venue = _selectedVenue;
if (venue == null) return false;
_step = RegistrationStep.registering;
_errorMessage = null;
notifyListeners();
try {
final credentials = await apiClient.registerDevice(
venueId: venue.id,
deviceName: deviceName,
registrationCode: registrationCode,
);
await syncService.setCredentials(
deviceId: credentials.deviceId,
token: credentials.token,
venueId: venue.id,
);
_step = RegistrationStep.registered;
notifyListeners();
return true;
} on ApiException catch (e) {
_errorMessage = e.message.isEmpty
? 'Registration failed (HTTP ${e.statusCode})'
: e.message;
} on Exception catch (e) {
debugPrint('RegistrationViewModel: registerDevice error: $e');
_errorMessage = e.toString();
}
_step = RegistrationStep.venuesLoaded;
notifyListeners();
return false;
}
Future<void> retry() => fetchVenues();
void reset() {
_step = RegistrationStep.initial;
_venues = [];
_selectedVenue = null;
_errorMessage = null;
notifyListeners();
}
}