diff --git a/lib/core/routes/app_shell/desktop_shell_page.dart b/lib/core/routes/app_shell/desktop_shell_page.dart index f234f1d..e6478ed 100644 --- a/lib/core/routes/app_shell/desktop_shell_page.dart +++ b/lib/core/routes/app_shell/desktop_shell_page.dart @@ -28,6 +28,7 @@ class DesktopShellPage extends StatelessWidget { return Container( height: 64, decoration: BoxDecoration( + color: AppColors.backgroundColor, border: Border(bottom: BorderSide(color: AppColors.grey30)), ), diff --git a/lib/core/routes/app_shell/tablet_shell_page.dart b/lib/core/routes/app_shell/tablet_shell_page.dart index a4c346e..1c8b6fc 100644 --- a/lib/core/routes/app_shell/tablet_shell_page.dart +++ b/lib/core/routes/app_shell/tablet_shell_page.dart @@ -29,6 +29,7 @@ class TabletShellPage extends StatelessWidget { height: 64.0.h(), padding: EdgeInsets.symmetric(horizontal: 24.0.w()), decoration: BoxDecoration( + color: AppColors.backgroundColor, border: Border( bottom: BorderSide(color: AppColors.grey30, width: 1), ), diff --git a/lib/view_models/auth_view_model.dart b/lib/view_models/auth_view_model.dart index 0b2ba07..47e08af 100644 --- a/lib/view_models/auth_view_model.dart +++ b/lib/view_models/auth_view_model.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; + import '../core/utils/result.dart'; import '../data/models/user_model.dart'; import '../data/repositories/auth_repository.dart'; @@ -7,7 +8,7 @@ class AuthViewModel with ChangeNotifier { final AuthRepository _authRepository; AuthViewModel({required AuthRepository authRepository}) - : _authRepository = authRepository { + : _authRepository = authRepository { usernameController.addListener(_onTextChanged); passwordController.addListener(_onTextChanged); usernameFocus.addListener(_onTextChanged); @@ -22,8 +23,7 @@ class AuthViewModel with ChangeNotifier { bool _obscurePassword = true; bool get obscurePassword => _obscurePassword; bool get isLoginEnabled => - usernameController.text.isNotEmpty && - passwordController.text.isNotEmpty; + usernameController.text.isNotEmpty && passwordController.text.isNotEmpty; // Auth state bool _isLoading = false; @@ -64,6 +64,8 @@ class AuthViewModel with ChangeNotifier { _isLoading = false; notifyListeners(); + _errorMessage = null; + notifyListeners(); } @override diff --git a/lib/view_models/tender_detail_view_model.dart b/lib/view_models/tender_detail_view_model.dart index 398b8af..bac6866 100644 --- a/lib/view_models/tender_detail_view_model.dart +++ b/lib/view_models/tender_detail_view_model.dart @@ -7,8 +7,13 @@ import 'package:tm_app/data/services/model/tender_detail_response/tender_detail_ class TenderDetailViewModel with ChangeNotifier { final TenderDetailRepository _tenderDetailRepository; - TenderDetailViewModel({required TenderDetailRepository tenderDetailRepository}) - : _tenderDetailRepository = tenderDetailRepository; + TenderDetailViewModel({ + required TenderDetailRepository tenderDetailRepository, + }) : _tenderDetailRepository = tenderDetailRepository { + WidgetsBinding.instance.addPostFrameCallback((_) { + getTenderDetail(id: 'JNDFKMDV-100JF'); + }); + } bool _isLoading = false; String? _errorMessage; @@ -23,8 +28,10 @@ class TenderDetailViewModel with ChangeNotifier { _errorMessage = null; notifyListeners(); - final request = TenderDetailRequest(id: id); -final result = await _tenderDetailRepository.getTenderDetail(request: request); + final request = TenderDetailRequest(id: id); + final result = await _tenderDetailRepository.getTenderDetail( + request: request, + ); switch (result) { case Ok(): _tenderDetail = result.value; diff --git a/lib/views/detail/pages/detail_desktop_page.dart b/lib/views/detail/pages/detail_desktop_page.dart index 44ce11c..453f858 100644 --- a/lib/views/detail/pages/detail_desktop_page.dart +++ b/lib/views/detail/pages/detail_desktop_page.dart @@ -10,26 +10,10 @@ import 'package:tm_app/views/detail/widgets/tender_detail_action.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_card.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_header.dart'; -class TenderDetailDesktopPage extends StatefulWidget { +class TenderDetailDesktopPage extends StatelessWidget { final String tenderId; const TenderDetailDesktopPage({required this.tenderId, super.key}); - @override - State createState() => - _TenderDetailDesktopPageState(); -} - -class _TenderDetailDesktopPageState extends State { - @override - void initState() { - super.initState(); - Future.microtask(() { - context.read().getTenderDetail( - id: widget.tenderId, - ); - }); - } - @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/views/detail/pages/detail_mobile_page.dart b/lib/views/detail/pages/detail_mobile_page.dart index 21caa8b..d4ef9a4 100644 --- a/lib/views/detail/pages/detail_mobile_page.dart +++ b/lib/views/detail/pages/detail_mobile_page.dart @@ -10,24 +10,9 @@ import 'package:tm_app/views/detail/widgets/tender_detail_action.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_card.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_header.dart'; -class TenderDetailMobilePage extends StatefulWidget { +class TenderDetailMobilePage extends StatelessWidget { final String tenderId; - const TenderDetailMobilePage({super.key, required this.tenderId}); - - @override - State createState() => _TenderDetailMobilePageState(); -} - -class _TenderDetailMobilePageState extends State { - @override - void initState() { - super.initState(); - Future.microtask(() { - context.read().getTenderDetail( - id: widget.tenderId, - ); - }); - } + const TenderDetailMobilePage({required this.tenderId, super.key}); @override Widget build(BuildContext context) { @@ -48,7 +33,7 @@ class _TenderDetailMobilePageState extends State { final detail = tenderViewModel.tenderDetail; if (detail == null) { - return const Center(child: Text("No tender details available")); + return const Center(child: Text('No tender details available')); } return SingleChildScrollView( diff --git a/lib/views/detail/pages/detail_tablet_page.dart b/lib/views/detail/pages/detail_tablet_page.dart index 0855beb..91cced4 100644 --- a/lib/views/detail/pages/detail_tablet_page.dart +++ b/lib/views/detail/pages/detail_tablet_page.dart @@ -10,25 +10,10 @@ import 'package:tm_app/views/detail/widgets/tender_detail_action.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_card.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_header.dart'; -class TenderDetailTabletPage extends StatefulWidget { +class TenderDetailTabletPage extends StatelessWidget { final String tenderId; const TenderDetailTabletPage({required this.tenderId, super.key}); - @override - State createState() => _TenderDetailTabletPageState(); -} - -class _TenderDetailTabletPageState extends State { - @override - void initState() { - super.initState(); - Future.microtask(() { - context.read().getTenderDetail( - id: widget.tenderId, - ); - }); - } - @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/views/detail/widgets/tender_detail_action.dart b/lib/views/detail/widgets/tender_detail_action.dart index bd92e6a..7cc9bc8 100644 --- a/lib/views/detail/widgets/tender_detail_action.dart +++ b/lib/views/detail/widgets/tender_detail_action.dart @@ -28,7 +28,7 @@ class TenderDetailActions extends StatelessWidget { isEnabled: true, text: AppStrings.tenderSubmitButton, backgroundColor: AppColors.lightBlue, - textColor: AppColors.primary30, + textColor: AppColors.mainBlue, onPressed: () {}, width: 120.0.w(), ), diff --git a/lib/views/home/pages/d_home_page.dart b/lib/views/home/pages/d_home_page.dart index eca0167..ead3d1c 100644 --- a/lib/views/home/pages/d_home_page.dart +++ b/lib/views/home/pages/d_home_page.dart @@ -164,8 +164,9 @@ class DesktopHomePage extends StatelessWidget { Widget _bottomListView(HomeResponseModel homeResponse) { return SizedBox( width: 740, - height: 310.0.h(), + height: 290.0, child: ListView.builder( + padding: EdgeInsets.only(bottom: 20), itemCount: homeResponse.yourTenders?.length ?? 0, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { diff --git a/lib/views/login/pages/login_mobile_page.dart b/lib/views/login/pages/login_mobile_page.dart index 5fabc35..5044cc2 100644 --- a/lib/views/login/pages/login_mobile_page.dart +++ b/lib/views/login/pages/login_mobile_page.dart @@ -9,9 +9,39 @@ import '../../../core/utils/size_config.dart'; import '../../../view_models/auth_view_model.dart'; import '../widgets/widgets.dart'; -class LoginMobilePage extends StatelessWidget { +class LoginMobilePage extends StatefulWidget { const LoginMobilePage({super.key}); + @override + State createState() => _LoginMobilePageState(); +} + +class _LoginMobilePageState extends State { + late final AuthViewModel viewModel; + @override + void initState() { + viewModel = context.read(); + viewModel.addListener(_viewModelListener); + super.initState(); + } + + void _viewModelListener() { + if (viewModel.loggedInUser != null) { + HomeRouteData().go(context); + } + if (viewModel.errorMessage != null) { + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(viewModel.errorMessage!))); + } + } + + @override + void dispose() { + viewModel.removeListener(_viewModelListener); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -58,21 +88,11 @@ class LoginMobilePage extends StatelessWidget { else BaseButton( isEnabled: viewModel.isLoginEnabled, - onPressed: - viewModel.isLoginEnabled - ? () async { - await viewModel.login(); - if (viewModel.loggedInUser != null) { - HomeRouteData().go(context); - } else if (viewModel.errorMessage != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(viewModel.errorMessage!), - ), - ); - } - } - : null, + onPressed: () async { + if (viewModel.isLoginEnabled) { + await viewModel.login(); + } + }, ), ], ); diff --git a/lib/views/tenders/widgets/tender_action_buttons.dart b/lib/views/tenders/widgets/tender_action_buttons.dart index 8cc109f..cd869ab 100644 --- a/lib/views/tenders/widgets/tender_action_buttons.dart +++ b/lib/views/tenders/widgets/tender_action_buttons.dart @@ -30,6 +30,7 @@ class TenderActionButtons extends StatelessWidget { Tooltip( message: 'Dislike', child: InkWell( + splashColor: Colors.transparent, onTap: () { viewModel.onDislike(tender); }, @@ -69,6 +70,7 @@ class TenderActionButtons extends StatelessWidget { Tooltip( message: 'Reject', child: InkWell( + splashColor: Colors.transparent, onTap: () { viewModel.onReject(tender); }, @@ -119,6 +121,7 @@ class TenderActionButtons extends StatelessWidget { Tooltip( message: 'Submit', child: InkWell( + splashColor: Colors.transparent, onTap: () { viewModel.onSubmit(tender); }, @@ -170,6 +173,7 @@ class TenderActionButtons extends StatelessWidget { Tooltip( message: 'Like', child: InkWell( + splashColor: Colors.transparent, onTap: () { viewModel.onLike(tender); },