migrated the breaker system to MarianumConnect and refactored the API response to a rule-based model with support for version-specific blocks using maxBuild.
This commit is contained in:
@@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:persistent_bottom_nav_bar_v2/persistent_bottom_nav_bar_v2.dart';
|
||||
|
||||
import '../../../api/mhsl/breaker/get_breakers/get_breakers_response.dart';
|
||||
import '../../../api/marianumconnect/queries/get_breakers/get_breakers_response.dart';
|
||||
import '../../../routing/app_routes.dart';
|
||||
import '../../../view/pages/files/files.dart';
|
||||
import '../../../view/pages/grade_averages/grade_averages_view.dart';
|
||||
@@ -95,35 +95,35 @@ class AppModule {
|
||||
Modules.marianumMessage,
|
||||
name: 'Marianum Message',
|
||||
icon: () => Icon(Icons.newspaper),
|
||||
breakerArea: BreakerArea.more,
|
||||
breakerArea: BreakerArea.news,
|
||||
create: MarianumMessageListView.new,
|
||||
),
|
||||
Modules.roomPlan: AppModule(
|
||||
Modules.roomPlan,
|
||||
name: 'Raumplan',
|
||||
icon: () => Icon(Icons.location_pin),
|
||||
breakerArea: BreakerArea.more,
|
||||
breakerArea: BreakerArea.roomPlan,
|
||||
create: Roomplan.new,
|
||||
),
|
||||
Modules.gradeAveragesCalculator: AppModule(
|
||||
Modules.gradeAveragesCalculator,
|
||||
name: 'Notendurchschnittsrechner',
|
||||
icon: () => Icon(Icons.calculate),
|
||||
breakerArea: BreakerArea.more,
|
||||
breakerArea: BreakerArea.grades,
|
||||
create: GradeAveragesView.new,
|
||||
),
|
||||
Modules.holidays: AppModule(
|
||||
Modules.holidays,
|
||||
name: 'Schulferien',
|
||||
icon: () => Icon(Icons.beach_access_outlined),
|
||||
breakerArea: BreakerArea.more,
|
||||
breakerArea: BreakerArea.holidays,
|
||||
create: HolidaysView.new,
|
||||
),
|
||||
Modules.marianumDates: AppModule(
|
||||
Modules.marianumDates,
|
||||
name: 'Marianum Termine',
|
||||
icon: () => Icon(Icons.event_note),
|
||||
breakerArea: BreakerArea.more,
|
||||
breakerArea: BreakerArea.dates,
|
||||
create: MarianumDatesView.new,
|
||||
),
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
|
||||
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_response.dart';
|
||||
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_response.dart';
|
||||
import '../../../infrastructure/utility_widgets/loadable_hydrated_bloc/loadable_hydrated_bloc.dart';
|
||||
import '../../../infrastructure/utility_widgets/loadable_hydrated_bloc/loadable_hydrated_bloc_event.dart';
|
||||
import '../repository/breaker_repository.dart';
|
||||
@@ -40,13 +40,11 @@ class BreakerBloc
|
||||
final response = innerState?.response;
|
||||
if (response == null || _packageInfo == null) return null;
|
||||
|
||||
if (response.global.areas.contains(type)) return response.global.message;
|
||||
|
||||
final selfBuild = int.parse(_packageInfo!.buildNumber);
|
||||
for (final entry in response.regional.entries) {
|
||||
final affectedBuild = int.parse(entry.key.split('b')[1]);
|
||||
if (affectedBuild >= selfBuild && entry.value.areas.contains(type)) {
|
||||
return entry.value.message;
|
||||
final selfBuild = int.tryParse(_packageInfo!.buildNumber) ?? 0;
|
||||
for (final rule in response.rules) {
|
||||
if (!rule.areas.contains(type)) continue;
|
||||
if (rule.maxBuild == null || selfBuild <= rule.maxBuild!) {
|
||||
return rule.message;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_response.dart';
|
||||
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_response.dart';
|
||||
|
||||
part 'breaker_state.freezed.dart';
|
||||
part 'breaker_state.g.dart';
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
import 'dart:async';
|
||||
|
||||
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_cache.dart';
|
||||
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_response.dart';
|
||||
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_cache.dart';
|
||||
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_response.dart';
|
||||
import '../../../../../api/request_cache.dart';
|
||||
|
||||
class BreakerDataProvider {
|
||||
Future<GetBreakersResponse> getBreakers() {
|
||||
final completer = Completer<GetBreakersResponse>();
|
||||
GetBreakersCache(
|
||||
onUpdate: (data) {
|
||||
if (!completer.isCompleted) completer.complete(data);
|
||||
},
|
||||
);
|
||||
return completer.future;
|
||||
}
|
||||
/// Resolves via [resolveFromCache] (not first-emit-wins): the cache emits its
|
||||
/// stored value first for an instant display, then the network value — and we
|
||||
/// return the latter once [RequestCache.ready] settles. `renew: true` forces a
|
||||
/// fresh network check on every call so a just-changed breaker takes effect on
|
||||
/// the next `refresh()` (app resume) instead of only after a restart.
|
||||
Future<GetBreakersResponse> getBreakers({
|
||||
bool renew = true,
|
||||
void Function(Object)? onError,
|
||||
}) => resolveFromCache<GetBreakersResponse>(
|
||||
(onUpdate, onError) =>
|
||||
GetBreakersCache(renew: renew, onUpdate: onUpdate, onError: onError),
|
||||
onError: onError,
|
||||
operationName: 'getBreakers',
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user