Working auth and added shared notes
This commit is contained in:
+105
-98
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user