implemented marianum message dataloader

This commit is contained in:
Elias Müller 2024-05-11 19:29:12 +02:00
parent 181682a424
commit e57a1a915e
7 changed files with 53 additions and 19 deletions

View File

@ -7,11 +7,8 @@ import 'getMessagesResponse.dart';
class GetMessages extends MhslApi<GetMessagesResponse> { class GetMessages extends MhslApi<GetMessagesResponse> {
GetMessages() : super('message/messages.json'); GetMessages() : super('message/messages.json');
@override @override
GetMessagesResponse assemble(String raw) => GetMessagesResponse.fromJson(jsonDecode(raw)); GetMessagesResponse assemble(String raw) => GetMessagesResponse.fromJson(jsonDecode(raw));
@override @override
Future<http.Response> request(Uri uri) => http.get(uri); Future<http.Response> request(Uri uri) => http.get(uri);
} }

View File

@ -1,3 +1,36 @@
import 'dart:convert';
import 'dart:developer';
import 'package:dio/dio.dart';
abstract class DataLoader<TResult> { abstract class DataLoader<TResult> {
Future<TResult> fetch(); final Dio dio;
DataLoader(this.dio) {
dio.options.connectTimeout = const Duration(seconds: 10).inMilliseconds;
dio.options.sendTimeout = const Duration(seconds: 30).inMilliseconds;
dio.options.receiveTimeout = const Duration(seconds: 30).inMilliseconds;
}
Future<TResult> run() async {
var response = await fetch();
try {
return assemble(DataLoaderResult(
json: jsonDecode(response.data!),
headers: response.headers.map.map((key, value) => MapEntry(key, value.join(';'))),
));
} catch(trace, e) {
log(trace.toString());
throw(e);
}
}
Future<Response<String>> fetch();
TResult assemble(DataLoaderResult data);
}
class DataLoaderResult {
final Map<String, dynamic> json;
final Map<String, String> headers;
DataLoaderResult({required this.json, required this.headers});
} }

View File

@ -0,0 +1,9 @@
import 'package:dio/dio.dart';
import 'data_loader.dart';
abstract class MhslDataLoader<TResult> extends DataLoader<TResult> {
MhslDataLoader() : super(Dio(BaseOptions(
baseUrl: 'https://mhsl.eu/marianum/marianummobile/'
)));
}

View File

@ -1,12 +1,12 @@
import 'package:dio/dio.dart';
import '../../../infrastructure/dataLoader/data_loader.dart'; import '../../../infrastructure/dataLoader/data_loader.dart';
import '../../../infrastructure/dataLoader/mhsl_data_loader.dart';
import '../bloc/marianum_message_state.dart'; import '../bloc/marianum_message_state.dart';
class MarianumMessageGetMessages extends DataLoader<MarianumMessageList> { class MarianumMessageGetMessages extends MhslDataLoader<MarianumMessageList> {
@override @override
Future<MarianumMessageList> fetch() async { Future<Response<String>> fetch() async => dio.get('/message/messages.json');
await Future.delayed(const Duration(seconds: 3)); @override
// throw UnimplementedError("Test"); MarianumMessageList assemble(DataLoaderResult data) => MarianumMessageList.fromJson(data.json);
return const MarianumMessageList(base: '', messages: [MarianumMessage(date: '', name: 'RepoTest', url: '')]);
}
} }

View File

@ -3,5 +3,5 @@ import '../bloc/marianum_message_state.dart';
import '../dataProvider/marianum_message_get_messages.dart'; import '../dataProvider/marianum_message_get_messages.dart';
class MarianumMessageRepository extends Repository<MarianumMessageState> { class MarianumMessageRepository extends Repository<MarianumMessageState> {
Future<MarianumMessageList> getMessages() => MarianumMessageGetMessages().fetch(); Future<MarianumMessageList> getMessages() => MarianumMessageGetMessages().run();
} }

View File

@ -1,12 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../../../../api/mhsl/message/getMessages/getMessagesResponse.dart'; import '../../../../../api/mhsl/message/getMessages/getMessagesResponse.dart';
import '../../../../../view/pages/more/message/messageView.dart'; import '../../../../../view/pages/more/message/messageView.dart';
import '../../../infrastructure/loadableState/loadable_state.dart'; import '../../../infrastructure/loadableState/loadable_state.dart';
import '../../../infrastructure/loadableState/view/loadable_state_consumer.dart'; import '../../../infrastructure/loadableState/view/loadable_state_consumer.dart';
import '../../../infrastructure/utilityWidgets/bloc_module.dart'; import '../../../infrastructure/utilityWidgets/bloc_module.dart';
import '../../../infrastructure/utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc_event.dart';
import '../bloc/marianum_message_bloc.dart'; import '../bloc/marianum_message_bloc.dart';
import '../bloc/marianum_message_state.dart'; import '../bloc/marianum_message_state.dart';
@ -19,10 +17,6 @@ class MarianumMessageListView extends StatelessWidget {
child: (context, bloc, state) => Scaffold( child: (context, bloc, state) => Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Marianum Message'), title: const Text('Marianum Message'),
actions: [
IconButton(onPressed: () => context.read<MarianumMessageBloc>().add(Emit((state) => const MarianumMessageState(messageList: MarianumMessageList(base: '', messages: [MarianumMessage(url: '', name: 'Teeest', date: 'now')])))), icon: const Icon(Icons.add)),
IconButton(onPressed: () => context.read<MarianumMessageBloc>().add(ClearState()), icon: const Icon(Icons.add))
],
), ),
body: LoadableStateConsumer<MarianumMessageBloc, MarianumMessageState>( body: LoadableStateConsumer<MarianumMessageBloc, MarianumMessageState>(
child: (state, loading) => ListView.builder( child: (state, loading) => ListView.builder(
@ -34,7 +28,7 @@ class MarianumMessageListView extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [Icon(Icons.newspaper)], children: [Icon(Icons.newspaper)],
), ),
title: Text("${message.name}${loading ? "loading" : "notloading"}", overflow: TextOverflow.ellipsis), title: Text(message.name, overflow: TextOverflow.ellipsis),
subtitle: Text('vom ${message.date}'), subtitle: Text('vom ${message.date}'),
trailing: const Icon(Icons.arrow_right), trailing: const Icon(Icons.arrow_right),
onTap: () { onTap: () {

View File

@ -103,6 +103,7 @@ dependencies:
freezed_annotation: ^2.4.1 freezed_annotation: ^2.4.1
connectivity_plus: ^6.0.3 connectivity_plus: ^6.0.3
hydrated_bloc: ^9.1.5 hydrated_bloc: ^9.1.5
dio: ^4.0.6
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: