Skip to content
Snippets Groups Projects
timeline.dart 2.69 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_timeline_cubit.dart';
import 'package:scrobbles/models/timeline.dart';
import 'package:scrobbles/network/scrobbles.dart';
import 'package:scrobbles/ui/widgets/card_content.dart';
import 'package:scrobbles/ui/widgets/charts/timeline_counts.dart';
import 'package:scrobbles/ui/widgets/charts/timeline_eclecticism.dart';
import 'package:scrobbles/ui/widgets/error.dart';

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

  @override
  Widget build(BuildContext context) {
Benoît Harrault's avatar
Benoît Harrault committed
    final int daysCount = Settings.timelineDaysCount;
Benoît Harrault's avatar
Benoît Harrault committed
    return BlocProvider<DataTimelineCubit>(
      create: (BuildContext context) => DataTimelineCubit(),
      child: BlocBuilder<DataTimelineCubit, DataTimelineState>(
        builder: (BuildContext context, DataTimelineState state) {
          return CardContent(
            color: Theme.of(context).colorScheme.surface,
            title: 'timeline_title'.tr(
              namedArgs: {
                'daysCount': daysCount.toString(),
              },
            ),
            loader: updateTimeline(Settings.timelineDaysCount),
Benoît Harrault's avatar
Benoît Harrault committed
            content: Stack(
              children: [
                ChartTimelineCounts(
                  chartData: TimelineData.fromJson(jsonDecode(state.timeline.toString())),
                  isLoading: false,
                ),
                ChartTimelineEclecticism(
                  chartData: TimelineData.fromJson(jsonDecode(state.timeline.toString())),
                  isLoading: false,
                ),
              ],
            ),
          );
        },
      ),

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

    late Future<TimelineData> futureTimeline = ScrobblesApi.fetchTimeline(daysCount);

    return BlocProvider<DataTimelineCubit>(
      create: (BuildContext context) => DataTimelineCubit(),
      child: BlocBuilder<DataTimelineCubit, DataTimelineState>(
        builder: (BuildContext context, DataTimelineState state) {
          return FutureBuilder<TimelineData>(
            future: futureTimeline,
            builder: (context, snapshot) {
              if (snapshot.hasError) {
                return ShowErrorWidget(message: '${snapshot.error}');
              }

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