Skip to content

Commit 1caba7b

Browse files
committed
feat: Initialize to build home and profile page.
1 parent 74b0e03 commit 1caba7b

19 files changed

Lines changed: 449 additions & 63 deletions

File tree

.vscode/settings.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
"**/windows": true,
3535
},
3636
"material-icon-theme.folders.associations": {
37-
"dashboard": "home",
3837
"expense_tracker": "database",
3938
"network": "public",
4039
"nfc_scanner": "core",

lib/constants/routes.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Routes {
2222
// Authentication
2323
static const String forgotPassword = '/forgot-password';
2424
static const String login = '/login';
25+
static const String logout = '/logout';
2526
static const String otp = '/otp';
2627
static const String register = '/register';
2728
static const String resetPassword = '/reset-password';

lib/features/auth/forgot_password/services/forgot_password_service.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:monet/utils/log.dart';
88
/// password reset request to the backend API and handling responses.
99
class ForgotPasswordService {
1010
late final Dio _dio = Dio(BaseOptions(
11-
baseUrl: const String.fromEnvironment('API_BASE_URL', defaultValue: 'http://localhost:8000/'),
11+
baseUrl: const String.fromEnvironment('API_BASE_URL'),
1212
connectTimeout: const Duration(seconds: 10),
1313
receiveTimeout: const Duration(seconds: 10),
1414
));
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/// Represents the payload sent to the backend for a login request.
2+
class LoginRequest {
3+
final String username;
4+
final String password;
5+
6+
LoginRequest({required this.username, required this.password});
7+
8+
Map<String, dynamic> toJson() {
9+
return {'username': username, 'password': password};
10+
}
11+
}

lib/features/auth/login/services/login_service.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@ import 'package:flutter/material.dart';
33
import 'package:go_router/go_router.dart';
44
import 'package:monet/constants/routes.dart';
55
import 'package:monet/core/security/secure_storage.dart';
6+
import 'package:monet/features/auth/login/models/login_request.dart';
67
import 'package:monet/features/auth/login/models/login_response.dart';
78
import 'package:monet/utils/log.dart';
89

910
/// A service class that handles user login functionality.
1011
class LoginService {
1112
// Dio instance for making HTTP requests.
1213
late final Dio _dio = Dio(BaseOptions(
13-
baseUrl: const String.fromEnvironment('API_BASE_URL', defaultValue: 'http://localhost:8000/'),
14+
baseUrl: const String.fromEnvironment('API_BASE_URL'),
1415
connectTimeout: const Duration(seconds: 10),
1516
receiveTimeout: const Duration(seconds: 10),
1617
));
1718

1819
final SecureStorage _storage = SecureStorage();
1920

20-
/// Login function that takes a username and password, and returns a Future
21-
/// that resolves to a String (e.g., a token) or null if login fails.
2221
Future<void> handleLogin({ required BuildContext context, required String email, required String password }) async {
2322
try {
24-
final response = await _dio.post(Routes.login, data: {'username': email, 'password': password});
23+
final payload = LoginRequest(username: email, password: password);
24+
final response = await _dio.post(Routes.login, data: payload.toJson());
2525

2626
if (response.statusCode != 200) {
2727
throw Exception('Failed to log in. Please check your credentials.');
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/// Represents a request for user registration.
2+
class RegisterRequest {
3+
final String fullName;
4+
final String email;
5+
final String password;
6+
final String country;
7+
final String defaultCurrency;
8+
9+
RegisterRequest({
10+
required this.fullName,
11+
required this.email,
12+
required this.password,
13+
required this.country,
14+
required this.defaultCurrency,
15+
});
16+
17+
Map<String, dynamic> toJson() {
18+
return {
19+
'full_name': fullName,
20+
'email': email,
21+
'password': password,
22+
'country': country,
23+
'default_currency': defaultCurrency,
24+
};
25+
}
26+
}

lib/features/auth/register/services/register_service.dart

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,22 @@ import 'package:flutter/material.dart';
33
import 'package:go_router/go_router.dart';
44
import 'package:monet/constants/routes.dart';
55
import 'package:monet/core/security/secure_storage.dart';
6+
import 'package:monet/features/auth/register/models/register_request.dart';
67
import 'package:monet/utils/log.dart';
78

89
/// A service class that handles user registration functionality.
910
class RegisterService {
1011
late final Dio _dio = Dio(BaseOptions(
11-
baseUrl: const String.fromEnvironment('API_BASE_URL', defaultValue: 'http://localhost:8000/'),
12+
baseUrl: const String.fromEnvironment('API_BASE_URL'),
1213
connectTimeout: const Duration(seconds: 10),
1314
receiveTimeout: const Duration(seconds: 10),
1415
));
1516

1617
final SecureStorage _storage = SecureStorage();
1718

18-
Future<void> handleRegister({
19-
required BuildContext context,
20-
required String fullName,
21-
required String email,
22-
required String password,
23-
required String country,
24-
required String defaultCurrency,
25-
}) async {
19+
Future<void> handleRegister({ required BuildContext context, required RegisterRequest request }) async {
2620
try {
27-
final response = await _dio.post(
28-
Routes.register,
29-
data: {
30-
'full_name': fullName,
31-
'email': email,
32-
'password': password,
33-
'country': country,
34-
'default_currency': defaultCurrency,
35-
},
36-
);
21+
final response = await _dio.post(Routes.register, data: request.toJson());
3722

3823
if (response.statusCode != 200 && response.statusCode != 201) {
3924
throw Exception('Registration completed, but received an unexpected response.');
@@ -55,7 +40,7 @@ class RegisterService {
5540
),
5641
);
5742

58-
context.go(Routes.otp, extra: email);
43+
context.go(Routes.otp, extra: request.email);
5944
} on DioException catch (e) {
6045
String errorMessage = 'An unexpected error occurred during registration.';
6146
final statusCode = e.response?.statusCode;

lib/features/auth/register/widgets/register_form.dart

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:dropdown_search/dropdown_search.dart';
22
import 'package:flutter/material.dart';
33
import 'package:google_fonts/google_fonts.dart';
44
import 'package:monet/core/services/region.dart';
5+
import 'package:monet/features/auth/register/models/register_request.dart';
56
import 'package:monet/features/auth/register/services/register_service.dart';
67
import 'package:monet/helpers/input_style.dart';
78

@@ -36,15 +37,15 @@ class _RegisterFormState extends State<RegisterForm> {
3637

3738
setState(() => _isLoading = true);
3839

39-
await _registerService.handleRegister(
40-
context: context,
41-
fullName: _fullNameController.text,
42-
email: _emailController.text,
43-
password: _passwordController.text,
44-
country: _countryController.text,
40+
final payload = RegisterRequest(
41+
fullName: _fullNameController.text,
42+
email: _emailController.text,
43+
password: _passwordController.text,
44+
country: _countryController.text,
4545
defaultCurrency: _defaultCurrencyController.text,
4646
);
4747

48+
await _registerService.handleRegister(context: context, request: payload);
4849
if (mounted) setState(() => _isLoading = false);
4950
}
5051

lib/features/auth/reset_password/services/reset_password_service.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:monet/utils/log.dart';
66

77
class ResetPasswordService {
88
late final Dio _dio = Dio(BaseOptions(
9-
baseUrl: const String.fromEnvironment('API_BASE_URL', defaultValue: 'http://localhost:8000/'),
9+
baseUrl: const String.fromEnvironment('API_BASE_URL'),
1010
connectTimeout: const Duration(seconds: 10),
1111
receiveTimeout: const Duration(seconds: 10),
1212
));

lib/features/dashboard/dashboard_page.dart

Lines changed: 0 additions & 24 deletions
This file was deleted.

0 commit comments

Comments
 (0)