some changes and fixes
This commit is contained in:
@@ -122,6 +122,7 @@ List<SingleChildWidget> get viewModels {
|
||||
(context) => LikedTendersViewModel(
|
||||
likedTendersRepository: context.read(),
|
||||
tendersRepository: context.read(),
|
||||
homeViewModel: context.read(),
|
||||
),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'package:tm_app/data/repositories/tenders_repository.dart';
|
||||
import 'package:tm_app/data/services/model/liked_tender_feedback/liked_tender_feedback.dart';
|
||||
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
|
||||
import 'package:tm_app/data/services/model/tender_approvals_toggle_response/tender_approvals_toggle_response.dart';
|
||||
import 'package:tm_app/view_models/home_view_model.dart';
|
||||
|
||||
import '../data/services/model/feedback_response/feedback_response.dart';
|
||||
import '../data/services/model/tender_approvals_by_id_response/tender_approvals_by_id_response.dart';
|
||||
@@ -13,10 +14,13 @@ import '../data/services/model/tender_approvals_data/tender_approvals_data.dart'
|
||||
class LikedTendersViewModel with ChangeNotifier {
|
||||
final LikedTendersRepository _likedTendersRepository;
|
||||
final TendersRepository _tendersRepository;
|
||||
final HomeViewModel _homeViewModel;
|
||||
LikedTendersViewModel({
|
||||
required LikedTendersRepository likedTendersRepository,
|
||||
required TendersRepository tendersRepository,
|
||||
required HomeViewModel homeViewModel,
|
||||
}) : _likedTendersRepository = likedTendersRepository,
|
||||
_homeViewModel = homeViewModel,
|
||||
_tendersRepository = tendersRepository;
|
||||
|
||||
bool isLoading = false;
|
||||
@@ -47,6 +51,10 @@ class LikedTendersViewModel with ChangeNotifier {
|
||||
bool get isSubmitApprovalLoading => _isSubmitApprovalLoading;
|
||||
bool get isRejectApprovalLoading => _isRejectApprovalLoading;
|
||||
|
||||
void updateHome() {
|
||||
_homeViewModel.init();
|
||||
}
|
||||
|
||||
Future<void> getLikedTenders({bool reset = false}) async {
|
||||
if (!reset && (isLoadingMore || !hasMore)) {
|
||||
return;
|
||||
|
||||
@@ -7,7 +7,6 @@ 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';
|
||||
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../shared/desktop_navigation_widget.dart';
|
||||
import '../strings/tender_details_strings.dart';
|
||||
|
||||
@@ -115,27 +114,6 @@ class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
|
||||
children: [
|
||||
DesktopNavigationWidget(
|
||||
currentIndex: 1, // Home index
|
||||
onTabChanged: (index) {
|
||||
// Navigate to different screens based on index
|
||||
switch (index) {
|
||||
case 0:
|
||||
Router.neglect(
|
||||
context,
|
||||
() => HomeRouteData().go(context),
|
||||
);
|
||||
viewModel.updateHome();
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
Router.neglect(
|
||||
context,
|
||||
() => ProfileRouteData().go(context),
|
||||
);
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: SingleChildScrollView(
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
@@ -10,7 +9,6 @@ import 'package:tm_app/views/detail/widgets/tender_detail_card.dart';
|
||||
import 'package:tm_app/views/detail/widgets/tender_detail_header.dart';
|
||||
import 'package:tm_app/views/shared/tablet_navigation_widget.dart';
|
||||
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../shared/tender_app_bar.dart';
|
||||
import '../strings/tender_details_strings.dart';
|
||||
|
||||
@@ -105,22 +103,6 @@ class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
|
||||
|
||||
drawer: TabletNavigationWidget(
|
||||
currentIndex: 1, // Home is index 0
|
||||
onTabChanged: (index) {
|
||||
// Handle navigation to other tabs
|
||||
switch (index) {
|
||||
case 0:
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
viewModel.updateHome();
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
context.pop();
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
body: Consumer<TenderDetailViewModel>(
|
||||
builder: (context, tenderViewModel, child) {
|
||||
|
||||
@@ -162,7 +162,8 @@ class TenderDetailActions extends StatelessWidget {
|
||||
submissionMode: 'self-apply',
|
||||
);
|
||||
} else {
|
||||
showDialog(
|
||||
(MediaQuery.sizeOf(context).width > 600)
|
||||
? showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return SelectSubmissionDialog(
|
||||
@@ -174,6 +175,19 @@ class TenderDetailActions extends StatelessWidget {
|
||||
},
|
||||
);
|
||||
},
|
||||
)
|
||||
: showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return SelectSubmissionBottomSheet(
|
||||
onConfirm: (String value) {
|
||||
viewModel.submitTenderApproval(
|
||||
tenderId: detail.id!,
|
||||
submissionMode: value,
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -31,38 +31,14 @@ class DesktopHomePage extends StatelessWidget {
|
||||
if (homeViewModel.tenderApprovalsStateResponse != null &&
|
||||
homeViewModel.data != null &&
|
||||
homeViewModel.feedbackStats != null) {
|
||||
return Column(
|
||||
return SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
DesktopNavigationWidget(
|
||||
currentIndex: 0, // Home index
|
||||
onTabChanged: (index) {
|
||||
// Navigate to different screens based on index
|
||||
switch (index) {
|
||||
case 0:
|
||||
// Already on home
|
||||
break;
|
||||
case 1:
|
||||
// Navigate to tenders
|
||||
Router.neglect(
|
||||
context,
|
||||
() => TendersRouteData().go(context),
|
||||
);
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
Router.neglect(
|
||||
context,
|
||||
() => ProfileRouteData().go(context),
|
||||
);
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Center(
|
||||
child: SizedBox(
|
||||
SizedBox(
|
||||
width: 780,
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
@@ -72,13 +48,8 @@ class DesktopHomePage extends StatelessWidget {
|
||||
_progressBarsRow(homeViewModel),
|
||||
SizedBox(height: 32.0.h()),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 15.0.w(),
|
||||
),
|
||||
child: _firstTenderCardsRow(
|
||||
context,
|
||||
homeViewModel,
|
||||
),
|
||||
padding: EdgeInsets.symmetric(horizontal: 15.0.w()),
|
||||
child: _firstTenderCardsRow(context, homeViewModel),
|
||||
),
|
||||
SizedBox(height: 32.0.h()),
|
||||
_yourTenderText(homeViewModel),
|
||||
@@ -87,10 +58,8 @@ class DesktopHomePage extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
return const Center(
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
@@ -27,24 +26,6 @@ class TabletHomePage extends StatelessWidget {
|
||||
|
||||
drawer: TabletNavigationWidget(
|
||||
currentIndex: 0, // Home is index 0
|
||||
onTabChanged: (index) {
|
||||
// Handle navigation to other tabs
|
||||
switch (index) {
|
||||
case 0:
|
||||
// Already on home
|
||||
break;
|
||||
case 1:
|
||||
// Navigate to tenders
|
||||
context.pop();
|
||||
Router.neglect(context, () => TendersRouteData().go(context));
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
context.pop();
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
body: Consumer<HomeViewModel>(
|
||||
builder: (context, homeViewModel, child) {
|
||||
|
||||
@@ -8,8 +8,8 @@ import 'package:tm_app/data/services/model/tender_approvals_data/tender_approval
|
||||
import 'package:tm_app/view_models/liked_tenders_view_model.dart';
|
||||
import 'package:tm_app/views/liked_tenders/widgets/liked_tenders_list_item.dart';
|
||||
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../shared/desktop_navigation_widget.dart';
|
||||
import '../strings/liked_tenders_strings.dart';
|
||||
|
||||
class LikedTendersDesktopPage extends StatefulWidget {
|
||||
const LikedTendersDesktopPage({super.key});
|
||||
@@ -20,27 +20,26 @@ class LikedTendersDesktopPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
|
||||
late final LikedTendersViewModel viewModel;
|
||||
@override
|
||||
void initState() {
|
||||
viewModel = context.read<LikedTendersViewModel>();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
return PopScope(
|
||||
onPopInvokedWithResult: (didPop, result) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
viewModel.updateHome();
|
||||
});
|
||||
},
|
||||
child: Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
body: Column(
|
||||
children: [
|
||||
DesktopNavigationWidget(
|
||||
currentIndex: 1,
|
||||
onTabChanged: (index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
DesktopNavigationWidget(currentIndex: 1),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
width: 740,
|
||||
@@ -63,7 +62,7 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
|
||||
|
||||
if (feedback.isEmpty) {
|
||||
return const Center(
|
||||
child: Text('You haven’t liked any tenders yet.'),
|
||||
child: Text(LikedTendersStrings.noLikedTenders),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -89,7 +88,8 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
|
||||
bool hasApproval = viewModel
|
||||
.hasTenderApprovalForTender(item.tenderId!);
|
||||
if (hasApproval) {
|
||||
approval = viewModel.getApprovalStatusForTender(
|
||||
approval = viewModel
|
||||
.getApprovalStatusForTender(
|
||||
item.tenderId!,
|
||||
);
|
||||
} else {
|
||||
@@ -235,6 +235,7 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
@@ -19,9 +20,11 @@ class LikedTendersMobilePage extends StatefulWidget {
|
||||
|
||||
class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
|
||||
late final ScrollController _scrollController;
|
||||
late final LikedTendersViewModel viewModel;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
viewModel = context.read<LikedTendersViewModel>();
|
||||
super.initState();
|
||||
_scrollController = ScrollController()..addListener(_onScroll);
|
||||
}
|
||||
@@ -48,9 +51,20 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
return PopScope(
|
||||
onPopInvokedWithResult: (didPop, result) {
|
||||
if (kIsWeb) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
viewModel.updateHome();
|
||||
});
|
||||
}
|
||||
},
|
||||
child: Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: appBar(context: context, title: LikedTendersStrings.likedTenders),
|
||||
appBar: appBar(
|
||||
context: context,
|
||||
title: LikedTendersStrings.likedTenders,
|
||||
),
|
||||
body: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
@@ -73,7 +87,7 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
|
||||
|
||||
if (feedback.isEmpty) {
|
||||
return const Center(
|
||||
child: Text('You haven’t liked any tenders yet.'),
|
||||
child: Text(LikedTendersStrings.noLikedTenders),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -95,9 +109,8 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
|
||||
if (index < feedback.length) {
|
||||
final item = feedback[index];
|
||||
TenderApprovalsData? approval;
|
||||
bool hasApproval = viewModel.hasTenderApprovalForTender(
|
||||
item.tenderId!,
|
||||
);
|
||||
bool hasApproval = viewModel
|
||||
.hasTenderApprovalForTender(item.tenderId!);
|
||||
if (hasApproval) {
|
||||
approval = viewModel.getApprovalStatusForTender(
|
||||
item.tenderId!,
|
||||
@@ -116,7 +129,11 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 20.0.w(),
|
||||
),
|
||||
child: SvgPicture.asset(AssetsManager.trash,width: 32.0.w(),height: 32.0.h(),),
|
||||
child: SvgPicture.asset(
|
||||
AssetsManager.trash,
|
||||
width: 32.0.w(),
|
||||
height: 32.0.h(),
|
||||
),
|
||||
),
|
||||
onDismissed: (_) {
|
||||
if (item.tenderId != null) {
|
||||
@@ -152,6 +169,7 @@ class _LikedTendersMobilePageState extends State<LikedTendersMobilePage> {
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/liked_tenders_view_model.dart';
|
||||
@@ -22,29 +21,29 @@ class LikedTendersTabletPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
|
||||
late final LikedTendersViewModel viewModel;
|
||||
@override
|
||||
void initState() {
|
||||
viewModel = context.read<LikedTendersViewModel>();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final GlobalKey<ScaffoldState> key = GlobalKey();
|
||||
return Scaffold(
|
||||
return PopScope(
|
||||
onPopInvokedWithResult: (didPop, result) {
|
||||
if (kIsWeb) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
viewModel.updateHome();
|
||||
});
|
||||
}
|
||||
},
|
||||
child: Scaffold(
|
||||
key: key,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: tabletAppBar(title: LikedTendersStrings.likedTenders, key: key),
|
||||
drawer: TabletNavigationWidget(
|
||||
currentIndex: 1,
|
||||
onTabChanged: (index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
context.pop();
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
drawer: TabletNavigationWidget(currentIndex: 1),
|
||||
body: Center(
|
||||
child: SizedBox(
|
||||
width: 720,
|
||||
@@ -70,7 +69,7 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
|
||||
|
||||
if (feedback.isEmpty) {
|
||||
return const Center(
|
||||
child: Text('You haven’t liked any tenders yet.'),
|
||||
child: Text(LikedTendersStrings.noLikedTenders),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -94,7 +93,9 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
|
||||
final item = feedback[index];
|
||||
TenderApprovalsData? approval;
|
||||
bool hasApproval = viewModel
|
||||
.hasTenderApprovalForTender(item.tenderId!);
|
||||
.hasTenderApprovalForTender(
|
||||
item.tenderId!,
|
||||
);
|
||||
if (hasApproval) {
|
||||
approval = viewModel
|
||||
.getApprovalStatusForTender(
|
||||
@@ -115,7 +116,8 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
|
||||
),
|
||||
child: SvgPicture.asset(
|
||||
AssetsManager.trash,
|
||||
width: 32.0.w(),height: 32.0.h(),
|
||||
width: 32.0.w(),
|
||||
height: 32.0.h(),
|
||||
),
|
||||
),
|
||||
onDismissed: (_) {
|
||||
@@ -245,6 +247,7 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,4 +12,5 @@ class LikedTendersStrings {
|
||||
static const startDate = 'YYYY/MM/DD';
|
||||
static const endDate = 'YYYY/MM/DD';
|
||||
static const approvedTenders = 'Approved tenders';
|
||||
static const noLikedTenders = 'You haven’t liked any tenders yet.';
|
||||
}
|
||||
|
||||
@@ -214,7 +214,7 @@ class LikedListItem extends StatelessWidget {
|
||||
submissionMode: 'self-apply',
|
||||
);
|
||||
} else {
|
||||
kIsWeb
|
||||
(kIsWeb && MediaQuery.sizeOf(context).width > 600)
|
||||
? showDialog(
|
||||
context: context,
|
||||
builder: (context) {
|
||||
|
||||
@@ -72,28 +72,6 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
|
||||
children: [
|
||||
DesktopNavigationWidget(
|
||||
currentIndex: 2, // Tenders index
|
||||
onTabChanged: (index) {
|
||||
// Navigate to different screens based on index
|
||||
switch (index) {
|
||||
case 0:
|
||||
// Navigate to home
|
||||
Router.neglect(
|
||||
context,
|
||||
() => HomeRouteData().go(context),
|
||||
);
|
||||
break;
|
||||
case 1:
|
||||
// Navigate to profile
|
||||
Router.neglect(
|
||||
context,
|
||||
() => TendersRouteData().go(context),
|
||||
);
|
||||
break;
|
||||
case 2:
|
||||
// Already on profile
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
SizedBox(
|
||||
width: 740,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/common_strings.dart';
|
||||
@@ -75,25 +74,7 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: tabletAppBar(title: ProfileStrings.profileTitle, key: key),
|
||||
|
||||
drawer: TabletNavigationWidget(
|
||||
currentIndex: 2,
|
||||
onTabChanged: (index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
context.pop();
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
|
||||
break;
|
||||
case 1:
|
||||
context.pop();
|
||||
Router.neglect(
|
||||
context,
|
||||
() => TendersRouteData().go(context),
|
||||
);
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
drawer: TabletNavigationWidget(currentIndex: 2),
|
||||
body: Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 24.0.w(),
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/home_view_model.dart';
|
||||
import 'package:tm_app/view_models/tenders_view_model.dart';
|
||||
import 'package:tm_app/views/home/strings/home_strings.dart';
|
||||
import 'package:tm_app/views/profile/strings/profile_strings.dart';
|
||||
import 'package:tm_app/views/tenders/strings/tenders_strings.dart';
|
||||
|
||||
import '../../core/routes/app_routes.dart';
|
||||
|
||||
class DesktopNavigationWidget extends StatelessWidget {
|
||||
const DesktopNavigationWidget({
|
||||
required this.currentIndex,
|
||||
required this.onTabChanged,
|
||||
super.key,
|
||||
});
|
||||
const DesktopNavigationWidget({required this.currentIndex, super.key});
|
||||
|
||||
final int currentIndex;
|
||||
final ValueChanged<int> onTabChanged;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -36,7 +36,14 @@ class DesktopNavigationWidget extends StatelessWidget {
|
||||
context: context,
|
||||
text: HomeStrings.home,
|
||||
isActive: currentIndex == 0,
|
||||
onTap: () => onTabChanged(0),
|
||||
onTap: () {
|
||||
if (currentIndex == 0) {
|
||||
return;
|
||||
} else {
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
context.read<HomeViewModel>().init();
|
||||
}
|
||||
},
|
||||
iconPath: AssetsManager.home,
|
||||
activeIconPath: AssetsManager.homeActive,
|
||||
),
|
||||
@@ -45,7 +52,14 @@ class DesktopNavigationWidget extends StatelessWidget {
|
||||
context: context,
|
||||
text: TendersStrings.tendersTitle,
|
||||
isActive: currentIndex == 1,
|
||||
onTap: () => onTabChanged(1),
|
||||
onTap: () {
|
||||
if (currentIndex == 1) {
|
||||
return;
|
||||
} else {
|
||||
Router.neglect(context, () => TendersRouteData().go(context));
|
||||
context.read<TendersViewModel>().getTenders();
|
||||
}
|
||||
},
|
||||
iconPath: AssetsManager.tenders,
|
||||
activeIconPath: AssetsManager.tendersActive,
|
||||
),
|
||||
@@ -54,7 +68,13 @@ class DesktopNavigationWidget extends StatelessWidget {
|
||||
context: context,
|
||||
text: ProfileStrings.profileTitle,
|
||||
isActive: currentIndex == 2,
|
||||
onTap: () => onTabChanged(2),
|
||||
onTap: () {
|
||||
if (currentIndex == 2) {
|
||||
return;
|
||||
} else {
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
}
|
||||
},
|
||||
iconPath: AssetsManager.profile,
|
||||
activeIconPath: AssetsManager.profileActive,
|
||||
),
|
||||
|
||||
@@ -1,21 +1,22 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/home_view_model.dart';
|
||||
import 'package:tm_app/view_models/tenders_view_model.dart';
|
||||
import 'package:tm_app/views/home/strings/home_strings.dart';
|
||||
import 'package:tm_app/views/profile/strings/profile_strings.dart';
|
||||
import 'package:tm_app/views/tenders/strings/tenders_strings.dart';
|
||||
|
||||
import '../../core/routes/app_routes.dart';
|
||||
|
||||
class TabletNavigationWidget extends StatelessWidget {
|
||||
const TabletNavigationWidget({
|
||||
required this.currentIndex,
|
||||
required this.onTabChanged,
|
||||
super.key,
|
||||
});
|
||||
const TabletNavigationWidget({required this.currentIndex, super.key});
|
||||
|
||||
final int currentIndex;
|
||||
final ValueChanged<int> onTabChanged;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -30,7 +31,14 @@ class TabletNavigationWidget extends StatelessWidget {
|
||||
context: context,
|
||||
text: HomeStrings.home,
|
||||
isActive: currentIndex == 0,
|
||||
onTap: () => onTabChanged(0),
|
||||
onTap: () {
|
||||
if (currentIndex == 0) {
|
||||
return;
|
||||
} else {
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
context.read<HomeViewModel>().init();
|
||||
}
|
||||
},
|
||||
iconPath: AssetsManager.home,
|
||||
activeIconPath: AssetsManager.homeActive,
|
||||
),
|
||||
@@ -38,7 +46,14 @@ class TabletNavigationWidget extends StatelessWidget {
|
||||
context: context,
|
||||
text: TendersStrings.tendersTitle,
|
||||
isActive: currentIndex == 1,
|
||||
onTap: () => onTabChanged(1),
|
||||
onTap: () {
|
||||
if (currentIndex == 1) {
|
||||
return;
|
||||
} else {
|
||||
Router.neglect(context, () => TendersRouteData().go(context));
|
||||
context.read<TendersViewModel>().getTenders();
|
||||
}
|
||||
},
|
||||
iconPath: AssetsManager.tenders,
|
||||
activeIconPath: AssetsManager.tendersActive,
|
||||
),
|
||||
@@ -46,7 +61,14 @@ class TabletNavigationWidget extends StatelessWidget {
|
||||
context: context,
|
||||
text: ProfileStrings.profileTitle,
|
||||
isActive: currentIndex == 2,
|
||||
onTap: () => onTabChanged(2),
|
||||
onTap: () {
|
||||
if (currentIndex == 2) {
|
||||
return;
|
||||
} else {
|
||||
context.pop();
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
}
|
||||
},
|
||||
iconPath: AssetsManager.profile,
|
||||
activeIconPath: AssetsManager.profileActive,
|
||||
),
|
||||
|
||||
@@ -7,7 +7,6 @@ import 'package:tm_app/views/shared/desktop_navigation_widget.dart';
|
||||
import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart';
|
||||
|
||||
import '../../../core/constants/common_strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
|
||||
class DesktopTendersPage extends StatefulWidget {
|
||||
const DesktopTendersPage({super.key});
|
||||
@@ -54,38 +53,12 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
body: Column(
|
||||
children: [
|
||||
DesktopNavigationWidget(
|
||||
currentIndex: 1, // Tenders index
|
||||
onTabChanged: (index) {
|
||||
// Navigate to different screens based on index
|
||||
switch (index) {
|
||||
case 0:
|
||||
// Navigate to home
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
viewModel.updateHome();
|
||||
break;
|
||||
case 1:
|
||||
// Already on tenders
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: Center(
|
||||
child: SingleChildScrollView(
|
||||
body: SingleChildScrollView(
|
||||
child: Consumer<TendersViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
if (viewModel.isLoading) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(
|
||||
color: AppColors.jellyBean,
|
||||
),
|
||||
child: CircularProgressIndicator(color: AppColors.jellyBean),
|
||||
);
|
||||
}
|
||||
if (viewModel.errorMessage != null) {
|
||||
@@ -95,24 +68,26 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
|
||||
viewModel.tendersResponse!.data!.tenders!.isEmpty) {
|
||||
return Center(child: Text(CommonStrings.noData));
|
||||
}
|
||||
return SizedBox(
|
||||
return Column(
|
||||
children: [
|
||||
DesktopNavigationWidget(
|
||||
currentIndex: 1, // Tenders index
|
||||
),
|
||||
SizedBox(
|
||||
width: 740,
|
||||
height: 800,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 24.0.h()),
|
||||
child: MainTendersSlider(
|
||||
tenders:
|
||||
viewModel.tendersResponse?.data?.tenders ?? [],
|
||||
tenders: viewModel.tendersResponse?.data?.tenders ?? [],
|
||||
isDesktop: true,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
@@ -8,7 +7,6 @@ import 'package:tm_app/views/shared/tablet_navigation_widget.dart';
|
||||
import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart';
|
||||
|
||||
import '../../../core/constants/common_strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../shared/tender_app_bar.dart';
|
||||
import '../strings/tenders_strings.dart';
|
||||
|
||||
@@ -35,23 +33,7 @@ class _TabletTendersPageState extends State<TabletTendersPage> {
|
||||
key: key,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: tabletAppBar(title: TendersStrings.tendersTitle, key: key),
|
||||
drawer: TabletNavigationWidget(
|
||||
currentIndex: 1,
|
||||
onTabChanged: (index) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
context.pop();
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
viewModel.updateHome();
|
||||
break;
|
||||
case 2:
|
||||
context.pop();
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
drawer: TabletNavigationWidget(currentIndex: 1),
|
||||
body: SingleChildScrollView(
|
||||
child: Consumer<TendersViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
|
||||
@@ -91,7 +91,7 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
|
||||
Widget _tendersPageView() {
|
||||
return SizedBox(
|
||||
width: double.infinity,
|
||||
height: 719.0.h(),
|
||||
height: 722.0.h(),
|
||||
child: PageView.builder(
|
||||
controller: pageController,
|
||||
scrollDirection: Axis.horizontal,
|
||||
@@ -145,8 +145,8 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
onTap: _goToPreviousPage,
|
||||
child: Container(
|
||||
width: 32.0.w(),
|
||||
height: 32.0.w(),
|
||||
width: 32.0.h(),
|
||||
height: 32.0.h(),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
border: Border.all(color: AppColors.iconColor, width: 1.5),
|
||||
@@ -194,8 +194,8 @@ class _MainTendersSliderState extends State<MainTendersSlider> {
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
onTap: _goToNextPage,
|
||||
child: Container(
|
||||
width: 32.0.w(),
|
||||
height: 32.0.w(),
|
||||
width: 32.0.h(),
|
||||
height: 32.0.h(),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
border: Border.all(color: AppColors.iconColor, width: 1.5),
|
||||
|
||||
@@ -8,7 +8,6 @@ import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.da
|
||||
import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
|
||||
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../shared/desktop_navigation_widget.dart';
|
||||
|
||||
class YourTendersDesktopPage extends StatefulWidget {
|
||||
@@ -43,22 +42,6 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
||||
children: [
|
||||
DesktopNavigationWidget(
|
||||
currentIndex: 1, // Tenders index
|
||||
onTabChanged: (index) {
|
||||
// Navigate to different screens based on index
|
||||
switch (index) {
|
||||
case 0:
|
||||
// Navigate to home
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
break;
|
||||
case 1:
|
||||
// Already on tenders
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
@@ -68,14 +51,6 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
||||
SizedBox(height: 64.0),
|
||||
TabletDesktopAppbar(),
|
||||
SizedBox(height: 20.0),
|
||||
|
||||
// MainTabBar(
|
||||
// controller: controller,
|
||||
// titles: [
|
||||
// AppStrings.approvedTenders,
|
||||
// AppStrings.tenderSubmitted,
|
||||
// ],
|
||||
// ),
|
||||
FilterButton(platformType: PlatformType.tabletDesktop),
|
||||
|
||||
Expanded(
|
||||
@@ -115,15 +90,10 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
||||
isDesktop: true,
|
||||
);
|
||||
} else {
|
||||
return const Center(child: Text('No data available'));
|
||||
return const Center(
|
||||
child: Text(YourTendersStrings.noTenders),
|
||||
);
|
||||
}
|
||||
// return TabBarView(
|
||||
// controller: controller,
|
||||
// children: [
|
||||
// // ApprovedTenders(tendersSubmitted: []),
|
||||
|
||||
// ],
|
||||
// );
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
@@ -85,7 +85,9 @@ class _YourTendersMobilePageState extends State<YourTendersMobilePage> {
|
||||
)
|
||||
else
|
||||
const Expanded(
|
||||
child: Center(child: Text('No data available')),
|
||||
child: Center(
|
||||
child: Text(YourTendersStrings.noTenders),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/your_tenders_view_model.dart';
|
||||
@@ -46,21 +44,6 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
|
||||
appBar: tabletAppBar(title: YourTendersStrings.yourTenders, key: key),
|
||||
drawer: TabletNavigationWidget(
|
||||
currentIndex: 1, // Home is index 0
|
||||
onTabChanged: (index) {
|
||||
// Handle navigation to other tabs
|
||||
switch (index) {
|
||||
case 0:
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
context.pop();
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
),
|
||||
body: Center(
|
||||
child: SizedBox(
|
||||
@@ -114,9 +97,14 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
|
||||
isDesctop: false,
|
||||
);
|
||||
} else if (viewModel.data != null) {
|
||||
return TendersSubmitted(approvedTenders: viewModel.data!,isDesktop: false,);
|
||||
return TendersSubmitted(
|
||||
approvedTenders: viewModel.data!,
|
||||
isDesktop: false,
|
||||
);
|
||||
} else {
|
||||
return const Center(child: Text('No data available'));
|
||||
return const Center(
|
||||
child: Text(YourTendersStrings.noTenders),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
|
||||
@@ -13,4 +13,6 @@ class YourTendersStrings {
|
||||
static const startDate = 'YYYY/MM/DD';
|
||||
static const endDate = 'YYYY/MM/DD';
|
||||
static const approvedTenders = 'Approved tenders';
|
||||
static const noTenders = 'No data available';
|
||||
static const selectPublicationRangeDate = 'Select publication date range';
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ class TendersFilterDialog extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 16.0.h()),
|
||||
Text(
|
||||
'Select date range',
|
||||
YourTendersStrings.selectPublicationRangeDate,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.w600,
|
||||
|
||||
Reference in New Issue
Block a user