diff --git a/lib/core/managers/news_repository.dart b/lib/core/managers/news_repository.dart index f63f20a5c..85e4c920e 100644 --- a/lib/core/managers/news_repository.dart +++ b/lib/core/managers/news_repository.dart @@ -40,7 +40,8 @@ class NewsRepository { avatar: "https://picsum.photos/200/200", activity: "Club scientifique", publishedDate: DateTime.now(), - eventDate: DateTime.now().add(const Duration(days: 2)), + eventStartDate: DateTime.now().add(const Duration(days: 2)), + eventEndDate: DateTime.now().add(const Duration(days: 5)), image: "https://picsum.photos/400/200", tags: [ "Robotique", @@ -58,7 +59,8 @@ class NewsRepository { avatar: "https://picsum.photos/200/200", activity: "Club scientifique", publishedDate: DateTime.now(), - eventDate: DateTime.now().add(const Duration(days: 10)), + eventStartDate: DateTime.now().add(const Duration(days: 10)), + eventEndDate: DateTime.now().add(const Duration(days: 11)), image: "https://picsum.photos/400/200", tags: [ "Compétition", @@ -73,7 +75,7 @@ class NewsRepository { avatar: "https://picsum.photos/200/200", activity: "Service à la vie étudiante", publishedDate: DateTime.now(), - eventDate: DateTime.now().add(const Duration(days: 3)), + eventStartDate: DateTime.now().add(const Duration(days: 3)), image: "https://picsum.photos/400/200", tags: ["5 @ 7", "Vie étudiante", "Activité"], ), diff --git a/lib/core/models/news.dart b/lib/core/models/news.dart index a2957cf7d..1bca74a55 100644 --- a/lib/core/models/news.dart +++ b/lib/core/models/news.dart @@ -8,20 +8,21 @@ class News { final String image; final List tags; final DateTime publishedDate; - final DateTime eventDate; + final DateTime eventStartDate; + final DateTime? eventEndDate; - News({ - required this.id, - required this.title, - required this.description, - required this.author, - required this.avatar, - required this.activity, - required this.image, - required this.tags, - required this.publishedDate, - required this.eventDate, - }); + News( + {required this.id, + required this.title, + required this.description, + required this.author, + required this.avatar, + required this.activity, + required this.image, + required this.tags, + required this.publishedDate, + required this.eventStartDate, + this.eventEndDate}); /// Used to create [News] instance from a JSON file factory News.fromJson(Map map) { @@ -35,7 +36,8 @@ class News { image: map['image'] as String, tags: map['tags'] as List, publishedDate: DateTime.parse(map['publishedDate'] as String), - eventDate: DateTime.parse(map['eventDate'] as String), + eventStartDate: DateTime.parse(map['eventStartDate'] as String), + eventEndDate: DateTime.parse(map['eventEndDate'] as String), ); } @@ -50,7 +52,8 @@ class News { 'image': image, 'tags': tags.toList(), 'publishedDate': publishedDate.toString(), - 'eventDate': eventDate.toString(), + 'eventStartDate': eventStartDate.toString(), + 'eventEndDate': eventEndDate.toString(), }; } } diff --git a/lib/ui/views/news_details_view.dart b/lib/ui/views/news_details_view.dart index 54151d23e..94022c437 100644 --- a/lib/ui/views/news_details_view.dart +++ b/lib/ui/views/news_details_view.dart @@ -93,8 +93,11 @@ class _NewsDetailsViewState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _buildTitle(widget.news.title), - _buildDate(context, widget.news.publishedDate, - widget.news.eventDate), + _buildDate( + context, + widget.news.publishedDate, + widget.news.eventStartDate, + widget.news.eventEndDate), _buildImage(widget.news.image), _buildAuthor(widget.news.avatar, widget.news.author, widget.news.activity), @@ -187,14 +190,31 @@ class _NewsDetailsViewState extends State { ); } - Widget _buildDate( - BuildContext context, DateTime publishedDate, DateTime eventDate) { + Widget _buildDate(BuildContext context, DateTime publishedDate, + DateTime eventStartDate, DateTime? eventEndDate) { + final String locale = Localizations.localeOf(context).toString(); final String formattedPublishedDate = - DateFormat('d MMMM yyyy', Localizations.localeOf(context).toString()) - .format(publishedDate); - final String formattedEventDate = - DateFormat('d MMMM yyyy', Localizations.localeOf(context).toString()) - .format(eventDate); + DateFormat('d MMMM yyyy', locale).format(publishedDate); + + late String formattedEventDate; + + final bool sameMonthAndYear = eventEndDate?.month == eventStartDate.month && + eventEndDate?.year == eventStartDate.year; + final bool sameDayMonthAndYear = + eventEndDate?.day == eventStartDate.day && sameMonthAndYear; + + if (eventEndDate == null || sameDayMonthAndYear) { + formattedEventDate = + DateFormat('d MMMM yyyy', locale).format(eventStartDate); + } else { + if (sameMonthAndYear) { + formattedEventDate = + '${DateFormat('d', locale).format(eventStartDate)} - ${DateFormat('d MMMM yyyy', locale).format(eventEndDate)}'; + } else { + formattedEventDate = + '${DateFormat('d MMMM yyyy', locale).format(eventStartDate)} -\n${DateFormat('d MMMM yyyy', locale).format(eventEndDate)}'; + } + } return Padding( padding: const EdgeInsets.fromLTRB(16.0, 5.0, 16.0, 8.0), @@ -231,7 +251,7 @@ class _NewsDetailsViewState extends State { child: Padding( padding: const EdgeInsets.only(left: 4), child: Column( - crossAxisAlignment: CrossAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( AppIntl.of(context)!.news_event_date, diff --git a/test/models/news_test.dart b/test/models/news_test.dart index da9d694f5..6ba719321 100644 --- a/test/models/news_test.dart +++ b/test/models/news_test.dart @@ -19,7 +19,8 @@ void main() { 'image': 'https://example.com/image.jpg', 'tags': ['Tag 1', 'Tag 2'], 'publishedDate': '2022-01-01T12:00:00Z', - 'eventDate': '2022-01-01T12:00:00Z', + 'eventStartDate': '2022-01-01T12:00:00Z', + 'eventEndDate': '2022-01-01T12:00:00Z', }; final news = News.fromJson(json); @@ -35,7 +36,9 @@ void main() { expect(news.tags[1], equals('Tag 2')); expect( news.publishedDate, equals(DateTime.parse('2022-01-01T12:00:00Z'))); - expect(news.eventDate, equals(DateTime.parse('2022-01-01T12:00:00Z'))); + expect( + news.eventStartDate, equals(DateTime.parse('2022-01-01T12:00:00Z'))); + expect(news.eventEndDate, equals(DateTime.parse('2022-01-01T12:00:00Z'))); }); test('toJson() should convert News to JSON correctly', () { @@ -49,7 +52,8 @@ void main() { image: 'https://example.com/image.jpg', tags: ['Tag 1', 'Tag 2'], publishedDate: DateTime.parse('2022-01-01T12:00:00.000Z'), - eventDate: DateTime.parse('2022-01-01T12:00:00.000Z'), + eventStartDate: DateTime.parse('2022-01-01T12:00:00.000Z'), + eventEndDate: DateTime.parse('2022-01-01T12:00:00.000Z'), ); final json = news.toJson(); @@ -65,7 +69,8 @@ void main() { expect(json['tags'][0], equals('Tag 1')); expect(json['tags'][1], equals('Tag 2')); expect(json['publishedDate'], equals('2022-01-01 12:00:00.000Z')); - expect(json['eventDate'], equals('2022-01-01 12:00:00.000Z')); + expect(json['eventStartDate'], equals('2022-01-01 12:00:00.000Z')); + expect(json['eventEndDate'], equals('2022-01-01 12:00:00.000Z')); }); }); } diff --git a/test/ui/views/ets_view_test.dart b/test/ui/views/ets_view_test.dart index 60bc125d5..47fd2c250 100644 --- a/test/ui/views/ets_view_test.dart +++ b/test/ui/views/ets_view_test.dart @@ -36,7 +36,8 @@ void main() { image: "", tags: ["tag1", "tag2"], publishedDate: DateTime.parse('2022-01-01T12:00:00Z'), - eventDate: DateTime.parse('2022-01-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-01-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-01-02T12:00:00Z'), ), News( id: 2, @@ -48,7 +49,8 @@ void main() { image: "", tags: ["tag3", "tag4"], publishedDate: DateTime.parse('2022-02-01T12:00:00Z'), - eventDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ), News( id: 3, @@ -60,7 +62,8 @@ void main() { image: "", tags: ["tag5", "tag6"], publishedDate: DateTime.parse('2022-02-01T12:00:00Z'), - eventDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ), ]; diff --git a/test/ui/views/goldenFiles/newsDetailsView_1.png b/test/ui/views/goldenFiles/newsDetailsView_1.png index 0d0ed4817..afb48195e 100644 Binary files a/test/ui/views/goldenFiles/newsDetailsView_1.png and b/test/ui/views/goldenFiles/newsDetailsView_1.png differ diff --git a/test/ui/views/goldenFiles/newsView_2.png b/test/ui/views/goldenFiles/newsView_2.png index 103e89d33..d70543850 100644 Binary files a/test/ui/views/goldenFiles/newsView_2.png and b/test/ui/views/goldenFiles/newsView_2.png differ diff --git a/test/ui/views/news_details_view_test.dart b/test/ui/views/news_details_view_test.dart index 5c87a718f..4f9f4ff9d 100644 --- a/test/ui/views/news_details_view_test.dart +++ b/test/ui/views/news_details_view_test.dart @@ -34,7 +34,8 @@ void main() { image: '', tags: ['sampleTag1', 'sampleTag2'], publishedDate: DateTime.parse('2022-01-01T12:00:00Z'), - eventDate: DateTime.parse('2022-01-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ); }); diff --git a/test/ui/views/news_view_test.dart b/test/ui/views/news_view_test.dart index c2d133f07..65d48643e 100644 --- a/test/ui/views/news_view_test.dart +++ b/test/ui/views/news_view_test.dart @@ -34,7 +34,8 @@ void main() { image: "", tags: ["tag1", "tag2"], publishedDate: DateTime.parse('2022-01-01T12:00:00Z'), - eventDate: DateTime.parse('2022-01-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ), News( id: 2, @@ -46,7 +47,8 @@ void main() { image: "", tags: ["tag3", "tag4"], publishedDate: DateTime.parse('2022-02-01T12:00:00Z'), - eventDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ), News( id: 3, @@ -58,7 +60,8 @@ void main() { image: "", tags: ["tag5", "tag6"], publishedDate: DateTime.parse('2022-02-01T12:00:00Z'), - eventDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ), ]; diff --git a/test/ui/widgets/news_card_test.dart b/test/ui/widgets/news_card_test.dart index 21b717fad..36d12403a 100644 --- a/test/ui/widgets/news_card_test.dart +++ b/test/ui/widgets/news_card_test.dart @@ -20,7 +20,8 @@ void main() { image: "", tags: ["tag5", "tag6"], publishedDate: DateTime.parse('2022-02-01T12:00:00Z'), - eventDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ); group('News card Tests', () { diff --git a/test/viewmodels/news_details_viewmodel_test.dart b/test/viewmodels/news_details_viewmodel_test.dart index 18477558a..8286085c8 100644 --- a/test/viewmodels/news_details_viewmodel_test.dart +++ b/test/viewmodels/news_details_viewmodel_test.dart @@ -18,7 +18,8 @@ void main() { image: "https://example.com/image.jpg", tags: ["tag1", "tag2"], publishedDate: DateTime.parse('2022-01-01T12:00:00Z'), - eventDate: DateTime.parse('2022-01-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ); group('NewsDetailsViewModel Tests', () { diff --git a/test/viewmodels/news_viewmodel_test.dart b/test/viewmodels/news_viewmodel_test.dart index 274e77116..11f766bc2 100644 --- a/test/viewmodels/news_viewmodel_test.dart +++ b/test/viewmodels/news_viewmodel_test.dart @@ -28,7 +28,8 @@ void main() { image: "", tags: ["tag1", "tag2"], publishedDate: DateTime.parse('2022-01-01T12:00:00Z'), - eventDate: DateTime.parse('2022-01-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ), News( id: 2, @@ -40,7 +41,8 @@ void main() { image: "", tags: ["tag3", "tag4"], publishedDate: DateTime.parse('2022-02-01T12:00:00Z'), - eventDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventStartDate: DateTime.parse('2022-02-02T12:00:00Z'), + eventEndDate: DateTime.parse('2022-02-02T12:00:00Z'), ) ];