From 55e91013cb1cf19d3c7fc4c85165f601d5579c4d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Fri, 27 Oct 2023 15:26:00 +0200
Subject: [PATCH] Improve title bar, add "refresh" button

---
 android/gradle.properties                     |  4 +--
 .../metadata/android/en-US/changelogs/11.txt  |  1 +
 .../metadata/android/fr-FR/changelogs/11.txt  |  1 +
 lib/network/scrobbles_api.dart                |  7 ++++-
 lib/ui/screens/main_screen.dart               |  3 +-
 lib/ui/screens/skeleton_screen.dart           | 20 +++++++++++--
 lib/ui/widgets/app_bar.dart                   | 28 +++++++++++++++++++
 lib/ui/widgets/header.dart                    | 11 +++-----
 .../widgets/main_screen/statistics_card.dart  |  4 +--
 pubspec.lock                                  |  8 ++++++
 pubspec.yaml                                  |  3 +-
 11 files changed, 73 insertions(+), 17 deletions(-)
 create mode 100644 fastlane/metadata/android/en-US/changelogs/11.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/11.txt
 create mode 100644 lib/ui/widgets/app_bar.dart

diff --git a/android/gradle.properties b/android/gradle.properties
index 6bf54a6..f0be9fb 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.10
-app.versionCode=10
+app.versionName=0.0.11
+app.versionCode=11
diff --git a/fastlane/metadata/android/en-US/changelogs/11.txt b/fastlane/metadata/android/en-US/changelogs/11.txt
new file mode 100644
index 0000000..f081bd3
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/11.txt
@@ -0,0 +1 @@
+Improve title bar, add refresh button.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/11.txt b/fastlane/metadata/android/fr-FR/changelogs/11.txt
new file mode 100644
index 0000000..6f31360
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/11.txt
@@ -0,0 +1 @@
+Amélioration de la barre de titre, ajout d'un bouton de mise à jour.
diff --git a/lib/network/scrobbles_api.dart b/lib/network/scrobbles_api.dart
index 7b00359..8aed8f9 100644
--- a/lib/network/scrobbles_api.dart
+++ b/lib/network/scrobbles_api.dart
@@ -10,7 +10,9 @@ class ScrobblesApi {
   static String baseUrl = 'https://scrobble.harrault.fr';
 
   static Future<StatisticsData> fetchStatistics() async {
-    final response = await http.get(Uri.parse(baseUrl + '/stats'));
+    final String url = baseUrl + '/stats';
+    print('fetching ' + url);
+    final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
       return StatisticsData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
@@ -21,6 +23,7 @@ class ScrobblesApi {
 
   static Future<TimelineData> fetchTimeline(int daysCount) async {
     final String url = baseUrl + '/data/' + daysCount.toString() + '/timeline';
+    print('fetching ' + url);
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -32,6 +35,7 @@ class ScrobblesApi {
 
   static Future<CountsByDayData> fetchCountsByDay(int daysCount) async {
     final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-day';
+    print('fetching ' + url);
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
@@ -43,6 +47,7 @@ class ScrobblesApi {
 
   static Future<CountsByHourData> fetchCountsByHour(int daysCount) async {
     final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-hour';
+    print('fetching ' + url);
     final response = await http.get(Uri.parse(url));
 
     if (response.statusCode == 200) {
diff --git a/lib/ui/screens/main_screen.dart b/lib/ui/screens/main_screen.dart
index 8ac7cca..9943616 100644
--- a/lib/ui/screens/main_screen.dart
+++ b/lib/ui/screens/main_screen.dart
@@ -1,6 +1,5 @@
 import 'package:flutter/material.dart';
 
-import '../widgets/header.dart';
 import '../widgets/main_screen/counts_by_day_card.dart';
 import '../widgets/main_screen/counts_by_hour_card.dart';
 import '../widgets/main_screen/statistics_card.dart';
@@ -17,7 +16,7 @@ class MainScreen extends StatelessWidget {
         padding: const EdgeInsets.symmetric(horizontal: 16),
         physics: const BouncingScrollPhysics(),
         children: <Widget>[
-          const Header(text: 'app_name'),
+          const SizedBox(height: 90),
           const StatisticsCard(),
           const SizedBox(height: 8),
           const ChartTimelineCard(),
diff --git a/lib/ui/screens/skeleton_screen.dart b/lib/ui/screens/skeleton_screen.dart
index aeeb665..161794e 100644
--- a/lib/ui/screens/skeleton_screen.dart
+++ b/lib/ui/screens/skeleton_screen.dart
@@ -1,16 +1,32 @@
 import 'package:flutter/material.dart';
 
 import 'main_screen.dart';
+import '../widgets/app_bar.dart';
 
-class SkeletonScreen extends StatelessWidget {
+class SkeletonScreen extends StatefulWidget {
   const SkeletonScreen({super.key});
 
+  @override
+  State<SkeletonScreen> createState() => _SkeletonScreenState();
+}
+
+class _SkeletonScreenState extends State<SkeletonScreen> {
   @override
   Widget build(BuildContext context) {
     return Scaffold(
+      appBar: StandardAppBar(notifyParent: refresh),
       extendBodyBehindAppBar: true,
-      body: MainScreen(),
+      body: const MainScreen(),
       backgroundColor: Theme.of(context).colorScheme.background,
     );
   }
+
+  refresh() {
+    void rebuild(Element el) {
+      el.markNeedsBuild();
+      el.visitChildren(rebuild);
+    }
+
+    (context as Element).visitChildren(rebuild);
+  }
 }
diff --git a/lib/ui/widgets/app_bar.dart b/lib/ui/widgets/app_bar.dart
new file mode 100644
index 0000000..3313e59
--- /dev/null
+++ b/lib/ui/widgets/app_bar.dart
@@ -0,0 +1,28 @@
+import 'package:flutter/material.dart';
+import 'package:unicons/unicons.dart';
+
+import '../widgets/header.dart';
+
+class StandardAppBar extends StatelessWidget implements PreferredSizeWidget {
+  final Function() notifyParent;
+
+  const StandardAppBar({super.key, required this.notifyParent});
+
+  @override
+  Widget build(BuildContext context) {
+    return AppBar(
+      title: const Header(text: 'app_name'),
+      actions: [
+        IconButton(
+          onPressed: () {
+            this.notifyParent();
+          },
+          icon: const Icon(UniconsSolid.refresh),
+        ),
+      ],
+    );
+  }
+
+  @override
+  Size get preferredSize => const Size.fromHeight(50);
+}
diff --git a/lib/ui/widgets/header.dart b/lib/ui/widgets/header.dart
index 1186bd3..2187ef8 100644
--- a/lib/ui/widgets/header.dart
+++ b/lib/ui/widgets/header.dart
@@ -8,13 +8,10 @@ class Header extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    return Padding(
-      padding: const EdgeInsets.only(left: 2, right: 2, top: 48, bottom: 24),
-      child: Text(
-        tr(text),
-        textAlign: TextAlign.start,
-        style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
-      ),
+    return Text(
+      tr(text),
+      textAlign: TextAlign.start,
+      style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2),
     );
   }
 }
diff --git a/lib/ui/widgets/main_screen/statistics_card.dart b/lib/ui/widgets/main_screen/statistics_card.dart
index ae0a4e9..aef4e34 100644
--- a/lib/ui/widgets/main_screen/statistics_card.dart
+++ b/lib/ui/widgets/main_screen/statistics_card.dart
@@ -12,10 +12,10 @@ class StatisticsCard extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    late Future<StatisticsData> futureAlbum = ScrobblesApi.fetchStatistics();
+    late Future<StatisticsData> futureStatistics = ScrobblesApi.fetchStatistics();
 
     return FutureBuilder<StatisticsData>(
-      future: futureAlbum,
+      future: futureStatistics,
       builder: (context, snapshot) {
         if (snapshot.hasError) {
           return ShowErrorWidget(message: '${snapshot.error}');
diff --git a/pubspec.lock b/pubspec.lock
index 6952c80..42ca9d5 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -285,6 +285,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.3.2"
+  unicons:
+    dependency: "direct main"
+    description:
+      name: unicons
+      sha256: dbfcf93ff4d4ea19b324113857e358e4882115ab85db04417a4ba1c72b17a670
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
   vector_math:
     dependency: transitive
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 27e3de8..4336e10 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Display scrobbles data and charts
 
 publish_to: 'none'
 
-version: 0.0.10+10
+version: 0.0.11+11
 
 environment:
   sdk: '^3.0.0'
@@ -15,6 +15,7 @@ dependencies:
   easy_localization: ^3.0.1
   http: ^1.1.0
   fl_chart: ^0.64.0
+  unicons: ^2.1.1
 
 flutter:
   uses-material-design: false
-- 
GitLab