strings check

This commit is contained in:
amirrezaghabeli
2025-09-08 12:54:27 +03:30
parent f6da74f739
commit d56261b664
15 changed files with 64 additions and 136 deletions
+3 -6
View File
@@ -3,11 +3,8 @@ class CommonStrings {
// Truly shared strings across multiple features // Truly shared strings across multiple features
static const String noData = 'No data'; static const String noData = 'No data';
static const String selectSubmission = 'Select Submission';
static const String selfApply = 'Self-apply';
static const String partnership = 'Partnership';
static const String confirm = 'Confirm'; static const String confirm = 'Confirm';
static const String submit = 'Submit';
static const String cancel = 'Cancel';
static const String loading = 'Loading...';
static const String error = 'Error';
static const String success = 'Success';
static const String retry = 'Retry';
} }
@@ -7,6 +7,7 @@ import 'package:tm_app/views/shared/base_button.dart';
import 'package:tm_app/views/shared/select_submission_bottom_sheet.dart'; import 'package:tm_app/views/shared/select_submission_bottom_sheet.dart';
import '../../../core/constants/tender_approval_status.dart'; import '../../../core/constants/tender_approval_status.dart';
import '../../../core/constants/tender_submision_mode.dart';
import '../../../data/services/model/tender_data/tender_data.dart'; import '../../../data/services/model/tender_data/tender_data.dart';
import '../../shared/select_submission_dialog.dart'; import '../../shared/select_submission_dialog.dart';
import '../strings/tender_details_strings.dart'; import '../strings/tender_details_strings.dart';
@@ -52,7 +53,8 @@ class TenderDetailActions extends StatelessWidget {
TenderApprovalStatus.submitted.value) { TenderApprovalStatus.submitted.value) {
viewModel.submitTenderApproval( viewModel.submitTenderApproval(
tenderId: detail.id!, tenderId: detail.id!,
submissionMode: 'self-apply', submissionMode:
TenderSubmissionMode.selfApply.value,
); );
} else { } else {
showModalBottomSheet( showModalBottomSheet(
@@ -97,7 +99,7 @@ class TenderDetailActions extends StatelessWidget {
onPressed: () { onPressed: () {
viewModel.rejectTenderApproval( viewModel.rejectTenderApproval(
tenderId: detail.id!, tenderId: detail.id!,
submissionMode: 'self-apply', submissionMode: TenderSubmissionMode.selfApply.value,
); );
}, },
); );
@@ -133,7 +135,7 @@ class TenderDetailActions extends StatelessWidget {
onPressed: () { onPressed: () {
viewModel.rejectTenderApproval( viewModel.rejectTenderApproval(
tenderId: detail.id!, tenderId: detail.id!,
submissionMode: 'self-apply', submissionMode: TenderSubmissionMode.selfApply.value,
); );
}, },
width: 120.0.w(), width: 120.0.w(),
@@ -162,7 +164,7 @@ class TenderDetailActions extends StatelessWidget {
TenderApprovalStatus.submitted.value) { TenderApprovalStatus.submitted.value) {
viewModel.submitTenderApproval( viewModel.submitTenderApproval(
tenderId: detail.id!, tenderId: detail.id!,
submissionMode: 'self-apply', submissionMode: TenderSubmissionMode.selfApply.value,
); );
} else { } else {
(MediaQuery.sizeOf(context).width > 600) (MediaQuery.sizeOf(context).width > 600)
@@ -150,7 +150,7 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
children: [ children: [
const Spacer(), const Spacer(),
Text( Text(
'Page', LikedTendersStrings.page,
style: TextStyle( style: TextStyle(
fontSize: 13.0.sp(), fontSize: 13.0.sp(),
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300,
@@ -165,7 +165,9 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
context: context, context: context,
builder: (context) { builder: (context) {
return AlertDialog( return AlertDialog(
title: const Text('Select Page'), title: const Text(
LikedTendersStrings.selectPage,
),
content: SizedBox( content: SizedBox(
width: 200, width: 200,
height: 300, height: 300,
@@ -174,7 +176,9 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
final pageNumber = index + 1; final pageNumber = index + 1;
return ListTile( return ListTile(
title: Text('Page $pageNumber'), title: Text(
'${LikedTendersStrings.page} $pageNumber',
),
onTap: onTap:
() => Navigator.pop( () => Navigator.pop(
context, context,
@@ -223,7 +227,7 @@ class _LikedTendersDesktopPageState extends State<LikedTendersDesktopPage> {
SizedBox(width: 5.0.w()), SizedBox(width: 5.0.w()),
Text( Text(
'Of', LikedTendersStrings.of,
style: TextStyle( style: TextStyle(
fontSize: 14.0.sp(), fontSize: 14.0.sp(),
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
@@ -160,7 +160,7 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
children: [ children: [
const Spacer(), const Spacer(),
Text( Text(
'Page', LikedTendersStrings.page,
style: TextStyle( style: TextStyle(
fontSize: 13.0.sp(), fontSize: 13.0.sp(),
fontWeight: FontWeight.w300, fontWeight: FontWeight.w300,
@@ -175,7 +175,9 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
context: context, context: context,
builder: (context) { builder: (context) {
return AlertDialog( return AlertDialog(
title: const Text('Select Page'), title: const Text(
LikedTendersStrings.selectPage,
),
content: SizedBox( content: SizedBox(
width: 200, width: 200,
height: 300, height: 300,
@@ -184,7 +186,9 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
final pageNumber = index + 1; final pageNumber = index + 1;
return ListTile( return ListTile(
title: Text('Page $pageNumber'), title: Text(
'${LikedTendersStrings.page} $pageNumber',
),
onTap: onTap:
() => Navigator.pop( () => Navigator.pop(
context, context,
@@ -233,7 +237,7 @@ class _LikedTendersTabletPageState extends State<LikedTendersTabletPage> {
SizedBox(width: 5.0.w()), SizedBox(width: 5.0.w()),
Text( Text(
'Of', LikedTendersStrings.of,
style: TextStyle( style: TextStyle(
fontSize: 14.0.sp(), fontSize: 14.0.sp(),
fontWeight: FontWeight.w400, fontWeight: FontWeight.w400,
@@ -12,5 +12,8 @@ class LikedTendersStrings {
static const startDate = 'YYYY/MM/DD'; static const startDate = 'YYYY/MM/DD';
static const endDate = 'YYYY/MM/DD'; static const endDate = 'YYYY/MM/DD';
static const approvedTenders = 'Approved tenders'; static const approvedTenders = 'Approved tenders';
static const noLikedTenders = 'You havent liked any tenders yet.'; static const noLikedTenders = 'You havent liked any tenders yet!';
static const page = 'Page';
static const selectPage = 'Select Page';
static const of = 'Of';
} }
@@ -10,6 +10,7 @@ import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/view_models/liked_tenders_view_model.dart'; import 'package:tm_app/view_models/liked_tenders_view_model.dart';
import 'package:tm_app/views/home/strings/home_strings.dart'; import 'package:tm_app/views/home/strings/home_strings.dart';
import '../../../core/constants/tender_submision_mode.dart';
import '../../../data/services/model/tender_approvals_data/tender_approvals_data.dart'; import '../../../data/services/model/tender_approvals_data/tender_approvals_data.dart';
import '../../shared/select_submission_bottom_sheet.dart'; import '../../shared/select_submission_bottom_sheet.dart';
import '../../shared/select_submission_dialog.dart'; import '../../shared/select_submission_dialog.dart';
@@ -178,7 +179,7 @@ class LikedListItem extends StatelessWidget {
onTap: () { onTap: () {
viewModel.rejectTenderApproval( viewModel.rejectTenderApproval(
tenderId: tender.id!, tenderId: tender.id!,
submissionMode: 'self-apply', submissionMode: TenderSubmissionMode.selfApply.value,
); );
}, },
child: Container( child: Container(
@@ -211,7 +212,7 @@ class LikedListItem extends StatelessWidget {
if (viewModel.isTenderSubmitted(tender.id!)) { if (viewModel.isTenderSubmitted(tender.id!)) {
viewModel.submitTenderApproval( viewModel.submitTenderApproval(
tenderId: tender.id!, tenderId: tender.id!,
submissionMode: 'self-apply', submissionMode: TenderSubmissionMode.selfApply.value,
); );
} else { } else {
(kIsWeb && MediaQuery.sizeOf(context).width > 600) (kIsWeb && MediaQuery.sizeOf(context).width > 600)
@@ -1,11 +1,11 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart'; import '../../../core/constants/assets.dart';
import '../../../core/routes/app_routes.dart';
import '../../../core/utils/app_toast.dart'; import '../../../core/utils/app_toast.dart';
import '../../../core/utils/size_config.dart'; import '../../../core/utils/size_config.dart';
import '../../../view_models/auth_view_model.dart'; import '../../../view_models/auth_view_model.dart';
@@ -31,7 +31,7 @@ class _LoginDesktopPageState extends State<LoginDesktopPage> {
void _viewModelListener() { void _viewModelListener() {
if (viewModel.loggedInUser != null) { if (viewModel.loggedInUser != null) {
Router.neglect(context, () => context.go('/home')); Router.neglect(context, () => HomeRouteData().go(context));
} else if (viewModel.errorMessage != null) { } else if (viewModel.errorMessage != null) {
AppToast.error(context, viewModel.errorMessage!); AppToast.error(context, viewModel.errorMessage!);
} }
+2 -2
View File
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart'; import '../../../core/constants/assets.dart';
import '../../../core/routes/app_routes.dart';
import '../../../core/utils/app_toast.dart'; import '../../../core/utils/app_toast.dart';
import '../../../core/utils/size_config.dart'; import '../../../core/utils/size_config.dart';
import '../../../view_models/auth_view_model.dart'; import '../../../view_models/auth_view_model.dart';
@@ -29,7 +29,7 @@ class _LoginMobilePageState extends State<LoginMobilePage> {
void _viewModelListener() { void _viewModelListener() {
if (viewModel.loggedInUser != null) { if (viewModel.loggedInUser != null) {
Router.neglect(context, () => context.go('/home')); Router.neglect(context, () => HomeRouteData().go(context));
} }
if (viewModel.errorMessage != null) { if (viewModel.errorMessage != null) {
AppToast.error(context, viewModel.errorMessage!); AppToast.error(context, viewModel.errorMessage!);
+2 -2
View File
@@ -1,9 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart'; import '../../../core/constants/assets.dart';
import '../../../core/routes/app_routes.dart';
import '../../../core/utils/app_toast.dart'; import '../../../core/utils/app_toast.dart';
import '../../../core/utils/size_config.dart'; import '../../../core/utils/size_config.dart';
import '../../../view_models/auth_view_model.dart'; import '../../../view_models/auth_view_model.dart';
@@ -29,7 +29,7 @@ class _LoginTabletPageState extends State<LoginTabletPage> {
void _viewModelListener() { void _viewModelListener() {
if (viewModel.loggedInUser != null) { if (viewModel.loggedInUser != null) {
Router.neglect(context, () => context.go('/home')); Router.neglect(context, () => HomeRouteData().go(context));
} }
if (viewModel.errorMessage != null) { if (viewModel.errorMessage != null) {
AppToast.error(context, viewModel.errorMessage!); AppToast.error(context, viewModel.errorMessage!);
-98
View File
@@ -1,98 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:tm_app/core/constants/assets.dart';
import '../../core/utils/size_config.dart';
class TenderBottomNavigation extends StatefulWidget {
const TenderBottomNavigation({super.key});
@override
State<TenderBottomNavigation> createState() => _TenderBottomNavigationState();
}
class _TenderBottomNavigationState extends State<TenderBottomNavigation> {
int activeTab = 0;
@override
Widget build(BuildContext context) {
return Container(
height: 72.0.h(),
decoration: BoxDecoration(
color: Color(0xFFE3E3E3),
border: Border.fromBorderSide(BorderSide(color: Color(0xFFE3E3E3))),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
_bottomNavigationItem(
text: 'Home',
isActive: activeTab == 0,
onTap: () {
setState(() {
activeTab = 0;
});
},
iconPath: 'assets/icons/home.svg',
activeIconPath: AssetsManager.homeActive,
),
_bottomNavigationItem(
text: 'Tenders',
isActive: activeTab == 1,
onTap: () {
setState(() {
activeTab = 1;
});
},
iconPath: 'assets/icons/task_square.svg',
activeIconPath: 'assets/icons/task-square_active.svg',
),
_bottomNavigationItem(
text: 'Profile',
isActive: activeTab == 2,
onTap: () {
setState(() {
activeTab = 2;
});
},
iconPath: 'assets/icons/profile-circle.svg',
activeIconPath: 'assets/icons/profile-circle_active.svg',
),
],
),
);
}
Widget _bottomNavigationItem({
required String text,
required bool isActive,
required VoidCallback onTap,
required String iconPath,
required String activeIconPath,
}) {
return InkWell(
onTap: onTap,
child: SizedBox(
width: 64.0.w(),
height: 72.0.h(),
child: Padding(
padding: EdgeInsets.only(top: 12.0.h(), bottom: 14.0.h()),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset(isActive ? activeIconPath : iconPath),
Text(
text,
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color: isActive ? Color(0xFF0164FF) : Color(0xFF777777),
),
),
],
),
),
),
);
}
}
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:tm_app/core/utils/size_config.dart'; import 'package:tm_app/core/utils/size_config.dart';
import '../../core/constants/common_strings.dart';
import '../../core/constants/tender_submision_mode.dart'; import '../../core/constants/tender_submision_mode.dart';
import '../../core/theme/colors.dart'; import '../../core/theme/colors.dart';
@@ -37,7 +38,7 @@ class _SelectSubmissionBottomSheetState
child: Column( child: Column(
children: [ children: [
Text( Text(
'Select Submission', CommonStrings.selectSubmission,
style: TextStyle( style: TextStyle(
fontSize: 20.0.sp(), fontSize: 20.0.sp(),
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@@ -46,7 +47,7 @@ class _SelectSubmissionBottomSheetState
), ),
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_submissionType( _submissionType(
title: 'self-apply', title: CommonStrings.selfApply,
isSelected: type == TenderSubmissionMode.selfApply.value, isSelected: type == TenderSubmissionMode.selfApply.value,
onTap: () { onTap: () {
selectedType = 0; selectedType = 0;
@@ -56,7 +57,7 @@ class _SelectSubmissionBottomSheetState
), ),
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_submissionType( _submissionType(
title: 'Partnership', title: CommonStrings.partnership,
isSelected: type == TenderSubmissionMode.partnership.value, isSelected: type == TenderSubmissionMode.partnership.value,
onTap: () { onTap: () {
selectedType = 1; selectedType = 1;
@@ -79,7 +80,7 @@ class _SelectSubmissionBottomSheetState
), ),
alignment: Alignment.center, alignment: Alignment.center,
child: Text( child: Text(
'Confirm', CommonStrings.confirm,
style: TextStyle( style: TextStyle(
fontSize: 14.0.sp(), fontSize: 14.0.sp(),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:tm_app/core/utils/size_config.dart'; import 'package:tm_app/core/utils/size_config.dart';
import '../../core/constants/common_strings.dart';
import '../../core/constants/tender_submision_mode.dart'; import '../../core/constants/tender_submision_mode.dart';
import '../../core/theme/colors.dart'; import '../../core/theme/colors.dart';
@@ -34,7 +35,7 @@ class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
child: Column( child: Column(
children: [ children: [
Text( Text(
'Select Submission', CommonStrings.selectSubmission,
style: TextStyle( style: TextStyle(
fontSize: 20.0.sp(), fontSize: 20.0.sp(),
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
@@ -43,7 +44,7 @@ class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
), ),
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_submissionType( _submissionType(
title: 'Self-apply', title: CommonStrings.selfApply,
isSelected: type == TenderSubmissionMode.selfApply.value, isSelected: type == TenderSubmissionMode.selfApply.value,
onTap: () { onTap: () {
selectedType = 0; selectedType = 0;
@@ -53,7 +54,7 @@ class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
), ),
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_submissionType( _submissionType(
title: 'Partnership', title: CommonStrings.partnership,
isSelected: type == TenderSubmissionMode.partnership.value, isSelected: type == TenderSubmissionMode.partnership.value,
onTap: () { onTap: () {
selectedType = 1; selectedType = 1;
@@ -78,7 +79,7 @@ class _SelectSubmissionDialogState extends State<SelectSubmissionDialog> {
), ),
alignment: Alignment.center, alignment: Alignment.center,
child: Text( child: Text(
'Confirm', CommonStrings.confirm,
style: TextStyle( style: TextStyle(
fontSize: 14.0.sp(), fontSize: 14.0.sp(),
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
@@ -15,4 +15,7 @@ class YourTendersStrings {
static const approvedTenders = 'Approved tenders'; static const approvedTenders = 'Approved tenders';
static const noTenders = 'No data available'; static const noTenders = 'No data available';
static const selectPublicationRangeDate = 'Select publication date range'; static const selectPublicationRangeDate = 'Select publication date range';
static const noLikedTenders = 'You havent liked any tenders yet !';
static const noDislikedTenders = 'You havent disliked any tenders yet !';
static const noTendersSubmitted = 'You havent submitted any tenders yet !';
} }
@@ -4,8 +4,11 @@ import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart'; import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart'; import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart';
import 'package:tm_app/view_models/your_tenders_view_model.dart'; import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
import 'package:tm_app/views/your_tenders/widgets/tender_card.dart'; import 'package:tm_app/views/your_tenders/widgets/tender_card.dart';
import '../../../core/constants/tender_feedback.dart';
class LikedDislikedTendersList extends StatefulWidget { class LikedDislikedTendersList extends StatefulWidget {
final LikedTendersResponse data; final LikedTendersResponse data;
final String status; final String status;
@@ -54,7 +57,9 @@ class _LikedDislikedTendersListState extends State<LikedDislikedTendersList> {
if (data.data?.feedback == null || data.data!.feedback!.isEmpty) { if (data.data?.feedback == null || data.data!.feedback!.isEmpty) {
return Center( return Center(
child: Text( child: Text(
'No ${widget.status} found', widget.status == TenderFeedback.liked.value
? YourTendersStrings.noLikedTenders
: YourTendersStrings.noDislikedTenders,
style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey70), style: TextStyle(fontSize: 16.0.sp(), color: AppColors.grey70),
), ),
); );
@@ -3,6 +3,7 @@ import 'package:provider/provider.dart';
import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart'; import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/view_models/your_tenders_view_model.dart'; import 'package:tm_app/view_models/your_tenders_view_model.dart';
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
import 'package:tm_app/views/your_tenders/widgets/tender_card.dart'; import 'package:tm_app/views/your_tenders/widgets/tender_card.dart';
import '../../../data/services/model/tender_approvals_response/tender_approvals_response.dart'; import '../../../data/services/model/tender_approvals_response/tender_approvals_response.dart';
@@ -55,12 +56,16 @@ class _TendersSubmittedState extends State<TendersSubmitted> {
return Consumer<YourTendersViewModel>( return Consumer<YourTendersViewModel>(
builder: (context, viewModel, child) { builder: (context, viewModel, child) {
if (widget.approvedTenders.data == null) { if (widget.approvedTenders.data == null) {
return const Center(child: Text('No submitted projects yet.')); return const Center(
child: Text(YourTendersStrings.noTendersSubmitted),
);
} }
final tenders = widget.approvedTenders.data!.tenders ?? []; final tenders = widget.approvedTenders.data!.tenders ?? [];
if (tenders.isEmpty) { if (tenders.isEmpty) {
return const Center(child: Text('No submitted projects yet.')); return const Center(
child: Text(YourTendersStrings.noTendersSubmitted),
);
} }
final itemCount = final itemCount =