import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; import 'package:mc_gallery/features/core/services/logging_service.dart'; import 'package:mc_gallery/l10n/generated/l10n.dart'; import '../data/enums/view_model_state.dart'; abstract class BaseViewModel extends ChangeNotifier { final ValueNotifier _isInitialised = ValueNotifier(false); ValueListenable get isInitialised => _isInitialised; final ValueNotifier _isBusy = ValueNotifier(false); ValueListenable get isBusy => _isBusy; final ValueNotifier _hasError = ValueNotifier(false); ValueListenable get hasError => _hasError; final ValueNotifier _state = ValueNotifier(ViewModelState.isInitialising); ValueListenable get state => _state; final LoggingService _loggingService = LoggingService.locate; String? _errorMessage; String get errorMessage => _errorMessage ?? strings.somethingWentWrong; @mustCallSuper void initialise(DisposableBuildContext disposableBuildContext, bool Function() mounted, [E? arguments]) { _mounted = mounted; _isInitialised.value = true; _state.value = ViewModelState.isInitialised; _loggingService.successfulInit(location: runtimeType.runtimeType.toString()); } void setBusy(bool isBusy) { _isBusy.value = isBusy; if (isBusy) { _state.value = ViewModelState.isBusy; } else { _state.value = ViewModelState.isInitialised; } } void setError( bool hasError, { String? message, }) { _errorMessage = hasError ? message : null; _hasError.value = hasError; if (hasError) { _state.value = ViewModelState.hasError; } else { _state.value = ViewModelState.isInitialised; } } @override void dispose() { super.dispose(); _loggingService.successfulDispose(location: runtimeType.runtimeType.toString()); } late final bool Function() _mounted; void ifMounted(VoidCallback voidCallback) { if (_mounted()) { voidCallback(); } } final Strings strings = Strings.current; double width(BuildContext context) => MediaQuery.of(context).size.width; double height(BuildContext context) => MediaQuery.of(context).size.height; }