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

Merge branch '35-clean-move-some-code' into 'master'

Resolve "Clean / move some code"

Closes #35

See merge request !31
parents 7de05453 e7244ad8
No related branches found
No related tags found
1 merge request!31Resolve "Clean / move some code"
Pipeline #4585 passed
Showing
with 121 additions and 80 deletions
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.0.27
app.versionCode=27
app.versionName=0.0.28
app.versionCode=28
......@@ -9,16 +9,16 @@
"statistics_total_scrobbles_count": "Total scrobbles count: {count}",
"statistics_last_scrobble": "Last scrobble: {datetime}",
"recent_statistics": "Recent statistics",
"statistics_selected_period": "On last {daysCount} days:",
"recent_statistics": "Recent statistics ({daysCount} days)",
"statistics_recent_scrobbles_count_and_discoveries": "{count} scrobbles and {artistsCount} artists / {tracksCount} tracks discovered.",
"timeline_title": "Recent scrobbles ({daysCount} days)",
"counts_by_day": "Counts by day ({daysCount} days)",
"counts_by_hour": "Counts by hour ({daysCount} days)",
"discoveries_artists_title": "Artists discoveries ({daysCount} days)",
"discoveries_tracks_title": "Tracks discoveries ({daysCount} days)",
"discoveries_title": "Discoveries ({daysCount} days)",
"discoveries_artists_title": "Artists",
"discoveries_tracks_title": "Tracks",
"top_artists_title": "Top artists ({daysCount} days)",
......
......@@ -9,16 +9,16 @@
"statistics_total_scrobbles_count": "Nombre total d'écoutes : {count}",
"statistics_last_scrobble": "Dernière écoute : {datetime}",
"recent_statistics": "Statistiques récentes",
"statistics_selected_period": "Sur les {daysCount} derniers jours :",
"recent_statistics": "Statistiques récentes ({daysCount} jours)",
"statistics_recent_scrobbles_count_and_discoveries": "{count} écoutes et {artistsCount} artistes / {tracksCount} morceaux découverts.",
"timeline_title": "Écoutes récentes ({daysCount} jours)",
"counts_by_day": "Écoutes par jour ({daysCount} jours)",
"counts_by_hour": "Écoutes par heure ({daysCount} jours)",
"discoveries_artists_title": "Artistes découverts ({daysCount} jours)",
"discoveries_tracks_title": "Morceaux découverts ({daysCount} jours)",
"discoveries_title": "Découvertes ({daysCount} jours)",
"discoveries_artists_title": "Artistes",
"discoveries_tracks_title": "Morceaux",
"top_artists_title": "Top artistes ({daysCount} jours)",
......
Clean/improve/refactor code.
Nettoyage/améliorations/refactorisations de code.
......@@ -6,9 +6,8 @@ import 'package:hive/hive.dart';
import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:path_provider/path_provider.dart';
import 'config/theme.dart';
import 'ui/screens/skeleton_screen.dart';
import 'package:scrobbles/config/theme.dart';
import 'package:scrobbles/ui/skeleton.dart';
void main() async {
/// Initialize packages
......
......@@ -7,11 +7,11 @@ class CountsByDayData {
required this.data,
});
factory CountsByDayData.fromJson(Map<String, dynamic> json) {
factory CountsByDayData.fromJson(Map<String, dynamic>? json) {
Map<int, double> data = {};
if (json['counts-by-day'] != null) {
json['counts-by-day'].keys.forEach((day) {
if (json?['counts-by-day'] != null) {
json?['counts-by-day'].keys.forEach((day) {
data[int.parse(day)] = double.parse(json['counts-by-day'][day].toString());
});
}
......@@ -20,7 +20,7 @@ class CountsByDayData {
}
factory CountsByDayData.createEmpty() {
return CountsByDayData.fromJson({});
return CountsByDayData.fromJson({'counts-by-day': {}});
}
String toString() {
......
......@@ -7,11 +7,11 @@ class CountsByHourData {
required this.data,
});
factory CountsByHourData.fromJson(Map<String, dynamic> json) {
factory CountsByHourData.fromJson(Map<String, dynamic>? json) {
Map<int, double> data = {};
if (json['counts-by-hour'] != null) {
json['counts-by-hour'].keys.forEach((day) {
if (json?['counts-by-hour'] != null) {
json?['counts-by-hour'].keys.forEach((day) {
if (int.parse(day) != 24) {
data[int.parse(day)] = double.parse(json['counts-by-hour'][day].toString());
}
......
......@@ -6,10 +6,10 @@ class DiscoveriesDataValue {
const DiscoveriesDataValue({required this.newArtistsCount, required this.newTracksCount});
factory DiscoveriesDataValue.fromJson(Map<String, dynamic> json) {
factory DiscoveriesDataValue.fromJson(Map<String, dynamic>? json) {
return DiscoveriesDataValue(
newArtistsCount: json['new-artists'] as int,
newTracksCount: json['new-tracks'] as int,
newArtistsCount: json?['new-artists'] as int,
newTracksCount: json?['new-tracks'] as int,
);
}
}
......@@ -21,10 +21,10 @@ class DiscoveriesData {
required this.data,
});
factory DiscoveriesData.fromJson(Map<String, dynamic> json) {
factory DiscoveriesData.fromJson(Map<String, dynamic>? json) {
Map<String, DiscoveriesDataValue> data = {};
json.keys.forEach((date) {
json?.keys.forEach((date) {
DiscoveriesDataValue value = DiscoveriesDataValue(
newArtistsCount: json[date]['new-artists'] as int,
newTracksCount: json[date]['new-tracks'] as int,
......
......@@ -9,12 +9,12 @@ class StatisticsGlobalData {
required this.lastScrobble,
});
factory StatisticsGlobalData.fromJson(Map<String, dynamic> json) {
factory StatisticsGlobalData.fromJson(Map<String, dynamic>? json) {
return StatisticsGlobalData(
totalCount: json['totalCount'] != null ? json['totalCount'] as int : 0,
lastScrobble: (json['lastScrobble'] != null && json['lastScrobble']['date'] != null)
totalCount: (json?['totalCount'] != null) ? (json?['totalCount'] as int) : 0,
lastScrobble: (json?['lastScrobble'] != null && json?['lastScrobble']['date'] != null)
? DateTime.parse(
json['lastScrobble']['date'],
json?['lastScrobble']['date'],
)
: DateTime.now(),
);
......
......@@ -13,14 +13,16 @@ class StatisticsRecentData {
required this.selectedPeriod,
});
factory StatisticsRecentData.fromJson(Map<String, dynamic> json) {
factory StatisticsRecentData.fromJson(Map<String, dynamic>? json) {
return StatisticsRecentData(
recentCount: json['recentCount'] != null ? json['recentCount'] as int : 0,
firstPlayedArtistsCount:
json['firstPlayedArtistsCount'] != null ? json['firstPlayedArtistsCount'] as int : 0,
firstPlayedTracksCount:
json['firstPlayedTracksCount'] != null ? json['firstPlayedTracksCount'] as int : 0,
selectedPeriod: json['selectedPeriod'] != null ? json['selectedPeriod'] as int : 0,
recentCount: (json?['recentCount'] != null) ? (json?['recentCount'] as int) : 0,
firstPlayedArtistsCount: (json?['firstPlayedArtistsCount'] != null)
? (json?['firstPlayedArtistsCount'] as int)
: 0,
firstPlayedTracksCount: (json?['firstPlayedTracksCount'] != null)
? (json?['firstPlayedTracksCount'] as int)
: 0,
selectedPeriod: (json?['selectedPeriod'] != null) ? (json?['selectedPeriod'] as int) : 0,
);
}
......
......@@ -6,10 +6,10 @@ class TimelineDataValue {
const TimelineDataValue({required this.counts, required this.eclecticism});
factory TimelineDataValue.fromJson(Map<String, dynamic> json) {
factory TimelineDataValue.fromJson(Map<String, dynamic>? json) {
return TimelineDataValue(
counts: json['counts'] as int,
eclecticism: json['eclecticism'] as int,
counts: json?['counts'] as int,
eclecticism: json?['eclecticism'] as int,
);
}
}
......@@ -21,10 +21,10 @@ class TimelineData {
required this.data,
});
factory TimelineData.fromJson(Map<String, dynamic> json) {
factory TimelineData.fromJson(Map<String, dynamic>? json) {
Map<String, TimelineDataValue> data = {};
json.keys.forEach((date) {
json?.keys.forEach((date) {
TimelineDataValue value = TimelineDataValue(
counts: json[date]['counts'] as int,
eclecticism: json[date]['eclecticism'] as int,
......
......@@ -6,10 +6,10 @@ class TopArtistsDataValue {
const TopArtistsDataValue({required this.artistName, required this.count});
factory TopArtistsDataValue.fromJson(Map<String, dynamic> json) {
factory TopArtistsDataValue.fromJson(Map<String, dynamic>? json) {
return TopArtistsDataValue(
artistName: json['artistName'] as String,
count: json['count'] as int,
artistName: json?['artistName'] as String,
count: json?['count'] as int,
);
}
}
......@@ -21,10 +21,10 @@ class TopArtistsData {
required this.topArtists,
});
factory TopArtistsData.fromJson(Map<String, dynamic> json) {
factory TopArtistsData.fromJson(Map<String, dynamic>? json) {
List<TopArtistsDataValue> topArtists = [];
json['top-artists'].forEach((element) {
json?['top-artists'].forEach((element) {
TopArtistsDataValue value = TopArtistsDataValue(
artistName: element['artistName'] as String,
count: element['count'] as int,
......
import 'dart:convert';
import 'package:http/http.dart' as http;
import '../models/counts_by_day.dart';
import '../models/counts_by_hour.dart';
import '../models/discoveries.dart';
import '../models/statistics_global.dart';
import '../models/statistics_recent.dart';
import '../models/timeline.dart';
import '../models/topartists.dart';
import 'package:scrobbles/models/counts_by_day.dart';
import 'package:scrobbles/models/counts_by_hour.dart';
import 'package:scrobbles/models/discoveries.dart';
import 'package:scrobbles/models/statistics_global.dart';
import 'package:scrobbles/models/statistics_recent.dart';
import 'package:scrobbles/models/timeline.dart';
import 'package:scrobbles/models/topartists.dart';
class ScrobblesApi {
static String baseUrl = 'https://scrobble.harrault.fr';
......
import 'package:flutter/material.dart';
import '../widgets/main_screen/discoveries_card.dart';
import 'package:scrobbles/ui/widgets/cards/discoveries.dart';
class DiscoveriesScreen extends StatefulWidget {
const DiscoveriesScreen({super.key});
class ScreenDiscoveries extends StatefulWidget {
const ScreenDiscoveries({super.key});
@override
State<DiscoveriesScreen> createState() => _DiscoveriesScreenState();
State<ScreenDiscoveries> createState() => _ScreenDiscoveriesState();
}
class _DiscoveriesScreenState extends State<DiscoveriesScreen> {
class _ScreenDiscoveriesState extends State<ScreenDiscoveries> {
@override
Widget build(BuildContext context) {
return Material(
......@@ -19,7 +19,7 @@ class _DiscoveriesScreenState extends State<DiscoveriesScreen> {
physics: const BouncingScrollPhysics(),
children: <Widget>[
const SizedBox(height: 8),
const ChartDiscoveriesCard(),
const CardDiscoveries(),
const SizedBox(height: 36),
],
),
......
import 'package:flutter/material.dart';
import '../widgets/main_screen/statistics_global_card.dart';
import '../widgets/main_screen/statistics_recent_card.dart';
import '../widgets/main_screen/timeline_card.dart';
import '../widgets/main_screen/topartists_card.dart';
import 'package:scrobbles/ui/widgets/cards/statistics_global.dart';
import 'package:scrobbles/ui/widgets/cards/statistics_recent.dart';
import 'package:scrobbles/ui/widgets/cards/timeline.dart';
import 'package:scrobbles/ui/widgets/cards/top_artists.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
class ScreenHome extends StatefulWidget {
const ScreenHome({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
State<ScreenHome> createState() => _ScreenHomeState();
}
class _HomeScreenState extends State<HomeScreen> {
class _ScreenHomeState extends State<ScreenHome> {
@override
Widget build(BuildContext context) {
return Material(
......@@ -22,13 +22,13 @@ class _HomeScreenState extends State<HomeScreen> {
physics: const BouncingScrollPhysics(),
children: <Widget>[
const SizedBox(height: 8),
const StatisticsGlobalCard(),
const CardStatisticsGlobal(),
const SizedBox(height: 6),
const StatisticsRecentCard(),
const CardStatisticsRecent(),
const SizedBox(height: 6),
const ChartTimelineCard(),
const CardTimeline(),
const SizedBox(height: 6),
const ChartTopArtistsCard(),
const CardTopArtists(),
const SizedBox(height: 36),
],
),
......
import 'package:flutter/material.dart';
import '../widgets/main_screen/counts_by_day_card.dart';
import '../widgets/main_screen/counts_by_hour_card.dart';
import 'package:scrobbles/ui/widgets/cards/counts_by_day.dart';
import 'package:scrobbles/ui/widgets/cards/counts_by_hour.dart';
class StatisticsScreen extends StatefulWidget {
const StatisticsScreen({super.key});
class ScreenStatistics extends StatefulWidget {
const ScreenStatistics({super.key});
@override
State<StatisticsScreen> createState() => _StatisticsScreenState();
State<ScreenStatistics> createState() => _ScreenStatisticsState();
}
class _StatisticsScreenState extends State<StatisticsScreen> {
class _ScreenStatisticsState extends State<ScreenStatistics> {
@override
Widget build(BuildContext context) {
return Material(
......@@ -20,9 +20,9 @@ class _StatisticsScreenState extends State<StatisticsScreen> {
physics: const BouncingScrollPhysics(),
children: <Widget>[
const SizedBox(height: 8),
const ChartCountsByDayCard(),
const CardCountsByDay(),
const SizedBox(height: 6),
const ChartCountsByHourCard(),
const CardCountsByHour(),
const SizedBox(height: 36),
],
),
......
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../cubit/bottom_nav_cubit.dart';
import '../widgets/app_bar.dart';
import '../widgets/bottom_nav_bar.dart';
import 'discoveries_screen.dart';
import 'home_screen.dart';
import 'statistics_screen.dart';
import 'package:scrobbles/cubit/bottom_nav_cubit.dart';
import 'package:scrobbles/ui/screens/discoveries.dart';
import 'package:scrobbles/ui/screens/home.dart';
import 'package:scrobbles/ui/screens/statistics.dart';
import 'package:scrobbles/ui/widgets/app_bar.dart';
import 'package:scrobbles/ui/widgets/bottom_nav_bar.dart';
class SkeletonScreen extends StatefulWidget {
const SkeletonScreen({super.key});
......@@ -20,9 +19,9 @@ class _SkeletonScreenState extends State<SkeletonScreen> {
@override
Widget build(BuildContext context) {
const List<Widget> pageNavigation = <Widget>[
const HomeScreen(),
const DiscoveriesScreen(),
const StatisticsScreen(),
const ScreenHome(),
const ScreenDiscoveries(),
const ScreenStatistics(),
];
return BlocProvider<BottomNavCubit>(
......
......@@ -2,12 +2,13 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import '../../../config/app_colors.dart';
import '../../../utils/color_extensions.dart';
import 'package:scrobbles/config/app_colors.dart';
import 'package:scrobbles/utils/color_extensions.dart';
class CustomBarChart extends StatelessWidget {
CustomBarChart({super.key});
final Widget placeholder = Text('⏳');
final double chartHeight = 150.0;
final double verticalTicksInterval = 10;
final String verticalAxisTitleSuffix = '';
......
import 'package:fl_chart/fl_chart.dart';
import 'package:flutter/material.dart';
import '../../../config/app_colors.dart';
import 'package:scrobbles/config/app_colors.dart';
class CustomLineChart extends StatelessWidget {
CustomLineChart({super.key});
final Widget placeholder = Text('⏳');
final double chartHeight = 150.0;
final double titleFontSize = 10;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment