Skip to content
Snippets Groups Projects
Commit 88f5ae56 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Fix display while fetching data

parent 07a99c05
No related branches found
No related tags found
1 merge request!38Resolve "Display current data/chart while fetching new data"
Pipeline #4666 passed
Showing
with 23 additions and 57 deletions
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
app.versionName=0.0.36 app.versionName=0.0.37
app.versionCode=36 app.versionCode=37
Display data while fetching API.
Affichage des données pendant le chargement.
...@@ -18,7 +18,7 @@ class DataCountsByDayCubit extends HydratedCubit<DataCountsByDayState> { ...@@ -18,7 +18,7 @@ class DataCountsByDayCubit extends HydratedCubit<DataCountsByDayState> {
} }
void update(CountsByDayData? countsByDay) { void update(CountsByDayData? countsByDay) {
if (state.countsByDay.toString() != countsByDay.toString()) { if ((countsByDay != null) && (state.countsByDay.toString() != countsByDay.toString())) {
setValue(countsByDay); setValue(countsByDay);
} }
} }
......
...@@ -18,7 +18,7 @@ class DataCountsByHourCubit extends HydratedCubit<DataCountsByHourState> { ...@@ -18,7 +18,7 @@ class DataCountsByHourCubit extends HydratedCubit<DataCountsByHourState> {
} }
void update(CountsByHourData? countsByHour) { void update(CountsByHourData? countsByHour) {
if (state.countsByHour.toString() != countsByHour.toString()) { if ((countsByHour != null) && (state.countsByHour.toString() != countsByHour.toString())) {
setValue(countsByHour); setValue(countsByHour);
} }
} }
......
...@@ -18,7 +18,7 @@ class DataDiscoveriesCubit extends HydratedCubit<DataDiscoveriesState> { ...@@ -18,7 +18,7 @@ class DataDiscoveriesCubit extends HydratedCubit<DataDiscoveriesState> {
} }
void update(DiscoveriesData? discoveries) { void update(DiscoveriesData? discoveries) {
if (state.discoveries.toString() != discoveries.toString()) { if ((discoveries != null) && (state.discoveries.toString() != discoveries.toString())) {
setValue(discoveries); setValue(discoveries);
} }
} }
......
...@@ -18,7 +18,8 @@ class DataStatisticsGlobalCubit extends HydratedCubit<DataStatisticsGlobalState> ...@@ -18,7 +18,8 @@ class DataStatisticsGlobalCubit extends HydratedCubit<DataStatisticsGlobalState>
} }
void update(StatisticsGlobalData? statisticsGlobal) { void update(StatisticsGlobalData? statisticsGlobal) {
if (state.statisticsGlobal.toString() != statisticsGlobal.toString()) { if ((statisticsGlobal != null) &&
(state.statisticsGlobal.toString() != statisticsGlobal.toString())) {
setValue(statisticsGlobal); setValue(statisticsGlobal);
} }
} }
......
...@@ -18,7 +18,8 @@ class DataStatisticsRecentCubit extends HydratedCubit<DataStatisticsRecentState> ...@@ -18,7 +18,8 @@ class DataStatisticsRecentCubit extends HydratedCubit<DataStatisticsRecentState>
} }
void update(StatisticsRecentData? statisticsRecent) { void update(StatisticsRecentData? statisticsRecent) {
if (state.statisticsRecent.toString() != statisticsRecent.toString()) { if ((statisticsRecent != null) &&
(state.statisticsRecent.toString() != statisticsRecent.toString())) {
setValue(statisticsRecent); setValue(statisticsRecent);
} }
} }
......
...@@ -18,7 +18,7 @@ class DataTimelineCubit extends HydratedCubit<DataTimelineState> { ...@@ -18,7 +18,7 @@ class DataTimelineCubit extends HydratedCubit<DataTimelineState> {
} }
void update(TimelineData? timeline) { void update(TimelineData? timeline) {
if (state.timeline.toString() != timeline.toString()) { if ((timeline != null) && (state.timeline.toString() != timeline.toString())) {
setValue(timeline); setValue(timeline);
} }
} }
......
...@@ -18,7 +18,7 @@ class DataTopArtistsCubit extends HydratedCubit<DataTopArtistsState> { ...@@ -18,7 +18,7 @@ class DataTopArtistsCubit extends HydratedCubit<DataTopArtistsState> {
} }
void update(TopArtistsData? topArtists) { void update(TopArtistsData? topArtists) {
if (state.topArtists.toString() != topArtists.toString()) { if ((topArtists != null) && (state.topArtists.toString() != topArtists.toString())) {
setValue(topArtists); setValue(topArtists);
} }
} }
......
...@@ -14,11 +14,9 @@ class ScrobblesApi { ...@@ -14,11 +14,9 @@ class ScrobblesApi {
static Future<StatisticsGlobalData> fetchGlobalStatistics() async { static Future<StatisticsGlobalData> fetchGlobalStatistics() async {
final String url = baseUrl + '/stats'; final String url = baseUrl + '/stats';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
print('ok - fetched ' + url);
return StatisticsGlobalData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return StatisticsGlobalData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else { } else {
throw Exception('Failed to get data from API.'); throw Exception('Failed to get data from API.');
...@@ -27,11 +25,9 @@ class ScrobblesApi { ...@@ -27,11 +25,9 @@ class ScrobblesApi {
static Future<StatisticsRecentData> fetchRecentStatistics(int daysCount) async { static Future<StatisticsRecentData> fetchRecentStatistics(int daysCount) async {
final String url = baseUrl + '/' + daysCount.toString() + '/stats'; final String url = baseUrl + '/' + daysCount.toString() + '/stats';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
print('ok - fetched ' + url);
return StatisticsRecentData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return StatisticsRecentData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else { } else {
throw Exception('Failed to get data from API.'); throw Exception('Failed to get data from API.');
...@@ -40,11 +36,9 @@ class ScrobblesApi { ...@@ -40,11 +36,9 @@ class ScrobblesApi {
static Future<TimelineData> fetchTimeline(int daysCount) async { static Future<TimelineData> fetchTimeline(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/timeline'; final String url = baseUrl + '/data/' + daysCount.toString() + '/timeline';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
print('ok - fetched ' + url);
return TimelineData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return TimelineData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else { } else {
throw Exception('Failed to get data from API.'); throw Exception('Failed to get data from API.');
...@@ -53,11 +47,9 @@ class ScrobblesApi { ...@@ -53,11 +47,9 @@ class ScrobblesApi {
static Future<CountsByDayData> fetchCountsByDay(int daysCount) async { static Future<CountsByDayData> fetchCountsByDay(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-day'; final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-day';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
print('ok - fetched ' + url);
return CountsByDayData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return CountsByDayData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else { } else {
throw Exception('Failed to get data from API.'); throw Exception('Failed to get data from API.');
...@@ -66,11 +58,9 @@ class ScrobblesApi { ...@@ -66,11 +58,9 @@ class ScrobblesApi {
static Future<CountsByHourData> fetchCountsByHour(int daysCount) async { static Future<CountsByHourData> fetchCountsByHour(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-hour'; final String url = baseUrl + '/data/' + daysCount.toString() + '/counts-by-hour';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
print('ok - fetched ' + url);
return CountsByHourData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return CountsByHourData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else { } else {
throw Exception('Failed to get data from API.'); throw Exception('Failed to get data from API.');
...@@ -79,11 +69,9 @@ class ScrobblesApi { ...@@ -79,11 +69,9 @@ class ScrobblesApi {
static Future<DiscoveriesData> fetchDiscoveries(int daysCount) async { static Future<DiscoveriesData> fetchDiscoveries(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/news'; final String url = baseUrl + '/data/' + daysCount.toString() + '/news';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
print('ok - fetched ' + url);
return DiscoveriesData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return DiscoveriesData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else { } else {
throw Exception('Failed to get data from API.'); throw Exception('Failed to get data from API.');
...@@ -92,11 +80,9 @@ class ScrobblesApi { ...@@ -92,11 +80,9 @@ class ScrobblesApi {
static Future<TopArtistsData> fetchTopArtists(int daysCount) async { static Future<TopArtistsData> fetchTopArtists(int daysCount) async {
final String url = baseUrl + '/data/' + daysCount.toString() + '/top-artists'; final String url = baseUrl + '/data/' + daysCount.toString() + '/top-artists';
print('fetching ' + url);
final response = await http.get(Uri.parse(url)); final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) { if (response.statusCode == 200) {
print('ok - fetched ' + url);
return TopArtistsData.fromJson(jsonDecode(response.body) as Map<String, dynamic>); return TopArtistsData.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else { } else {
throw Exception('Failed to get data from API.'); throw Exception('Failed to get data from API.');
......
...@@ -6,9 +6,8 @@ import 'package:scrobbles/config/app_colors.dart'; ...@@ -6,9 +6,8 @@ import 'package:scrobbles/config/app_colors.dart';
import 'package:scrobbles/utils/color_extensions.dart'; import 'package:scrobbles/utils/color_extensions.dart';
class CustomBarChart extends StatelessWidget { class CustomBarChart extends StatelessWidget {
CustomBarChart({super.key}); const CustomBarChart({super.key});
final Widget placeholder = Text('⏳');
final double chartHeight = 150.0; final double chartHeight = 150.0;
final double verticalTicksInterval = 10; final double verticalTicksInterval = 10;
final String verticalAxisTitleSuffix = ''; final String verticalAxisTitleSuffix = '';
......
...@@ -4,9 +4,8 @@ import 'package:flutter/material.dart'; ...@@ -4,9 +4,8 @@ import 'package:flutter/material.dart';
import 'package:scrobbles/config/app_colors.dart'; import 'package:scrobbles/config/app_colors.dart';
class CustomLineChart extends StatelessWidget { class CustomLineChart extends StatelessWidget {
CustomLineChart({super.key}); const CustomLineChart({super.key});
final Widget placeholder = Text('⏳');
final double chartHeight = 150.0; final double chartHeight = 150.0;
final double titleFontSize = 10; final double titleFontSize = 10;
......
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
...@@ -32,8 +30,7 @@ class CardCountsByDay extends StatelessWidget { ...@@ -32,8 +30,7 @@ class CardCountsByDay extends StatelessWidget {
), ),
loader: updateCountsByDay(daysCount), loader: updateCountsByDay(daysCount),
content: ChartCountsByDay( content: ChartCountsByDay(
chartData: CountsByDayData.fromJson(jsonDecode(state.countsByDay.toString())), chartData: CountsByDayData.fromJson(state.countsByDay?.toJson()),
isLoading: false,
), ),
); );
}, },
......
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
...@@ -32,8 +30,7 @@ class CardCountsByHour extends StatelessWidget { ...@@ -32,8 +30,7 @@ class CardCountsByHour extends StatelessWidget {
), ),
loader: updateCountsByHour(daysCount), loader: updateCountsByHour(daysCount),
content: ChartCountsByHour( content: ChartCountsByHour(
chartData: CountsByHourData.fromJson(jsonDecode(state.countsByHour.toString())), chartData: CountsByHourData.fromJson(state.countsByHour?.toJson()),
isLoading: false,
), ),
); );
}, },
......
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
...@@ -44,8 +42,7 @@ class CardDiscoveries extends StatelessWidget { ...@@ -44,8 +42,7 @@ class CardDiscoveries extends StatelessWidget {
).tr(), ).tr(),
const SizedBox(height: 8), const SizedBox(height: 8),
ChartDiscoveriesArtists( ChartDiscoveriesArtists(
chartData: DiscoveriesData.fromJson(jsonDecode(state.discoveries.toString())), chartData: DiscoveriesData.fromJson(state.discoveries?.toJson()),
isLoading: false,
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text( Text(
...@@ -54,8 +51,7 @@ class CardDiscoveries extends StatelessWidget { ...@@ -54,8 +51,7 @@ class CardDiscoveries extends StatelessWidget {
).tr(), ).tr(),
const SizedBox(height: 8), const SizedBox(height: 8),
ChartDiscoveriesTracks( ChartDiscoveriesTracks(
chartData: DiscoveriesData.fromJson(jsonDecode(state.discoveries.toString())), chartData: DiscoveriesData.fromJson(state.discoveries?.toJson()),
isLoading: false,
), ),
], ],
), ),
......
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
...@@ -23,9 +21,7 @@ class CardStatisticsGlobal extends StatelessWidget { ...@@ -23,9 +21,7 @@ class CardStatisticsGlobal extends StatelessWidget {
title: 'global_statistics'.tr(), title: 'global_statistics'.tr(),
loader: updateStatisticsGlobal(), loader: updateStatisticsGlobal(),
content: ContentStatisticsGlobal( content: ContentStatisticsGlobal(
statistics: statistics: StatisticsGlobalData.fromJson(state.statisticsGlobal?.toJson()),
StatisticsGlobalData.fromJson(jsonDecode(state.statisticsGlobal.toString())),
isLoading: false,
), ),
); );
}, },
......
...@@ -34,7 +34,6 @@ class CardStatisticsRecent extends StatelessWidget { ...@@ -34,7 +34,6 @@ class CardStatisticsRecent extends StatelessWidget {
content: ContentStatisticsRecent( content: ContentStatisticsRecent(
statistics: StatisticsRecentData.fromJson( statistics: StatisticsRecentData.fromJson(
jsonDecode(dataState.statisticsRecent.toString())), jsonDecode(dataState.statisticsRecent.toString())),
isLoading: false,
), ),
); );
}, },
......
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
...@@ -35,12 +33,10 @@ class CardTimeline extends StatelessWidget { ...@@ -35,12 +33,10 @@ class CardTimeline extends StatelessWidget {
content: Stack( content: Stack(
children: [ children: [
ChartTimelineCounts( ChartTimelineCounts(
chartData: TimelineData.fromJson(jsonDecode(state.timeline.toString())), chartData: TimelineData.fromJson(state.timeline?.toJson()),
isLoading: false,
), ),
ChartTimelineEclecticism( ChartTimelineEclecticism(
chartData: TimelineData.fromJson(jsonDecode(state.timeline.toString())), chartData: TimelineData.fromJson(state.timeline?.toJson()),
isLoading: false,
), ),
], ],
), ),
......
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
...@@ -32,8 +30,7 @@ class CardTopArtists extends StatelessWidget { ...@@ -32,8 +30,7 @@ class CardTopArtists extends StatelessWidget {
), ),
loader: updateTopArtists(daysCount), loader: updateTopArtists(daysCount),
content: ChartTopArtists( content: ChartTopArtists(
chartData: TopArtistsData.fromJson(jsonDecode(state.topArtists.toString())), chartData: TopArtistsData.fromJson(state.topArtists?.toJson()),
isLoading: false,
), ),
); );
}, },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment