From e57a1a915e7d3f8889f591d05b43c51d51fdb86b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 11 May 2024 19:29:12 +0200 Subject: [PATCH] implemented marianum message dataloader --- .../mhsl/message/getMessages/getMessages.dart | 3 -- .../dataLoader/data_loader.dart | 35 ++++++++++++++++++- .../dataLoader/mhsl_data_loader.dart | 9 +++++ .../marianum_message_get_messages.dart | 14 ++++---- .../marianum_message_repository.dart | 2 +- .../view/marianum_message_list_view.dart | 8 +---- pubspec.yaml | 1 + 7 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 lib/state/app/infrastructure/dataLoader/mhsl_data_loader.dart diff --git a/lib/api/mhsl/message/getMessages/getMessages.dart b/lib/api/mhsl/message/getMessages/getMessages.dart index 32a5734..34bfc6b 100644 --- a/lib/api/mhsl/message/getMessages/getMessages.dart +++ b/lib/api/mhsl/message/getMessages/getMessages.dart @@ -7,11 +7,8 @@ import 'getMessagesResponse.dart'; class GetMessages extends MhslApi { GetMessages() : super('message/messages.json'); - - @override GetMessagesResponse assemble(String raw) => GetMessagesResponse.fromJson(jsonDecode(raw)); - @override Future request(Uri uri) => http.get(uri); } diff --git a/lib/state/app/infrastructure/dataLoader/data_loader.dart b/lib/state/app/infrastructure/dataLoader/data_loader.dart index 47306ba..c6b826b 100644 --- a/lib/state/app/infrastructure/dataLoader/data_loader.dart +++ b/lib/state/app/infrastructure/dataLoader/data_loader.dart @@ -1,3 +1,36 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:dio/dio.dart'; + abstract class DataLoader { - Future 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 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> fetch(); + TResult assemble(DataLoaderResult data); +} + +class DataLoaderResult { + final Map json; + final Map headers; + + DataLoaderResult({required this.json, required this.headers}); } diff --git a/lib/state/app/infrastructure/dataLoader/mhsl_data_loader.dart b/lib/state/app/infrastructure/dataLoader/mhsl_data_loader.dart new file mode 100644 index 0000000..060e37d --- /dev/null +++ b/lib/state/app/infrastructure/dataLoader/mhsl_data_loader.dart @@ -0,0 +1,9 @@ +import 'package:dio/dio.dart'; + +import 'data_loader.dart'; + +abstract class MhslDataLoader extends DataLoader { + MhslDataLoader() : super(Dio(BaseOptions( + baseUrl: 'https://mhsl.eu/marianum/marianummobile/' + ))); +} diff --git a/lib/state/app/modules/marianumMessage/dataProvider/marianum_message_get_messages.dart b/lib/state/app/modules/marianumMessage/dataProvider/marianum_message_get_messages.dart index 1a7d8f6..cb7f9db 100644 --- a/lib/state/app/modules/marianumMessage/dataProvider/marianum_message_get_messages.dart +++ b/lib/state/app/modules/marianumMessage/dataProvider/marianum_message_get_messages.dart @@ -1,12 +1,12 @@ +import 'package:dio/dio.dart'; + import '../../../infrastructure/dataLoader/data_loader.dart'; +import '../../../infrastructure/dataLoader/mhsl_data_loader.dart'; import '../bloc/marianum_message_state.dart'; -class MarianumMessageGetMessages extends DataLoader { - +class MarianumMessageGetMessages extends MhslDataLoader { @override - Future fetch() async { - await Future.delayed(const Duration(seconds: 3)); - // throw UnimplementedError("Test"); - return const MarianumMessageList(base: '', messages: [MarianumMessage(date: '', name: 'RepoTest', url: '')]); - } + Future> fetch() async => dio.get('/message/messages.json'); + @override + MarianumMessageList assemble(DataLoaderResult data) => MarianumMessageList.fromJson(data.json); } diff --git a/lib/state/app/modules/marianumMessage/repository/marianum_message_repository.dart b/lib/state/app/modules/marianumMessage/repository/marianum_message_repository.dart index 033f821..3148b92 100644 --- a/lib/state/app/modules/marianumMessage/repository/marianum_message_repository.dart +++ b/lib/state/app/modules/marianumMessage/repository/marianum_message_repository.dart @@ -3,5 +3,5 @@ import '../bloc/marianum_message_state.dart'; import '../dataProvider/marianum_message_get_messages.dart'; class MarianumMessageRepository extends Repository { - Future getMessages() => MarianumMessageGetMessages().fetch(); + Future getMessages() => MarianumMessageGetMessages().run(); } diff --git a/lib/state/app/modules/marianumMessage/view/marianum_message_list_view.dart b/lib/state/app/modules/marianumMessage/view/marianum_message_list_view.dart index a56bc36..bab6a1d 100644 --- a/lib/state/app/modules/marianumMessage/view/marianum_message_list_view.dart +++ b/lib/state/app/modules/marianumMessage/view/marianum_message_list_view.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import '../../../../../api/mhsl/message/getMessages/getMessagesResponse.dart'; import '../../../../../view/pages/more/message/messageView.dart'; import '../../../infrastructure/loadableState/loadable_state.dart'; import '../../../infrastructure/loadableState/view/loadable_state_consumer.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_state.dart'; @@ -19,10 +17,6 @@ class MarianumMessageListView extends StatelessWidget { child: (context, bloc, state) => Scaffold( appBar: AppBar( title: const Text('Marianum Message'), - actions: [ - IconButton(onPressed: () => context.read().add(Emit((state) => const MarianumMessageState(messageList: MarianumMessageList(base: '', messages: [MarianumMessage(url: '', name: 'Teeest', date: 'now')])))), icon: const Icon(Icons.add)), - IconButton(onPressed: () => context.read().add(ClearState()), icon: const Icon(Icons.add)) - ], ), body: LoadableStateConsumer( child: (state, loading) => ListView.builder( @@ -34,7 +28,7 @@ class MarianumMessageListView extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, 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}'), trailing: const Icon(Icons.arrow_right), onTap: () { diff --git a/pubspec.yaml b/pubspec.yaml index 61599a4..c74885e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -103,6 +103,7 @@ dependencies: freezed_annotation: ^2.4.1 connectivity_plus: ^6.0.3 hydrated_bloc: ^9.1.5 + dio: ^4.0.6 dev_dependencies: flutter_test: