Skip to content

Commit 23917bf

Browse files
feat: implement login and verify otp page
1 parent a9a7eb8 commit 23917bf

File tree

16 files changed

+682
-197
lines changed

16 files changed

+682
-197
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,6 @@ app.*.map.json
4646
/android/app/release
4747

4848

49-
.fvm/flutter_sdk
49+
.fvm/flutter_sdk
50+
51+
*.env
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
enum ApiPath {
2+
generateOtp("/auth/generate-otp"),
3+
verifyOtp("/auth/verify-otp"),
4+
refreshToken("/auth/refresh-token"),
5+
googleAuth("/auth/google/login"),
6+
googleAuthCallback("/auth/google/callback"),
7+
;
8+
9+
final String value;
10+
const ApiPath(this.value);
11+
}

lib/core/router/router.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import "package:flutter/material.dart";
2+
import "package:pomodore/features/authentication/views/login_page.dart";
3+
import "package:pomodore/features/authentication/views/verify_otp_page.dart";
24
import "package:pomodore/features/habit_tracking/presentation/pages/add_habit_page.dart";
35
import "package:pomodore/features/notification_management/presentation/pages/notifications_page.dart";
46
import "package:pomodore/features/task_management/domain/entities/task_entity.dart";
@@ -13,6 +15,14 @@ import "../../features/configuration/presentation/pages/splash_page.dart";
1315
class AppRouter {
1416
static Route<dynamic> onGenerationRouter(RouteSettings routeSettings) {
1517
switch (routeSettings.name) {
18+
case VerifyOtpPage.routeName:
19+
return MaterialPageRoute(
20+
builder: (context) => VerifyOtpPage(
21+
email: routeSettings.arguments as String,
22+
),
23+
);
24+
case LoginPage.routeName:
25+
return MaterialPageRoute(builder: (context) => const LoginPage());
1626
case BasePage.routeName:
1727
return MaterialPageRoute(builder: (context) => BasePage());
1828
case NotificationsPage.routeName:
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import "package:dio/dio.dart";
2+
import "package:flutter_dotenv/flutter_dotenv.dart";
3+
import "package:flutter_riverpod/flutter_riverpod.dart";
4+
import "package:riverpod_annotation/riverpod_annotation.dart";
5+
6+
part "rest_api.g.dart";
7+
8+
@riverpod
9+
RestApi restApi(Ref ref) {
10+
final baseUrl = dotenv.env["API"] ?? "";
11+
return RestApi(baseUrl);
12+
}
13+
14+
class RestApi {
15+
final Dio _dio;
16+
17+
RestApi(String baseUrl) : _dio = Dio(BaseOptions(baseUrl: baseUrl));
18+
19+
Future<Response<T>> get<T>(String endpoint,
20+
{Map<String, dynamic>? queryParameters}) async {
21+
try {
22+
final response =
23+
await _dio.get<T>(endpoint, queryParameters: queryParameters);
24+
return response;
25+
} on DioException catch (e) {
26+
throw Exception("Failed to GET data: ${e.message}");
27+
}
28+
}
29+
30+
Future<Response<T>> post<T>(String endpoint,
31+
{dynamic data, Map<String, dynamic>? queryParameters}) async {
32+
try {
33+
final response = await _dio.post<T>(endpoint,
34+
data: data, queryParameters: queryParameters);
35+
return response;
36+
} on DioException catch (e) {
37+
throw Exception("Failed to POST data: ${e.message}");
38+
}
39+
}
40+
41+
Future<Response<T>> put<T>(String endpoint,
42+
{dynamic data, Map<String, dynamic>? queryParameters}) async {
43+
try {
44+
final response = await _dio.put<T>(endpoint,
45+
data: data, queryParameters: queryParameters);
46+
return response;
47+
} on DioException catch (e) {
48+
throw Exception("Failed to PUT data: ${e.message}");
49+
}
50+
}
51+
52+
Future<Response<T>> delete<T>(String endpoint,
53+
{dynamic data, Map<String, dynamic>? queryParameters}) async {
54+
try {
55+
final response = await _dio.delete<T>(endpoint,
56+
data: data, queryParameters: queryParameters);
57+
return response;
58+
} on DioException catch (e) {
59+
throw Exception("Failed to DELETE data: ${e.message}");
60+
}
61+
}
62+
}

lib/core/services/rest_api/rest_api.g.dart

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import "package:flutter_riverpod/flutter_riverpod.dart";
2+
import "package:pomodore/features/authentication/authentication_repository.dart";
3+
import "package:riverpod_annotation/riverpod_annotation.dart";
4+
5+
part "authentication_providers.g.dart";
6+
7+
@riverpod
8+
FutureOr<void> generateOTP(Ref ref, String email) {
9+
return ref.read(authenticationRepositoryProvider).generateOTP(email);
10+
}

lib/features/authentication/authentication_providers.g.dart

Lines changed: 160 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import "package:flutter_riverpod/flutter_riverpod.dart";
2+
import "package:pomodore/core/services/rest_api/rest_api.dart";
3+
import "package:riverpod_annotation/riverpod_annotation.dart";
4+
part "authentication_repository.g.dart";
5+
6+
@riverpod
7+
AuthenticationRepository authenticationRepository(Ref ref) {
8+
return AuthenticationRepository(
9+
restApi: ref.read(restApiProvider),
10+
);
11+
}
12+
13+
class AuthenticationRepository {
14+
final RestApi restApi;
15+
16+
AuthenticationRepository({required this.restApi});
17+
18+
Future<void> generateOTP(String email) async {}
19+
Future<void> verifyOTP(String email, String otp) async {}
20+
}

lib/features/authentication/authentication_repository.g.dart

Lines changed: 30 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)