From 8fea8a95e471069fad569e1e507f3268dc872b64 Mon Sep 17 00:00:00 2001 From: Benoy Bose Date: Mon, 14 Oct 2024 18:29:27 +0530 Subject: [PATCH] Added user screen --- .env | 3 ++- analysis_options.yaml | 3 +++ lib/data_service.dart | 39 +++++++++++++++++++++++++++ lib/error_view.dart | 31 +++++++++++++++++++++ lib/launch_screen.dart | 4 +-- lib/routes.dart | 4 +-- lib/telemed_user.dart | 41 ++++++++++++++++++++++++++++ lib/user_check_screen.dart | 23 ---------------- lib/user_screen.dart | 55 ++++++++++++++++++++++++++++++++++++++ pubspec.lock | 24 +++++++++++++++++ pubspec.yaml | 1 + 11 files changed, 200 insertions(+), 28 deletions(-) create mode 100644 lib/data_service.dart create mode 100644 lib/error_view.dart create mode 100644 lib/telemed_user.dart delete mode 100644 lib/user_check_screen.dart create mode 100644 lib/user_screen.dart diff --git a/.env b/.env index 29b0dec..e1a1315 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -AUTH0_CUSTOM_SCHEME=com.cosqnet.telemednet \ No newline at end of file +CUSTOM_SCHEME=com.cosqnet.telemednet +PROFILE_COLLECTION_NAME=telemednetusers diff --git a/analysis_options.yaml b/analysis_options.yaml index 0d29021..ace0476 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -7,6 +7,9 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + errors: + avoid_print: ignore include: package:flutter_lints/flutter.yaml linter: diff --git a/lib/data_service.dart b/lib/data_service.dart new file mode 100644 index 0000000..c2bb877 --- /dev/null +++ b/lib/data_service.dart @@ -0,0 +1,39 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:telemednet/telemed_user.dart'; + +class DataService { + static final String profileCollectionName = + dotenv.env['PROFILE_COLLECTION_NAME']!; + static final db = FirebaseFirestore.instance; + + static User? getCurrentUser() { + return FirebaseAuth.instance.currentUser; + } + + static Future getProfile() async { + try { + final user = getCurrentUser(); + if (user == null) { + return null; + } + + final uid = user.uid; + final profiles = db.collection(profileCollectionName); + final profile = await profiles.doc(uid).get(); + if (!profile.exists) { + return null; + } + final profileData = profile.data(); + if (profileData == null) { + return null; + } + var telemedUser = TelemedUser.fromJson(profileData, uid); + return telemedUser; + } catch (e) { + print(e); + return null; + } + } +} diff --git a/lib/error_view.dart b/lib/error_view.dart new file mode 100644 index 0000000..7acb9f6 --- /dev/null +++ b/lib/error_view.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class ErrorView extends StatefulWidget { + final String message; + final String okMessage; + final Function() onPressed; + + const ErrorView( + {super.key, + required this.message, + required this.okMessage, + required this.onPressed}); + + @override + State createState() => _ErrorViewState(); +} + +class _ErrorViewState extends State { + @override + Widget build(BuildContext context) { + return Center( + child: Column( + children: [ + Text(widget.message), + ElevatedButton( + onPressed: widget.onPressed, child: Text(widget.okMessage)) + ], + ), + ); + } +} diff --git a/lib/launch_screen.dart b/lib/launch_screen.dart index a5bb872..9711eeb 100644 --- a/lib/launch_screen.dart +++ b/lib/launch_screen.dart @@ -1,7 +1,7 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_ui_auth/firebase_ui_auth.dart'; import 'package:flutter/material.dart'; -import 'package:telemednet/user_check_screen.dart'; +import 'package:telemednet/user_screen.dart'; class LaunchScreen extends StatefulWidget { const LaunchScreen({super.key}); @@ -30,7 +30,7 @@ class _LaunchScreenState extends State { child: CircularProgressIndicator(), ); } else if (snapshot.hasData) { - return const UserCheckScreen(); + return const UserScreen(); } else { return const SignInScreen(); } diff --git a/lib/routes.dart b/lib/routes.dart index 9de70aa..a7267ba 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -3,7 +3,7 @@ import 'package:firebase_ui_auth/firebase_ui_auth.dart'; import 'package:flutter/material.dart'; import 'package:telemednet/launch_screen.dart'; import 'package:telemednet/route_names.dart'; -import 'package:telemednet/user_check_screen.dart'; +import 'package:telemednet/user_screen.dart'; final Map routes = { '/': (context) => const LaunchScreen(), @@ -11,5 +11,5 @@ final Map routes = { providers: [EmailAuthProvider(), PhoneAuthProvider()], ), RouteNames.profile: (context) => const ProfileScreen(), - RouteNames.userCheck: (context) => const UserCheckScreen(), + RouteNames.userCheck: (context) => const UserScreen(), }; diff --git a/lib/telemed_user.dart b/lib/telemed_user.dart new file mode 100644 index 0000000..ed68a07 --- /dev/null +++ b/lib/telemed_user.dart @@ -0,0 +1,41 @@ +enum UserRole { doctor, patient } + +class TelemedUser { + String uid; + late String? name; + late String? email; + late String? photoURL; + late String? phoneNumber; + late String? alterPhoneNumber; + late UserRole? role; + TelemedUser( + {required this.uid, + this.name, + this.email, + this.photoURL, + this.phoneNumber, + this.alterPhoneNumber, + this.role}); + + TelemedUser.fromJson(Map json, this.uid) { + uid = json['uid']; + name = json['name']; + email = json['email']; + photoURL = json['photoURL']; + phoneNumber = json['phoneNumber']; + alterPhoneNumber = json['alterPhoneNumber']; + role = json['role']; + } + + Map toJson() { + final Map data = {}; + data['uid'] = uid; + data['name'] = name; + data['email'] = email; + data['photoURL'] = photoURL; + data['phoneNumber'] = phoneNumber; + data['alterPhoneNumber'] = alterPhoneNumber; + data['role'] = role; + return data; + } +} diff --git a/lib/user_check_screen.dart b/lib/user_check_screen.dart deleted file mode 100644 index cf4bf3b..0000000 --- a/lib/user_check_screen.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:flutter/material.dart'; - -class UserCheckScreen extends StatefulWidget { - const UserCheckScreen({super.key}); - - @override - State createState() => _UserCheckScreenState(); -} - -class _UserCheckScreenState extends State { - @override - Widget build(BuildContext context) { - return const Center( - widthFactor: double.infinity, - heightFactor: double.infinity, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [CircularProgressIndicator()], - ), - ); - } -} diff --git a/lib/user_screen.dart b/lib/user_screen.dart new file mode 100644 index 0000000..8176f18 --- /dev/null +++ b/lib/user_screen.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:telemednet/data_service.dart'; +import 'package:telemednet/error_view.dart'; +import 'package:telemednet/telemed_user.dart'; + +class UserScreen extends StatefulWidget { + const UserScreen({super.key}); + + @override + State createState() => _UserScreenState(); +} + +class _UserScreenState extends State { + late Future telemedUserFuture; + + @override + void initState() { + super.initState(); + telemedUserFuture = DataService.getProfile(); + } + + @override + Widget build(BuildContext context) { + return Center( + widthFactor: double.infinity, + heightFactor: double.infinity, + child: FutureBuilder( + future: telemedUserFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + if (snapshot.hasError) { + return ErrorView( + message: "Error while loading profile", + okMessage: "OK", + onPressed: () { + Navigator.of(context).pop(); + }, + ); + } + + if (snapshot.hasData) { + final user = snapshot.data!; + return Container(); + } else { + return Container(); + } + }), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index b0d163a..b1700f1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,6 +49,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.1" + cloud_firestore: + dependency: "direct main" + description: + name: cloud_firestore + sha256: bdc7607e9169ee3ce736bbbe6a81c2a6cb15c41379346b74f77f8e641211a17f + url: "https://pub.dev" + source: hosted + version: "5.4.4" + cloud_firestore_platform_interface: + dependency: transitive + description: + name: cloud_firestore_platform_interface + sha256: "884fa34c6be2d9c7c1f4af86f90f36c0a3b3afef585a12b350a5d15368e7ec7a" + url: "https://pub.dev" + source: hosted + version: "6.4.3" + cloud_firestore_web: + dependency: transitive + description: + name: cloud_firestore_web + sha256: "6e621bbcc999f32db0bc6bfcb18d9991617ec20f8d6bf51b6a1571f5c324fafd" + url: "https://pub.dev" + source: hosted + version: "4.3.2" collection: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0264ebf..b09fc8a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: firebase_core: ^3.6.0 firebase_auth: ^5.3.1 firebase_ui_auth: ^1.16.0 + cloud_firestore: ^5.4.4 dev_dependencies: flutter_test: