Add settings page
This commit is contained in:
@@ -5,13 +5,14 @@ import 'package:okane/ui/pages/account/account.dart';
|
||||
import 'package:okane/ui/pages/beneficiary_list.dart';
|
||||
import 'package:okane/ui/pages/budgets/budget_details.dart';
|
||||
import 'package:okane/ui/pages/budgets/budgets.dart';
|
||||
import 'package:okane/ui/pages/settings.dart';
|
||||
import 'package:okane/ui/pages/template_list.dart';
|
||||
import 'package:okane/ui/pages/transaction_details.dart';
|
||||
import 'package:okane/ui/pages/transaction_list.dart';
|
||||
import 'package:okane/ui/state/core.dart';
|
||||
import 'package:okane/ui/widgets/account_indicator.dart';
|
||||
|
||||
enum OkanePage { accounts, transactions, beneficiaries, templates, budgets }
|
||||
enum OkanePage { accounts, transactions, beneficiaries, templates, budgets, settings }
|
||||
|
||||
typedef OkanePageBuilder = Widget Function(bool);
|
||||
|
||||
@@ -96,6 +97,14 @@ final _pages = <OkanePageItem>[
|
||||
(_) => BudgetDetailsPage(),
|
||||
true,
|
||||
),
|
||||
OkanePageItem(
|
||||
OkanePage.settings,
|
||||
Icons.settings,
|
||||
"Settings",
|
||||
SettingsPage(),
|
||||
null,
|
||||
false,
|
||||
),
|
||||
];
|
||||
|
||||
class OkaneNavigationRail extends StatelessWidget {
|
||||
|
||||
59
lib/ui/pages/settings.dart
Normal file
59
lib/ui/pages/settings.dart
Normal file
@@ -0,0 +1,59 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:okane/ui/state/settings.dart';
|
||||
import 'package:okane/ui/utils.dart';
|
||||
|
||||
class SettingsPage extends StatelessWidget {
|
||||
const SettingsPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ListView(
|
||||
children: [
|
||||
BlocBuilder<SettingsCubit, SettingsWrapper>(
|
||||
builder:
|
||||
(context, state) => ListTile(
|
||||
title: Text("Color Scheme"),
|
||||
subtitle: switch (state.settings.colorScheme) {
|
||||
ColorSchemeSettings.dark => Text("Dark"),
|
||||
ColorSchemeSettings.light => Text("Light"),
|
||||
ColorSchemeSettings.system => Text("System"),
|
||||
},
|
||||
onTap: () async {
|
||||
final colorScheme = await showDialogOrModal(
|
||||
context: context,
|
||||
builder:
|
||||
(context) => ListView(
|
||||
shrinkWrap: true,
|
||||
children:
|
||||
ColorSchemeSettings.values
|
||||
.map(
|
||||
(s) => ListTile(
|
||||
title: Text(switch (s) {
|
||||
ColorSchemeSettings.dark => "Dark",
|
||||
ColorSchemeSettings.light => "Light",
|
||||
ColorSchemeSettings.system => "System",
|
||||
}),
|
||||
onTap: () {
|
||||
Navigator.of(context).pop(s);
|
||||
},
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
);
|
||||
if (colorScheme == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
await GetIt.I.get<SettingsCubit>().setSettings(
|
||||
state.settings.copyWith(colorScheme: colorScheme),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,7 @@ part of 'core.dart';
|
||||
T _$identity<T>(T value) => value;
|
||||
|
||||
final _privateConstructorUsedError = UnsupportedError(
|
||||
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models',
|
||||
);
|
||||
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
||||
|
||||
/// @nodoc
|
||||
mixin _$CoreState {
|
||||
@@ -42,19 +41,18 @@ abstract class $CoreStateCopyWith<$Res> {
|
||||
factory $CoreStateCopyWith(CoreState value, $Res Function(CoreState) then) =
|
||||
_$CoreStateCopyWithImpl<$Res, CoreState>;
|
||||
@useResult
|
||||
$Res call({
|
||||
OkanePage activePage,
|
||||
int? activeAccountIndex,
|
||||
Transaction? activeTransaction,
|
||||
List<Account> accounts,
|
||||
List<RecurringTransaction> recurringTransactions,
|
||||
List<Transaction> transactions,
|
||||
List<TransactionTemplate> transactionTemplates,
|
||||
List<Beneficiary> beneficiaries,
|
||||
List<ExpenseCategory> expenseCategories,
|
||||
List<Budget> budgets,
|
||||
Budget? activeBudget,
|
||||
});
|
||||
$Res call(
|
||||
{OkanePage activePage,
|
||||
int? activeAccountIndex,
|
||||
Transaction? activeTransaction,
|
||||
List<Account> accounts,
|
||||
List<RecurringTransaction> recurringTransactions,
|
||||
List<Transaction> transactions,
|
||||
List<TransactionTemplate> transactionTemplates,
|
||||
List<Beneficiary> beneficiaries,
|
||||
List<ExpenseCategory> expenseCategories,
|
||||
List<Budget> budgets,
|
||||
Budget? activeBudget});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@@ -82,66 +80,52 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
|
||||
Object? budgets = null,
|
||||
Object? activeBudget = freezed,
|
||||
}) {
|
||||
return _then(
|
||||
_value.copyWith(
|
||||
activePage:
|
||||
null == activePage
|
||||
? _value.activePage
|
||||
: activePage // ignore: cast_nullable_to_non_nullable
|
||||
as OkanePage,
|
||||
activeAccountIndex:
|
||||
freezed == activeAccountIndex
|
||||
? _value.activeAccountIndex
|
||||
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
|
||||
as int?,
|
||||
activeTransaction:
|
||||
freezed == activeTransaction
|
||||
? _value.activeTransaction
|
||||
: activeTransaction // ignore: cast_nullable_to_non_nullable
|
||||
as Transaction?,
|
||||
accounts:
|
||||
null == accounts
|
||||
? _value.accounts
|
||||
: accounts // ignore: cast_nullable_to_non_nullable
|
||||
as List<Account>,
|
||||
recurringTransactions:
|
||||
null == recurringTransactions
|
||||
? _value.recurringTransactions
|
||||
: recurringTransactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<RecurringTransaction>,
|
||||
transactions:
|
||||
null == transactions
|
||||
? _value.transactions
|
||||
: transactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<Transaction>,
|
||||
transactionTemplates:
|
||||
null == transactionTemplates
|
||||
? _value.transactionTemplates
|
||||
: transactionTemplates // ignore: cast_nullable_to_non_nullable
|
||||
as List<TransactionTemplate>,
|
||||
beneficiaries:
|
||||
null == beneficiaries
|
||||
? _value.beneficiaries
|
||||
: beneficiaries // ignore: cast_nullable_to_non_nullable
|
||||
as List<Beneficiary>,
|
||||
expenseCategories:
|
||||
null == expenseCategories
|
||||
? _value.expenseCategories
|
||||
: expenseCategories // ignore: cast_nullable_to_non_nullable
|
||||
as List<ExpenseCategory>,
|
||||
budgets:
|
||||
null == budgets
|
||||
? _value.budgets
|
||||
: budgets // ignore: cast_nullable_to_non_nullable
|
||||
as List<Budget>,
|
||||
activeBudget:
|
||||
freezed == activeBudget
|
||||
? _value.activeBudget
|
||||
: activeBudget // ignore: cast_nullable_to_non_nullable
|
||||
as Budget?,
|
||||
)
|
||||
as $Val,
|
||||
);
|
||||
return _then(_value.copyWith(
|
||||
activePage: null == activePage
|
||||
? _value.activePage
|
||||
: activePage // ignore: cast_nullable_to_non_nullable
|
||||
as OkanePage,
|
||||
activeAccountIndex: freezed == activeAccountIndex
|
||||
? _value.activeAccountIndex
|
||||
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
|
||||
as int?,
|
||||
activeTransaction: freezed == activeTransaction
|
||||
? _value.activeTransaction
|
||||
: activeTransaction // ignore: cast_nullable_to_non_nullable
|
||||
as Transaction?,
|
||||
accounts: null == accounts
|
||||
? _value.accounts
|
||||
: accounts // ignore: cast_nullable_to_non_nullable
|
||||
as List<Account>,
|
||||
recurringTransactions: null == recurringTransactions
|
||||
? _value.recurringTransactions
|
||||
: recurringTransactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<RecurringTransaction>,
|
||||
transactions: null == transactions
|
||||
? _value.transactions
|
||||
: transactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<Transaction>,
|
||||
transactionTemplates: null == transactionTemplates
|
||||
? _value.transactionTemplates
|
||||
: transactionTemplates // ignore: cast_nullable_to_non_nullable
|
||||
as List<TransactionTemplate>,
|
||||
beneficiaries: null == beneficiaries
|
||||
? _value.beneficiaries
|
||||
: beneficiaries // ignore: cast_nullable_to_non_nullable
|
||||
as List<Beneficiary>,
|
||||
expenseCategories: null == expenseCategories
|
||||
? _value.expenseCategories
|
||||
: expenseCategories // ignore: cast_nullable_to_non_nullable
|
||||
as List<ExpenseCategory>,
|
||||
budgets: null == budgets
|
||||
? _value.budgets
|
||||
: budgets // ignore: cast_nullable_to_non_nullable
|
||||
as List<Budget>,
|
||||
activeBudget: freezed == activeBudget
|
||||
? _value.activeBudget
|
||||
: activeBudget // ignore: cast_nullable_to_non_nullable
|
||||
as Budget?,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,24 +133,22 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
|
||||
abstract class _$$CoreStateImplCopyWith<$Res>
|
||||
implements $CoreStateCopyWith<$Res> {
|
||||
factory _$$CoreStateImplCopyWith(
|
||||
_$CoreStateImpl value,
|
||||
$Res Function(_$CoreStateImpl) then,
|
||||
) = __$$CoreStateImplCopyWithImpl<$Res>;
|
||||
_$CoreStateImpl value, $Res Function(_$CoreStateImpl) then) =
|
||||
__$$CoreStateImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({
|
||||
OkanePage activePage,
|
||||
int? activeAccountIndex,
|
||||
Transaction? activeTransaction,
|
||||
List<Account> accounts,
|
||||
List<RecurringTransaction> recurringTransactions,
|
||||
List<Transaction> transactions,
|
||||
List<TransactionTemplate> transactionTemplates,
|
||||
List<Beneficiary> beneficiaries,
|
||||
List<ExpenseCategory> expenseCategories,
|
||||
List<Budget> budgets,
|
||||
Budget? activeBudget,
|
||||
});
|
||||
$Res call(
|
||||
{OkanePage activePage,
|
||||
int? activeAccountIndex,
|
||||
Transaction? activeTransaction,
|
||||
List<Account> accounts,
|
||||
List<RecurringTransaction> recurringTransactions,
|
||||
List<Transaction> transactions,
|
||||
List<TransactionTemplate> transactionTemplates,
|
||||
List<Beneficiary> beneficiaries,
|
||||
List<ExpenseCategory> expenseCategories,
|
||||
List<Budget> budgets,
|
||||
Budget? activeBudget});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@@ -174,9 +156,8 @@ class __$$CoreStateImplCopyWithImpl<$Res>
|
||||
extends _$CoreStateCopyWithImpl<$Res, _$CoreStateImpl>
|
||||
implements _$$CoreStateImplCopyWith<$Res> {
|
||||
__$$CoreStateImplCopyWithImpl(
|
||||
_$CoreStateImpl _value,
|
||||
$Res Function(_$CoreStateImpl) _then,
|
||||
) : super(_value, _then);
|
||||
_$CoreStateImpl _value, $Res Function(_$CoreStateImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
@@ -193,90 +174,77 @@ class __$$CoreStateImplCopyWithImpl<$Res>
|
||||
Object? budgets = null,
|
||||
Object? activeBudget = freezed,
|
||||
}) {
|
||||
return _then(
|
||||
_$CoreStateImpl(
|
||||
activePage:
|
||||
null == activePage
|
||||
? _value.activePage
|
||||
: activePage // ignore: cast_nullable_to_non_nullable
|
||||
as OkanePage,
|
||||
activeAccountIndex:
|
||||
freezed == activeAccountIndex
|
||||
? _value.activeAccountIndex
|
||||
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
|
||||
as int?,
|
||||
activeTransaction:
|
||||
freezed == activeTransaction
|
||||
? _value.activeTransaction
|
||||
: activeTransaction // ignore: cast_nullable_to_non_nullable
|
||||
as Transaction?,
|
||||
accounts:
|
||||
null == accounts
|
||||
? _value._accounts
|
||||
: accounts // ignore: cast_nullable_to_non_nullable
|
||||
as List<Account>,
|
||||
recurringTransactions:
|
||||
null == recurringTransactions
|
||||
? _value._recurringTransactions
|
||||
: recurringTransactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<RecurringTransaction>,
|
||||
transactions:
|
||||
null == transactions
|
||||
? _value._transactions
|
||||
: transactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<Transaction>,
|
||||
transactionTemplates:
|
||||
null == transactionTemplates
|
||||
? _value._transactionTemplates
|
||||
: transactionTemplates // ignore: cast_nullable_to_non_nullable
|
||||
as List<TransactionTemplate>,
|
||||
beneficiaries:
|
||||
null == beneficiaries
|
||||
? _value._beneficiaries
|
||||
: beneficiaries // ignore: cast_nullable_to_non_nullable
|
||||
as List<Beneficiary>,
|
||||
expenseCategories:
|
||||
null == expenseCategories
|
||||
? _value._expenseCategories
|
||||
: expenseCategories // ignore: cast_nullable_to_non_nullable
|
||||
as List<ExpenseCategory>,
|
||||
budgets:
|
||||
null == budgets
|
||||
? _value._budgets
|
||||
: budgets // ignore: cast_nullable_to_non_nullable
|
||||
as List<Budget>,
|
||||
activeBudget:
|
||||
freezed == activeBudget
|
||||
? _value.activeBudget
|
||||
: activeBudget // ignore: cast_nullable_to_non_nullable
|
||||
as Budget?,
|
||||
),
|
||||
);
|
||||
return _then(_$CoreStateImpl(
|
||||
activePage: null == activePage
|
||||
? _value.activePage
|
||||
: activePage // ignore: cast_nullable_to_non_nullable
|
||||
as OkanePage,
|
||||
activeAccountIndex: freezed == activeAccountIndex
|
||||
? _value.activeAccountIndex
|
||||
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
|
||||
as int?,
|
||||
activeTransaction: freezed == activeTransaction
|
||||
? _value.activeTransaction
|
||||
: activeTransaction // ignore: cast_nullable_to_non_nullable
|
||||
as Transaction?,
|
||||
accounts: null == accounts
|
||||
? _value._accounts
|
||||
: accounts // ignore: cast_nullable_to_non_nullable
|
||||
as List<Account>,
|
||||
recurringTransactions: null == recurringTransactions
|
||||
? _value._recurringTransactions
|
||||
: recurringTransactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<RecurringTransaction>,
|
||||
transactions: null == transactions
|
||||
? _value._transactions
|
||||
: transactions // ignore: cast_nullable_to_non_nullable
|
||||
as List<Transaction>,
|
||||
transactionTemplates: null == transactionTemplates
|
||||
? _value._transactionTemplates
|
||||
: transactionTemplates // ignore: cast_nullable_to_non_nullable
|
||||
as List<TransactionTemplate>,
|
||||
beneficiaries: null == beneficiaries
|
||||
? _value._beneficiaries
|
||||
: beneficiaries // ignore: cast_nullable_to_non_nullable
|
||||
as List<Beneficiary>,
|
||||
expenseCategories: null == expenseCategories
|
||||
? _value._expenseCategories
|
||||
: expenseCategories // ignore: cast_nullable_to_non_nullable
|
||||
as List<ExpenseCategory>,
|
||||
budgets: null == budgets
|
||||
? _value._budgets
|
||||
: budgets // ignore: cast_nullable_to_non_nullable
|
||||
as List<Budget>,
|
||||
activeBudget: freezed == activeBudget
|
||||
? _value.activeBudget
|
||||
: activeBudget // ignore: cast_nullable_to_non_nullable
|
||||
as Budget?,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$CoreStateImpl implements _CoreState {
|
||||
const _$CoreStateImpl({
|
||||
this.activePage = OkanePage.accounts,
|
||||
this.activeAccountIndex,
|
||||
this.activeTransaction = null,
|
||||
final List<Account> accounts = const [],
|
||||
final List<RecurringTransaction> recurringTransactions = const [],
|
||||
final List<Transaction> transactions = const [],
|
||||
final List<TransactionTemplate> transactionTemplates = const [],
|
||||
final List<Beneficiary> beneficiaries = const [],
|
||||
final List<ExpenseCategory> expenseCategories = const [],
|
||||
final List<Budget> budgets = const [],
|
||||
this.activeBudget = null,
|
||||
}) : _accounts = accounts,
|
||||
_recurringTransactions = recurringTransactions,
|
||||
_transactions = transactions,
|
||||
_transactionTemplates = transactionTemplates,
|
||||
_beneficiaries = beneficiaries,
|
||||
_expenseCategories = expenseCategories,
|
||||
_budgets = budgets;
|
||||
const _$CoreStateImpl(
|
||||
{this.activePage = OkanePage.accounts,
|
||||
this.activeAccountIndex,
|
||||
this.activeTransaction = null,
|
||||
final List<Account> accounts = const [],
|
||||
final List<RecurringTransaction> recurringTransactions = const [],
|
||||
final List<Transaction> transactions = const [],
|
||||
final List<TransactionTemplate> transactionTemplates = const [],
|
||||
final List<Beneficiary> beneficiaries = const [],
|
||||
final List<ExpenseCategory> expenseCategories = const [],
|
||||
final List<Budget> budgets = const [],
|
||||
this.activeBudget = null})
|
||||
: _accounts = accounts,
|
||||
_recurringTransactions = recurringTransactions,
|
||||
_transactions = transactions,
|
||||
_transactionTemplates = transactionTemplates,
|
||||
_beneficiaries = beneficiaries,
|
||||
_expenseCategories = expenseCategories,
|
||||
_budgets = budgets;
|
||||
|
||||
@override
|
||||
@JsonKey()
|
||||
@@ -373,26 +341,16 @@ class _$CoreStateImpl implements _CoreState {
|
||||
(identical(other.activeTransaction, activeTransaction) ||
|
||||
other.activeTransaction == activeTransaction) &&
|
||||
const DeepCollectionEquality().equals(other._accounts, _accounts) &&
|
||||
const DeepCollectionEquality().equals(
|
||||
other._recurringTransactions,
|
||||
_recurringTransactions,
|
||||
) &&
|
||||
const DeepCollectionEquality().equals(
|
||||
other._transactions,
|
||||
_transactions,
|
||||
) &&
|
||||
const DeepCollectionEquality().equals(
|
||||
other._transactionTemplates,
|
||||
_transactionTemplates,
|
||||
) &&
|
||||
const DeepCollectionEquality().equals(
|
||||
other._beneficiaries,
|
||||
_beneficiaries,
|
||||
) &&
|
||||
const DeepCollectionEquality().equals(
|
||||
other._expenseCategories,
|
||||
_expenseCategories,
|
||||
) &&
|
||||
const DeepCollectionEquality()
|
||||
.equals(other._recurringTransactions, _recurringTransactions) &&
|
||||
const DeepCollectionEquality()
|
||||
.equals(other._transactions, _transactions) &&
|
||||
const DeepCollectionEquality()
|
||||
.equals(other._transactionTemplates, _transactionTemplates) &&
|
||||
const DeepCollectionEquality()
|
||||
.equals(other._beneficiaries, _beneficiaries) &&
|
||||
const DeepCollectionEquality()
|
||||
.equals(other._expenseCategories, _expenseCategories) &&
|
||||
const DeepCollectionEquality().equals(other._budgets, _budgets) &&
|
||||
(identical(other.activeBudget, activeBudget) ||
|
||||
other.activeBudget == activeBudget));
|
||||
@@ -400,19 +358,18 @@ class _$CoreStateImpl implements _CoreState {
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(
|
||||
runtimeType,
|
||||
activePage,
|
||||
activeAccountIndex,
|
||||
activeTransaction,
|
||||
const DeepCollectionEquality().hash(_accounts),
|
||||
const DeepCollectionEquality().hash(_recurringTransactions),
|
||||
const DeepCollectionEquality().hash(_transactions),
|
||||
const DeepCollectionEquality().hash(_transactionTemplates),
|
||||
const DeepCollectionEquality().hash(_beneficiaries),
|
||||
const DeepCollectionEquality().hash(_expenseCategories),
|
||||
const DeepCollectionEquality().hash(_budgets),
|
||||
activeBudget,
|
||||
);
|
||||
runtimeType,
|
||||
activePage,
|
||||
activeAccountIndex,
|
||||
activeTransaction,
|
||||
const DeepCollectionEquality().hash(_accounts),
|
||||
const DeepCollectionEquality().hash(_recurringTransactions),
|
||||
const DeepCollectionEquality().hash(_transactions),
|
||||
const DeepCollectionEquality().hash(_transactionTemplates),
|
||||
const DeepCollectionEquality().hash(_beneficiaries),
|
||||
const DeepCollectionEquality().hash(_expenseCategories),
|
||||
const DeepCollectionEquality().hash(_budgets),
|
||||
activeBudget);
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
@override
|
||||
@@ -422,19 +379,18 @@ class _$CoreStateImpl implements _CoreState {
|
||||
}
|
||||
|
||||
abstract class _CoreState implements CoreState {
|
||||
const factory _CoreState({
|
||||
final OkanePage activePage,
|
||||
final int? activeAccountIndex,
|
||||
final Transaction? activeTransaction,
|
||||
final List<Account> accounts,
|
||||
final List<RecurringTransaction> recurringTransactions,
|
||||
final List<Transaction> transactions,
|
||||
final List<TransactionTemplate> transactionTemplates,
|
||||
final List<Beneficiary> beneficiaries,
|
||||
final List<ExpenseCategory> expenseCategories,
|
||||
final List<Budget> budgets,
|
||||
final Budget? activeBudget,
|
||||
}) = _$CoreStateImpl;
|
||||
const factory _CoreState(
|
||||
{final OkanePage activePage,
|
||||
final int? activeAccountIndex,
|
||||
final Transaction? activeTransaction,
|
||||
final List<Account> accounts,
|
||||
final List<RecurringTransaction> recurringTransactions,
|
||||
final List<Transaction> transactions,
|
||||
final List<TransactionTemplate> transactionTemplates,
|
||||
final List<Beneficiary> beneficiaries,
|
||||
final List<ExpenseCategory> expenseCategories,
|
||||
final List<Budget> budgets,
|
||||
final Budget? activeBudget}) = _$CoreStateImpl;
|
||||
|
||||
@override
|
||||
OkanePage get activePage;
|
||||
|
||||
48
lib/ui/state/settings.dart
Normal file
48
lib/ui/state/settings.dart
Normal file
@@ -0,0 +1,48 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
part 'settings.freezed.dart';
|
||||
part 'settings.g.dart';
|
||||
|
||||
enum ColorSchemeSettings { light, dark, system }
|
||||
|
||||
@freezed
|
||||
abstract class Settings with _$Settings {
|
||||
const factory Settings({
|
||||
@Default(ColorSchemeSettings.system) ColorSchemeSettings colorScheme,
|
||||
}) = _Settings;
|
||||
|
||||
factory Settings.fromJson(Map<String, Object?> json) =>
|
||||
_$SettingsFromJson(json);
|
||||
}
|
||||
|
||||
@freezed
|
||||
abstract class SettingsWrapper with _$SettingsWrapper {
|
||||
const factory SettingsWrapper({@Default(Settings()) Settings settings}) =
|
||||
_SettingsWrapper;
|
||||
}
|
||||
|
||||
class SettingsCubit extends Cubit<SettingsWrapper> {
|
||||
final SharedPreferencesAsync _prefs = SharedPreferencesAsync();
|
||||
|
||||
SettingsCubit() : super(SettingsWrapper());
|
||||
|
||||
Future<void> loadSettings() async {
|
||||
final value = await _prefs.getString("settings");
|
||||
if (value == null) {
|
||||
await _prefs.setString("settings", jsonEncode(Settings().toJson()));
|
||||
return;
|
||||
}
|
||||
|
||||
emit(state.copyWith(settings: Settings.fromJson(jsonDecode(value))));
|
||||
}
|
||||
|
||||
Future<void> setSettings(Settings settings) async {
|
||||
emit(state.copyWith(settings: settings));
|
||||
|
||||
await _prefs.setString("settings", jsonEncode(settings.toJson()));
|
||||
}
|
||||
}
|
||||
287
lib/ui/state/settings.freezed.dart
Normal file
287
lib/ui/state/settings.freezed.dart
Normal file
@@ -0,0 +1,287 @@
|
||||
// coverage:ignore-file
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
|
||||
|
||||
part of 'settings.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// FreezedGenerator
|
||||
// **************************************************************************
|
||||
|
||||
T _$identity<T>(T value) => value;
|
||||
|
||||
final _privateConstructorUsedError = UnsupportedError(
|
||||
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
||||
|
||||
Settings _$SettingsFromJson(Map<String, dynamic> json) {
|
||||
return _Settings.fromJson(json);
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$Settings {
|
||||
ColorSchemeSettings get colorScheme => throw _privateConstructorUsedError;
|
||||
|
||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||
@JsonKey(ignore: true)
|
||||
$SettingsCopyWith<Settings> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $SettingsCopyWith<$Res> {
|
||||
factory $SettingsCopyWith(Settings value, $Res Function(Settings) then) =
|
||||
_$SettingsCopyWithImpl<$Res, Settings>;
|
||||
@useResult
|
||||
$Res call({ColorSchemeSettings colorScheme});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$SettingsCopyWithImpl<$Res, $Val extends Settings>
|
||||
implements $SettingsCopyWith<$Res> {
|
||||
_$SettingsCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? colorScheme = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
colorScheme: null == colorScheme
|
||||
? _value.colorScheme
|
||||
: colorScheme // ignore: cast_nullable_to_non_nullable
|
||||
as ColorSchemeSettings,
|
||||
) as $Val);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$SettingsImplCopyWith<$Res>
|
||||
implements $SettingsCopyWith<$Res> {
|
||||
factory _$$SettingsImplCopyWith(
|
||||
_$SettingsImpl value, $Res Function(_$SettingsImpl) then) =
|
||||
__$$SettingsImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({ColorSchemeSettings colorScheme});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$SettingsImplCopyWithImpl<$Res>
|
||||
extends _$SettingsCopyWithImpl<$Res, _$SettingsImpl>
|
||||
implements _$$SettingsImplCopyWith<$Res> {
|
||||
__$$SettingsImplCopyWithImpl(
|
||||
_$SettingsImpl _value, $Res Function(_$SettingsImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? colorScheme = null,
|
||||
}) {
|
||||
return _then(_$SettingsImpl(
|
||||
colorScheme: null == colorScheme
|
||||
? _value.colorScheme
|
||||
: colorScheme // ignore: cast_nullable_to_non_nullable
|
||||
as ColorSchemeSettings,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
@JsonSerializable()
|
||||
class _$SettingsImpl implements _Settings {
|
||||
const _$SettingsImpl({this.colorScheme = ColorSchemeSettings.system});
|
||||
|
||||
factory _$SettingsImpl.fromJson(Map<String, dynamic> json) =>
|
||||
_$$SettingsImplFromJson(json);
|
||||
|
||||
@override
|
||||
@JsonKey()
|
||||
final ColorSchemeSettings colorScheme;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'Settings(colorScheme: $colorScheme)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$SettingsImpl &&
|
||||
(identical(other.colorScheme, colorScheme) ||
|
||||
other.colorScheme == colorScheme));
|
||||
}
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, colorScheme);
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$SettingsImplCopyWith<_$SettingsImpl> get copyWith =>
|
||||
__$$SettingsImplCopyWithImpl<_$SettingsImpl>(this, _$identity);
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson() {
|
||||
return _$$SettingsImplToJson(
|
||||
this,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _Settings implements Settings {
|
||||
const factory _Settings({final ColorSchemeSettings colorScheme}) =
|
||||
_$SettingsImpl;
|
||||
|
||||
factory _Settings.fromJson(Map<String, dynamic> json) =
|
||||
_$SettingsImpl.fromJson;
|
||||
|
||||
@override
|
||||
ColorSchemeSettings get colorScheme;
|
||||
@override
|
||||
@JsonKey(ignore: true)
|
||||
_$$SettingsImplCopyWith<_$SettingsImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
mixin _$SettingsWrapper {
|
||||
Settings get settings => throw _privateConstructorUsedError;
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
$SettingsWrapperCopyWith<SettingsWrapper> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class $SettingsWrapperCopyWith<$Res> {
|
||||
factory $SettingsWrapperCopyWith(
|
||||
SettingsWrapper value, $Res Function(SettingsWrapper) then) =
|
||||
_$SettingsWrapperCopyWithImpl<$Res, SettingsWrapper>;
|
||||
@useResult
|
||||
$Res call({Settings settings});
|
||||
|
||||
$SettingsCopyWith<$Res> get settings;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$SettingsWrapperCopyWithImpl<$Res, $Val extends SettingsWrapper>
|
||||
implements $SettingsWrapperCopyWith<$Res> {
|
||||
_$SettingsWrapperCopyWithImpl(this._value, this._then);
|
||||
|
||||
// ignore: unused_field
|
||||
final $Val _value;
|
||||
// ignore: unused_field
|
||||
final $Res Function($Val) _then;
|
||||
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? settings = null,
|
||||
}) {
|
||||
return _then(_value.copyWith(
|
||||
settings: null == settings
|
||||
? _value.settings
|
||||
: settings // ignore: cast_nullable_to_non_nullable
|
||||
as Settings,
|
||||
) as $Val);
|
||||
}
|
||||
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
$SettingsCopyWith<$Res> get settings {
|
||||
return $SettingsCopyWith<$Res>(_value.settings, (value) {
|
||||
return _then(_value.copyWith(settings: value) as $Val);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$SettingsWrapperImplCopyWith<$Res>
|
||||
implements $SettingsWrapperCopyWith<$Res> {
|
||||
factory _$$SettingsWrapperImplCopyWith(_$SettingsWrapperImpl value,
|
||||
$Res Function(_$SettingsWrapperImpl) then) =
|
||||
__$$SettingsWrapperImplCopyWithImpl<$Res>;
|
||||
@override
|
||||
@useResult
|
||||
$Res call({Settings settings});
|
||||
|
||||
@override
|
||||
$SettingsCopyWith<$Res> get settings;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$SettingsWrapperImplCopyWithImpl<$Res>
|
||||
extends _$SettingsWrapperCopyWithImpl<$Res, _$SettingsWrapperImpl>
|
||||
implements _$$SettingsWrapperImplCopyWith<$Res> {
|
||||
__$$SettingsWrapperImplCopyWithImpl(
|
||||
_$SettingsWrapperImpl _value, $Res Function(_$SettingsWrapperImpl) _then)
|
||||
: super(_value, _then);
|
||||
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? settings = null,
|
||||
}) {
|
||||
return _then(_$SettingsWrapperImpl(
|
||||
settings: null == settings
|
||||
? _value.settings
|
||||
: settings // ignore: cast_nullable_to_non_nullable
|
||||
as Settings,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
|
||||
class _$SettingsWrapperImpl implements _SettingsWrapper {
|
||||
const _$SettingsWrapperImpl({this.settings = const Settings()});
|
||||
|
||||
@override
|
||||
@JsonKey()
|
||||
final Settings settings;
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'SettingsWrapper(settings: $settings)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$SettingsWrapperImpl &&
|
||||
(identical(other.settings, settings) ||
|
||||
other.settings == settings));
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(runtimeType, settings);
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$SettingsWrapperImplCopyWith<_$SettingsWrapperImpl> get copyWith =>
|
||||
__$$SettingsWrapperImplCopyWithImpl<_$SettingsWrapperImpl>(
|
||||
this, _$identity);
|
||||
}
|
||||
|
||||
abstract class _SettingsWrapper implements SettingsWrapper {
|
||||
const factory _SettingsWrapper({final Settings settings}) =
|
||||
_$SettingsWrapperImpl;
|
||||
|
||||
@override
|
||||
Settings get settings;
|
||||
@override
|
||||
@JsonKey(ignore: true)
|
||||
_$$SettingsWrapperImplCopyWith<_$SettingsWrapperImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
25
lib/ui/state/settings.g.dart
Normal file
25
lib/ui/state/settings.g.dart
Normal file
@@ -0,0 +1,25 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'settings.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
_$SettingsImpl _$$SettingsImplFromJson(Map<String, dynamic> json) =>
|
||||
_$SettingsImpl(
|
||||
colorScheme: $enumDecodeNullable(
|
||||
_$ColorSchemeSettingsEnumMap, json['colorScheme']) ??
|
||||
ColorSchemeSettings.system,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$$SettingsImplToJson(_$SettingsImpl instance) =>
|
||||
<String, dynamic>{
|
||||
'colorScheme': _$ColorSchemeSettingsEnumMap[instance.colorScheme]!,
|
||||
};
|
||||
|
||||
const _$ColorSchemeSettingsEnumMap = {
|
||||
ColorSchemeSettings.light: 'light',
|
||||
ColorSchemeSettings.dark: 'dark',
|
||||
ColorSchemeSettings.system: 'system',
|
||||
};
|
||||
Reference in New Issue
Block a user