diff --git a/assets/customer_background.webp b/assets/customer_background.webp new file mode 100644 index 0000000..4fb10d6 Binary files /dev/null and b/assets/customer_background.webp differ diff --git a/lib/blocs/language/functions/bloc_getlanguage.dart b/lib/blocs/language/functions/bloc_getlanguage.dart new file mode 100644 index 0000000..86181fe --- /dev/null +++ b/lib/blocs/language/functions/bloc_getlanguage.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/language/language_bloc.dart'; +import 'package:pharmacy_mobile/blocs/language/language_event.dart'; + +Future blocGetLanguage(BuildContext context) async { + try { + final languageBloc = context.read(); + languageBloc.add(LanguageGetValue()); + return languageBloc.state.value; + } catch (e) { + return ''; + } +} diff --git a/lib/blocs/language/functions/bloc_setlanguage.dart b/lib/blocs/language/functions/bloc_setlanguage.dart new file mode 100644 index 0000000..351a409 --- /dev/null +++ b/lib/blocs/language/functions/bloc_setlanguage.dart @@ -0,0 +1,14 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/language/language_bloc.dart'; +import 'package:pharmacy_mobile/blocs/language/language_event.dart'; + +Future blocSetLanguage(BuildContext context, String value) async { + try { + final languageBloc = context.read(); + languageBloc.add(LanguageSetValue(value)); + return true; + } catch (e) { + return false; + } +} diff --git a/lib/blocs/language/language_bloc.dart b/lib/blocs/language/language_bloc.dart new file mode 100644 index 0000000..3dba17c --- /dev/null +++ b/lib/blocs/language/language_bloc.dart @@ -0,0 +1,14 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pharmacy_mobile/blocs/language/language_event.dart'; +import 'package:pharmacy_mobile/blocs/language/language_state.dart'; + +class LanguageBloc extends Bloc { + LanguageBloc() : super(LanguageState('')) { + on((event, emit) { + emit(LanguageState(event.value)); + }); + on((event, emit) { + emit(state); + }); + } +} diff --git a/lib/blocs/language/language_event.dart b/lib/blocs/language/language_event.dart new file mode 100644 index 0000000..5f0a0d0 --- /dev/null +++ b/lib/blocs/language/language_event.dart @@ -0,0 +1,8 @@ +abstract class LanguageEvent {} + +class LanguageSetValue extends LanguageEvent { + final String value; + LanguageSetValue(this.value); +} + +class LanguageGetValue extends LanguageEvent {} diff --git a/lib/blocs/language/language_state.dart b/lib/blocs/language/language_state.dart new file mode 100644 index 0000000..9a85c8a --- /dev/null +++ b/lib/blocs/language/language_state.dart @@ -0,0 +1,5 @@ +class LanguageState { + final String value; + + LanguageState(this.value); +} diff --git a/lib/functions/getlanguage_function.dart b/lib/functions/getlanguage_function.dart new file mode 100644 index 0000000..1229794 --- /dev/null +++ b/lib/functions/getlanguage_function.dart @@ -0,0 +1,7 @@ +import 'package:flutter/widgets.dart'; +import 'package:pharmacy_mobile/blocs/language/functions/bloc_getlanguage.dart'; + +Future getLanguage(BuildContext context) async { + final language = await blocGetLanguage(context); + return language; +} diff --git a/lib/main.dart b/lib/main.dart index 8d82781..21f83c9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,6 +8,7 @@ import 'package:pharmacy_mobile/blocs/caches/medicinelist/medicinelist_cache_blo import 'package:pharmacy_mobile/blocs/caches/stocklist/stocklist_cache_bloc.dart'; import 'package:pharmacy_mobile/blocs/caches/typelist/typelist_cache_bloc.dart'; import 'package:pharmacy_mobile/blocs/guest/guest_bloc.dart'; +import 'package:pharmacy_mobile/blocs/language/language_bloc.dart'; import 'package:pharmacy_mobile/blocs/user/user_bloc.dart'; import 'package:pharmacy_mobile/pages/add_category_page.dart'; import 'package:pharmacy_mobile/pages/add_generics_page.dart'; @@ -163,6 +164,9 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => StockListBloc(), ), + BlocProvider( + create: (context) => LanguageBloc(), + ), ], child: MaterialApp.router( debugShowCheckedModeBanner: false, diff --git a/lib/pages/customer_page.dart b/lib/pages/customer_page.dart index 21bf698..5f93330 100644 --- a/lib/pages/customer_page.dart +++ b/lib/pages/customer_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:pharmacy_mobile/blocs/language/functions/bloc_setlanguage.dart'; import 'package:pharmacy_mobile/pages/customer_pages/customer_cart_page.dart'; import 'package:pharmacy_mobile/pages/customer_pages/customer_main_page.dart'; import 'package:pharmacy_mobile/pages/customer_pages/customer_settings_page.dart'; @@ -18,7 +19,23 @@ class _CustomerPageState extends State { final _pageController = PageController(initialPage: 0); final NotchBottomBarController _notchController = NotchBottomBarController(index: 0); - void sample() {} + Future _setDefault() async { + final language = await blocSetLanguage(context, 'English'); + + if (language) { + setState(() {}); + } + } + + void autoRun() async { + await _setDefault(); + } + + @override + void initState() { + autoRun(); + super.initState(); + } @override Widget build(BuildContext context) { diff --git a/lib/pages/customer_pages/customer_cart_page.dart b/lib/pages/customer_pages/customer_cart_page.dart index db8c00c..9aecf80 100644 --- a/lib/pages/customer_pages/customer_cart_page.dart +++ b/lib/pages/customer_pages/customer_cart_page.dart @@ -152,17 +152,16 @@ class _CustomerCartPageState extends State { const Gap(16), const TextWidget( text: 'Cart is disabled for guests', - size: 16, + size: 12, ), - const Gap(8), + const Gap(32), const TextWidget( text: 'Please login', - size: 32, + size: 20, ), - const Gap(8), const TextWidget( text: 'to use your cart', - size: 24, + size: 16, ), const Gap(32), Padding( diff --git a/lib/pages/customer_pages/customer_main_page.dart b/lib/pages/customer_pages/customer_main_page.dart index b339c12..098727d 100644 --- a/lib/pages/customer_pages/customer_main_page.dart +++ b/lib/pages/customer_pages/customer_main_page.dart @@ -18,6 +18,7 @@ class _CustomerMainPageState extends State { Widget build(BuildContext context) { return Scaffold( body: CustomerPagebackgroundWidget( + height: MediaQuery.of(context).size.height * 1.4, child: Column( children: [ const Gap(68), diff --git a/lib/pages/customer_pages/customer_settings_page.dart b/lib/pages/customer_pages/customer_settings_page.dart index e31b3fa..b5e1a1b 100644 --- a/lib/pages/customer_pages/customer_settings_page.dart +++ b/lib/pages/customer_pages/customer_settings_page.dart @@ -3,6 +3,7 @@ import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:pharmacy_mobile/auth/auth_service.dart'; import 'package:pharmacy_mobile/blocs/guest/functions/bloc_getgueststatus.dart'; +import 'package:pharmacy_mobile/functions/getlanguage_function.dart'; import 'package:pharmacy_mobile/widgets/button_widget.dart'; import 'package:pharmacy_mobile/widgets/customer_pagebackground_widget.dart'; import 'package:pharmacy_mobile/widgets/customer_title_widget.dart'; @@ -22,6 +23,7 @@ class _CustomerSettingsPageState extends State { late String currentName = ''; late bool _isGuest = false; + late String currentLanguage = ''; void _signOut() async { // ignore: use_build_context_synchronously @@ -38,6 +40,13 @@ class _CustomerSettingsPageState extends State { return username ?? ''; } + void gotoSettings() async { + final changed = await context.push('/languagesetting'); + if (changed == true) { + setState(() {}); + } + } + void autoRun() async { final guest = await _checkGuest(); if (guest) { @@ -45,7 +54,8 @@ class _CustomerSettingsPageState extends State { } else { currentName = await _getUsername(); } - + // ignore: use_build_context_synchronously + currentLanguage = await getLanguage(context); setState(() {}); } @@ -69,10 +79,7 @@ class _CustomerSettingsPageState extends State { const TextWidget(text: 'Settings'), const Gap(16), SettingWidget( - icon: Icons.language, - title: 'Language', - value: 'English', - onPressed: () => context.push('/languagesetting')), + icon: Icons.language, title: 'Language', value: currentLanguage, onPressed: () => gotoSettings()), const Gap(8), SettingWidget( icon: Icons.person, diff --git a/lib/pages/settings_pages/language_setting_page.dart b/lib/pages/settings_pages/language_setting_page.dart index ace02d7..840f0a3 100644 --- a/lib/pages/settings_pages/language_setting_page.dart +++ b/lib/pages/settings_pages/language_setting_page.dart @@ -1,13 +1,33 @@ import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; +import 'package:pharmacy_mobile/functions/getlanguage_function.dart'; import 'package:pharmacy_mobile/widgets/customer_pagebackground_widget.dart'; import 'package:pharmacy_mobile/widgets/customer_title_widget.dart'; import 'package:pharmacy_mobile/widgets/settings_menu_widget.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart'; -class LanguageSettingPage extends StatelessWidget { +class LanguageSettingPage extends StatefulWidget { const LanguageSettingPage({super.key}); + @override + State createState() => _LanguageSettingPageState(); +} + +class _LanguageSettingPageState extends State { + final languageList = ['English', 'Tagalog', 'Hilogaynon (Ilonggo)', 'Cebuano (Bisaya)']; + late String currentLanguage = ''; + + void autoRun() async { + currentLanguage = await getLanguage(context); + setState(() {}); + } + + @override + void initState() { + autoRun(); + super.initState(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -19,7 +39,18 @@ class LanguageSettingPage extends StatelessWidget { const Gap(32), const TextWidget(text: 'Language'), const Gap(16), - SettingsMenuWidget() + SettingsMenuWidget( + title: 'Current', + value: currentLanguage, + ), + const Gap(16), + SettingsMenuWidget( + title: 'Other Options', + value: currentLanguage, + isSelection: true, + selectionList: languageList, + selectionFor: 'Language', + ) ], )), ); diff --git a/lib/widgets/customer_pagebackground_widget.dart b/lib/widgets/customer_pagebackground_widget.dart index e1829ef..77827fd 100644 --- a/lib/widgets/customer_pagebackground_widget.dart +++ b/lib/widgets/customer_pagebackground_widget.dart @@ -21,15 +21,16 @@ class CustomerPagebackgroundWidget extends StatelessWidget { height: height ?? MediaQuery.of(context).size.height + 200, decoration: BoxDecoration( image: DecorationImage( - image: AssetImage( - page == 'login' - ? 'assets/login_background.webp' - : page == 'register' - ? 'assets/register_background.webp' - : page == 'menu' - ? 'assets/menu_background.webp' - : 'assets/background.webp', - ), + // image: AssetImage( + // page == 'login' + // ? 'assets/login_background.webp' + // : page == 'register' + // ? 'assets/register_background.webp' + // : page == 'menu' + // ? 'assets/menu_background.webp' + // : 'assets/background.webp', + // ), + image: AssetImage('assets/customer_background.webp'), fit: BoxFit.cover, // Ensures the background covers the entire container alignment: Alignment.center, opacity: 0.1, // Adjusts the opacity as needed @@ -37,8 +38,8 @@ class CustomerPagebackgroundWidget extends StatelessWidget { gradient: RadialGradient( tileMode: TileMode.clamp, colors: [ - Color.fromRGBO(19, 8, 26, 1), - Color.fromRGBO(43, 22, 60, 1), + Color.fromRGBO(15, 6, 20, 1), + Color.fromRGBO(23, 12, 32, 1), ], ), ), diff --git a/lib/widgets/indicator_widget.dart b/lib/widgets/indicator_widget.dart index 0c489b4..e47ef3a 100644 --- a/lib/widgets/indicator_widget.dart +++ b/lib/widgets/indicator_widget.dart @@ -11,18 +11,31 @@ class IndicatorWidget extends StatelessWidget { return Row( mainAxisAlignment: MainAxisAlignment.start, children: [ + // Container( + // height: 24, + // padding: EdgeInsets.symmetric(horizontal: 16), + // decoration: BoxDecoration( + // border: Border.all(color: color ?? const Color.fromRGBO(249, 249, 249, 1), width: 1), + // borderRadius: BorderRadius.circular(20), + // color: color ?? const Color.fromRGBO(249, 249, 249, 1)), + // alignment: Alignment.center, // Center the text within the container + // child: TextWidget( + // text: text, + // size: 12, + // color: const Color.fromRGBO(0, 0, 0, 1), + // ), + // ), Container( - height: 24, - padding: EdgeInsets.symmetric(horizontal: 16), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 4), decoration: BoxDecoration( - border: Border.all(color: color ?? const Color.fromRGBO(249, 249, 249, 1), width: 1), + // border: Border.all(color: color ?? const Color.fromRGBO(7, 5, 7, 0.783), width: 1), borderRadius: BorderRadius.circular(20), - color: color ?? const Color.fromRGBO(249, 249, 249, 1)), + color: color ?? const Color.fromRGBO(28, 10, 28, 0.894)), alignment: Alignment.center, // Center the text within the container child: TextWidget( text: text, size: 12, - color: const Color.fromRGBO(0, 0, 0, 1), + color: const Color.fromARGB(255, 255, 255, 255), ), ), ], diff --git a/lib/widgets/setting_widget.dart b/lib/widgets/setting_widget.dart index b52a83c..9961442 100644 --- a/lib/widgets/setting_widget.dart +++ b/lib/widgets/setting_widget.dart @@ -15,7 +15,7 @@ class SettingWidget extends StatelessWidget { return Container( padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), decoration: BoxDecoration( - color: const Color.fromRGBO(39, 20, 36, 0.66), + color: const Color.fromRGBO(28, 17, 32, 0.678), border: Border.all(color: const Color.fromRGBO(74, 74, 74, 0.127)), borderRadius: BorderRadius.circular(8.0)), child: SizedBox( diff --git a/lib/widgets/settings_menu_widget.dart b/lib/widgets/settings_menu_widget.dart index bd4f9da..55769b6 100644 --- a/lib/widgets/settings_menu_widget.dart +++ b/lib/widgets/settings_menu_widget.dart @@ -1,24 +1,73 @@ import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; +import 'package:go_router/go_router.dart'; +import 'package:pharmacy_mobile/blocs/language/functions/bloc_setlanguage.dart'; import 'package:pharmacy_mobile/widgets/text_widget.dart'; -class SettingsMenuWidget extends StatefulWidget { - const SettingsMenuWidget({super.key}); +class SettingsMenuWidget extends StatelessWidget { + final String title; + final String value; + final bool? isSelection; + final List selectionList; + final String selectionFor; - @override - State createState() => _SettingsMenuWidgetState(); -} + const SettingsMenuWidget({ + super.key, + required this.title, + required this.value, + this.isSelection = false, + this.selectionList = const [], + this.selectionFor = '', + }); -class _SettingsMenuWidgetState extends State { @override Widget build(BuildContext context) { + void setNewValue(String newValue) async { + switch (selectionFor) { + case 'Language': + final language = await blocSetLanguage(context, newValue); + if (language) { + // ignore: use_build_context_synchronously + context.pop(true); + } + break; + + default: + break; + } + } + return Container( padding: const EdgeInsets.all(16), - width: MediaQuery.of(context).size.width * 0.9, - decoration: BoxDecoration(color: const Color.fromRGBO(28, 17, 32, 0.678), borderRadius: BorderRadius.circular(8.0)), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [TextWidget(text: 'Current', size: 8,), TextWidget(text: 'text')], - ), + width: MediaQuery.of(context).size.width, + decoration: + BoxDecoration(color: const Color.fromRGBO(28, 17, 32, 0.678), borderRadius: BorderRadius.circular(8.0)), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + TextWidget( + text: title, + size: 8, + ), + const Gap(8), + if (isSelection!) + Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ + const Gap(8), + for (var item in selectionList) + GestureDetector( + onTap: () => setNewValue(item), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8), + child: TextWidget(text: item, size: 12, color: const Color.fromRGBO(255, 255, 255, 1)), + ), + ), + const Gap(8), + ]) + else + TextWidget( + text: value, + size: 12, + bold: true, + ), + ]), ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 9a6416d..0f6450a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,6 +52,7 @@ flutter: - assets/background.webp - assets/login_background.webp - assets/register_background.webp + - assets/customer_background.webp - assets/menu_background.webp - assets/ofa_logo.webp - assets/php_logo.webp