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
+105 -98
View File
@@ -1,5 +1,6 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:helpers/helpers/print.dart';
import 'package:rluv/global/api.dart';
@@ -12,116 +13,120 @@ import '../models/shared_note.dart';
import '../models/transaction_model.dart';
import '../models/user.dart';
class Store {
static final Store _instance = Store._internal();
bool _initDone = false;
SharedPreferences? prefs;
StateProvider<SharedPreferences?> prefsProvider =
StateProvider<SharedPreferences?>((ref) => null);
factory Store() {
if (_instance._initDone) {
return _instance;
}
_instance._initDone = true;
SharedPreferences.getInstance().then(
(value) => _instance.prefs = value,
);
_instance.dashboardProvider =
StateNotifierProvider<DashBoardStateNotifier, Map<String, dynamic>?>(
(ref) {
final family = ref.watch(_instance.familyProvider).valueOrNull;
return DashBoardStateNotifier(family);
},
);
// _instance.dashboardProvider = FutureProvider<Map<String, dynamic>?>(
// (ref) async {
// final family = await ref.watch(_instance.familyProvider.future);
// return Api().get("dashboard/${family.id}");
// },
// );
_instance.budgetProvider = Provider<Budget?>(
(ref) {
final dash = ref.watch(_instance.dashboardProvider);
if (dash == null) return null;
final budgetData = dash['budget'] as Map<String, dynamic>?;
if (budgetData == null) return null;
return Budget.fromJson(budgetData);
},
);
_instance.budgetCategoriesProvider = Provider<List<BudgetCategory>>((ref) {
final dash = ref.watch(_instance.dashboardProvider);
if (dash == null) return [];
final categoriesData = dash['budget_categories'] as List<dynamic>;
final categories = categoriesData
.map(
(e) => BudgetCategory.fromJson(e as Map<String, dynamic>),
)
.toList();
if (_instance.prefs != null) {
final budgetJson = jsonEncode({'budget_categories': categoriesData});
printBlue('updated prefs stored categories');
_instance.prefs!.setString('budget_categories', budgetJson);
}
return categories;
});
_instance.transactionsProvider = Provider<List<Transaction>>((ref) {
final dash = ref.watch(_instance.dashboardProvider);
if (dash == null) return [];
final transactions = dash['transactions'] as List<dynamic>;
return transactions
.map(
(e) => Transaction.fromJson(e as Map<String, dynamic>),
)
.toList();
});
return _instance;
}
// final StateProvider<Token?> tokenProvider = StateProvider<Token?>((ref) {
// // final tokenStr = prefs.getString('jwt');
// // if (tokenStr != null) {
// // return Token.fromJson(jsonDecode(tokenStr));
// // }
// return null;
// });
Store._internal();
final Provider<User?> userProvider = Provider<User?>(
(ref) {
final dash = ref.watch(dashboardProvider);
if (dash == null) return null;
final userData = dash['user'] as Map<String, dynamic>;
return User.fromJson(userData);
},
);
final FutureProvider<User> userProvider = FutureProvider<User>(
(ref) {
return User(
id: 0,
budgetId: 1,
createdAt: DateTime.now(),
familyId: 1,
lastActivityAt: DateTime.now(),
name: 'TEMP',
updatedAt: DateTime.now(),
);
},
);
final Provider<FamilyModel?> familyProvider = Provider<FamilyModel?>(
(ref) {
final dash = ref.watch(dashboardProvider);
if (dash == null) return null;
final familyData = dash['family'] as Map<String, dynamic>;
return FamilyModel.fromJson(familyData);
},
);
final FutureProvider<FamilyModel> familyProvider =
FutureProvider<FamilyModel>((ref) => FamilyModel(
id: 1,
budgetId: 1,
createdAt: DateTime.now(),
updatedAt: DateTime.now()));
final Provider<List<BudgetCategory>> budgetCategoriesProvider =
Provider<List<BudgetCategory>>((ref) {
final dash = ref.watch(dashboardProvider);
if (dash == null) return [];
final categoriesData = dash['budget_categories'] as List<dynamic>;
final categories = categoriesData
.map(
(e) => BudgetCategory.fromJson(e as Map<String, dynamic>),
)
.toList();
late final Provider<List<BudgetCategory>> budgetCategoriesProvider;
late final Provider<Budget?> budgetProvider;
late final Provider<List<Transaction>> transactionsProvider;
late final Provider<List<SharedNote>> sharedNotesProvider;
// late final FutureProvider<Map<String, dynamic>?> dashboardProvider;
final prefs = ref.read(prefsProvider);
final budgetJson = jsonEncode({'budget_categories': categoriesData});
printBlue('updated prefs stored categories');
prefs?.setString('budget_categories', budgetJson);
late final StateNotifierProvider<DashBoardStateNotifier,
Map<String, dynamic>?> dashboardProvider;
void fetchDashboard() {}
}
return categories;
});
final Provider<Budget?> budgetProvider = Provider<Budget?>(
(ref) {
final dash = ref.watch(dashboardProvider);
if (dash == null) return null;
final budgetData = dash['budget'] as Map<String, dynamic>?;
if (budgetData == null) return null;
return Budget.fromJson(budgetData);
},
);
final Provider<List<Transaction>> transactionsProvider =
Provider<List<Transaction>>((ref) {
final dash = ref.watch(dashboardProvider);
if (dash == null) return [];
final transactions = dash['transactions'] as List<dynamic>;
return transactions
.map(
(e) => Transaction.fromJson(e as Map<String, dynamic>),
)
.toList();
});
final Provider<List<SharedNote>> sharedNotesProvider =
Provider<List<SharedNote>>(
(ref) {
final dash = ref.watch(dashboardProvider);
if (dash == null) return [];
final sharedNotes = dash['shared_notes'] as List<dynamic>;
return sharedNotes
.map(
(e) => SharedNote.fromJson(e as Map<String, dynamic>),
)
.toList();
},
);
final dashboardProvider =
StateNotifierProvider<DashBoardStateNotifier, Map<String, dynamic>?>(
(ref) {
return DashBoardStateNotifier(ref);
},
);
final loadingStateProvider = StateProvider<bool>(
(ref) => false,
);
class DashBoardStateNotifier extends StateNotifier<Map<String, dynamic>?> {
DashBoardStateNotifier(FamilyModel? family) : super(null) {
fetchDashboard(family);
}
DashBoardStateNotifier(this.ref) : super(null);
Future fetchDashboard(FamilyModel? family) async {
if (family == null) {
printPink('Unable to get dashboard');
StateNotifierProviderRef ref;
Future<void> fetchDashboard() async {
WidgetsBinding.instance.addPostFrameCallback(
(_) => ref.read(loadingStateProvider.notifier).state = true,
);
final token = ref.read(tokenProvider);
if (token?.familyId == null) {
printPink('No token, cannot fetch dashboard');
return;
}
printAmber('Fetching dashboard');
state = await Api().get("dashboard/${family.id}");
state = await ref.read(apiProvider.notifier).get("dashboard");
WidgetsBinding.instance.addPostFrameCallback(
(_) => ref.read(loadingStateProvider.notifier).state = false,
);
}
void update(Map<String, dynamic> data) {
@@ -136,6 +141,7 @@ class DashBoardStateNotifier extends StateNotifier<Map<String, dynamic>?> {
switch (key) {
case 'transactions':
case 'budget_categories':
case 'shared_notes':
final subStateList = state![key] as List<dynamic>;
final subStateListObj = subStateList
.map(
@@ -171,6 +177,7 @@ class DashBoardStateNotifier extends StateNotifier<Map<String, dynamic>?> {
switch (key) {
case 'transactions':
case 'budget_categories':
case 'shared_noted':
final subStateList = state![key] as List<dynamic>;
final newState = state;
subStateList.add(data.values.first);