Skip to content

Commit

Permalink
DateTime extension (#1086)
Browse files Browse the repository at this point in the history
  • Loading branch information
bdmendes authored Feb 9, 2024
2 parents 9ecc57d + 991b074 commit fc08be9
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 141 deletions.
20 changes: 20 additions & 0 deletions uni/lib/utils/date_time_formatter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'package:intl/intl.dart';
import 'package:uni/model/entities/app_locale.dart';

extension DateTimeExtensions on DateTime {
String weekDay(AppLocale locale) {
return DateFormat.EEEE(locale.localeCode.languageCode)
.dateSymbols
.WEEKDAYS[weekday % 7];
}

String month(AppLocale locale) {
return DateFormat.EEEE(locale.localeCode.languageCode)
.dateSymbols
.MONTHS[this.month - 1];
}

String formattedDate(AppLocale locale) {
return DateFormat.MMMMd(locale.localeCode.languageCode).format(this);
}
}
14 changes: 9 additions & 5 deletions uni/lib/view/exams/exams.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import 'package:uni/controller/local_storage/preferences_controller.dart';
import 'package:uni/generated/l10n.dart';
import 'package:uni/model/entities/exam.dart';
import 'package:uni/model/providers/lazy/exam_provider.dart';
import 'package:uni/utils/date_time_formatter.dart';
import 'package:uni/view/common_widgets/expanded_image_label.dart';
import 'package:uni/view/common_widgets/pages_layouts/general/general.dart';
import 'package:uni/view/common_widgets/row_container.dart';
import 'package:uni/view/exams/widgets/day_title.dart';
import 'package:uni/view/exams/widgets/exam_page_title.dart';
import 'package:uni/view/exams/widgets/exam_row.dart';
import 'package:uni/view/lazy_consumer.dart';
Expand Down Expand Up @@ -120,10 +120,14 @@ class ExamsPageViewState extends GeneralPageViewState<ExamsPageView> {
Widget createExamsCards(BuildContext context, List<Exam> exams) {
final locale = Provider.of<LocaleNotifier>(context).getLocale();
final examCards = <Widget>[
DayTitle(
day: exams[0].begin.day.toString(),
weekDay: exams[0].weekDay(locale),
month: exams[0].month(locale),
Container(
padding: const EdgeInsets.only(top: 15, bottom: 3),
alignment: Alignment.center,
child: Text(
'${exams.first.weekDay(locale)}, '
'${exams.first.begin.formattedDate(locale)}',
style: Theme.of(context).textTheme.titleLarge,
),
),
];
for (var i = 0; i < exams.length; i++) {
Expand Down
26 changes: 0 additions & 26 deletions uni/lib/view/exams/widgets/day_title.dart

This file was deleted.

200 changes: 100 additions & 100 deletions uni/lib/view/home/widgets/exam_card.dart
Original file line number Diff line number Diff line change
@@ -1,100 +1,100 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:uni/generated/l10n.dart';
import 'package:uni/model/entities/exam.dart';
import 'package:uni/model/providers/lazy/exam_provider.dart';
import 'package:uni/utils/drawer_items.dart';
import 'package:uni/view/common_widgets/generic_card.dart';
import 'package:uni/view/home/widgets/exam_card_shimmer.dart';
import 'package:uni/view/home/widgets/next_exams_card.dart';
import 'package:uni/view/home/widgets/remaining_exams_card.dart';
import 'package:uni/view/lazy_consumer.dart';

class ExamCard extends GenericCard {
ExamCard({super.key});

const ExamCard.fromEditingInformation(
super.key, {
required super.editingMode,
super.onDelete,
}) : super.fromEditingInformation();

static const int maxExamsToDisplay = 4;

@override
String getTitle(BuildContext context) =>
S.of(context).nav_title(DrawerItem.navExams.title);

@override
Future<Object?> onClick(BuildContext context) =>
Navigator.pushNamed(context, '/${DrawerItem.navExams.title}');

@override
void onRefresh(BuildContext context) {
Provider.of<ExamProvider>(context, listen: false).forceRefresh(context);
}

@override
Widget buildCardContent(BuildContext context) {
return LazyConsumer<ExamProvider, List<Exam>>(
builder: (context, allExams) {
final nextExams = getPrimaryExams(
allExams,
);
return Column(
mainAxisSize: MainAxisSize.min,
children: [
NextExamsWidget(exams: nextExams),
if (nextExams.length < maxExamsToDisplay &&
allExams.length > nextExams.length)
Column(
children: [
Container(
margin: const EdgeInsets.only(
right: 80,
left: 80,
top: 7,
bottom: 7,
),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Theme.of(context).dividerColor,
),
),
),
),
RemainingExamsWidget(
exams: allExams
.where((exam) => !nextExams.contains(exam))
.take(maxExamsToDisplay - nextExams.length)
.toList(),
),
],
),
],
);
},
hasContent: (allExams) => allExams.isNotEmpty,
onNullContent: Center(
child: Text(
S.of(context).no_selected_exams,
style: Theme.of(context).textTheme.titleLarge,
),
),
contentLoadingWidget: const ExamCardShimmer(),
);
}

List<Exam> getPrimaryExams(List<Exam> allExams) {
return allExams
.where((exam) => isSameDay(allExams[0].begin, exam.begin))
.toList();
}

bool isSameDay(DateTime? dateA, DateTime? dateB) {
return dateA?.year == dateB?.year &&
dateA?.month == dateB?.month &&
dateA?.day == dateB?.day;
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:uni/generated/l10n.dart';
import 'package:uni/model/entities/exam.dart';
import 'package:uni/model/providers/lazy/exam_provider.dart';
import 'package:uni/utils/drawer_items.dart';
import 'package:uni/view/common_widgets/generic_card.dart';
import 'package:uni/view/home/widgets/exam_card_shimmer.dart';
import 'package:uni/view/home/widgets/next_exams_card.dart';
import 'package:uni/view/home/widgets/remaining_exams_card.dart';
import 'package:uni/view/lazy_consumer.dart';

class ExamCard extends GenericCard {
ExamCard({super.key});

const ExamCard.fromEditingInformation(
super.key, {
required super.editingMode,
super.onDelete,
}) : super.fromEditingInformation();

static const int maxExamsToDisplay = 4;

@override
String getTitle(BuildContext context) =>
S.of(context).nav_title(DrawerItem.navExams.title);

@override
Future<Object?> onClick(BuildContext context) =>
Navigator.pushNamed(context, '/${DrawerItem.navExams.title}');

@override
void onRefresh(BuildContext context) {
Provider.of<ExamProvider>(context, listen: false).forceRefresh(context);
}

@override
Widget buildCardContent(BuildContext context) {
return LazyConsumer<ExamProvider, List<Exam>>(
builder: (context, allExams) {
final nextExams = getPrimaryExams(
allExams,
);
return Column(
mainAxisSize: MainAxisSize.min,
children: [
NextExamsWidget(exams: nextExams),
if (nextExams.length < maxExamsToDisplay &&
allExams.length > nextExams.length)
Column(
children: [
Container(
margin: const EdgeInsets.only(
right: 80,
left: 80,
top: 7,
bottom: 7,
),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Theme.of(context).dividerColor,
),
),
),
),
RemainingExamsWidget(
exams: allExams
.where((exam) => !nextExams.contains(exam))
.take(maxExamsToDisplay - nextExams.length)
.toList(),
),
],
),
],
);
},
hasContent: (allExams) => allExams.isNotEmpty,
onNullContent: Center(
child: Text(
S.of(context).no_selected_exams,
style: Theme.of(context).textTheme.titleLarge,
),
),
contentLoadingWidget: const ExamCardShimmer(),
);
}

List<Exam> getPrimaryExams(List<Exam> allExams) {
return allExams
.where((exam) => isSameDay(allExams[0].begin, exam.begin))
.toList();
}

bool isSameDay(DateTime? dateA, DateTime? dateB) {
return dateA?.year == dateB?.year &&
dateA?.month == dateB?.month &&
dateA?.day == dateB?.day;
}
}
12 changes: 3 additions & 9 deletions uni/lib/view/home/widgets/next_exams_card.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:uni/model/entities/app_locale.dart';
import 'package:uni/model/entities/exam.dart';
import 'package:uni/utils/date_time_formatter.dart';
import 'package:uni/view/common_widgets/date_rectangle.dart';
import 'package:uni/view/common_widgets/row_container.dart';
import 'package:uni/view/exams/widgets/exam_row.dart';
Expand All @@ -14,11 +14,12 @@ class NextExamsWidget extends StatelessWidget {

@override
Widget build(BuildContext context) {
final locale = Provider.of<LocaleNotifier>(context).getLocale();
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
DateRectangle(
date: exams.isNotEmpty ? getFormattedDate(exams.first, context) : '',
date: exams.isNotEmpty ? exams.first.begin.formattedDate(locale) : '',
),
Column(
children: exams.map((exam) {
Expand All @@ -38,11 +39,4 @@ class NextExamsWidget extends StatelessWidget {
],
);
}

String getFormattedDate(Exam exam, BuildContext context) {
final locale = Provider.of<LocaleNotifier>(context).getLocale();
return locale == AppLocale.pt
? '${exam.weekDay(locale)}, ${exam.begin.day} de ${exam.month(locale)}'
: '${exam.weekDay(locale)}, ${exam.begin.day} ${exam.month(locale)}';
}
}
3 changes: 2 additions & 1 deletion uni/lib/view/home/widgets/remaining_exams_card.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:uni/model/entities/exam.dart';
import 'package:uni/utils/date_time_formatter.dart';
import 'package:uni/view/common_widgets/row_container.dart';
import 'package:uni/view/exams/widgets/exam_title.dart';
import 'package:uni/view/locale_notifier.dart';
Expand All @@ -25,7 +26,7 @@ class RemainingExamsWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
'${exam.begin.day} ${exam.month(locale)}',
exam.begin.formattedDate(locale),
style: Theme.of(context).textTheme.bodyLarge,
),
ExamTitle(
Expand Down

0 comments on commit fc08be9

Please sign in to comment.