diff --git a/packages/uni_app/lib/model/entities/calendar_event.dart b/packages/uni_app/lib/model/entities/calendar_event.dart index 954764421..5bf823f21 100644 --- a/packages/uni_app/lib/model/entities/calendar_event.dart +++ b/packages/uni_app/lib/model/entities/calendar_event.dart @@ -6,31 +6,90 @@ part '../../generated/model/entities/calendar_event.g.dart'; /// An event in the school calendar @JsonSerializable() class CalendarEvent { - CalendarEvent(this.name, this.date); + /// Creates an instance of the class [CalendarEvent] + /// + + CalendarEvent(this.name, this.date) { + if (date != 'TBD') { + date = formatString(date); + } + RegExpMatch? match; + String? day1; + String? day2; + String? year1; + String? month1; + String? month2; + String? year2; + final regex1 = RegExp(r'(\d{1,2}) ([a-zç]+) (\d{4})'); + final regex2 = RegExp(r'(\d{1,2}) (\d{1,2}) ([a-zç]+) (\d{4})'); + final regex3 = RegExp(r'(\d{1,2}) ([a-zç]+) (\d{1,2}) ([a-zç]+) (\d{4})'); + final regex4 = + RegExp(r'(\d{1,2}) ([a-zç]+) (\d{4}) (\d{1,2}) ([a-zç]+) (\d{4})'); + match = regex4.firstMatch(date); + if (match != null && match.groupCount == 6) { + day1 = match.group(1); + month1 = match.group(2); + year1 = match.group(3); + day2 = match.group(4); + month2 = match.group(5); + year2 = match.group(6); + start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1'); + finish = + DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day2 $month2 $year2'); + return; + } + + match = regex3.firstMatch(date); + if (match != null && match.groupCount == 5) { + day1 = match.group(1); + month1 = match.group(2); + day2 = match.group(3); + month2 = match.group(4); + year1 = match.group(5); + start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1'); + finish = + DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day2 $month2 $year1'); + return; + } + match = regex2.firstMatch(date); + if (match != null && match.groupCount == 4) { + day1 = match.group(1); + day2 = match.group(2); + month1 = match.group(3); + year1 = match.group(4); + start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1'); + finish = + DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day2 $month1 $year1'); + return; + } + match = regex1.firstMatch(date); + if (match != null && match.groupCount == 3) { + day1 = match.group(1); + month1 = match.group(2); + year1 = match.group(3); + start = DateFormat('dd MMMM yyyy', 'pt_PT').parse('$day1 $month1 $year1'); + return; + } + } factory CalendarEvent.fromJson(Map json) => _$CalendarEventFromJson(json); - /// Creates an instance of the class [CalendarEvent] - /// String name; String date; + DateTime? start; + DateTime? finish; Map toJson() => _$CalendarEventToJson(this); - DateTime? get parsedStartDate { - final splitDate = date.split(' '); - final month = splitDate.firstWhere( - (element) => - DateFormat.MMMM('pt').dateSymbols.MONTHS.contains(element) || - element == 'TBD', - ); - - try { - return DateFormat('dd MMMM yyyy', 'pt') - .parse('${splitDate[0]} $month ${splitDate.last}'); - } catch (_) { - return null; - } + String formatString(String date) { + return date + .toLowerCase() + .replaceAll(RegExp(r'\baté\b'), '') + .replaceAll(RegExp(r'\bde\b'), '') + .replaceAll(RegExp(r'\ba\b'), '') + .replaceAll(RegExp(r'\e\b'), '') + .replaceAll(RegExp(r'\s+'), ' ') + .trim(); } } diff --git a/packages/uni_app/lib/view/calendar/calendar.dart b/packages/uni_app/lib/view/calendar/calendar.dart index e65739d68..421ab7cee 100644 --- a/packages/uni_app/lib/view/calendar/calendar.dart +++ b/packages/uni_app/lib/view/calendar/calendar.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:timelines/timelines.dart'; import 'package:uni/generated/l10n.dart'; import 'package:uni/model/entities/calendar_event.dart'; import 'package:uni/model/providers/lazy/calendar_provider.dart'; import 'package:uni/utils/navigation_items.dart'; -import 'package:uni/view/calendar/widgets/calendar_tile.dart'; +import 'package:uni/view/calendar/widgets/row_format.dart'; import 'package:uni/view/common_widgets/pages_layouts/secondary/secondary.dart'; import 'package:uni/view/lazy_consumer.dart'; +import 'package:uni/view/locale_notifier.dart'; class CalendarPageView extends StatefulWidget { const CalendarPageView({super.key}); @@ -32,24 +32,12 @@ class CalendarPageViewState extends SecondaryPageViewState { } Widget getTimeline(BuildContext context, List calendar) { + final locale = Provider.of(context).getLocale(); return SingleChildScrollView( - child: FixedTimeline.tileBuilder( - theme: TimelineTheme.of(context).copyWith( - connectorTheme: TimelineTheme.of(context) - .connectorTheme - .copyWith(thickness: 2, color: Theme.of(context).dividerColor), - indicatorTheme: TimelineTheme.of(context) - .indicatorTheme - .copyWith(size: 15, color: Theme.of(context).primaryColor), - ), - builder: TimelineTileBuilder.fromStyle( - contentsAlign: ContentsAlign.alternating, - contentsBuilder: (_, index) => - CalendarTile(text: calendar[index].name), - oppositeContentsBuilder: (_, index) => - CalendarTile(text: calendar[index].date, isOpposite: true), - itemCount: calendar.length, - ), + child: Column( + children: calendar + .map((event) => RowFormat(event: event, locale: locale)) + .toList(), ), ); } diff --git a/packages/uni_app/lib/view/calendar/widgets/calendar_card.dart b/packages/uni_app/lib/view/calendar/widgets/calendar_card.dart index e0b2131e8..866c78b63 100644 --- a/packages/uni_app/lib/view/calendar/widgets/calendar_card.dart +++ b/packages/uni_app/lib/view/calendar/widgets/calendar_card.dart @@ -48,10 +48,10 @@ class CalendarCard extends GenericCard { List getFurtherEvents(List events) { final sortedEvents = events - .where((element) => element.parsedStartDate != null) - .sorted((a, b) => a.parsedStartDate!.compareTo(b.parsedStartDate!)); + .where((element) => element.start != null) + .sorted((a, b) => a.start!.compareTo(b.start!)); final pinEvent = sortedEvents.firstWhere( - (element) => element.parsedStartDate!.compareTo(DateTime.now()) == 1, + (element) => element.start!.compareTo(DateTime.now()) == 1, ); return sortedEvents.sublist( sortedEvents.indexOf(pinEvent), diff --git a/packages/uni_app/lib/view/calendar/widgets/calendar_tile.dart b/packages/uni_app/lib/view/calendar/widgets/calendar_tile.dart deleted file mode 100644 index 6d3793eba..000000000 --- a/packages/uni_app/lib/view/calendar/widgets/calendar_tile.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; - -class CalendarTile extends StatelessWidget { - const CalendarTile({required this.text, super.key, this.isOpposite = false}); - final String text; - final bool isOpposite; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.all(24), - child: Text( - text, - style: !isOpposite - ? Theme.of(context) - .textTheme - .titleLarge - ?.copyWith(fontWeight: FontWeight.w500) - : Theme.of(context).textTheme.titleMedium?.copyWith( - fontStyle: FontStyle.italic, - ), - ), - ); - } -} diff --git a/packages/uni_app/lib/view/calendar/widgets/row_format.dart b/packages/uni_app/lib/view/calendar/widgets/row_format.dart new file mode 100644 index 000000000..f45eec9ed --- /dev/null +++ b/packages/uni_app/lib/view/calendar/widgets/row_format.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:uni/model/entities/app_locale.dart'; +import 'package:uni/model/entities/calendar_event.dart'; +import 'package:uni_ui/cards/timeline_card.dart'; + +// TODO(thePeras): This class should be extracted up +class RowFormat extends StatelessWidget { + const RowFormat({super.key, required this.event, required this.locale}); + final CalendarEvent event; + final AppLocale locale; + + @override + Widget build(BuildContext context) { + final eventperiod = eventPeriod(event.date, event.start, event.finish); + + return TimelineItem( + title: eventperiod[0], + subtitle: eventperiod[1], + card: Text( + event.name, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 16, + fontWeight: FontWeight.w500, + height: 1, + ), + maxLines: 5, + ), + ); + } + + // TODO(thePeras): This shoudn't exist here + List eventPeriod(String date, DateTime? start, DateTime? end) { + final period = []; + String timePeriod; + String month; + String? month1; + String day; + String? day1; + String year; + String? year1; + if (start == null) { + period + ..add(date) + ..add(''); + return period; + } + year = start.year.toString(); + month = shortMonth(start); + day = start.day.toString(); + if (end == null) { + timePeriod = '$day $month'; + period + ..add(timePeriod) + ..add(year); + return period; + } + day1 = end.day.toString(); + year1 = end.year.toString(); + month1 = shortMonth(end); + if (year == year1 && month1 == month) { + timePeriod = '$day-$day1 $month'; + period + ..add(timePeriod) + ..add(year); + return period; + } + if (year == year1 && month1 != month) { + timePeriod = '$day $month-$day1 $month1'; + period + ..add(timePeriod) + ..add(year); + return period; + } + if (year1 != year) { + timePeriod = '$day $month-$day1 $month1'; + period + ..add(timePeriod) + ..add(year); + return period; + } + period + ..add('the date') + ..add(date); + return period; + } + + String shortMonth(DateTime date) { + return DateFormat.MMM(locale.localeCode.languageCode) + .format(date) + .replaceFirst('.', ''); + } +} diff --git a/packages/uni_ui/lib/cards/timeline_card.dart b/packages/uni_ui/lib/cards/timeline_card.dart index 88e8d705a..b0da66059 100644 --- a/packages/uni_ui/lib/cards/timeline_card.dart +++ b/packages/uni_ui/lib/cards/timeline_card.dart @@ -17,13 +17,15 @@ class TimelineItem extends StatelessWidget { Widget build(BuildContext context) { return Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - width: 50, + width: 60, child: Column( children: [ Text(title, - style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18)), + style: Theme.of(context).textTheme.bodyLarge, + textAlign: TextAlign.center), Text(subtitle, - style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600)) + style: Theme.of(context).textTheme.labelLarge, + textAlign: TextAlign.center), ], ), ),