From f924111815caf09c8f0fb62fb43af3310a4166a7 Mon Sep 17 00:00:00 2001 From: rodolfobacuinjr Date: Mon, 5 Dec 2022 16:06:45 +0800 Subject: [PATCH] create user interface for request SOS, profile, and empty module screen --- unit2/assets/pngs/bg.png | Bin 0 -> 62456 bytes unit2/assets/svgs/add_mobile.svg | 1 + unit2/assets/svgs/no_module.svg | 1 + unit2/assets/svgs/request_sos.svg | 1 + unit2/lib/main.dart | 10 +- unit2/lib/screen/sos/add_mobile.dart | 139 +++++++++++++++ unit2/lib/screen/sos/components/mobile.dart | 37 ++++ unit2/lib/screen/sos/request_sos.dart | 109 ++++++++++++ unit2/lib/screen/sos/sos_received.dart | 133 ++++++++++++++ .../components/drawer-screen.dart | 32 ++++ .../components/empty_module.dart | 53 ++++++ .../homepage.dart/components/menu-screen.dart | 75 ++++++++ .../unit2/homepage.dart/components/menu.dart | 25 +++ .../unit2/homepage.dart/module-screen.dart | 53 +++++- unit2/lib/screen/unit2/login/login.dart | 47 +++-- .../unit2/profile/components/cover-image.dart | 20 +++ unit2/lib/screen/unit2/profile/profile.dart | 109 ++++++++++++ unit2/lib/theme-data.dart/btn-style.dart | 17 +- unit2/lib/theme-data.dart/form-style.dart | 50 +++++- unit2/lib/theme-data.dart/text-styles.dart | 7 + unit2/lib/utils/router.dart | 41 ++++- unit2/lib/utils/screen_info.dart | 9 + unit2/lib/utils/text_container.dart | 23 +++ unit2/lib/utils/validators.dart | 12 ++ .../Flutter/GeneratedPluginRegistrant.swift | 4 + unit2/pubspec.lock | 163 +++++++++++++++++- unit2/pubspec.yaml | 6 +- 27 files changed, 1129 insertions(+), 48 deletions(-) create mode 100644 unit2/assets/pngs/bg.png create mode 100644 unit2/assets/svgs/add_mobile.svg create mode 100644 unit2/assets/svgs/no_module.svg create mode 100644 unit2/assets/svgs/request_sos.svg create mode 100644 unit2/lib/screen/sos/add_mobile.dart create mode 100644 unit2/lib/screen/sos/components/mobile.dart create mode 100644 unit2/lib/screen/sos/request_sos.dart create mode 100644 unit2/lib/screen/sos/sos_received.dart create mode 100644 unit2/lib/screen/unit2/homepage.dart/components/drawer-screen.dart create mode 100644 unit2/lib/screen/unit2/homepage.dart/components/empty_module.dart create mode 100644 unit2/lib/screen/unit2/homepage.dart/components/menu-screen.dart create mode 100644 unit2/lib/screen/unit2/homepage.dart/components/menu.dart create mode 100644 unit2/lib/screen/unit2/profile/components/cover-image.dart create mode 100644 unit2/lib/screen/unit2/profile/profile.dart create mode 100644 unit2/lib/theme-data.dart/text-styles.dart create mode 100644 unit2/lib/utils/screen_info.dart create mode 100644 unit2/lib/utils/text_container.dart create mode 100644 unit2/lib/utils/validators.dart diff --git a/unit2/assets/pngs/bg.png b/unit2/assets/pngs/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b8afe26cef4d94d498bb6b8f552f5c990b2c8b06 GIT binary patch literal 62456 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 wzVsasNdF{ \ No newline at end of file diff --git a/unit2/assets/svgs/no_module.svg b/unit2/assets/svgs/no_module.svg new file mode 100644 index 0000000..7d09b1e --- /dev/null +++ b/unit2/assets/svgs/no_module.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/unit2/assets/svgs/request_sos.svg b/unit2/assets/svgs/request_sos.svg new file mode 100644 index 0000000..f4cd5b8 --- /dev/null +++ b/unit2/assets/svgs/request_sos.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/unit2/lib/main.dart b/unit2/lib/main.dart index 7bfa0d4..f87f8ef 100644 --- a/unit2/lib/main.dart +++ b/unit2/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:device_preview/device_preview.dart'; +import 'package:flutter/services.dart'; import './utils/router.dart'; import './utils/global.dart'; @@ -33,14 +34,21 @@ class MyApp extends StatelessWidget { mediaQueryData.padding.top + mediaQueryData.padding.bottom; safeBlockHorizontal = (screenWidth - safeAreaHorizontal) / 100; safeBlockVertical = (screenHeight - safeAreaVertical) / 100; + return MaterialApp.router( // useInheritedMediaQuery: true, // locale: DevicePreview.locale(context), // builder: DevicePreview.appBuilder, routeInformationParser: goRouter.routeInformationParser, - routerDelegate: goRouter.routerDelegate, + routerDelegate: goRouter.routerDelegate, + // routeInformationProvider: goRouter.routeInformationProvider, title: 'uniT2 - Universal Tracker and Tracer', theme: ThemeData( + appBarTheme: const AppBarTheme( + systemOverlayStyle: SystemUiOverlayStyle( + statusBarBrightness: Brightness.dark, + statusBarColor: Colors.black), + ), fontFamily: 'LexendDeca', ), debugShowCheckedModeBanner: false, diff --git a/unit2/lib/screen/sos/add_mobile.dart b/unit2/lib/screen/sos/add_mobile.dart new file mode 100644 index 0000000..c102a0a --- /dev/null +++ b/unit2/lib/screen/sos/add_mobile.dart @@ -0,0 +1,139 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:fluttericon/font_awesome_icons.dart'; +import 'package:go_router/go_router.dart'; +import 'package:unit2/theme-data.dart/text-styles.dart'; +import 'package:unit2/utils/screen_info.dart'; +import '../../theme-data.dart/btn-style.dart'; +import '../../theme-data.dart/colors.dart'; +import '../../theme-data.dart/form-style.dart'; +import '../../utils/global.dart'; +import '../../utils/text_container.dart'; +import '../../utils/validators.dart'; +import '../../widgets/wave.dart'; + +class AddMobile extends StatelessWidget { + AddMobile({super.key}); + final _formKey = GlobalKey(); + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () async { + return true; + }, + child: Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + leading: IconButton( + icon: const Icon( + FontAwesome.left_big, + ), + onPressed: () { + context.go(context.namedLocation('login')); + }, + color: primary, + ), + ), + resizeToAvoidBottomInset: true, + body: SingleChildScrollView( + child: SizedBox( + height: screenHeight * .89, + child: Stack( + children: [ + Positioned( + bottom: 0, + right: 0, + child: WaveReverse(height: blockSizeVertical * 8)), + Container( + height: screenHeight, + padding: isMobile() + ? const EdgeInsets.symmetric(horizontal: 24) + : const EdgeInsets.symmetric(horizontal: 60), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: isMobile() + ? screenHeight * .12 + : screenHeight * .20), + SvgPicture.asset( + 'assets/svgs/add_mobile.svg', + height: isMobile() + ? blockSizeVertical * 22 + : blockSizeVertical * 30, + allowDrawingOutsideViewBox: true, + ), + const SizedBox( + height: 24, + ), + Text(addMobile, style: titleTextStyle()), + const SizedBox( + height: 8, + ), + Text(addMobileCaption, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.caption), + const SizedBox( + height: 24, + ), + FormBuilder( + key: _formKey, + child: Column( + children: [ + // Mobile number 1 + FormBuilderTextField( + name: 'mobile1', + validator: mobileNumberValidator, + decoration: normalTextFieldStyle( + "mobile number 1", "+63")), + const SizedBox( + height: 12, + ), + FormBuilderTextField( + name: 'mobile2', + validator: mobileNumberValidator, + decoration: normalTextFieldStyle( + "mobile number 2", "+63")), + + SizedBox( + height: isMobile() + ? blockSizeVertical * 3 + : blockSizeHorizontal * 5), + SizedBox( + width: double.infinity, + height: screenHeight * .06, + child: ElevatedButton( + style: secondaryBtnStyle(second, + Colors.transparent, Colors.white54), + child: const Text( + submit, + style: TextStyle(color: Colors.white), + ), + onPressed: () { + context.go( + context.namedLocation('request-sos')); + // if (_formKey.currentState.validate()) { + // _formKey.currentState.save(); + // BlocProvider.of(context) + // .add(UserWebLogin( + // password: password, + // username: username)); + // } + }, + ), + ), + ], + )) + ]), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/unit2/lib/screen/sos/components/mobile.dart b/unit2/lib/screen/sos/components/mobile.dart new file mode 100644 index 0000000..bd0c522 --- /dev/null +++ b/unit2/lib/screen/sos/components/mobile.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:fluttericon/font_awesome5_icons.dart'; + +import '../../../theme-data.dart/colors.dart'; + +class Mobile extends StatelessWidget { + final String title; + final String subtitle; + final Function onPressed; + const Mobile({ + super.key, + required this.title, + required this.subtitle, + required this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: const Icon( + FontAwesome5.sim_card, + color: second, + ), + title: Text(title), + subtitle: Text( + subtitle, + style: Theme.of(context).textTheme.caption, + ), + trailing: IconButton( + icon: const Icon(Icons.edit), + onPressed: () { + onPressed(); + }, + ), + ); + } +} diff --git a/unit2/lib/screen/sos/request_sos.dart b/unit2/lib/screen/sos/request_sos.dart new file mode 100644 index 0000000..e284efd --- /dev/null +++ b/unit2/lib/screen/sos/request_sos.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:fluttericon/font_awesome5_icons.dart'; +import 'package:fluttericon/typicons_icons.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:unit2/screen/sos/components/mobile.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'package:unit2/utils/text_container.dart'; + +import '../../theme-data.dart/btn-style.dart'; +import '../../theme-data.dart/form-style.dart'; +import '../../utils/global.dart'; + +class RequestSOS extends StatefulWidget { + const RequestSOS({super.key}); + + @override + State createState() => _RequestSOSState(); +} + +class _RequestSOSState extends State { + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + appBar: AppBar( + centerTitle: true, + title: const Text(sOSTitle), + backgroundColor: second, + ), + body: SingleChildScrollView( + child: Container( + height: screenHeight * .89, + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 10), + child: Column( + children: [ + SizedBox( + height: blockSizeVertical * 2, + ), + SvgPicture.asset( + 'assets/svgs/request_sos.svg', + height: blockSizeVertical * 22, + allowDrawingOutsideViewBox: true, + ), + Mobile( + title: "09661548775", + subtitle: mobile1, + onPressed: () {}), + const Divider(), + Mobile( + title: "09661548775", + subtitle: mobile2, + onPressed: () {}), + const Divider(), + ListTile( + leading: const Icon( + Typicons.location, + color: second, + ), + title: Text("Latitude/Longitude"), + subtitle: Text( + currentLocation, + style: Theme.of(context).textTheme.caption, + ), + ), + FormBuilderTextField( + name: "message", + validator: FormBuilderValidators.compose([ + FormBuilderValidators.required( + errorText: "Message is required") + ]), + autovalidateMode: AutovalidateMode.onUserInteraction, + maxLines: 5, + decoration: normalTextFieldStyle("", "SOS message.."), + ), + Expanded( + child: SizedBox(), + ), + SizedBox( + width: double.infinity, + height: screenHeight * .06, + child: ElevatedButton( + style: secondaryBtnStyle( + second, Colors.transparent, Colors.white54), + child: const Text( + submit, + style: TextStyle(color: Colors.white), + ), + onPressed: () { + // if (_formKey.currentState.validate()) { + // _formKey.currentState.save(); + // BlocProvider.of(context) + // .add(UserWebLogin( + // password: password, + // username: username)); + // } + }, + ), + ), + ], + )), + ), + ), + ); + } +} diff --git a/unit2/lib/screen/sos/sos_received.dart b/unit2/lib/screen/sos/sos_received.dart new file mode 100644 index 0000000..8a2de78 --- /dev/null +++ b/unit2/lib/screen/sos/sos_received.dart @@ -0,0 +1,133 @@ +import 'package:animate_do/animate_do.dart'; +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:unit2/theme-data.dart/btn-style.dart'; +import 'package:unit2/utils/text_container.dart'; +import '../../theme-data.dart/colors.dart'; +import '../../utils/global.dart'; + +class SOSreceived extends StatelessWidget { + final Function onpressed; + const SOSreceived({required Key key, required this.onpressed}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 40, horizontal: 35), + height: screenHeight, + child: Stack( + children: [ + Positioned( + bottom: 0, + child: SizedBox( + width: screenWidth, + height: screenHeight / 2, + child: Opacity( + opacity: .2, + child: Image.asset( + "assets/emergency.png", + fit: BoxFit.cover, + ), + ), + )), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: blockSizeVertical * 6, + ), + Bounce( + from: 20, + infinite: true, + delay: const Duration(milliseconds: 800), + child: Stack( + alignment: AlignmentDirectional.topCenter, + children: [ + Container( + margin: const EdgeInsets.only(top: 20), + child: CircleAvatar( + radius: blockSizeVertical * 8, + backgroundColor: second, + child: Container( + margin: const EdgeInsets.only(top: 25), + child: SvgPicture.asset( + 'assets/sos.svg', + height: blockSizeHorizontal * 17, + color: Colors.white, + allowDrawingOutsideViewBox: true, + alignment: Alignment.bottomCenter, + ), + ), + ), + ), + Positioned( + top: blockSizeVertical * 3, + child: SpinKitPulse( + color: primary, + size: 120, + ), + ), + ], + ), + ), + const SizedBox(height: 16), + SlideInUp( + from: 50, + child: AutoSizeText( + "SOS Received!", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.displayMedium!.copyWith( + fontSize: 40, + color: third, + fontWeight: FontWeight.w500, + ), + ), + ), + const SizedBox( + height: 8, + ), + SlideInUp( + from: 50, + child: Container( + padding: const EdgeInsets.all(15), + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(15))), + child: AutoSizeText( + sOSReceivedMessage, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.caption!.copyWith( + fontSize: 16, + color: Colors.black87, + ), + ), + ), + ), + const SizedBox( + height: 40, + ), + Expanded(child: Container()), + SlideInUp( + child: SizedBox( + height: 50, + width: 200, + child: TextButton( + style: mainBtnStyle(second, Colors.transparent, second), + onPressed: () {}, + child: const Text("Cancel request", + style: TextStyle( + color: Colors.white, + )), + ), + ), + ) + ], + ), + ], + ), + ); + } +} diff --git a/unit2/lib/screen/unit2/homepage.dart/components/drawer-screen.dart b/unit2/lib/screen/unit2/homepage.dart/components/drawer-screen.dart new file mode 100644 index 0000000..4ffd092 --- /dev/null +++ b/unit2/lib/screen/unit2/homepage.dart/components/drawer-screen.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_zoom_drawer/config.dart'; +import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'menu-screen.dart'; +import '../module-screen.dart'; + +class DrawerScreen extends StatefulWidget { + const DrawerScreen({Key? key}) : super(key: key); + @override + State createState() => _DrawerScreenState(); +} + +class _DrawerScreenState extends State { + final zoomDrawerController = ZoomDrawerController(); + @override + Widget build(BuildContext context) { + return ZoomDrawer( + controller: zoomDrawerController, + menuScreen: const MenuScreen(), + mainScreen: const MainScreen(), + style: DrawerStyle.defaultStyle, + borderRadius: 24.0, + showShadow: false, + angle: -0.0, + slideWidth: MediaQuery.of(context).size.width * .90, + openCurve: Curves.fastOutSlowIn, + closeCurve: Curves.easeOut, + menuBackgroundColor: Colors.grey, + ); + } +} diff --git a/unit2/lib/screen/unit2/homepage.dart/components/empty_module.dart b/unit2/lib/screen/unit2/homepage.dart/components/empty_module.dart new file mode 100644 index 0000000..e7c9590 --- /dev/null +++ b/unit2/lib/screen/unit2/homepage.dart/components/empty_module.dart @@ -0,0 +1,53 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/container.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:unit2/theme-data.dart/text-styles.dart'; + +import '../../../../utils/global.dart'; +import '../../../../utils/text_container.dart'; + +class NoModule extends StatelessWidget { + const NoModule({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 25), + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SvgPicture.asset( + 'assets/svgs/no_module.svg', + height: blockSizeVertical * 30, + allowDrawingOutsideViewBox: true, + ), + const SizedBox( + height: 24, + ), + Text( + noModule, + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .displayLarge! + .copyWith(fontSize: blockSizeVertical * 5, height: .8), + ), + const SizedBox( + height: 5, + ), + Text( + noModuleSubTitle, + style: Theme.of(context) + .textTheme + .caption! + .copyWith(fontSize: blockSizeVertical * 1.5), + textAlign: TextAlign.center, + ) + ]), + ); + } +} diff --git a/unit2/lib/screen/unit2/homepage.dart/components/menu-screen.dart b/unit2/lib/screen/unit2/homepage.dart/components/menu-screen.dart new file mode 100644 index 0000000..f207fde --- /dev/null +++ b/unit2/lib/screen/unit2/homepage.dart/components/menu-screen.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'package:fluttericon/web_symbols_icons.dart'; +import 'package:fluttericon/typicons_icons.dart'; +import 'package:fluttericon/font_awesome5_icons.dart'; +import 'menu.dart'; +import '../../../../utils/global.dart'; + +class MenuScreen extends StatefulWidget { + const MenuScreen({Key? key}) : super(key: key); + + @override + State createState() => _MenuScreenState(); +} + +class _MenuScreenState extends State { + @override + Widget build(BuildContext context) { + return SafeArea( + child: Drawer( + child: SingleChildScrollView( + child: SizedBox( + height: blockSizeVertical * 96, + child: Column( + // ignore: prefer_const_literals_to_create_immutables + children: [ + const UserAccountsDrawerHeader( + decoration: BoxDecoration( + color: primary, + image: DecorationImage( + image: AssetImage('assets/pngs/bg.png'), + fit: BoxFit.cover)), + accountName: Text("ACUIN" ", " "RODOLFO" " " "BERNALIS"), + accountEmail: null, + currentAccountPicture: CircleAvatar( + radius: 40, + backgroundColor: fifth, + child: CircleAvatar( + radius: 33, + backgroundColor: third, + child: //Icon(Icons.person, size: 40, color: fifth), + Text( + "A", + style: TextStyle(fontSize: 45.0, color: fifth), + ), + ), + ), + ), + getTile(Typicons.user_outline, "Profile", 'profile', context), + const Divider(), + getTile(Typicons.home_outline, "Address", '/SelfAddressScreen', + context), + const Divider(), + getTile(Typicons.contacts, "Contact Number", + '/SelfContactScreen', context), + const Divider(), + getTile(Typicons.mail, "Email Address", '/SelfEmailAddScreen', + context), + const Divider(), + getTile(FontAwesome5.life_ring, "Request SOS", 'request-sos', + context), + const Divider(), + Expanded( + child: Align( + alignment: FractionalOffset.bottomLeft, + child: getTile(WebSymbols.logout, "Logout", '/', context), + )), + ], + ), + ), + ), + ), + ); + } +} diff --git a/unit2/lib/screen/unit2/homepage.dart/components/menu.dart b/unit2/lib/screen/unit2/homepage.dart/components/menu.dart new file mode 100644 index 0000000..204fdd0 --- /dev/null +++ b/unit2/lib/screen/unit2/homepage.dart/components/menu.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart'; +import 'package:go_router/go_router.dart'; + +import '../../../../theme-data.dart/colors.dart'; + +Widget getTile( + IconData icondata, String title, String route, BuildContext context) { + return ListTile( + dense: true, + leading: Icon( + icondata, + color: primary, + ), + title: Text( + title, + style: const TextStyle(color: Colors.black), + ), + onTap: () async { + debugPrint(title); + ZoomDrawer.of(context)!.toggle(); + context.goNamed(route); + }, + ); +} diff --git a/unit2/lib/screen/unit2/homepage.dart/module-screen.dart b/unit2/lib/screen/unit2/homepage.dart/module-screen.dart index f55a9c9..96b7a99 100644 --- a/unit2/lib/screen/unit2/homepage.dart/module-screen.dart +++ b/unit2/lib/screen/unit2/homepage.dart/module-screen.dart @@ -1,16 +1,53 @@ -import 'package:flutter/src/widgets/container.dart'; -import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'package:unit2/utils/text_container.dart'; -class ModuleScreen extends StatefulWidget { - const ModuleScreen({super.key}); +import 'components/empty_module.dart'; + +class MainScreen extends StatefulWidget { + const MainScreen({Key? key}) : super(key: key); @override - State createState() => _ModuleScreenState(); + State createState() => _MainScreenState(); } -class _ModuleScreenState extends State { +class _MainScreenState extends State { + bool hasModule = false; @override Widget build(BuildContext context) { - return Container(); + return WillPopScope( + onWillPop: () async { + return Future.value(true); + }, + child: SafeArea( + child: Scaffold( + appBar: AppBar( + backgroundColor: primary, + leading: IconButton( + onPressed: () { + ZoomDrawer.of(context)!.toggle(); + }, + icon: const Icon( + Icons.menu, + color: Colors.white, + ), + ), + centerTitle: true, + title: const Text( + unit2ModuleScreen, + style: TextStyle( + fontSize: 18.0, + color: Colors.white, + ), + ), + ), + body: hasModule + ? const Center( + child: Text('Main Screen'), + ) + : const NoModule(), + )), + ); } -} \ No newline at end of file +} diff --git a/unit2/lib/screen/unit2/login/login.dart b/unit2/lib/screen/unit2/login/login.dart index 4dc993e..31da7a8 100644 --- a/unit2/lib/screen/unit2/login/login.dart +++ b/unit2/lib/screen/unit2/login/login.dart @@ -3,6 +3,8 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:go_router/go_router.dart'; +import 'package:unit2/utils/text_container.dart'; import '../../../widgets/wave.dart'; import '../../../utils/global.dart'; import '../../../theme-data.dart/colors.dart'; @@ -53,12 +55,12 @@ class _UniT2LoginState extends State { ), Text( - "Welcome to!", + welcome, style: TextStyle( fontSize: blockSizeVertical * 5, fontWeight: FontWeight.w600), ), - Text("uniT-App", + Text(unitApp, style: TextStyle( fontSize: blockSizeVertical * 8, fontWeight: FontWeight.w800, @@ -66,7 +68,7 @@ class _UniT2LoginState extends State { height: 1, color: primary)), Text( - "Please login to continue.", + loginToContinue, style: TextStyle( fontSize: blockSizeVertical * 2, height: 1.5, @@ -78,10 +80,8 @@ class _UniT2LoginState extends State { // USERNAME FormBuilderTextField( name: 'username', - validator: FormBuilderValidators.compose([ - FormBuilderValidators.required( - errorText: "Username is required") - ]), + validator: FormBuilderValidators.required( + errorText: "Username is required"), autofocus: false, style: const TextStyle( fontWeight: FontWeight.bold, @@ -93,10 +93,9 @@ class _UniT2LoginState extends State { // PASSWORD FormBuilderTextField( name: 'password', - validator: FormBuilderValidators.compose([ - FormBuilderValidators.required( - errorText: "Password is required") - ]), + validator: FormBuilderValidators.required( + errorText: "Password is required"), + // initialValue: state.password, onChanged: (value) { value!.isEmpty @@ -155,20 +154,14 @@ class _UniT2LoginState extends State { child: SizedBox( width: MediaQuery.of(context).size.width, child: ElevatedButton( - style: btnStyle( + style: mainBtnStyle( second, Colors.transparent, Colors.white54), child: const Text( "LOGIN", style: TextStyle(color: Colors.white), ), - onPressed: () async { - if (_formKey.currentState! - .saveAndValidate()) { - debugPrint( - _formKey.currentState!.value['name']); - debugPrint(_formKey - .currentState!.value['password']); - } + onPressed: () { + context.go(context.namedLocation('home')); // if (_formKey.currentState.validate()) { // _formKey.currentState.save(); // BlocProvider.of(context) @@ -189,14 +182,14 @@ class _UniT2LoginState extends State { child: SizedBox( width: MediaQuery.of(context).size.width, child: ElevatedButton.icon( - style: btnStyle(Colors.white, second, + style: mainBtnStyle(Colors.white, second, primary.withOpacity(.4)), icon: const Icon( Icons.qr_code, color: second, ), label: const Text( - "Login via QR code", + loginViaQr, style: TextStyle(color: second), ), onPressed: () async { @@ -208,8 +201,7 @@ class _UniT2LoginState extends State { SizedBox( height: blockSizeVertical * 1, ), - const LoginViaQr( - text: " Request Emergency Response "), + const LoginViaQr(text: emergencyReponseLabel), SizedBox( height: blockSizeVertical * 1, ), @@ -222,13 +214,14 @@ class _UniT2LoginState extends State { FontAwesome5.life_ring, color: Colors.white, ), - style: btnStyle( + style: mainBtnStyle( third, Colors.transparent, Colors.white38), onPressed: () { - Navigator.pushNamed(context, '/SosScreen'); + context + .go(context.namedLocation('add-mobile')); }, label: const Text( - "Request SOS", + requestSOS, style: TextStyle(color: Colors.white), )), ) diff --git a/unit2/lib/screen/unit2/profile/components/cover-image.dart b/unit2/lib/screen/unit2/profile/components/cover-image.dart new file mode 100644 index 0000000..5ce6aaf --- /dev/null +++ b/unit2/lib/screen/unit2/profile/components/cover-image.dart @@ -0,0 +1,20 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; + +class CoverImage extends StatelessWidget { + const CoverImage({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey, + child: CachedNetworkImage( + imageUrl: + 'https://static.vecteezy.com/system/resources/thumbnails/008/074/253/small/tropical-forest-sunset-nature-background-with-coconut-trees-vector.jpg', + width: double.infinity, + height: 220, + fit: BoxFit.cover, + ), + ); + } +} \ No newline at end of file diff --git a/unit2/lib/screen/unit2/profile/profile.dart b/unit2/lib/screen/unit2/profile/profile.dart new file mode 100644 index 0000000..5803e2f --- /dev/null +++ b/unit2/lib/screen/unit2/profile/profile.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:fluttericon/font_awesome5_icons.dart'; +import 'package:go_router/go_router.dart'; +import './components/cover-image.dart'; + +class Profile extends StatelessWidget { + const Profile({super.key}); + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: () async { + return Future.value(true); + }, + child: SafeArea( + child: Scaffold( + body: Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + const CoverImage(), + const Positioned(top: 125, child: BuildProfileImage()), + Positioned( + top: 10, + left: 20, + child: IconButton( + onPressed: () { + context.go(context.namedLocation('home')); + }, + icon: const Icon( + FontAwesome5.arrow_left, + size: 24, + color: Colors.white, + ), + )), + ], + ), + ), + ), + ); + } +} + +class BuildInformation extends StatelessWidget { + const BuildInformation({super.key}); + @override + Widget build(BuildContext context) { + return Column( + children: [ + const SizedBox( + height: 8, + ), + Text( + "Rodolfo Bernales Acuin", + style: Theme.of(context) + .textTheme + .headline5! + .copyWith(fontWeight: FontWeight.bold), + ), + Row( + children: [ + Icon( + FontAwesome5.birthday_cake, + color: Colors.blueAccent, + ), + const SizedBox( + width: 20, + ), + Text( + "july 14, 1994 | Male", + style: + Theme.of(context).textTheme.caption!.copyWith(fontSize: 22), + ), + ], + ), + ], + ); + } +} + +class BuildProfileImage extends StatelessWidget { + const BuildProfileImage({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Stack( + alignment: Alignment.center, + children: [ + CircleAvatar( + radius: 85, + backgroundColor: Colors.white, + ), + CircleAvatar( + radius: 80, + backgroundColor: Colors.grey.shade800, + child: SvgPicture.asset( + 'assets/svgs/male.svg', + ), + ), + ], + ), + BuildInformation(), + ], + ); + } +} diff --git a/unit2/lib/theme-data.dart/btn-style.dart b/unit2/lib/theme-data.dart/btn-style.dart index 998f54d..89f7e86 100644 --- a/unit2/lib/theme-data.dart/btn-style.dart +++ b/unit2/lib/theme-data.dart/btn-style.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -ButtonStyle btnStyle(Color background, Color borderColor, Color overlay) { +ButtonStyle mainBtnStyle(Color background, Color borderColor, Color overlay) { return ButtonStyle( elevation: MaterialStateProperty.all(0), backgroundColor: MaterialStateProperty.all(background), @@ -13,3 +13,18 @@ ButtonStyle btnStyle(Color background, Color borderColor, Color overlay) { color: borderColor, )))); } + +ButtonStyle secondaryBtnStyle( + Color background, Color borderColor, Color overlay) { + return ButtonStyle( + elevation: MaterialStateProperty.all(0), + backgroundColor: MaterialStateProperty.all(background), + overlayColor: MaterialStateProperty.all(overlay), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + side: BorderSide( + width: 2, + color: borderColor, + )))); +} diff --git a/unit2/lib/theme-data.dart/form-style.dart b/unit2/lib/theme-data.dart/form-style.dart index 2f339a1..6fbcc4c 100644 --- a/unit2/lib/theme-data.dart/form-style.dart +++ b/unit2/lib/theme-data.dart/form-style.dart @@ -1,5 +1,53 @@ import 'package:flutter/material.dart'; +InputDecoration normalTextFieldStyle(String labelText, String hintText) { + return InputDecoration( + contentPadding: EdgeInsets.fromLTRB(12, 6, 6, 6), + floatingLabelBehavior: FloatingLabelBehavior.auto, + labelText: labelText, + labelStyle: const TextStyle(color: Colors.grey), + hintText: hintText, + hintStyle: const TextStyle( + color: Colors.grey, + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + width: 1, + color: Colors.black87, + ), + borderRadius: BorderRadius.circular(5), + ), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Colors.grey, + width: 1, + ), + borderRadius: BorderRadius.circular(5), + ), + disabledBorder: OutlineInputBorder( + borderSide: const BorderSide( + width: 1, + color: Colors.grey, + ), + borderRadius: BorderRadius.circular(5), + ), + errorBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors.red, + width: 1, + ), + borderRadius: BorderRadius.all(Radius.circular(5)), + ), + focusedErrorBorder: const OutlineInputBorder( + borderSide: BorderSide( + color: Colors.red, + width: 1, + ), + borderRadius: BorderRadius.all(Radius.circular(5)), + ), + filled: false); +} + InputDecoration loginTextFieldStyle() { return InputDecoration( floatingLabelBehavior: FloatingLabelBehavior.never, @@ -37,4 +85,4 @@ InputDecoration loginTextFieldStyle() { borderRadius: BorderRadius.all(Radius.circular(5)), ), filled: false); -} \ No newline at end of file +} diff --git a/unit2/lib/theme-data.dart/text-styles.dart b/unit2/lib/theme-data.dart/text-styles.dart new file mode 100644 index 0000000..7ad4888 --- /dev/null +++ b/unit2/lib/theme-data.dart/text-styles.dart @@ -0,0 +1,7 @@ +import 'package:flutter/material.dart'; +import 'package:unit2/utils/global.dart'; + +TextStyle titleTextStyle() { + return TextStyle( + fontSize: blockSizeVertical * 2.5, fontWeight: FontWeight.w500); +} diff --git a/unit2/lib/utils/router.dart b/unit2/lib/utils/router.dart index 98a746a..7794074 100644 --- a/unit2/lib/utils/router.dart +++ b/unit2/lib/utils/router.dart @@ -1,11 +1,36 @@ import 'package:go_router/go_router.dart'; +import '../screen/sos/add_mobile.dart'; +import '../screen/sos/request_sos.dart'; import '../screen/unit2/login/login.dart'; +import '../screen/unit2/homepage.dart/components/drawer-screen.dart'; +import '../screen/unit2/profile/profile.dart'; - -final GoRouter goRouter = GoRouter( - routes: [ - GoRoute(path: '/', - builder: (context,state) => const UniT2Login() - ) - ] -); \ No newline at end of file +final GoRouter goRouter = GoRouter(routes: [ + GoRoute( + path: '/', + name: 'login', + builder: (context, state) => const UniT2Login(), + routes: [ + GoRoute( + name: 'home', + path: 'home', + builder: (context, state) => const DrawerScreen(), + routes: [ + GoRoute( + name: 'profile', + path: 'profile', + builder: (context, state) => const Profile()) + ]), + GoRoute( + name: 'add-mobile', + path: 'add-moble', + builder: (context, state) => AddMobile(), + routes: [ + GoRoute( + name: 'request-sos', + path: 'request-sos', + builder: (context, state) => const RequestSOS(), + ) + ]), + ]), +]); diff --git a/unit2/lib/utils/screen_info.dart b/unit2/lib/utils/screen_info.dart new file mode 100644 index 0000000..a536655 --- /dev/null +++ b/unit2/lib/utils/screen_info.dart @@ -0,0 +1,9 @@ +import 'package:unit2/utils/global.dart'; + +bool isMobile() { + if (screenWidth > 500.00) { + return false; + } else { + return true; + } +} diff --git a/unit2/lib/utils/text_container.dart b/unit2/lib/utils/text_container.dart new file mode 100644 index 0000000..a214c0b --- /dev/null +++ b/unit2/lib/utils/text_container.dart @@ -0,0 +1,23 @@ +const String addMobile = "Enter your mobile number(s)"; +const String addMobileCaption = + "These mobile numbers will be used to contact you if you request an emergency response. Please provide at least one active number"; +const String mobileNumberRequired = "You must add atleast one mobile"; +const String numericValidator = "Please a number only"; +const String mobile1 = "Mobile number 1"; +const String mobile2 = "Mobile number 2"; +const String currentLocation = "You current location"; +const String noModule = "No Module Assigned"; +const String noModuleSubTitle = + "Please contact the admin if you want to access a module."; +const String submit = "SUBMIT"; +const String login = "LOGIN"; +const String sOSTitle = "Request SOS"; +const String sOSReceivedMessage = + "your SOS request has been received. Please wait for respondent's acknowledgement."; +const String unit2ModuleScreen = "uniT2 Modules"; +const String welcome = "Welcome to!"; +const String unitApp = 'uniT-App'; +const String loginToContinue = "Please login to continue."; +const String loginViaQr = "Login via QR code"; +const String emergencyReponseLabel = " Request Emergency Response "; +const String requestSOS = "Request SOS"; \ No newline at end of file diff --git a/unit2/lib/utils/validators.dart b/unit2/lib/utils/validators.dart new file mode 100644 index 0000000..704e733 --- /dev/null +++ b/unit2/lib/utils/validators.dart @@ -0,0 +1,12 @@ +import 'package:form_builder_validators/form_builder_validators.dart'; +import '../utils/text_container.dart'; + + +final mobileNumberValidator = FormBuilderValidators.compose([ + FormBuilderValidators.required( + errorText: mobileNumberRequired), + FormBuilderValidators.numeric( + errorText: numericValidator) + ]); + + diff --git a/unit2/macos/Flutter/GeneratedPluginRegistrant.swift b/unit2/macos/Flutter/GeneratedPluginRegistrant.swift index 287b6a9..e9cf192 100644 --- a/unit2/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/unit2/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,12 @@ import FlutterMacOS import Foundation +import path_provider_macos import shared_preferences_macos +import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/unit2/pubspec.lock b/unit2/pubspec.lock index cd07b24..06adf03 100644 --- a/unit2/pubspec.lock +++ b/unit2/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + animate_do: + dependency: "direct main" + description: + name: animate_do + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" async: dependency: transitive description: @@ -8,6 +15,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.9.0" + auto_size_text: + dependency: "direct main" + description: + name: auto_size_text + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0" boolean_selector: dependency: transitive description: @@ -15,6 +29,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.3" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" characters: dependency: transitive description: @@ -36,6 +71,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.16.0" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -83,6 +125,20 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_blurhash: + dependency: transitive + description: + name: flutter_blurhash + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" flutter_custom_clippers: dependency: "direct main" description: @@ -109,6 +165,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_spinkit: + dependency: "direct main" + description: + name: flutter_spinkit + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.0" flutter_svg: dependency: "direct main" description: @@ -167,7 +230,21 @@ packages: name: go_router url: "https://pub.dartlang.org" source: hosted - version: "5.2.0" + version: "3.1.1" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.5" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.2" intl: dependency: transitive description: @@ -231,6 +308,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + octo_image: + dependency: transitive + description: + name: octo_image + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" path: dependency: transitive description: @@ -252,6 +336,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.22" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" path_provider_linux: dependency: transitive description: @@ -259,6 +364,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.7" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: @@ -273,6 +385,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.3" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.1" petitparser: dependency: transitive description: @@ -308,6 +427,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.0.4" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.7" shared_preferences: dependency: transitive description: @@ -376,6 +502,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.9.0" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.0+2" stack_trace: dependency: transitive description: @@ -397,6 +537,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.1" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0+3" term_glyph: dependency: transitive description: @@ -411,6 +558,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.4.12" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.7" vector_math: dependency: transitive description: diff --git a/unit2/pubspec.yaml b/unit2/pubspec.yaml index 21b322e..af6129a 100644 --- a/unit2/pubspec.yaml +++ b/unit2/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - go_router: ^5.2.0 + go_router: ^3.0.6 flutter_custom_clippers: ^2.0.0 flutter_svg: ^1.1.6 flutter_form_builder: ^7.7.0 @@ -45,6 +45,10 @@ dependencies: fluttertoast: ^8.1.1 device_preview: ^1.1.0 flutter_zoom_drawer: ^3.0.3 + cached_network_image: ^3.2.3 + auto_size_text: ^3.0.0 + animate_do: ^3.0.2 + flutter_spinkit: ^5.1.0 dev_dependencies: flutter_test: