import 'dart:async'; import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/cubit/metrics/metrics_repository.dart'; import 'package:selfprivacy/logic/models/metrics.dart'; part 'metrics_state.dart'; class MetricsCubit extends Cubit { MetricsCubit() : super(const MetricsLoading(Period.day)); final MetricsRepository repository = MetricsRepository(); Timer? timer; @override Future close() { closeTimer(); return super.close(); } void closeTimer() { if (timer != null && timer!.isActive) { timer!.cancel(); } } void changePeriod(final Period period) async { closeTimer(); emit(MetricsLoading(period)); load(period); } void restart() async { load(state.period); } void load(final Period period) async { try { final MetricsLoaded newState = await repository.getServerMetrics(period); timer = Timer( Duration(seconds: newState.metrics.stepsInSecond.toInt()), () => load(newState.period), ); emit(newState); return; } catch (_) {} try { final MetricsLoaded newState = await repository.getLegacyMetrics(period); timer = Timer( Duration(seconds: newState.metrics.stepsInSecond.toInt()), () => load(newState.period), ); emit(newState); } on StateError { print('Tried to emit metrics when cubit is closed'); } on MetricsLoadException { timer = Timer( Duration(seconds: state.period.stepPeriodInSeconds), () => load(state.period), ); } on MetricsUnsupportedException { emit(MetricsUnsupported(period)); } } }