Skip to content
Snippets Groups Projects
top_artists.dart 2.4 KiB
Newer Older
import 'dart:convert';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
Benoît Harrault's avatar
Benoît Harrault committed
import 'package:flutter_bloc/flutter_bloc.dart';
Benoît Harrault's avatar
Benoît Harrault committed
import 'package:scrobbles/config/settings.dart';
Benoît Harrault's avatar
Benoît Harrault committed
import 'package:scrobbles/cubit/data_top_artists_cubit.dart';
import 'package:scrobbles/models/topartists.dart';
import 'package:scrobbles/network/scrobbles.dart';
import 'package:scrobbles/ui/widgets/card_content.dart';
import 'package:scrobbles/ui/widgets/charts/top_artists.dart';
import 'package:scrobbles/ui/widgets/error.dart';

class CardTopArtists extends StatelessWidget {
  const CardTopArtists({super.key});

  @override
  Widget build(BuildContext context) {
Benoît Harrault's avatar
Benoît Harrault committed
    final int daysCount = Settings.topArtistsDaysCount;
Benoît Harrault's avatar
Benoît Harrault committed
    return BlocProvider<DataTopArtistsCubit>(
      create: (BuildContext context) => DataTopArtistsCubit(),
      child: BlocBuilder<DataTopArtistsCubit, DataTopArtistsState>(
        builder: (BuildContext context, DataTopArtistsState state) {
          return CardContent(
            color: Theme.of(context).colorScheme.surface,
            title: 'top_artists_title'.tr(
              namedArgs: {
                'daysCount': daysCount.toString(),
              },
            ),
            loader: updateTopArtists(Settings.topArtistsDaysCount),
Benoît Harrault's avatar
Benoît Harrault committed
            content: ChartTopArtists(
              chartData: TopArtistsData.fromJson(jsonDecode(state.topArtists.toString())),
              isLoading: false,
            ),
          );
        },
      ),

  Widget updateTopArtists(int daysCount) {
    final Widget loading = const Text('⏳');
    final Widget done = const Text('');

    late Future<TopArtistsData> futureTopArtists = ScrobblesApi.fetchTopArtists(daysCount);

    return BlocProvider<DataTopArtistsCubit>(
      create: (BuildContext context) => DataTopArtistsCubit(),
      child: BlocBuilder<DataTopArtistsCubit, DataTopArtistsState>(
        builder: (BuildContext context, DataTopArtistsState state) {
          return FutureBuilder<TopArtistsData>(
            future: futureTopArtists,
            builder: (context, snapshot) {
              if (snapshot.hasError) {
                return ShowErrorWidget(message: '${snapshot.error}');
              }

              BlocProvider.of<DataTopArtistsCubit>(context).setValue(snapshot.data);
              return !snapshot.hasData ? loading : done;
            },
          );
        },
      ),
    );
  }