From c4117427a6fa7599df5f0d6c6617eb730024931c Mon Sep 17 00:00:00 2001 From: David <1920881@users.noreply.github.com> Date: Fri, 9 Jun 2023 20:38:31 +0200 Subject: [PATCH] Add upload_job.dart job functions Add Delete Job Funtion Changed avatar > userImage --- lib/Persistent/persistent.dart | 13 + lib/Search/profile_company.dart | 7 +- lib/Search/search_job.dart | 35 ++ lib/Widgets/bottom_nav_bar.dart | 6 +- lib/Widgets/job_widget.dart | 151 ++++++++ lib/forget_passwort/forget_pass_screen.dart | 4 +- lib/jobs/jobs_screen.dart | 221 ++++++++--- lib/jobs/upload_job.dart | 391 ++++++++++++++++++-- lib/login_page/login_screen.dart | 2 +- lib/services/global_variables.dart | 5 +- lib/signup_page/signup_screen.dart | 2 +- 11 files changed, 756 insertions(+), 81 deletions(-) create mode 100644 lib/Persistent/persistent.dart create mode 100644 lib/Search/search_job.dart create mode 100644 lib/Widgets/job_widget.dart diff --git a/lib/Persistent/persistent.dart b/lib/Persistent/persistent.dart new file mode 100644 index 0000000..e597a33 --- /dev/null +++ b/lib/Persistent/persistent.dart @@ -0,0 +1,13 @@ +class Persistent{ + static List jobCategoryList = [ + "Architecture and Construction", + "Education and Training", + "Development - Programming", + "Business", + "Information Technology", + "Human Resources", + "Marketing", + "Design", + "Accounting" + ]; +} \ No newline at end of file diff --git a/lib/Search/profile_company.dart b/lib/Search/profile_company.dart index 336e174..dfef748 100644 --- a/lib/Search/profile_company.dart +++ b/lib/Search/profile_company.dart @@ -12,19 +12,18 @@ class _ProfileScreenState extends State { @override Widget build(BuildContext context) { return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: LinearGradient( - colors: [Colors.deepOrange.shade300, Colors.blueAccent], + colors: [Colors.cyan, Colors.white60], begin: Alignment.centerLeft, end: Alignment.centerRight, - stops: const [0.2, 0.9], + stops: [0.2, 0.9], ) ), child: Scaffold( bottomNavigationBar: BottomNavigationBarForApp(indexNum: 3,), backgroundColor: Colors.transparent, appBar: AppBar( - backgroundColor: Colors.cyan, title: const Text('Profile Screen'), actions: [ IconButton( diff --git a/lib/Search/search_job.dart b/lib/Search/search_job.dart new file mode 100644 index 0000000..38ff14b --- /dev/null +++ b/lib/Search/search_job.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +class SearchScreen extends StatefulWidget { + @override + State createState() => _SearchScreenState(); +} + +class _SearchScreenState extends State { + @override + Widget build(BuildContext context) { + return Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [Colors.cyan, Colors.white60], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + stops: [0.2, 0.9])), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + title: const Text("Search Job Screen"), + centerTitle: true, + flexibleSpace: Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [Colors.cyan, Colors.black], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + stops: [0.2, 0.9])), + ), + ), + ), + ); + } +} diff --git a/lib/Widgets/bottom_nav_bar.dart b/lib/Widgets/bottom_nav_bar.dart index e66ccb3..5813f72 100644 --- a/lib/Widgets/bottom_nav_bar.dart +++ b/lib/Widgets/bottom_nav_bar.dart @@ -70,9 +70,9 @@ class BottomNavigationBarForApp extends StatelessWidget { @override Widget build(BuildContext context) { return CurvedNavigationBar( - color: Colors.deepOrange.shade400, - backgroundColor: Colors.blueAccent, - buttonBackgroundColor: Colors.deepOrange.shade300, + color: Colors.cyan, + backgroundColor: Colors.black, + buttonBackgroundColor: Colors.white, height: 50, index: indexNum, items: const [ diff --git a/lib/Widgets/job_widget.dart b/lib/Widgets/job_widget.dart new file mode 100644 index 0000000..30d28a3 --- /dev/null +++ b/lib/Widgets/job_widget.dart @@ -0,0 +1,151 @@ +// ignore_for_file: use_build_context_synchronously + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:cpd_ss23/services/global_methods.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; + +class JobWidget extends StatefulWidget { + final String jobTitle; + final String jobDescription; + final String jobId; + final String uploadedBy; + final String userImage; + final String name; + final bool recruitment; + final String email; + final String location; + + const JobWidget({ + required this.jobTitle, + required this.jobDescription, + required this.jobId, + required this.uploadedBy, + required this.userImage, + required this.name, + required this.recruitment, + required this.email, + required this.location, + }); + + @override + State createState() => _JobWidgetState(); +} + +class _JobWidgetState extends State { + final FirebaseAuth _auth = FirebaseAuth.instance; + + _deleteDialog() { + User? user = _auth.currentUser; + final _uid = user!.uid; + showDialog( + context: context, + builder: (ctx) { + return AlertDialog( + actions: [ + TextButton( + onPressed: () async{ + try{ + if(widget.uploadedBy == _uid){ + await FirebaseFirestore.instance.collection("jobs").doc(widget.jobId).delete(); + await Fluttertoast.showToast(msg: "Job has been deleted", toastLength: Toast.LENGTH_LONG, backgroundColor: Colors.grey, fontSize: 18.0); + Navigator.canPop(context) ? Navigator.pop(context) : null; + } else { + GlobalMethod.showErrorDialog(error: "You cannot perform this action!", ctx: ctx); + } + } catch (error){ + //TODO Error kommt immer beim löschen fon Job aber funktioniert trotzdem + GlobalMethod.showErrorDialog(error: "This task cannot be deleted", ctx: ctx); + } finally{} + }, + child: const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.delete, + color: Colors.red, + ), + Text( + "Delete", + style: TextStyle(color: Colors.red), + ), + ], + )) + ], + ); + }); + } + + @override + Widget build(BuildContext context) { + return Card( + color: Colors.white24, + elevation: 8, + margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + child: ListTile( + onTap: () {}, + onLongPress: () { + _deleteDialog(); + }, + contentPadding: + const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + leading: Container( + padding: const EdgeInsets.only(right: 12), + decoration: const BoxDecoration( + border: Border( + right: BorderSide(width: 1), + ), + ), + //Debuging for userImage + //width: 100, + //height: 100, + child: Image.network(widget.userImage), + ), + title: Text( + widget.jobTitle, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.amber, + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + widget.name, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 13, + ), + ), + const SizedBox( + height: 8, + ), + Text( + widget.jobDescription, + maxLines: 4, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: Colors.black, + fontSize: 15, + ), + ) + ], + ), + trailing: const Icon( + Icons.keyboard_arrow_right, + size: 30, + color: Colors.black, + ), + ), + ); + } +} diff --git a/lib/forget_passwort/forget_pass_screen.dart b/lib/forget_passwort/forget_pass_screen.dart index 3286483..ceeaed9 100644 --- a/lib/forget_passwort/forget_pass_screen.dart +++ b/lib/forget_passwort/forget_pass_screen.dart @@ -63,7 +63,7 @@ class ForgetPasswort extends StatelessWidget { const SizedBox(height: 16), TextFormField( controller: _emailController, - style: TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white), decoration: InputDecoration( labelText: 'E-Mail', filled: true, @@ -90,7 +90,7 @@ class ForgetPasswort extends StatelessWidget { borderRadius: BorderRadius.circular(13), ), ), - child: Padding( + child: const Padding( padding: EdgeInsets.symmetric(vertical: 14), child: Text( 'Reset Passwort', diff --git a/lib/jobs/jobs_screen.dart b/lib/jobs/jobs_screen.dart index 80b2179..da047bc 100644 --- a/lib/jobs/jobs_screen.dart +++ b/lib/jobs/jobs_screen.dart @@ -1,7 +1,11 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:cpd_ss23/Search/search_job.dart'; import 'package:cpd_ss23/Widgets/bottom_nav_bar.dart'; +import 'package:cpd_ss23/Widgets/job_widget.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; +import '../Persistent/persistent.dart'; import '../services/global_variables.dart'; import '../user_state.dart'; @@ -10,58 +14,191 @@ class JobScreen extends StatefulWidget { State createState() => _JobScreenState(); } -final _auth = FirebaseAuth.instance; - class _JobScreenState extends State { + String? jobCategoryFilter; + + final FirebaseAuth _auth = FirebaseAuth.instance; + + _showTaskCategoriesDialog({required Size size}) { + showDialog( + context: context, + builder: (ctx) { + return AlertDialog( + backgroundColor: Colors.black54, + title: const Text( + "Job Category", + textAlign: TextAlign.center, + style: TextStyle(fontSize: 20, color: Colors.white), + ), + content: Container( + width: size.width * 0.9, + child: ListView.builder( + shrinkWrap: true, + itemCount: Persistent.jobCategoryList.length, + itemBuilder: (ctx, index) { + return InkWell( + onTap: () { + setState(() { + jobCategoryFilter = Persistent.jobCategoryList[index]; + }); + Navigator.canPop(context) ? Navigator.pop(context) : null; + print( + "jobCategoryList[index], ${Persistent.jobCategoryList[index]}"); + }, + child: Row( + children: [ + const Icon( + Icons.arrow_right_alt_outlined, + color: Colors.grey, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + Persistent.jobCategoryList[index], + style: const TextStyle( + color: Colors.grey, + fontSize: 16, + ), + ), + ) + ], + ), + ); + }, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.canPop(context) ? Navigator.pop(context) : null; + }, + child: const Text( + "Close", + style: TextStyle( + color: Colors.white, + fontSize: 16, + ), + ), + ), + TextButton( + onPressed: () { + setState(() { + jobCategoryFilter = null; + }); + Navigator.canPop(context) ? Navigator.pop(context) : null; + }, + child: const Text("Cancel Filter", + style: TextStyle(color: Colors.white)), + ), + ], + ); + }); + } + @override Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; return Scaffold( - bottomNavigationBar: BottomNavigationBarForApp(indexNum:0), - body: Stack( - children: [ - Image.network( - signupUrlImage, - fit: BoxFit.cover, - width: double.infinity, - height: double.infinity, - ), - SingleChildScrollView( - child: SizedBox( - height: size.height - 18, // Adjust for bottom overflow - child: Column( - children: [ - AppBar( - backgroundColor: Colors.cyan, - title: const Text('Job Screen'), - actions: [ - IconButton( - icon: Icon(Icons.search), + bottomNavigationBar: BottomNavigationBarForApp(indexNum: 0), + body: Stack( + children: [ + Image.network( + signupUrlImage, + fit: BoxFit.cover, + width: double.infinity, + height: double.infinity, + ), + SingleChildScrollView( + child: SizedBox( + height: size.height - 18, // Adjust for bottom overflow + child: Column( + children: [ + AppBar( + backgroundColor: Colors.transparent, + actions: [ + IconButton( + icon: const Icon(Icons.search_outlined, + color: Colors.white), + onPressed: () { + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (c) => SearchScreen())); + }, + ), + ], + automaticallyImplyLeading: false, + leading: IconButton( + icon: const Icon( + Icons.filter_list_rounded, + color: Colors.white, + ), onPressed: () { - // Action when the search icon is clicked + _showTaskCategoriesDialog(size: size); }, ), - ], - ), - const SizedBox(height: 80), - ElevatedButton( - onPressed: () { - _auth.signOut(); - Navigator.canPop(context) ? Navigator.pop(context) : null; - Navigator.pushReplacement( - context, - MaterialPageRoute(builder: (_) => UserState()), - ); - }, - child: const Text("Log Out"), - ), - ], + ), + const SizedBox(height: 80), + ElevatedButton( + onPressed: () { + _auth.signOut(); + Navigator.canPop(context) + ? Navigator.pop(context) + : null; + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (_) => UserState()), + ); + }, + child: const Text("Log Out"), + ), + ], + ), ), ), - ), - ], - ), - ); + StreamBuilder>>( + stream: FirebaseFirestore.instance.collection("jobs").where("jobCategory", isEqualTo: jobCategoryFilter).where("recruitment", isEqualTo: true).orderBy("createdAt", descending: false).snapshots(), + builder: (context, AsyncSnapshot snapshot){ + if(snapshot.connectionState == ConnectionState.waiting){ + return const Center (child: CircularProgressIndicator(),); + } else if (snapshot.connectionState == ConnectionState.active){ + if(snapshot.data?.docs.isNotEmpty == true){ + return ListView.builder( + itemCount: snapshot.data?.docs.length, + itemBuilder: (BuildContext context, int index){ + return JobWidget( + jobTitle: snapshot.data?.docs[index]["jobTitle"], + jobDescription: snapshot.data!.docs[index]["jobDescription"], + jobId: snapshot.data?.docs[index]["jobId"], + uploadedBy: snapshot.data?.docs[index]["uploadedBy"], + userImage: snapshot.data?.docs[index]["userImage"], + name: snapshot.data?.docs[index]["name"], + recruitment: snapshot.data?.docs[index]["recruitment"], + email: snapshot.data?.docs[index]["email"], + location: snapshot.data?.docs[index]["location"], + ); + } + ); + } else { + return const Center( + child: Text("There is no jobs"), + ); + } + } + return const Center( + child: Text( + "Something went wrong", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 30 + ), + ), + ); + } + ), + ], + ), + ); } } diff --git a/lib/jobs/upload_job.dart b/lib/jobs/upload_job.dart index 3c54b85..977a033 100644 --- a/lib/jobs/upload_job.dart +++ b/lib/jobs/upload_job.dart @@ -1,52 +1,294 @@ -import 'package:flutter/material.dart'; +// ignore_for_file: use_key_in_widget_constructors +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:uuid/uuid.dart'; + +import '../Persistent/persistent.dart'; import '../Widgets/bottom_nav_bar.dart'; +import '../services/global_methods.dart'; +import '../services/global_variables.dart'; class UploadJobNow extends StatefulWidget { - @override State createState() => _UploadJobNowState(); } - class _UploadJobNowState extends State { + final TextEditingController _jobCategoryController = + TextEditingController(text: "Select Job Category"); + final TextEditingController _jobTitleController = TextEditingController(); + final TextEditingController _jobDescriptionController = + TextEditingController(); + final TextEditingController _deadlineDateController = + TextEditingController(text: "Job Deadline Date"); + + final _formKey = GlobalKey(); + DateTime? picked; + Timestamp? deadlineDateTimeStamp; + bool _isLoading = false; + + @override + void dispose(){ + super.dispose(); + _jobCategoryController.dispose(); + _jobTitleController.dispose(); + _jobDescriptionController.dispose(); + _deadlineDateController.dispose(); + } + + Widget _textTitles({required String label}) { + return Padding( + padding: const EdgeInsets.all(5.0), + child: Text( + label, + style: const TextStyle( + color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), + ), + ); + } + + Widget _textFormFields({ + required String valueKey, + required TextEditingController controller, + required bool enabled, + required Function fct, + required int maxLength, + }) { + return Padding( + padding: const EdgeInsets.all(5.0), + child: InkWell( + onTap: () { + fct(); + }, + child: TextFormField( + validator: (values) { + if (values!.isEmpty) { + return "Value is missing"; + } + return null; + }, + controller: controller, + enabled: enabled, + key: ValueKey(valueKey), + style: const TextStyle( + color: Colors.white, + ), + maxLines: valueKey == "JobDescription" ? 3 : 1, + maxLength: maxLength, + keyboardType: TextInputType.text, + decoration: const InputDecoration( + filled: true, + fillColor: Colors.black54, + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black), + ), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black54), + ), + errorBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.black54), + ), + ), + ), + ), + ); + } + + _showTaskCategoriesDialog({required Size size}) { + showDialog( + context: context, + builder: (ctx) { + return AlertDialog( + backgroundColor: Colors.black54, + title: const Text( + "Job Category", + textAlign: TextAlign.center, + style: TextStyle(fontSize: 20, color: Colors.white), + ), + content: Container( + width: size.width * 0.9, + child: ListView.builder( + shrinkWrap: true, + itemCount: Persistent.jobCategoryList.length, + itemBuilder: (ctx, index) { + return InkWell( + onTap: () { + setState(() { + _jobCategoryController.text = + Persistent.jobCategoryList[index]; + }); + Navigator.pop(context); + }, + child: Row( + children: [ + const Icon( + Icons.arrow_right_alt_outlined, + color: Colors.grey, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + Persistent.jobCategoryList[index], + style: const TextStyle( + color: Colors.grey, + fontSize: 16, + ), + ), + ) + ], + ), + ); + }, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.canPop(context) ? Navigator.pop(context) : null; + }, + child: const Text( + "Cancel", + style: TextStyle( + color: Colors.white, + fontSize: 16, + ), + ), + ), + ], + ); + }); + } + + void _pickDateDialog() async { + picked = await showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime.now().subtract( + const Duration(days: 0), + ), + lastDate: DateTime(2100), + ); + if (picked != null) { + setState(() { + _deadlineDateController.text = + "${picked!.year} - ${picked!.month} - ${picked!.day}"; + deadlineDateTimeStamp = Timestamp.fromMicrosecondsSinceEpoch( + picked!.microsecondsSinceEpoch); + }); + } + } + + void _uploadTask() async { + final jobId = const Uuid().v4(); + User? user = FirebaseAuth.instance.currentUser; + final _uid = user!.uid; + final isValid = _formKey.currentState!.validate(); + + if (isValid) { + if (_deadlineDateController.text == "Choose job Deadline date" || + _jobCategoryController.text == "Choose job category") { + GlobalMethod.showErrorDialog( + error: "Please pick everything", ctx: context); + return; + } + setState(() { + _isLoading = true; + }); + try { + await FirebaseFirestore.instance.collection("jobs").doc(jobId).set({ + "jobId": jobId, + "uploadedBy": _uid, + "email": user.email, + "jobTitle": _jobTitleController.text, + "jobDescription": _jobDescriptionController.text, + "deadlineDate": _deadlineDateController.text, + "deadlineDateTimeStamp": deadlineDateTimeStamp, + "jobCategory": _jobCategoryController.text, + "jobComments": [], + "recruitment": true, + "createdAt": Timestamp.now(), + "name": name, + "userImage": userImage, + "location": location, + "applicants": 0, + }); + await Fluttertoast.showToast( + msg: "The task has been uploaded", + toastLength: Toast.LENGTH_LONG, + backgroundColor: Colors.grey, + fontSize: 18.0, + ); + _jobTitleController.clear(); + _jobDescriptionController.clear(); + setState(() { + _jobDescriptionController.text = "Choose job category"; + _deadlineDateController.text = "Choose job Deadline date"; + }); + } catch (error) { + setState(() { + _isLoading = false; + }); + GlobalMethod.showErrorDialog(error: error.toString(), ctx: context); + } finally { + setState(() { + _isLoading = false; + }); + } + } else { + print("Its not valid"); + } + } + + void getMyData() async{ + final DocumentSnapshot userDoc = await FirebaseFirestore.instance.collection("users").doc(FirebaseAuth.instance.currentUser!.uid) + .get(); + + setState(() { + name = userDoc.get("name"); + userImage = userDoc.get("userImage"); + location = userDoc.get("location"); + }); + } + + @override + void initState() { + // TODO: implement initState + super.initState(); + getMyData(); + } + @override Widget build(BuildContext context) { + Size size = MediaQuery.of(context).size; return Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: LinearGradient( - colors: [Colors.deepOrange.shade300, Colors.blueAccent], - begin: Alignment.centerLeft, - end: Alignment.centerRight, - stops: const [0.2, 0.9], - ) - ), + colors: [Colors.cyan, Colors.white60], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + stops: [0.2, 0.9], + )), child: Scaffold( - bottomNavigationBar: BottomNavigationBarForApp(indexNum: 2,), - backgroundColor: Colors.transparent, - appBar: AppBar( - backgroundColor: Colors.cyan, - title: const Text('Upload Job Now'), - actions: [ - IconButton( - icon: const Icon(Icons.search), - onPressed: () { - // Action when the search icon is clicked - }, - ), - ], + bottomNavigationBar: BottomNavigationBarForApp( + indexNum: 2, ), - body: const Center( + backgroundColor: Colors.transparent, + body: Center( child: Padding( - padding: EdgeInsets.all(7.0), + padding: const EdgeInsets.all(7.0), child: Card( color: Colors.white10, child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 10,), - Align( + const SizedBox( + height: 10, + ), + const Align( alignment: Alignment.center, child: Padding( padding: EdgeInsets.all(8.0), @@ -60,6 +302,101 @@ class _UploadJobNowState extends State { ), ), ), + ), + const SizedBox( + height: 10, + ), + const Divider( + thickness: 1, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _textTitles(label: "Job Category:"), + _textFormFields( + valueKey: "JobCategory", + controller: _jobCategoryController, + enabled: false, + fct: () { + _showTaskCategoriesDialog(size: size); + }, + maxLength: 100, + ), + _textTitles(label: "Job Title:"), + _textFormFields( + valueKey: "JobTitle", + controller: _jobTitleController, + enabled: true, + fct: () {}, + maxLength: 100, + ), + _textTitles(label: "Job Description:"), + _textFormFields( + valueKey: "JobDescription", + controller: _jobDescriptionController, + enabled: true, + fct: () {}, + maxLength: 100, + ), + _textTitles(label: "Job Deadline:"), + _textFormFields( + valueKey: "Deadline", + controller: _deadlineDateController, + enabled: false, + fct: () { + _pickDateDialog(); + }, + maxLength: 100, + ), + ], + ), + ), + ), + Center( + child: Padding( + padding: const EdgeInsets.only(bottom: 30), + child: _isLoading + ? const CircularProgressIndicator() + : MaterialButton( + onPressed: () { + _uploadTask(); + }, + color: Colors.black, + elevation: 8, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(13), + ), + child: const Padding( + padding: EdgeInsets.symmetric(vertical: 14), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Post Now", + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 28, + fontFamily: "Signatra", + ), + ), + SizedBox( + width: 9, + ), + Icon( + Icons.upload_file, + color: Colors.white, + ), + ], + ), + ), + ), + ), ) ], ), diff --git a/lib/login_page/login_screen.dart b/lib/login_page/login_screen.dart index 67561f0..b7c80b6 100644 --- a/lib/login_page/login_screen.dart +++ b/lib/login_page/login_screen.dart @@ -136,7 +136,7 @@ class _LoginState extends State with TickerProviderStateMixin { return null; } }, - style: TextStyle(color: Colors.white), + style: const TextStyle(color: Colors.white), decoration: const InputDecoration( hintText: 'Email', hintStyle: TextStyle(color: Colors.white), diff --git a/lib/services/global_variables.dart b/lib/services/global_variables.dart index 4ef05b3..08c1bd4 100644 --- a/lib/services/global_variables.dart +++ b/lib/services/global_variables.dart @@ -1,3 +1,6 @@ String loginUrlImage = "https://images.unsplash.com/photo-1523050854058-8df90110c9f1?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8dW5pdmVyc2l0eXxlbnwwfHwwfHw%3D&w=1000&q=80"; String signupUrlImage= 'https://images.unsplash.com/photo-1575330734740-21b22ac7bf5e?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxleHBsb3JlLWZlZWR8MXx8fGVufDB8fHx8fA%3D%3D&w=1000&q=80'; -String signupGenericImage = 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSeqUFP0nU4pUnNncq4dy7M6X6xYRYwUQduFcLkQ9yEAYMzORlw5eHddyCPMUY4yK2PBJ8&usqp=CAU'; \ No newline at end of file +String signupGenericImage = 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSeqUFP0nU4pUnNncq4dy7M6X6xYRYwUQduFcLkQ9yEAYMzORlw5eHddyCPMUY4yK2PBJ8&usqp=CAU'; +String? name = ""; +String? userImage = ""; +String? location = ""; \ No newline at end of file diff --git a/lib/signup_page/signup_screen.dart b/lib/signup_page/signup_screen.dart index 8c268c3..f3b18fe 100644 --- a/lib/signup_page/signup_screen.dart +++ b/lib/signup_page/signup_screen.dart @@ -103,7 +103,7 @@ class _SignUpState extends State { 'id': _uid, 'name': _nameTextController.text, 'email': _emailTextController.text, - 'avatar':imageUrl, + 'userImage':imageUrl, 'phone':_phoneNumberTextController.text, 'location': _cityTextController.text, 'createdAt': Timestamp.now(),