Skip to content

Commit

Permalink
optimize fetch user (#74)
Browse files Browse the repository at this point in the history
  • Loading branch information
Ida631 authored Dec 9, 2024
1 parent 54a1cae commit f5f8f10
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 37 deletions.
2 changes: 0 additions & 2 deletions lib/app/injection_container.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ void initInjection() {
() => SettingsViewModel(authUseCase: sl(), userUserCase: sl(), featureFlagProvider: sl()));
sl.registerFactory<QASettingsViewModel>(() =>
QASettingsViewModel(featureFlagProvider: sl(), apiEnvironment: sl(), authUseCase: sl()));
sl.registerFactory<UserProfileViewModel>(
() => UserProfileViewModel(authUseCase: sl(), userUseCase: sl()));
sl.registerFactory<ForgetPasswordViewModel>(() => ForgetPasswordViewModel(authUseCase: sl()));
sl.registerFactory<UpdatePasswordViewModel>(() => UpdatePasswordViewModel(authUseCase: sl()));

Expand Down
4 changes: 3 additions & 1 deletion lib/presentation/chat/views/chat_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ class _ChatScreenState extends State<ChatScreen>
String? result = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserProfilePage(),
builder: (context) => UserProfilePage(
user: viewModel.user,
),
),
);
if (result == "refresh") {
Expand Down
27 changes: 2 additions & 25 deletions lib/presentation/settings/viewModels/user_profile_view_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,20 @@ import 'package:domain/usecases/auth_usecase.dart';
class UserProfileViewModel extends ChangeNotifier {
final AuthUseCase authUseCase;
final UserUseCase userUseCase;
User? user;

bool isLoading = false;
User? user;
bool isSignedIn = false;
bool isLoggedIn = false;
String? _errorMessage;
String? get errorMessage => _errorMessage;

UserProfileViewModel({required this.authUseCase, required this.userUseCase}) {
fetchAuthSessionNew();
}

Future<void> fetchAuthSessionNew() async {
try {
isLoggedIn = await authUseCase.isLoggedIn();
if (isLoggedIn) {
await fetchUser(); // Fetch user only if logged in
} else {
user = null; // Clear user data when not logged in
}
} catch (e) {
if (kDebugMode) {
print(e);
}
isLoggedIn = false;
user = null; // Ensure user data is cleared on error
}
notifyListeners(); // Notify listeners about state changes
}
UserProfileViewModel({required this.authUseCase, required this.userUseCase, required this.user});

Future<void> fetchUser() async {
try {
user = await userUseCase.fetchMe();
notifyListeners();
} catch (e) {
isLoggedIn = false;
user = null; // Clear user data in case of an error
notifyListeners(); // Ensure the UI is updated
}
Expand All @@ -64,7 +42,6 @@ class UserProfileViewModel extends ChangeNotifier {
);

// Update state
isLoggedIn = false; // Explicitly set isLoggedIn to false
user = null; // Clear user data
notifyListeners();
} catch (e) {
Expand Down
2 changes: 1 addition & 1 deletion lib/presentation/settings/views/settings_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class _SettingsPageState extends State<SettingsPage> {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserProfilePage(),
builder: (context) => UserProfilePage(user: viewModel.user),
),
);
await _fetchAuthSession();
Expand Down
11 changes: 8 additions & 3 deletions lib/presentation/settings/views/user_profile_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:domain/entities/user.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
Expand All @@ -8,10 +9,14 @@ import '../../../app/injection_container.dart';
import '../viewModels/user_profile_view_model.dart';

class UserProfilePage extends StatelessWidget {
User? user;

UserProfilePage({Key? key, required this.user}) : super(key: key);

@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => sl<UserProfileViewModel>(),
create: (_) => UserProfileViewModel(authUseCase: sl(), userUseCase: sl(), user: user),
child: Scaffold(
appBar: AppBar(
title: const Text("User Profile"),
Expand Down Expand Up @@ -103,7 +108,7 @@ class UserProfilePage extends StatelessWidget {
),
);
if (result == 'refresh') {
await viewModel.fetchAuthSessionNew();
await viewModel.fetchUser();
}
},
style: ElevatedButton.styleFrom(
Expand All @@ -129,7 +134,7 @@ class UserProfilePage extends StatelessWidget {
),
);
if (result == 'refresh') {
await viewModel.fetchAuthSessionNew();
await viewModel.fetchUser();
}
},
style: ElevatedButton.styleFrom(
Expand Down
15 changes: 10 additions & 5 deletions test/user_profile_view_model_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,8 @@ void main() {
test('should set loading to true during the process and back to false after success', () async {
final MockAuthUseCase mockAuthUseCase = MockAuthUseCase();
final MockUserUseCase mockUserUseCase = MockUserUseCase();
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase);
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(
authUseCase: mockAuthUseCase, userUseCase: mockUserUseCase, user: User(email: "email"));
// Arrange
when(mockUserUseCase.deleteAccount()).thenAnswer((_) async {});

Expand All @@ -163,7 +164,8 @@ void main() {
test('should set loading to true during the process and back to false after failure', () async {
final MockAuthUseCase mockAuthUseCase = MockAuthUseCase();
final MockUserUseCase mockUserUseCase = MockUserUseCase();
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase);
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(
authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase, user: User(email: "email"));
// Arrange
when(mockUserUseCase.deleteAccount()).thenThrow(Exception('Deletion failed'));

Expand Down Expand Up @@ -194,7 +196,8 @@ void main() {
test('should handle exceptions and print an error message on failure', () async {
final MockAuthUseCase mockAuthUseCase = MockAuthUseCase();
final MockUserUseCase mockUserUseCase = MockUserUseCase();
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase);
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(
authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase, user: User(email: "email"));
// Arrange
when(mockUserUseCase.deleteAccount()).thenThrow(Exception('Deletion failed'));

Expand All @@ -213,7 +216,8 @@ void main() {
test('should update isLoading and notify listeners when set to true', () {
final MockAuthUseCase mockAuthUseCase = MockAuthUseCase();
final MockUserUseCase mockUserUseCase = MockUserUseCase();
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase);
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(
authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase, user: User(email: "email"));
// Act
userProfileViewModel.setLoading(true);

Expand All @@ -224,7 +228,8 @@ void main() {
test('should update isLoading and notify listeners when set to false', () {
final MockAuthUseCase mockAuthUseCase = MockAuthUseCase();
final MockUserUseCase mockUserUseCase = MockUserUseCase();
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase);
final UserProfileViewModel userProfileViewModel = UserProfileViewModel(
authUseCase: mockAuthUseCase,userUseCase: mockUserUseCase, user: User(email: "email"));
// Arrange
userProfileViewModel.setLoading(true); // Start with true

Expand Down

0 comments on commit f5f8f10

Please sign in to comment.