Skip to content
Snippets Groups Projects
settings_form.dart 9.14 KiB
Newer Older
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import 'package:scrobbles/config/default_settings.dart';
import 'package:scrobbles/cubit/settings_cubit.dart';

class SettingsForm extends StatefulWidget {
  const SettingsForm({super.key});

  @override
  State<SettingsForm> createState() => _SettingsFormState();
}

class _SettingsFormState extends State<SettingsForm> {
  final usernameController = TextEditingController();
  final securityTokenController = TextEditingController();

  int discoveriesDaysCount = DefaultSettings.defaultDiscoveriesDaysCount;
  int distributionDaysCount = DefaultSettings.defaultDistributionDaysCount;
  int statisticsRecentDaysCount = DefaultSettings.defaultStatisticsRecentDaysCount;
  int timelineDaysCount = DefaultSettings.defaultTimelineDaysCount;
  int topArtistsDaysCount = DefaultSettings.defaultTopArtistsDaysCount;

  List<bool> _selectedDiscoveriesDaysCount = [];
  List<bool> _selectedDistributionDaysCount = [];
  List<bool> _selectedStatisticsRecentDaysCount = [];
  List<bool> _selectedTimelineDaysCount = [];
  List<bool> _selectedTopArtistsDaysCount = [];

  @override
  void didChangeDependencies() {
    SettingsCubit settings = BlocProvider.of<SettingsCubit>(context);

    usernameController.text = settings.getUsername();
    securityTokenController.text = settings.getSecurityToken();

    discoveriesDaysCount = settings.getDiscoveriesDaysCount();
    distributionDaysCount = settings.getDistributionDaysCount();
    statisticsRecentDaysCount = settings.getStatisticsRecentDaysCount();
    timelineDaysCount = settings.getTimelineDaysCount();
    topArtistsDaysCount = settings.getTopArtistsDaysCount();

    _selectedDiscoveriesDaysCount =
        DefaultSettings.allowedValues.map((e) => (e == discoveriesDaysCount)).toList();
    _selectedDistributionDaysCount =
        DefaultSettings.allowedValues.map((e) => (e == distributionDaysCount)).toList();
    _selectedStatisticsRecentDaysCount =
        DefaultSettings.allowedValues.map((e) => (e == statisticsRecentDaysCount)).toList();
    _selectedTimelineDaysCount =
        DefaultSettings.allowedValues.map((e) => (e == timelineDaysCount)).toList();
    _selectedTopArtistsDaysCount =
        DefaultSettings.allowedValues.map((e) => (e == topArtistsDaysCount)).toList();

    super.didChangeDependencies();
  }

  @override
  void dispose() {
    usernameController.dispose();
    securityTokenController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    void saveSettings() {
      BlocProvider.of<SettingsCubit>(context).setValues(
        username: usernameController.text,
        securityToken: securityTokenController.text,
        discoveriesDaysCount: discoveriesDaysCount,
        distributionDaysCount: distributionDaysCount,
        statisticsRecentDaysCount: statisticsRecentDaysCount,
        timelineDaysCount: timelineDaysCount,
        topArtistsDaysCount: topArtistsDaysCount,
      );
    }

    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.max,
      children: <Widget>[
        // Username
        // Text('settings_label_username').tr(),
        // TextFormField(
        //   controller: usernameController,
        //   decoration: InputDecoration(
        //     border: UnderlineInputBorder(),
        //   ),
        // ),
        // SizedBox(height: 16),

        // Security token
        // Text('settings_label_security_token').tr(),
        // TextFormField(
        //   controller: securityTokenController,
        //   decoration: InputDecoration(
        //     border: UnderlineInputBorder(),
        //   ),
        // ),
        // SizedBox(height: 20),

        // Discoveries
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text('settings_label_discoveries_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  discoveriesDaysCount = DefaultSettings.allowedValues[index];
                  for (int i = 0; i < _selectedDiscoveriesDaysCount.length; i++) {
                    _selectedDiscoveriesDaysCount[i] = i == index;
                saveSettings();
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedDiscoveriesDaysCount,
              children: DefaultSettings.allowedValues.map((e) => Text(e.toString())).toList(),
            ),
          ],
        ),

        // Distribution by day/hour + heatmap
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text('settings_label_distribution_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  distributionDaysCount = DefaultSettings.allowedValues[index];
                  for (int i = 0; i < _selectedDistributionDaysCount.length; i++) {
                    _selectedDistributionDaysCount[i] = i == index;
                saveSettings();
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedDistributionDaysCount,
              children: DefaultSettings.allowedValues.map((e) => Text(e.toString())).toList(),
            ),
          ],

        // Statistics (recent)
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text('settings_label_statistics_recent_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  statisticsRecentDaysCount = DefaultSettings.allowedValues[index];
                  for (int i = 0; i < _selectedStatisticsRecentDaysCount.length; i++) {
                    _selectedStatisticsRecentDaysCount[i] = i == index;
                  }
                });
                saveSettings();
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedStatisticsRecentDaysCount,
              children: DefaultSettings.allowedValues.map((e) => Text(e.toString())).toList(),
            ),
          ],
        ),

        // Timeline
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text('settings_label_timeline_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  timelineDaysCount = DefaultSettings.allowedValues[index];
                  for (int i = 0; i < _selectedTimelineDaysCount.length; i++) {
                    _selectedTimelineDaysCount[i] = i == index;
                  }
                });
                saveSettings();
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedTimelineDaysCount,
              children: DefaultSettings.allowedValues.map((e) => Text(e.toString())).toList(),
            ),
          ],
        ),

        // Top Artists
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text('settings_label_top_artists_days_count').tr(),
            ToggleButtons(
              onPressed: (int index) {
                setState(() {
                  topArtistsDaysCount = DefaultSettings.allowedValues[index];
                  for (int i = 0; i < _selectedTopArtistsDaysCount.length; i++) {
                    _selectedTopArtistsDaysCount[i] = i == index;
                  }
                });
                saveSettings();
              },
              borderRadius: const BorderRadius.all(Radius.circular(8)),
              constraints: const BoxConstraints(minHeight: 30.0, minWidth: 30.0),
              isSelected: _selectedTopArtistsDaysCount,
              children: DefaultSettings.allowedValues.map((e) => Text(e.toString())).toList(),
            ),
          ],
        ),

        // Save
        // ElevatedButton(
        //   child: Row(
        //     mainAxisAlignment: MainAxisAlignment.center,
        //     crossAxisAlignment: CrossAxisAlignment.center,
        //     children: [
        //       Icon(UniconsLine.save),
        //       SizedBox(width: 8),
        //       Text('settings_button_save').tr(),
        //     ],
        //   ),
        //   onPressed: () => saveSettings(),
        // ),