develop-bloc-holidays #72

Merged
MineTec merged 6 commits from develop-bloc-holidays into develop 2024-06-23 21:00:45 +00:00
57 changed files with 819 additions and 88 deletions
Showing only changes of commit a33c4ddac5 - Show all commits

View File

@ -9,8 +9,8 @@ import 'holidays_state.dart';
class HolidaysBloc extends LoadableHydratedBloc<HolidaysEvent, HolidaysState, HolidaysRepository> {
HolidaysBloc() {
on<SetPastHolidaysVisible>((event, emit) {
log('set pastholidays: ${event.shouldBeVisible.toString()}');
add(Emit((state) => state.copyWith(showPastHolidays: state.showPastHolidays)));
log('SetPastHolidaysVisible: ${event.shouldBeVisible.toString()}');
add(Emit((state) => state.copyWith(showPastHolidays: event.shouldBeVisible)));
});
on<DisclaimerDismissed>((event, emit) => add(
@ -19,6 +19,9 @@ class HolidaysBloc extends LoadableHydratedBloc<HolidaysEvent, HolidaysState, Ho
}
bool showPastHolidays() => innerState?.showPastHolidays ?? false;
List<Holiday>? getHolidays() => innerState?.holidays.where(
(element) => showPastHolidays() || DateTime.parse(element.end).isAfter(DateTime.now())
).toList();
@override
fromNothing() => const HolidaysState(showPastHolidays: false, holidays: [], showDisclaimer: true);

View File

@ -1,13 +1,11 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:jiffy/jiffy.dart';
import '../../../../../view/pages/more/holidays/holidays.dart';
import '../../../../../widget/animatedTime.dart';
import '../../../../../widget/list_view_util.dart';
import '../../../../../widget/centeredLeading.dart';
import '../../../../../widget/debug/debugTile.dart';
import '../../../infrastructure/loadableState/loadable_state.dart';
import '../../../infrastructure/loadableState/view/loadable_state_consumer.dart';
import '../../../infrastructure/utilityWidgets/bloc_module.dart';
import '../bloc/holidays_bloc.dart';
@ -18,18 +16,17 @@ class HolidaysView extends StatelessWidget {
const HolidaysView({super.key});
@override
Widget build(BuildContext context) => BlocModule<HolidaysBloc, LoadableState<HolidaysState>>(
create: (contet) => HolidaysBloc(),
Widget build(BuildContext context) => BlocModule(
create: (context) => HolidaysBloc(),
autoRebuild: true,
child: (context, bloc, state) {
log(state.toString());
void showDisclaimer() {
showDialog(context: context, builder: (context) => AlertDialog(
title: const Text('Richtigkeit und Bereitstellung der Daten'),
content: const Text(''
'Sämtliche Datumsangaben sind ohne Gewähr.\n'
'Ich übernehme weder Verantwortung für die Richtigkeit der Daten noch hafte ich für wirtschaftliche Schäden die aus der Verwendung dieser Daten entstehen können.\n\n'
'Die Daten stammen von https://ferien-api.de/'),
'Sämtliche Datumsangaben sind ohne Gewähr.\n'
'Ich übernehme weder Verantwortung für die Richtigkeit der Daten noch hafte ich für wirtschaftliche Schäden die aus der Verwendung dieser Daten entstehen können.\n\n'
'Die Daten stammen von https://ferien-api.de/'),
actions: [
TextButton(child: const Text('Okay'), onPressed: () {
bloc.add(DisclaimerDismissed());
@ -66,53 +63,48 @@ class HolidaysView extends StatelessWidget {
],
),
body: LoadableStateConsumer<HolidaysBloc, HolidaysState>(
child: (state, loading) => ListView.builder(
itemCount: state.holidays.length,
itemBuilder: (context, index) {
var holiday = state.holidays[index];
var holidayType = holiday.name.split(' ').first.capitalize();
child: (state, loading) => ListViewUtil.fromList<Holiday>(bloc.getHolidays(), (holiday) {
var holidayType = holiday.name.split(' ').first.capitalize();
String formatDate(String enDate) => Jiffy.parse(enDate).format(pattern: 'dd.MM.yyyy');
String formatDate(String enDate) => Jiffy.parse(enDate).format(pattern: 'dd.MM.yyyy');
return ListTile(
leading: const CenteredLeading(Icon(Icons.calendar_month)),
title: Text('$holidayType ab ${formatDate(holiday.start)}'),
subtitle: Text('bis ${formatDate(holiday.end)}'),
onTap: () => showDialog(context: context, builder: (context) => SimpleDialog(
title: Text('$holidayType ${holiday.year} in Hessen'),
children: [
ListTile(
leading: const CenteredLeading(Icon(Icons.signpost_outlined)),
title: Text(holiday.name),
subtitle: Text(holiday.slug),
return ListTile(
leading: const CenteredLeading(Icon(Icons.calendar_month)),
title: Text('${state.showPastHolidays}$holidayType ab ${formatDate(holiday.start)}'),
subtitle: Text('bis ${formatDate(holiday.end)}'),
onTap: () => showDialog(context: context, builder: (context) => SimpleDialog(
title: Text('$holidayType ${holiday.year} in Hessen'),
children: [
ListTile(
leading: const CenteredLeading(Icon(Icons.signpost_outlined)),
title: Text(holiday.name),
subtitle: Text(holiday.slug),
),
ListTile(
leading: const Icon(Icons.arrow_forward),
title: Text('vom ${formatDate(holiday.start)}'),
),
ListTile(
leading: const Icon(Icons.arrow_back),
title: Text('bis zum ${formatDate(holiday.end)}'),
),
Visibility(
visible: !DateTime.parse(holiday.start).difference(DateTime.now()).isNegative,
replacement: ListTile(
leading: const CenteredLeading(Icon(Icons.content_paste_search_outlined)),
title: Text(Jiffy.parse(holiday.start).fromNow()),
),
ListTile(
leading: const Icon(Icons.arrow_forward),
title: Text('vom ${formatDate(holiday.start)}'),
child: ListTile(
leading: const CenteredLeading(Icon(Icons.timer_outlined)),
title: AnimatedTime(callback: () => DateTime.parse(holiday.start).difference(DateTime.now())),
subtitle: Text(Jiffy.parse(holiday.start).fromNow()),
),
ListTile(
leading: const Icon(Icons.arrow_back),
title: Text('bis zum ${formatDate(holiday.end)}'),
),
Visibility(
visible: !DateTime.parse(holiday.start).difference(DateTime.now()).isNegative,
replacement: ListTile(
leading: const CenteredLeading(Icon(Icons.content_paste_search_outlined)),
title: Text(Jiffy.parse(holiday.start).fromNow()),
),
child: ListTile(
leading: const CenteredLeading(Icon(Icons.timer_outlined)),
title: AnimatedTime(callback: () => DateTime.parse(holiday.start).difference(DateTime.now())),
subtitle: Text(Jiffy.parse(holiday.start).fromNow()),
),
),
DebugTile(context).jsonData(holiday.toJson()),
],
)),
trailing: const Icon(Icons.arrow_right),
);
},
),
),
DebugTile(context).jsonData(holiday.toJson()),
],
)),
trailing: const Icon(Icons.arrow_right),
);
}),
),
);
},

View File

@ -0,0 +1,9 @@
import 'package:flutter/material.dart';
class ListViewUtil {
static ListView fromList<T>(List<T>? items, Widget Function(T item) map) => ListView.builder(
itemCount: items?.length ?? 0,
itemBuilder: (context, index) => items != null ? map(items[index]) : null,
);
}