From 5469c484e15418f83dc49924606805c5f5b429f9 Mon Sep 17 00:00:00 2001 From: Patrick Alvin Alcala Date: Mon, 27 Jan 2025 13:18:18 +0800 Subject: [PATCH] update --- lib/main.dart | 6 +++++ lib/pages/add_medicine.dart | 45 ++++++++++++++++++++++++++++++++++ lib/pages/index_page.dart | 9 +++++-- lib/pages/login_page.dart | 41 ++++++++++++++++++------------- lib/pages/main_page.dart | 41 +++++++++++++++++++++++-------- lib/widgets/button_widget.dart | 30 +++++++++++++++++++++++ lib/widgets/menu_widget.dart | 43 ++++++++++++++++++-------------- lib/widgets/text_widget.dart | 14 +++++++++++ lib/widgets/title_widget.dart | 21 ++++++++++++++++ pubspec.yaml | 2 +- 10 files changed, 204 insertions(+), 48 deletions(-) create mode 100644 lib/pages/add_medicine.dart create mode 100644 lib/widgets/button_widget.dart create mode 100644 lib/widgets/text_widget.dart create mode 100644 lib/widgets/title_widget.dart diff --git a/lib/main.dart b/lib/main.dart index 852a224..1ed5997 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:pharmacy_mobile/pages/add_medicine.dart'; // import 'package:pharmacy_mobile/auth/auth_gate.dart'; import 'package:pharmacy_mobile/pages/index_page.dart'; import 'package:pharmacy_mobile/pages/login_page.dart'; @@ -49,6 +50,11 @@ final _router = GoRouter( path: '/main', builder: (context, state) => MainPage(), ), + GoRoute( + name: 'addmedicines', + path: '/addmedicines', + builder: (context, state) => AddMedicinePage(), + ), ], ); diff --git a/lib/pages/add_medicine.dart b/lib/pages/add_medicine.dart new file mode 100644 index 0000000..6d1788d --- /dev/null +++ b/lib/pages/add_medicine.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:pharmacy_mobile/widgets/text_widget.dart'; +import 'package:pharmacy_mobile/widgets/title_widget.dart'; + +class AddMedicinePage extends StatefulWidget { + const AddMedicinePage({super.key}); + + @override + AddMedicinePageState createState() => AddMedicinePageState(); +} + +class AddMedicinePageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + alignment: Alignment.center, + height: MediaQuery.of(context).size.height, + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [ + Color.fromRGBO(34, 51, 69, 1), + Color.fromRGBO(22, 32, 44, 1), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: Center( + child: Column( + children: [ + const Gap(120), + const TitleWidget(firstTextSize: 16, secondTextSize: 32), + const Gap(32), + const TextWidget(text: 'Add Medicine'), + const Gap(16), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/index_page.dart b/lib/pages/index_page.dart index c10e249..c3efd06 100644 --- a/lib/pages/index_page.dart +++ b/lib/pages/index_page.dart @@ -2,12 +2,17 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:gap/gap.dart'; +import 'package:pharmacy_mobile/widgets/button_widget.dart'; class IndexPage extends StatelessWidget { const IndexPage({super.key}); @override Widget build(BuildContext context) { + void gotoLogin() { + context.push('/login'); + } + return Scaffold( resizeToAvoidBottomInset: false, body: Container( @@ -40,8 +45,8 @@ class IndexPage extends StatelessWidget { child: Image.asset('assets/ph_logo.webp', width: 256, cacheWidth: (256 * MediaQuery.of(context).devicePixelRatio).round()), ), - const Gap(16), - TextButton(onPressed: () => {context.push('/login')}, child: const Text('Login')) + const Gap(32), + ButtonWidget(text: 'Login', onPressed: gotoLogin) ], ), ), diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 8b7c19b..a6ff9d6 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,9 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:gap/gap.dart'; import 'package:pharmacy_mobile/auth/auth_service.dart'; import 'package:pharmacy_mobile/main.dart'; +import 'package:pharmacy_mobile/widgets/button_widget.dart'; +import 'package:pharmacy_mobile/widgets/text_widget.dart'; +import 'package:pharmacy_mobile/widgets/title_widget.dart'; import 'dart:developer'; import 'package:quickalert/quickalert.dart'; @@ -18,6 +22,7 @@ class _LoginPageState extends State { final _authService = AuthService(); final _emailController = TextEditingController(); final _passwordController = TextEditingController(); + final FocusNode _focusNode = FocusNode(); void _signIn() async { final email = _emailController.text; @@ -81,16 +86,9 @@ class _LoginPageState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ const Gap(120), - Text('Ofelia Franco-Alcala', - style: GoogleFonts.outfit( - textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 16))), - Text('Pharmacy', - style: GoogleFonts.outfit( - textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 32))), + const TitleWidget(firstTextSize: 16, secondTextSize: 32), const Gap(32), - Text('Login', - style: GoogleFonts.outfit( - textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 32))), + const TextWidget(text: 'Login'), const Gap(16), Padding( padding: const EdgeInsets.only(left: 16, right: 16), @@ -110,17 +108,26 @@ class _LoginPageState extends State { style: const TextStyle(color: Colors.white), ), const Gap(8), - TextFormField( - obscureText: true, - controller: _passwordController, - decoration: const InputDecoration( - labelText: 'Password', - border: OutlineInputBorder(), + KeyboardListener( + focusNode: _focusNode, + onKeyEvent: (event) { + if (event is KeyDownEvent && event.logicalKey == LogicalKeyboardKey.enter) { + _signIn(); + } + }, + child: TextFormField( + obscureText: true, + controller: _passwordController, + decoration: const InputDecoration( + labelText: 'Password', + border: OutlineInputBorder(), + ), + style: const TextStyle(color: Colors.white), ), - style: const TextStyle(color: Colors.white), ), const Gap(16), - TextButton(onPressed: () => {_signIn()}, child: const Text('Login')) + // TextButton(onPressed: () => {_signIn()}, child: const Text('Login')) + ButtonWidget(text: 'Login', onPressed: _signIn) ], )), ), diff --git a/lib/pages/main_page.dart b/lib/pages/main_page.dart index 8640bb7..9d26d3f 100644 --- a/lib/pages/main_page.dart +++ b/lib/pages/main_page.dart @@ -4,7 +4,10 @@ import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:pharmacy_mobile/auth/auth_service.dart'; +import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/menu_widget.dart'; +import 'package:pharmacy_mobile/widgets/text_widget.dart'; +import 'package:pharmacy_mobile/widgets/title_widget.dart'; class MainPage extends StatelessWidget { const MainPage({super.key}); @@ -18,6 +21,10 @@ class MainPage extends StatelessWidget { context.push('/'); } + void gotoAddMedicine() { + context.push('/addmedicines'); + } + return Scaffold( body: Container( alignment: Alignment.center, @@ -36,27 +43,41 @@ class MainPage extends StatelessWidget { child: Column( children: [ const Gap(120), - Text('Ofelia Franco-Alcala', - style: GoogleFonts.outfit( - textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 16))), - Text('Pharmacy', - style: GoogleFonts.outfit( - textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 32))), + const TitleWidget(firstTextSize: 16, secondTextSize: 32), const Gap(32), - Text('Menu', - style: GoogleFonts.outfit( - textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 32))), + const TextWidget(text: 'Menu'), const Gap(16), MenuWidget( icon: FontAwesomeIcons.squarePlus, text: 'Add Medicine', + onPressed: gotoAddMedicine, ), const Gap(16), MenuWidget( icon: FontAwesomeIcons.squarePlus, text: 'Add Generics', ), - TextButton(onPressed: () => {signOut()}, child: const Text('Logout')) + const Gap(16), + MenuWidget( + icon: FontAwesomeIcons.squarePlus, + text: 'Add Stock', + ), + const Gap(16), + MenuWidget( + icon: FontAwesomeIcons.squarePlus, + text: 'Add Medicine Type', + ), + const Gap(32), + MenuWidget( + icon: FontAwesomeIcons.listCheck, + text: 'List of Stocks', + ), + const Gap(32), + // TextButton(onPressed: () => {_signOut()}, child: const Text('Logout')), + ButtonWidget( + text: 'Logout', + onPressed: signOut, + ) ], ), ), diff --git a/lib/widgets/button_widget.dart b/lib/widgets/button_widget.dart new file mode 100644 index 0000000..6fd2478 --- /dev/null +++ b/lib/widgets/button_widget.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +// import 'package:google_fonts/google_fonts.dart'; + +class ButtonWidget extends StatelessWidget { + final String text; + final VoidCallback onPressed; + + const ButtonWidget({super.key, required this.text, required this.onPressed}); + + @override + Widget build(BuildContext context) { + return TextButton( + style: TextButton.styleFrom( + foregroundColor: Colors.white, // text color + backgroundColor: const Color.fromARGB(255, 54, 140, 136), // background color + side: const BorderSide(color: Color.fromARGB(55, 255, 255, 255)), // border color + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(26), // rounded corners + ), + minimumSize: Size(MediaQuery.of(context).size.width - 64, 40), // minimum size + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 16), // padding + ), + onPressed: onPressed, + child: Text( + text, + style: GoogleFonts.outfit(textStyle: const TextStyle(fontSize: 18)), + )); + } +} diff --git a/lib/widgets/menu_widget.dart b/lib/widgets/menu_widget.dart index 46d21c6..d6b1795 100644 --- a/lib/widgets/menu_widget.dart +++ b/lib/widgets/menu_widget.dart @@ -1,33 +1,40 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; +import 'package:google_fonts/google_fonts.dart'; +// import 'package:pharmacy_mobile/widgets/text_widget.dart'; class MenuWidget extends StatelessWidget { - final String? text; + final String text; final IconData? icon; + final VoidCallback? onPressed; const MenuWidget({ super.key, - this.text, + required this.text, this.icon, + this.onPressed, }); @override Widget build(BuildContext context) { - return Container( - width: MediaQuery.of(context).size.width - 32, - height: 100, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: Colors.grey[200], - ), - child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ - const Gap(32), - Icon(icon, size: 32, color: const Color.fromRGBO(34, 51, 69, 1)), - const Gap(120), - Text( - text ?? 'Data', - style: TextStyle(fontSize: 16), - ) - ])); + return GestureDetector( + onTap: onPressed, + child: Container( + width: MediaQuery.of(context).size.width - 64, + height: 80, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.grey[200], + ), + child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ + const Gap(32), + Icon(icon, size: 32, color: const Color.fromRGBO(34, 51, 69, 1)), + const Gap(64), + Text( + text, + style: GoogleFonts.outfit(textStyle: const TextStyle(fontSize: 20)), + ), + ])), + ); } } diff --git a/lib/widgets/text_widget.dart b/lib/widgets/text_widget.dart new file mode 100644 index 0000000..9bd7e10 --- /dev/null +++ b/lib/widgets/text_widget.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class TextWidget extends StatelessWidget { + final String text; + + const TextWidget({super.key, required this.text}); + + @override + Widget build(BuildContext context) { + return Text(text, + style: GoogleFonts.outfit(textStyle: const TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: 32))); + } +} diff --git a/lib/widgets/title_widget.dart b/lib/widgets/title_widget.dart new file mode 100644 index 0000000..0ad9176 --- /dev/null +++ b/lib/widgets/title_widget.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class TitleWidget extends StatelessWidget { + final double firstTextSize; + final double secondTextSize; + + const TitleWidget({super.key, required this.firstTextSize, required this.secondTextSize}); + + @override + Widget build(BuildContext context) { + return Column(children: [ + Text('Ofelia Franco-Alcala', + style: GoogleFonts.outfit( + textStyle: TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: firstTextSize))), + Text('Pharmacy', + style: GoogleFonts.outfit( + textStyle: TextStyle(color: Color.fromRGBO(255, 255, 255, 1), fontSize: secondTextSize))), + ]); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 38a6882..5a9c830 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: pharmacy_mobile -description: "A new Flutter project." +description: "A Pharmacy Mobile Application." publish_to: "none" version: 1.0.0+1