Skip to content

Commit a72d1f2

Browse files
committed
feat(article): open race from name
1 parent 5607c98 commit a72d1f2

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

lib/Screens/Racing/circuit.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import 'package:boxbox/helpers/loading_indicator_util.dart';
2727
import 'package:boxbox/helpers/news.dart';
2828
import 'package:boxbox/helpers/request_error.dart';
2929
import 'package:boxbox/l10n/app_localizations.dart';
30+
import 'package:boxbox/scraping/formula_one.dart';
3031
import 'package:cached_network_image/cached_network_image.dart';
3132
import 'package:flutter/material.dart';
3233
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@@ -812,3 +813,28 @@ class CuratedSection extends StatelessWidget {
812813
);
813814
}
814815
}
816+
817+
class CircuitScreenFromMeetingName extends StatelessWidget {
818+
final String meetingName;
819+
CircuitScreenFromMeetingName(this.meetingName, {super.key});
820+
821+
@override
822+
Widget build(BuildContext context) {
823+
return Scaffold(
824+
appBar: AppBar(
825+
backgroundColor: Colors.transparent,
826+
),
827+
body: Center(
828+
child: FutureBuilder(
829+
future:
830+
FormulaOneScraper().getMeetingIdFromTrack(meetingName, context),
831+
builder: (context, snapshot) => snapshot.hasError
832+
? RequestErrorWidget(snapshot.error.toString())
833+
: snapshot.hasData
834+
? Container()
835+
: LoadingIndicatorUtil(),
836+
),
837+
),
838+
);
839+
}
840+
}

lib/config/router.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,13 @@ class RouterLocalConfig {
210210
name: 'racing',
211211
path: 'racing/:meetingId',
212212
builder: (context, state) {
213+
try {
214+
int.parse(state.pathParameters['meetingId']!);
215+
} catch (_) {
216+
return CircuitScreenFromMeetingName(
217+
state.pathParameters['meetingId']!,
218+
);
219+
}
213220
return CircuitScreen(
214221
state.pathParameters['meetingId']!,
215222
);

lib/scraping/formula_one.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import 'package:boxbox/helpers/constants.dart';
2525
import 'package:boxbox/helpers/convert_ergast_and_formula_one.dart';
2626
import 'package:flutter/material.dart';
2727
import 'package:boxbox/l10n/app_localizations.dart';
28+
import 'package:go_router/go_router.dart';
2829
import 'package:hive_flutter/hive_flutter.dart';
2930
import 'package:http/http.dart' as http;
3031
import 'package:html/parser.dart' as parser;
@@ -693,6 +694,31 @@ class FormulaOneScraper {
693694

694695
return results;
695696
}
697+
698+
Future<String> getMeetingIdFromTrack(
699+
String track, BuildContext context) async {
700+
late Uri url;
701+
String endpoint = Hive.box('settings')
702+
.get('server', defaultValue: defaultEndpoint) as String;
703+
if (endpoint != defaultEndpoint) {
704+
url = Uri.parse(
705+
'$endpoint/f1/en/racing/${DateTime.now().year}/$track/Circuit.html',
706+
);
707+
} else {
708+
url = Uri.parse(
709+
'https://www.formula1.com/en/racing/${DateTime.now().year}/$track/Circuit.html',
710+
);
711+
}
712+
http.Response response = await http.get(url);
713+
dom.Document document = parser.parse(utf8.decode(response.bodyBytes));
714+
int index = document.body!.innerHtml.indexOf('practice?meeting=') + 17;
715+
String meetingId = document.body!.innerHtml.substring(index, index + 4);
716+
context.pushReplacementNamed(
717+
'racing',
718+
pathParameters: {'meetingId': meetingId},
719+
);
720+
return meetingId;
721+
}
696722
}
697723

698724
class HallOfFameDriver {

0 commit comments

Comments
 (0)