Skip to content
Snippets Groups Projects
timeline_eclecticism.dart 2.66 KiB
Newer Older
import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.dart';

import 'package:scrobbles/config/app_colors.dart';
import 'package:scrobbles/models/timeline.dart';
import 'package:scrobbles/ui/widgets/abstracts/custom_line_chart.dart';
import 'package:scrobbles/utils/color_extensions.dart';
class ChartTimelineEclecticism extends CustomLineChart {
  final TimelineData chartData;

  const ChartTimelineEclecticism({super.key, required this.chartData});

  @override
  Widget build(BuildContext context) {
    final horizontalScale = getHorizontalScale();

    if (this.chartData.data.keys.length == 0) {
      return SizedBox(
        height: this.chartHeight,
      );
    }

    return Container(
      height: this.chartHeight,
      child: LineChart(
        LineChartData(
          lineBarsData: getDataEclecticism(),
          borderData: getBorderData(),
          gridData: getGridData(),
          titlesData: getTitlesData(),
          lineTouchData: const LineTouchData(enabled: false),
          minX: horizontalScale['min'],
          maxX: horizontalScale['max'],
          maxY: 100,
          minY: 0,
        ),
        duration: const Duration(milliseconds: 250),
      ),
  Map<String, double> getHorizontalScale() {
    // Left/right margins: 12h, in milliseconds
    int margin = 12 * 60 * 60 * 1000;

    double minDateAsDouble = double.maxFinite;
    double maxDateAsDouble = -double.maxFinite;

    this.chartData.data.keys.forEach((element) {
      TimelineDataValue? value = this.chartData.data[element];
      if (value != null) {
        final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble();

        if (date < minDateAsDouble) {
          minDateAsDouble = date;
        }
        if (date > maxDateAsDouble) {
          maxDateAsDouble = date;
        }
      }
    });

    return {
      'min': minDateAsDouble - margin,
      'max': maxDateAsDouble + margin,
    };
  }

  List<LineChartBarData> getDataEclecticism() {
    List<FlSpot> spots = [];

    this.chartData.data.keys.forEach((element) {
      TimelineDataValue? value = this.chartData.data[element];
      if (value != null) {
        final double date = DateTime.parse(element).millisecondsSinceEpoch.toDouble();
        final double eclecticism = value.eclecticism.toDouble();

        spots.add(FlSpot(date, eclecticism));
      }
    });

    final baseColor = AppColors.contentColorCyan;
    final borderColor = baseColor.darken(20);

    return [
      LineChartBarData(
        isCurved: true,
        color: borderColor,
        isStrokeCapRound: false,
        dotData: const FlDotData(show: false),
        spots: spots,
      ),
    ];
  }
}