Added user screen

This commit is contained in:
Benoy Bose 2024-10-14 18:29:27 +05:30
parent a1e07ef7e9
commit 8fea8a95e4
11 changed files with 200 additions and 28 deletions

3
.env
View File

@ -1 +1,2 @@
AUTH0_CUSTOM_SCHEME=com.cosqnet.telemednet
CUSTOM_SCHEME=com.cosqnet.telemednet
PROFILE_COLLECTION_NAME=telemednetusers

View File

@ -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:

39
lib/data_service.dart Normal file
View File

@ -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<TelemedUser?> 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;
}
}
}

31
lib/error_view.dart Normal file
View File

@ -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<ErrorView> createState() => _ErrorViewState();
}
class _ErrorViewState extends State<ErrorView> {
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: [
Text(widget.message),
ElevatedButton(
onPressed: widget.onPressed, child: Text(widget.okMessage))
],
),
);
}
}

View File

@ -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<LaunchScreen> {
child: CircularProgressIndicator(),
);
} else if (snapshot.hasData) {
return const UserCheckScreen();
return const UserScreen();
} else {
return const SignInScreen();
}

View File

@ -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<String, Widget Function(BuildContext)> routes = {
'/': (context) => const LaunchScreen(),
@ -11,5 +11,5 @@ final Map<String, Widget Function(BuildContext)> routes = {
providers: [EmailAuthProvider(), PhoneAuthProvider()],
),
RouteNames.profile: (context) => const ProfileScreen(),
RouteNames.userCheck: (context) => const UserCheckScreen(),
RouteNames.userCheck: (context) => const UserScreen(),
};

41
lib/telemed_user.dart Normal file
View File

@ -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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['uid'] = uid;
data['name'] = name;
data['email'] = email;
data['photoURL'] = photoURL;
data['phoneNumber'] = phoneNumber;
data['alterPhoneNumber'] = alterPhoneNumber;
data['role'] = role;
return data;
}
}

View File

@ -1,23 +0,0 @@
import 'package:flutter/material.dart';
class UserCheckScreen extends StatefulWidget {
const UserCheckScreen({super.key});
@override
State<UserCheckScreen> createState() => _UserCheckScreenState();
}
class _UserCheckScreenState extends State<UserCheckScreen> {
@override
Widget build(BuildContext context) {
return const Center(
widthFactor: double.infinity,
heightFactor: double.infinity,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [CircularProgressIndicator()],
),
);
}
}

55
lib/user_screen.dart Normal file
View File

@ -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<UserScreen> createState() => _UserScreenState();
}
class _UserScreenState extends State<UserScreen> {
late Future<TelemedUser?> 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();
}
}),
);
}
}

View File

@ -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:

View File

@ -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: