Initial commit
This commit is contained in:
152
lib/ui/state/core.dart
Normal file
152
lib/ui/state/core.dart
Normal file
@@ -0,0 +1,152 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:okane/database/collections/account.dart';
|
||||
import 'package:okane/database/collections/beneficiary.dart';
|
||||
import 'package:okane/database/collections/expense_category.dart';
|
||||
import 'package:okane/database/collections/recurrent.dart';
|
||||
import 'package:okane/database/collections/template.dart';
|
||||
import 'package:okane/database/collections/transaction.dart';
|
||||
import 'package:okane/database/database.dart';
|
||||
import 'package:okane/ui/navigation.dart';
|
||||
|
||||
part 'core.freezed.dart';
|
||||
|
||||
@freezed
|
||||
abstract class CoreState with _$CoreState {
|
||||
const factory CoreState({
|
||||
@Default(OkanePage.accounts) OkanePage activePage,
|
||||
int? activeAccountIndex,
|
||||
@Default(null) Transaction? activeTransaction,
|
||||
@Default([]) List<Account> accounts,
|
||||
@Default([]) List<RecurringTransaction> recurringTransactions,
|
||||
@Default([]) List<Transaction> transactions,
|
||||
@Default([]) List<TransactionTemplate> transactionTemplates,
|
||||
@Default([]) List<Beneficiary> beneficiaries,
|
||||
@Default([]) List<ExpenseCategory> expenseCategories,
|
||||
}) = _CoreState;
|
||||
}
|
||||
|
||||
class CoreCubit extends Cubit<CoreState> {
|
||||
CoreCubit() : super(CoreState());
|
||||
|
||||
StreamSubscription<void>? _recurringTransactionStreamSubscription;
|
||||
StreamSubscription<void>? _transactionTemplatesStreamSubcription;
|
||||
StreamSubscription<void>? _accountsStreamSubscription;
|
||||
StreamSubscription<void>? _transactionsStreamSubscription;
|
||||
StreamSubscription<void>? _beneficiariesStreamSubscription;
|
||||
StreamSubscription<void>? _expenseCategoryStreamSubscription;
|
||||
|
||||
void setupAccountStream() {
|
||||
_accountsStreamSubscription?.cancel();
|
||||
_accountsStreamSubscription = watchAccounts().listen((_) async {
|
||||
final resetStreams = state.activeAccountIndex == null;
|
||||
final accounts = await getAccounts();
|
||||
emit(
|
||||
state.copyWith(
|
||||
accounts: accounts,
|
||||
activeAccountIndex: state.activeAccountIndex ?? 0,
|
||||
),
|
||||
);
|
||||
|
||||
if (resetStreams) {
|
||||
setupStreams(accounts[0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void setupStreams(Account account) {
|
||||
setupAccountStream();
|
||||
_recurringTransactionStreamSubscription?.cancel();
|
||||
_recurringTransactionStreamSubscription = watchRecurringTransactions(
|
||||
activeAccount!,
|
||||
).listen((_) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
recurringTransactions: await getRecurringTransactions(activeAccount!),
|
||||
),
|
||||
);
|
||||
});
|
||||
_transactionTemplatesStreamSubcription?.cancel();
|
||||
_transactionTemplatesStreamSubcription = watchTransactionTemplates(
|
||||
activeAccount!,
|
||||
).listen((_) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
transactionTemplates: await getTransactionTemplates(activeAccount!),
|
||||
),
|
||||
);
|
||||
});
|
||||
_transactionsStreamSubscription?.cancel();
|
||||
_transactionsStreamSubscription = watchTransactions(activeAccount!).listen((
|
||||
_,
|
||||
) async {
|
||||
emit(state.copyWith(transactions: await getTransactions(activeAccount!)));
|
||||
});
|
||||
_beneficiariesStreamSubscription?.cancel();
|
||||
_beneficiariesStreamSubscription = watchBeneficiaries().listen((_) async {
|
||||
emit(state.copyWith(beneficiaries: await getBeneficiaries()));
|
||||
});
|
||||
_expenseCategoryStreamSubscription?.cancel();
|
||||
_expenseCategoryStreamSubscription = watchExpenseCategory().listen((
|
||||
_,
|
||||
) async {
|
||||
emit(state.copyWith(expenseCategories: await getExpenseCategories()));
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> init() async {
|
||||
final accounts = await getAccounts();
|
||||
final account = accounts.isEmpty ? null : accounts[0];
|
||||
emit(
|
||||
state.copyWith(
|
||||
accounts: accounts,
|
||||
activeAccountIndex: accounts.isEmpty ? null : 0,
|
||||
transactions: await getTransactions(account),
|
||||
beneficiaries: await getBeneficiaries(),
|
||||
transactionTemplates: await getTransactionTemplates(account),
|
||||
recurringTransactions: await getRecurringTransactions(account),
|
||||
expenseCategories: await getExpenseCategories(),
|
||||
),
|
||||
);
|
||||
|
||||
if (account != null) {
|
||||
setupStreams(account);
|
||||
} else {
|
||||
setupAccountStream();
|
||||
}
|
||||
print("Core init done");
|
||||
}
|
||||
|
||||
void setPage(OkanePage page) {
|
||||
emit(state.copyWith(activePage: page));
|
||||
}
|
||||
|
||||
Future<void> setActiveAccountIndex(int index) async {
|
||||
final account = state.accounts[index];
|
||||
emit(
|
||||
state.copyWith(
|
||||
activeAccountIndex: index,
|
||||
transactions: await getTransactions(account),
|
||||
beneficiaries: await getBeneficiaries(),
|
||||
transactionTemplates: await getTransactionTemplates(account),
|
||||
recurringTransactions: await getRecurringTransactions(account),
|
||||
),
|
||||
);
|
||||
setupStreams(account);
|
||||
}
|
||||
|
||||
void setActiveTransaction(Transaction? item) {
|
||||
emit(state.copyWith(activeTransaction: item));
|
||||
}
|
||||
|
||||
void setAccounts(List<Account> accounts) {
|
||||
emit(state.copyWith(accounts: accounts));
|
||||
}
|
||||
|
||||
Account? get activeAccount =>
|
||||
state.activeAccountIndex == null
|
||||
? null
|
||||
: state.accounts[state.activeAccountIndex!];
|
||||
}
|
||||
408
lib/ui/state/core.freezed.dart
Normal file
408
lib/ui/state/core.freezed.dart
Normal file
@@ -0,0 +1,408 @@
|
||||
// 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 'core.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',
|
||||
);
|
||||
|
||||
/// @nodoc
|
||||
mixin _$CoreState {
|
||||
OkanePage get activePage => throw _privateConstructorUsedError;
|
||||
int? get activeAccountIndex => throw _privateConstructorUsedError;
|
||||
Transaction? get activeTransaction => throw _privateConstructorUsedError;
|
||||
List<Account> get accounts => throw _privateConstructorUsedError;
|
||||
List<RecurringTransaction> get recurringTransactions =>
|
||||
throw _privateConstructorUsedError;
|
||||
List<Transaction> get transactions => throw _privateConstructorUsedError;
|
||||
List<TransactionTemplate> get transactionTemplates =>
|
||||
throw _privateConstructorUsedError;
|
||||
List<Beneficiary> get beneficiaries => throw _privateConstructorUsedError;
|
||||
List<ExpenseCategory> get expenseCategories =>
|
||||
throw _privateConstructorUsedError;
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
$CoreStateCopyWith<CoreState> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
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,
|
||||
});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
|
||||
implements $CoreStateCopyWith<$Res> {
|
||||
_$CoreStateCopyWithImpl(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? activePage = null,
|
||||
Object? activeAccountIndex = freezed,
|
||||
Object? activeTransaction = freezed,
|
||||
Object? accounts = null,
|
||||
Object? recurringTransactions = null,
|
||||
Object? transactions = null,
|
||||
Object? transactionTemplates = null,
|
||||
Object? beneficiaries = null,
|
||||
Object? expenseCategories = null,
|
||||
}) {
|
||||
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>,
|
||||
)
|
||||
as $Val,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
abstract class _$$CoreStateImplCopyWith<$Res>
|
||||
implements $CoreStateCopyWith<$Res> {
|
||||
factory _$$CoreStateImplCopyWith(
|
||||
_$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,
|
||||
});
|
||||
}
|
||||
|
||||
/// @nodoc
|
||||
class __$$CoreStateImplCopyWithImpl<$Res>
|
||||
extends _$CoreStateCopyWithImpl<$Res, _$CoreStateImpl>
|
||||
implements _$$CoreStateImplCopyWith<$Res> {
|
||||
__$$CoreStateImplCopyWithImpl(
|
||||
_$CoreStateImpl _value,
|
||||
$Res Function(_$CoreStateImpl) _then,
|
||||
) : super(_value, _then);
|
||||
|
||||
@pragma('vm:prefer-inline')
|
||||
@override
|
||||
$Res call({
|
||||
Object? activePage = null,
|
||||
Object? activeAccountIndex = freezed,
|
||||
Object? activeTransaction = freezed,
|
||||
Object? accounts = null,
|
||||
Object? recurringTransactions = null,
|
||||
Object? transactions = null,
|
||||
Object? transactionTemplates = null,
|
||||
Object? beneficiaries = null,
|
||||
Object? expenseCategories = null,
|
||||
}) {
|
||||
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>,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// @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 [],
|
||||
}) : _accounts = accounts,
|
||||
_recurringTransactions = recurringTransactions,
|
||||
_transactions = transactions,
|
||||
_transactionTemplates = transactionTemplates,
|
||||
_beneficiaries = beneficiaries,
|
||||
_expenseCategories = expenseCategories;
|
||||
|
||||
@override
|
||||
@JsonKey()
|
||||
final OkanePage activePage;
|
||||
@override
|
||||
final int? activeAccountIndex;
|
||||
@override
|
||||
@JsonKey()
|
||||
final Transaction? activeTransaction;
|
||||
final List<Account> _accounts;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<Account> get accounts {
|
||||
if (_accounts is EqualUnmodifiableListView) return _accounts;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_accounts);
|
||||
}
|
||||
|
||||
final List<RecurringTransaction> _recurringTransactions;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<RecurringTransaction> get recurringTransactions {
|
||||
if (_recurringTransactions is EqualUnmodifiableListView)
|
||||
return _recurringTransactions;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_recurringTransactions);
|
||||
}
|
||||
|
||||
final List<Transaction> _transactions;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<Transaction> get transactions {
|
||||
if (_transactions is EqualUnmodifiableListView) return _transactions;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_transactions);
|
||||
}
|
||||
|
||||
final List<TransactionTemplate> _transactionTemplates;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<TransactionTemplate> get transactionTemplates {
|
||||
if (_transactionTemplates is EqualUnmodifiableListView)
|
||||
return _transactionTemplates;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_transactionTemplates);
|
||||
}
|
||||
|
||||
final List<Beneficiary> _beneficiaries;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<Beneficiary> get beneficiaries {
|
||||
if (_beneficiaries is EqualUnmodifiableListView) return _beneficiaries;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_beneficiaries);
|
||||
}
|
||||
|
||||
final List<ExpenseCategory> _expenseCategories;
|
||||
@override
|
||||
@JsonKey()
|
||||
List<ExpenseCategory> get expenseCategories {
|
||||
if (_expenseCategories is EqualUnmodifiableListView)
|
||||
return _expenseCategories;
|
||||
// ignore: implicit_dynamic_type
|
||||
return EqualUnmodifiableListView(_expenseCategories);
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'CoreState(activePage: $activePage, activeAccountIndex: $activeAccountIndex, activeTransaction: $activeTransaction, accounts: $accounts, recurringTransactions: $recurringTransactions, transactions: $transactions, transactionTemplates: $transactionTemplates, beneficiaries: $beneficiaries, expenseCategories: $expenseCategories)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return identical(this, other) ||
|
||||
(other.runtimeType == runtimeType &&
|
||||
other is _$CoreStateImpl &&
|
||||
(identical(other.activePage, activePage) ||
|
||||
other.activePage == activePage) &&
|
||||
(identical(other.activeAccountIndex, activeAccountIndex) ||
|
||||
other.activeAccountIndex == activeAccountIndex) &&
|
||||
(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,
|
||||
));
|
||||
}
|
||||
|
||||
@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),
|
||||
);
|
||||
|
||||
@JsonKey(ignore: true)
|
||||
@override
|
||||
@pragma('vm:prefer-inline')
|
||||
_$$CoreStateImplCopyWith<_$CoreStateImpl> get copyWith =>
|
||||
__$$CoreStateImplCopyWithImpl<_$CoreStateImpl>(this, _$identity);
|
||||
}
|
||||
|
||||
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,
|
||||
}) = _$CoreStateImpl;
|
||||
|
||||
@override
|
||||
OkanePage get activePage;
|
||||
@override
|
||||
int? get activeAccountIndex;
|
||||
@override
|
||||
Transaction? get activeTransaction;
|
||||
@override
|
||||
List<Account> get accounts;
|
||||
@override
|
||||
List<RecurringTransaction> get recurringTransactions;
|
||||
@override
|
||||
List<Transaction> get transactions;
|
||||
@override
|
||||
List<TransactionTemplate> get transactionTemplates;
|
||||
@override
|
||||
List<Beneficiary> get beneficiaries;
|
||||
@override
|
||||
List<ExpenseCategory> get expenseCategories;
|
||||
@override
|
||||
@JsonKey(ignore: true)
|
||||
_$$CoreStateImplCopyWith<_$CoreStateImpl> get copyWith =>
|
||||
throw _privateConstructorUsedError;
|
||||
}
|
||||
Reference in New Issue
Block a user