Compare commits

..

1 Commits

Author SHA1 Message Date
d4de945df8 cleaner trip loading indicator
Some checks failed
Build and deploy the backend to staging / Build and push image (pull_request) Successful in 1m57s
Build and deploy the backend to staging / Deploy to staging (pull_request) Successful in 26s
Build and release debug APK / Build APK (pull_request) Has been cancelled
2025-02-05 13:50:38 +01:00
4 changed files with 75 additions and 95 deletions

View File

@ -1,11 +1,20 @@
import 'dart:ui'; import 'package:anyway/constants.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:anyway/structs/trip.dart'; import 'package:anyway/structs/trip.dart';
import 'package:anyway/pages/current_trip.dart'; import 'package:anyway/pages/current_trip.dart';
final List<String> statusTexts = [
'Parsing your preferences...',
'Finding the best places...',
'Crunching the numbers...',
'Calculating the best route...',
'Making sure you have a great time...',
];
class CurrentTripLoadingIndicator extends StatefulWidget { class CurrentTripLoadingIndicator extends StatefulWidget {
final Trip trip; final Trip trip;
const CurrentTripLoadingIndicator({ const CurrentTripLoadingIndicator({
@ -18,14 +27,52 @@ class CurrentTripLoadingIndicator extends StatefulWidget {
} }
Widget bottomLoadingIndicator = Container( class _CurrentTripLoadingIndicatorState extends State<CurrentTripLoadingIndicator> {
height: 20.0, // Increase the height to take up more vertical space @override
Widget build(BuildContext context) => Stack(
fit: StackFit.expand,
children: [
// In the very center of the panel, show the greeter which tells the user that the trip is being generated
Center(child: loadingText(widget.trip)),
// As a gimmick, and a way to show that the app is still working, show a few loading dots
Align(
alignment: Alignment.bottomCenter,
child: statusText(),
)
],
);
}
// automatically cycle through the greeter texts
class statusText extends StatefulWidget {
const statusText({Key? key}) : super(key: key);
@override
_statusTextState createState() => _statusTextState();
}
class _statusTextState extends State<statusText> {
int statusIndex = 0;
@override
void initState() {
super.initState();
Future.delayed(Duration(seconds: 5), () {
setState(() {
statusIndex = (statusIndex + 1) % statusTexts.length;
});
});
}
@override
Widget build(BuildContext context) {
return AutoSizeText(
statusTexts[statusIndex],
style: Theme.of(context).textTheme.labelSmall,
);
}
}
child: ImageFiltered(
imageFilter: ImageFilter.blur(sigmaX: 5.0, sigmaY: 5.0), // Apply blur effect
child: Padding(padding: EdgeInsets.all(10), child: CircularProgressIndicator(),)
),
);
Widget loadingText(Trip trip) => FutureBuilder( Widget loadingText(Trip trip) => FutureBuilder(
@ -35,7 +82,7 @@ Widget loadingText(Trip trip) => FutureBuilder(
if (snapshot.hasData) { if (snapshot.hasData) {
greeter = AnimatedGradientText( greeter = AnimatedGradientText(
text: 'Generating your trip to ${snapshot.data}...', text: 'Creating your trip to ${snapshot.data}...',
style: greeterStyle, style: greeterStyle,
); );
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
@ -46,7 +93,7 @@ Widget loadingText(Trip trip) => FutureBuilder(
); );
} else { } else {
greeter = AnimatedGradientText( greeter = AnimatedGradientText(
text: 'Generating your trip...', text: 'Creating your trip...',
style: greeterStyle, style: greeterStyle,
); );
} }
@ -94,7 +141,7 @@ class _AnimatedGradientTextState extends State<AnimatedGradientText> with Single
return ShaderMask( return ShaderMask(
shaderCallback: (bounds) { shaderCallback: (bounds) {
return LinearGradient( return LinearGradient(
colors: [Colors.blue, Colors.red, Colors.blue], colors: [GRADIENT_START, GRADIENT_END, GRADIENT_START],
stops: [ stops: [
_controller.value - 1.0, _controller.value - 1.0,
_controller.value, _controller.value,
@ -113,20 +160,3 @@ class _AnimatedGradientTextState extends State<AnimatedGradientText> with Single
} }
} }
class _CurrentTripLoadingIndicatorState extends State<CurrentTripLoadingIndicator> {
@override
Widget build(BuildContext context) => Stack(
fit: StackFit.expand,
children: [
Center(child: loadingText(widget.trip)),
Align(
alignment: Alignment.bottomCenter,
child: bottomLoadingIndicator,
)
],
);
}

View File

@ -11,7 +11,7 @@ final Shader textGradient = APP_GRADIENT.createShader(Rect.fromLTWH(0.0, 0.0, 20
TextStyle greeterStyle = TextStyle( TextStyle greeterStyle = TextStyle(
foreground: Paint()..shader = textGradient, foreground: Paint()..shader = textGradient,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
fontSize: 26 fontSize: 25
); );

View File

@ -101,10 +101,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.18.0" version: "1.19.0"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
@ -412,18 +412,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "10.0.5" version: "10.0.7"
leak_tracker_flutter_testing: leak_tracker_flutter_testing:
dependency: transitive dependency: transitive
description: description:
name: leak_tracker_flutter_testing name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.5" version: "3.0.8"
leak_tracker_testing: leak_tracker_testing:
dependency: transitive dependency: transitive
description: description:
@ -708,7 +708,7 @@ packages:
dependency: transitive dependency: transitive
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.99" version: "0.0.0"
sliding_up_panel: sliding_up_panel:
dependency: "direct main" dependency: "direct main"
description: description:
@ -753,10 +753,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.1" version: "1.12.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
@ -777,10 +777,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.3.0"
synchronized: synchronized:
dependency: transitive dependency: transitive
description: description:
@ -801,10 +801,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.2" version: "0.7.3"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@ -921,10 +921,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.2.5" version: "14.3.0"
web: web:
dependency: transitive dependency: transitive
description: description:

View File

@ -1,50 +0,0 @@
import httpx
import json
base_url = "https://en.wikipedia.org/w/api.php"
def best_page_match(title) -> int:
params = {
"action": "query",
"format": "json",
"list": "prefixsearch",
"pssearch": title,
}
response = httpx.get(base_url, params=params)
data = response.json()
data = data.get("query", {}).get("prefixsearch", [])
titles_and_ids = {d["title"]: d["pageid"] for d in data}
for t in titles_and_ids:
if title.lower() == t.lower():
print("Matched")
return titles_and_ids[t]
def get_image_url(page_id) -> str:
# https://en.wikipedia.org/w/api.php?action=query&titles=K%C3%B6lner%20Dom&prop=imageinfo&iiprop=url&format=json
params = {
"action": "query",
"format": "json",
"prop": "pageimages",
"pageids": page_id,
"pithumbsize": 500,
}
response = httpx.get(base_url, params=params)
data = response.json()
data = data.get("query", {}).get("pages", {})
data = data.get(str(page_id), {})
return data.get("thumbnail", {}).get("source")
def get_image_url_from_title(title) -> str:
page_id = best_page_match(title)
if page_id is None:
return None
return get_image_url(page_id)
print(get_image_url_from_title("kölner dom"))
print(get_image_url_from_title("grossmünster"))
print(get_image_url_from_title("eiffel tower"))
print(get_image_url_from_title("taj mahal"))
print(get_image_url_from_title("big ben"))