Working auth and added shared notes

This commit is contained in:
Nathan Anderson
2023-07-27 01:40:26 -06:00
parent 18aad2b3d5
commit 83393807c7
68 changed files with 2138 additions and 661 deletions
@@ -8,6 +8,8 @@ import 'package:rluv/models/budget_category_model.dart';
import '../../../global/api.dart';
import '../../../global/store.dart';
import '../../../global/utils.dart';
import '../../../global/widgets/ui_button.dart';
class AddBudgetCategoryDialog extends ConsumerStatefulWidget {
const AddBudgetCategoryDialog({super.key});
@@ -19,8 +21,6 @@ class AddBudgetCategoryDialog extends ConsumerStatefulWidget {
class _AddBudgetCategoryDialogState
extends ConsumerState<AddBudgetCategoryDialog> {
bool loading = false;
bool complete = false;
late final Budget? budget;
final categoryNameController = TextEditingController();
final amountController = TextEditingController();
@@ -34,7 +34,7 @@ class _AddBudgetCategoryDialogState
final formKey = GlobalKey<FormState>();
@override
void initState() {
budget = ref.read(Store().budgetProvider);
budget = ref.read(budgetProvider);
WidgetsBinding.instance.addPostFrameCallback((_) {
categoryFocusNode.requestFocus();
});
@@ -46,20 +46,10 @@ class _AddBudgetCategoryDialogState
if (budget == null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Could not get your budget'),
),
);
});
return Container();
} else if (complete) {
WidgetsBinding.instance.addPostFrameCallback((_) {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Budget Category Added!'),
),
showSnack(
ref: ref,
text: 'Could not get your budget',
type: SnackType.error,
);
});
return Container();
@@ -215,10 +205,20 @@ class _AddBudgetCategoryDialogState
),
),
),
ElevatedButton(
onPressed: () => submitCategory(colors[selectedColorIndex]),
child: const Text('SAVE'),
)
UiButton(
showLoading: true,
color: Styles.lavender,
text: 'SAVE',
onPressed: () =>
submitCategory(colors[selectedColorIndex]).then((_) {
Navigator.pop(context);
showSnack(
ref: ref,
text: 'Budget Category Added!',
type: SnackType.success,
);
}),
),
],
),
),
@@ -227,7 +227,6 @@ class _AddBudgetCategoryDialogState
icon: const Icon(Icons.close),
onPressed: () => Navigator.pop(context),
),
if (loading) const Center(child: CircularProgressIndicator()),
],
),
);
@@ -238,9 +237,6 @@ class _AddBudgetCategoryDialogState
printPink('Failed validation');
return;
}
setState(
() => loading = true,
);
final newBudget = BudgetCategory(
id: null,
amount: double.parse(amountController.text),
@@ -249,17 +245,16 @@ class _AddBudgetCategoryDialogState
name: categoryNameController.text,
);
final budgetData =
await Api().post(path: 'budget_category', data: newBudget.toJson());
final budgetData = await ref
.read(apiProvider.notifier)
.post(path: 'budget_category', data: newBudget.toJson());
final success = budgetData != null ? budgetData['success'] as bool : false;
if (success) {
ref
.read(Store().dashboardProvider.notifier)
.read(dashboardProvider.notifier)
.add({'budget_categories': budgetData});
} else {
showSnack(ref: ref, text: 'Could not add budget', type: SnackType.error);
}
complete = true;
setState(() {
loading = false;
});
}
}
@@ -2,10 +2,12 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:helpers/helpers/misc_build/build_media.dart';
import 'package:rluv/global/utils.dart';
import '../../../global/api.dart';
import '../../../global/store.dart';
import '../../../global/styles.dart';
import '../../../global/widgets/ui_button.dart';
import '../../../models/budget_category_model.dart';
import '../../../models/transaction_model.dart';
@@ -20,8 +22,7 @@ class AddTransactionDialog extends ConsumerStatefulWidget {
}
class _AddTransactionDialogState extends ConsumerState<AddTransactionDialog> {
bool loading = false;
bool complete = false;
late DateTime selectedDate;
late final TextEditingController amountController;
late final TextEditingController memoController;
@@ -38,11 +39,13 @@ class _AddTransactionDialogState extends ConsumerState<AddTransactionDialog> {
TextEditingController(text: widget.transaction!.amount.toString());
memoController = TextEditingController(text: widget.transaction!.memo);
transactionType = widget.transaction!.type;
selectedDate = widget.transaction!.date;
} else {
amountController = TextEditingController();
memoController = TextEditingController();
selectedDate = DateTime.now();
}
final categories = ref.read(Store().budgetCategoriesProvider);
final categories = ref.read(budgetCategoriesProvider);
if (categories.isNotEmpty) {
selectedBudgetCategory = categories.first;
}
@@ -51,21 +54,8 @@ class _AddTransactionDialogState extends ConsumerState<AddTransactionDialog> {
@override
Widget build(BuildContext context) {
if (complete) {
WidgetsBinding.instance.addPostFrameCallback((_) {
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(widget.transaction != null
? 'Transaction updated!'
: 'Transaction added!'),
),
);
});
return Container();
}
final List<BudgetCategory> budgetCategories =
ref.read(Store().budgetCategoriesProvider);
ref.read(budgetCategoriesProvider);
return SizedBox(
width: BuildMedia(context).width * Styles.dialogScreenWidthFactor,
child: budgetCategories.isEmpty
@@ -260,9 +250,20 @@ class _AddTransactionDialogState extends ConsumerState<AddTransactionDialog> {
onFieldSubmitted: (_) {},
),
),
ElevatedButton(
onPressed: loading ? null : () => submitTransaction(),
child: const Text('Add'),
UiButton(
showLoading: true,
text: 'ADD',
color: Styles.lavender,
onPressed: () => submitTransaction().then((_) {
Navigator.pop(context);
showSnack(
ref: ref,
text: widget.transaction != null
? 'Transaction updated!'
: 'Transaction added!',
type: SnackType.success,
);
}),
),
],
),
@@ -270,12 +271,9 @@ class _AddTransactionDialogState extends ConsumerState<AddTransactionDialog> {
}
Future submitTransaction() async {
setState(() {
loading = true;
});
Map<String, dynamic>? data;
if (widget.transaction != null) {
data = await Api().put(
data = await ref.read(apiProvider.notifier).put(
path: 'transactions',
data: Transaction.copyWith(widget.transaction!, {
'memo': memoController.text.isNotEmpty ? memoController.text : null,
@@ -285,7 +283,7 @@ class _AddTransactionDialogState extends ConsumerState<AddTransactionDialog> {
: selectedBudgetCategory.id,
}).toJson());
} else {
data = await Api().post(
data = await ref.read(apiProvider.notifier).post(
path: 'transactions',
data: Transaction(
amount: double.parse(amountController.text),
@@ -304,26 +302,17 @@ class _AddTransactionDialogState extends ConsumerState<AddTransactionDialog> {
final success = data != null ? data['success'] as bool : false;
if (success) {
if (widget.transaction != null) {
ref
.read(Store().dashboardProvider.notifier)
.update({'transactions': data});
ref.read(dashboardProvider.notifier).update({'transactions': data});
} else {
ref
.read(Store().dashboardProvider.notifier)
.add({'transactions': data});
ref.read(dashboardProvider.notifier).add({'transactions': data});
}
complete = true;
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(widget.transaction != null
showSnack(
ref: ref,
text: widget.transaction != null
? 'Failed to edit transaction'
: 'Failed to add transaction'),
),
);
: 'Failed to add transaction',
type: SnackType.error);
}
setState(() {
loading = false;
});
}
}
@@ -14,7 +14,7 @@ class BudgetCategoryBar extends StatefulWidget {
required this.currentAmount,
required this.index,
this.height = 32,
this.innerPadding = 1.5});
this.innerPadding = 2.5});
final int index;
final double currentAmount;
@@ -27,6 +27,7 @@ class BudgetCategoryBar extends StatefulWidget {
class _BudgetCategoryBarState extends State<BudgetCategoryBar> {
double percentSpent = 0.0;
@override
void initState() {
Future.delayed(Duration(milliseconds: min(1600, 200 * widget.index)), () {
@@ -76,7 +77,7 @@ class _BudgetCategoryBarState extends State<BudgetCategoryBar> {
height: widget.height,
decoration: BoxDecoration(
color: Colors.black,
borderRadius: BorderRadius.circular(14.0),
borderRadius: BorderRadius.circular(13.0),
),
),
Padding(
@@ -35,8 +35,8 @@ class _TransactionListItemState extends ConsumerState<TransactionListItem> {
@override
Widget build(BuildContext context) {
final transaction = ref.watch(Store().transactionsProvider)[widget.index];
final budgetCategories = ref.read(Store().budgetCategoriesProvider);
final transaction = ref.watch(transactionsProvider)[widget.index];
final budgetCategories = ref.read(budgetCategoriesProvider);
if (transaction.type == TransactionType.expense) {
budgetCategory = budgetCategories.singleWhere(
(category) => category.id == transaction.budgetCategoryId,