From d5f1bda69960576007aca0b9a8b3cad76bfca4ee Mon Sep 17 00:00:00 2001 From: BrightDV <92821484+BrightDV@users.noreply.github.com> Date: Thu, 18 Apr 2024 22:13:46 +0200 Subject: [PATCH] [race hub] add #143 (add an 'add to calendar' button to the sessions) --- lib/Screens/racehub.dart | 10 ++- lib/Screens/session_screen.dart | 112 +++++++++++++++++++++++++++++++- 2 files changed, 120 insertions(+), 2 deletions(-) diff --git a/lib/Screens/racehub.dart b/lib/Screens/racehub.dart index 2ae2450..61b5235 100644 --- a/lib/Screens/racehub.dart +++ b/lib/Screens/racehub.dart @@ -222,6 +222,7 @@ class RaceHubScreen extends StatelessWidget { session, event.raceId, event.meetingCountryName, + event.meetingOfficialName, ), ], ), @@ -366,6 +367,7 @@ class RaceHubScreen extends StatelessWidget { session, event.raceId, event.meetingCountryName, + event.meetingOfficialName, ), ), Padding( @@ -534,11 +536,13 @@ class SessionItem extends StatelessWidget { final Session session; final String raceId; final String meetingCountryName; + final String meetingOfficialName; const SessionItem( this.session, this.raceId, - this.meetingCountryName, { + this.meetingCountryName, + this.meetingOfficialName, { Key? key, }) : super(key: key); @@ -734,6 +738,8 @@ class SessionItem extends StatelessWidget { builder: (context) => SessionScreen( sessionsAbbreviations[session.sessionsAbbreviation], session, + meetingCountryName, + meetingOfficialName, ), ), ), @@ -865,6 +871,8 @@ class SessionItem extends StatelessWidget { builder: (context) => SessionScreen( sessionsAbbreviations[session.sessionsAbbreviation], session, + meetingCountryName, + meetingOfficialName, ), ), ), diff --git a/lib/Screens/session_screen.dart b/lib/Screens/session_screen.dart index 92be6c1..7b3ee85 100644 --- a/lib/Screens/session_screen.dart +++ b/lib/Screens/session_screen.dart @@ -17,11 +17,13 @@ * Copyright (c) 2022-2024, BrightDV */ +import 'package:add_2_calendar/add_2_calendar.dart' as calendar; import 'package:boxbox/Screens/SessionWebView/unofficial_webview.dart'; import 'package:boxbox/Screens/SessionWebView/webview_manager.dart'; import 'package:boxbox/Screens/free_practice_screen.dart'; import 'package:boxbox/Screens/race_details.dart'; import 'package:boxbox/api/event_tracker.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_timer_countdown/flutter_timer_countdown.dart'; @@ -30,8 +32,12 @@ import 'package:hive_flutter/hive_flutter.dart'; class SessionScreen extends StatefulWidget { final String sessionFullName; final Session session; + final String meetingCountryName; + final String meetingOfficialName; - const SessionScreen(this.sessionFullName, this.session, {Key? key}) + const SessionScreen(this.sessionFullName, this.session, + this.meetingCountryName, this.meetingOfficialName, + {Key? key}) : super(key: key); @override State createState() => _SessionScreenState(); @@ -117,6 +123,57 @@ class _SessionScreenState extends State { setState(() {}); }, ), + !kIsWeb + ? Padding( + padding: const EdgeInsets.only(top: 5, bottom: 5), + child: TextButton.icon( + label: Padding( + padding: + const EdgeInsets.symmetric(vertical: 7), + child: Text( + AppLocalizations.of(context)!.addToCalendar, + ), + ), + icon: Icon( + Icons.add_alert_outlined, + ), + style: TextButton.styleFrom( + side: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 1, + ), + ), + onPressed: () { + calendar.Event event = calendar.Event( + title: + '${widget.sessionFullName} - ${widget.meetingOfficialName}', + location: widget.meetingCountryName, + startDate: DateTime( + widget.session.startTime.toLocal().year, + widget.session.startTime.toLocal().month, + widget.session.startTime.toLocal().day, + widget.session.startTime.toLocal().hour, + widget.session.startTime.toLocal().minute, + widget.session.startTime.toLocal().second, + ), + endDate: DateTime( + widget.session.startTime.toLocal().year, + widget.session.startTime.toLocal().month, + widget.session.startTime.toLocal().day, + widget.session.startTime.toLocal().hour + + (widget.session.sessionsAbbreviation == + 'r' + ? 3 + : 1), + widget.session.startTime.toLocal().minute, + widget.session.startTime.toLocal().second, + ), + ); + calendar.Add2Calendar.addEvent2Cal(event); + }, + ), + ) + : Container(), ], ), ) @@ -195,6 +252,59 @@ class _SessionScreenState extends State { setState(() {}); }, ), + !kIsWeb + ? Padding( + padding: const EdgeInsets.only(top: 5, bottom: 5), + child: TextButton.icon( + label: Padding( + padding: + const EdgeInsets.symmetric(vertical: 7), + child: Text( + AppLocalizations.of(context)!.addToCalendar, + ), + ), + icon: Icon( + Icons.add_alert_outlined, + ), + style: TextButton.styleFrom( + side: BorderSide( + color: + Theme.of(context).colorScheme.primary, + width: 1, + ), + ), + onPressed: () { + calendar.Event event = calendar.Event( + title: + '${widget.sessionFullName} - ${widget.meetingOfficialName}', + location: widget.meetingCountryName, + startDate: DateTime( + widget.session.startTime.toLocal().year, + widget.session.startTime.toLocal().month, + widget.session.startTime.toLocal().day, + widget.session.startTime.toLocal().hour, + widget.session.startTime.toLocal().minute, + widget.session.startTime.toLocal().second, + ), + endDate: DateTime( + widget.session.startTime.toLocal().year, + widget.session.startTime.toLocal().month, + widget.session.startTime.toLocal().day, + widget.session.startTime.toLocal().hour + + (widget.session + .sessionsAbbreviation == + 'r' + ? 3 + : 1), + widget.session.startTime.toLocal().minute, + widget.session.startTime.toLocal().second, + ), + ); + calendar.Add2Calendar.addEvent2Cal(event); + }, + ), + ) + : Container(), ], ) : widget.session.state == 'completed' ||