108 lines
2.6 KiB
Dart
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;
|
|
_errorMessage = null;
|
|
notifyListeners();
|
|
}
|
|
|
|
void deselectVenue() {
|
|
_selectedVenue = null;
|
|
_errorMessage = null;
|
|
notifyListeners();
|
|
}
|
|
|
|
Future<void> fetchVenues() async {
|
|
_step = RegistrationStep.loadingVenues;
|
|
_selectedVenue = null;
|
|
_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();
|
|
}
|