added string for every screen and removed from app strings
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
class CommonStrings {
|
||||
CommonStrings._();
|
||||
|
||||
// Truly shared strings across multiple features
|
||||
static const String noData = 'No data';
|
||||
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';
|
||||
}
|
||||
@@ -1,116 +0,0 @@
|
||||
class AppStrings {
|
||||
AppStrings._();
|
||||
|
||||
static const String noData = 'No data';
|
||||
|
||||
// App Titles
|
||||
static const String appName = 'My Awesome App';
|
||||
static const String loginTitle = 'Welcome Back';
|
||||
|
||||
// Labels and Buttons
|
||||
static const String signupButton = 'Create Account';
|
||||
static const String forgotPassword = 'Forgot Password?';
|
||||
static const String emailHint = 'Email address';
|
||||
static const String passwordHint = 'Password';
|
||||
|
||||
// Error Messages
|
||||
static const String loginFailed =
|
||||
'Login failed. Please check your credentials.';
|
||||
static const String networkError = 'Network error. Please try again.';
|
||||
|
||||
//Login
|
||||
static const signInTitle = 'Sign In';
|
||||
static const signInSubtitle = 'Enter valid username & password to continue';
|
||||
static const usernameLabel = 'User Name';
|
||||
static const passwordLabel = 'Password';
|
||||
static const loginButton = 'Login';
|
||||
|
||||
//forgot password
|
||||
static const String forgotPasswordTitle = 'Forgot Password';
|
||||
static const String forgotPasswordSubtitle =
|
||||
'Enter your registered email and company ID and submit your request.';
|
||||
static const String emailAddressHint = 'Email Address';
|
||||
static const String backToSignInButton = 'Back to Sign In';
|
||||
static const String resetLink = 'Reset Link';
|
||||
|
||||
//Home
|
||||
static const String home = 'Home';
|
||||
static const String partnership = 'Partnership';
|
||||
static const String selfApply = 'Self-apply';
|
||||
static const String contracting = 'Contracting';
|
||||
static const String tenderSubmitted = 'Tenders submitted';
|
||||
static const String approvedTenders = 'Approved tenders';
|
||||
static const String tenderValue = 'Tender Value';
|
||||
static const String thunderStatus = 'Thunder status';
|
||||
static const String likedTenders = 'Liked Tenders';
|
||||
static const String yourTenders = 'Your tenders';
|
||||
static const String recommendation = 'Recommendation';
|
||||
static const String welcome = 'Welcome';
|
||||
static const String tenderDeadline = 'Deadline';
|
||||
static const String recommendedTenders = 'Recommended Tenders';
|
||||
|
||||
//Tenders
|
||||
static const String tendersTitle = 'Tenders';
|
||||
static const String tenderSeeMore = 'See More';
|
||||
static const String reject = 'Reject';
|
||||
static const String submit = 'Submit';
|
||||
static const String dislike = 'Dislike';
|
||||
static const String like = 'Like';
|
||||
|
||||
//profile
|
||||
static const String profile = 'Profile';
|
||||
static const String settings = 'Settings';
|
||||
static const String appTheme = 'App Theme';
|
||||
static const String companyName = 'Company Name';
|
||||
static const String nationalId = 'National ID';
|
||||
static const String registrationNumber = 'Registration No.';
|
||||
static const String businessType = 'Business Type';
|
||||
static const String founded = 'Founded';
|
||||
static const String logout = 'Logout';
|
||||
|
||||
//your tenders
|
||||
static const String yourTendersTitle = 'Your tenders';
|
||||
static const filter = 'Filter';
|
||||
static const selectDateRange = 'Select date range';
|
||||
static const status = 'Status';
|
||||
static const all = 'All';
|
||||
static const likeTenders = 'Like tenders';
|
||||
static const dislikeTenders = 'Dislike tenders';
|
||||
static const tendersSubmitted = 'Tenders submitted';
|
||||
static const confirm = 'Confirm';
|
||||
static const startDate = 'YYYY/MM/DD';
|
||||
static const endDate = 'YYYY/MM/DD';
|
||||
|
||||
|
||||
// Tender Detail Page
|
||||
static const String tenderDetailTitle = 'Tender Detail';
|
||||
static const String tenderStatusOpen = 'Open';
|
||||
static const String tenderIdLabel = 'ID';
|
||||
static const String tenderDeadlineLabel = 'Deadline';
|
||||
static const String tenderApprovalText = 'For approval';
|
||||
static const String tenderSubmissionText = 'For submission';
|
||||
static const String tenderClientLabel = 'Client';
|
||||
static const String tenderDeliveryLocationsLabel = 'Delivery Locations';
|
||||
static const String tenderReferenceNumberLabel = 'Reference Number';
|
||||
static const String tenderLocationLabel = 'Locations';
|
||||
static const String tenderPdfDocument = 'PDF , Document';
|
||||
static const String tenderMatchProfile = 'Match with your profile';
|
||||
static const String tenderIncompleteResume = 'Incomplete Resume Information';
|
||||
static const String tenderNoExperience =
|
||||
'No experience in e-platform development';
|
||||
static const String tenderSubmitButton = 'Submit';
|
||||
static const String tenderRejectButton = 'Reject';
|
||||
static const String tenderClientExample =
|
||||
'Procurement Notice Procurement Notice';
|
||||
static const String estimatedValue = 'Estimated Value ';
|
||||
static const String duration = 'Duration';
|
||||
static const String tenderSubmittedSuccessfully =
|
||||
'tender submitted successfully!';
|
||||
static const String tenderRejectedSuccessfully =
|
||||
'tender rejected successfully!';
|
||||
static const String tenderUnrejectedSuccessfully =
|
||||
'tender unrejected successfully!';
|
||||
static const String tenderUnsubmittedSuccessfully =
|
||||
'tender unsubmitted successfully!';
|
||||
static const String tenderNoData = 'No tender details available';
|
||||
}
|
||||
@@ -2,9 +2,12 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/views/profile/strings/profile_strings.dart';
|
||||
|
||||
import '../../../views/home/strings/home_strings.dart';
|
||||
import '../../../views/tenders/strings/tenders_strings.dart';
|
||||
|
||||
class MobileShellPage extends StatelessWidget {
|
||||
const MobileShellPage({
|
||||
@@ -31,7 +34,7 @@ class MobileShellPage extends StatelessWidget {
|
||||
children: [
|
||||
_bottomNavigationItem(
|
||||
context: context,
|
||||
text: AppStrings.home,
|
||||
text: HomeStrings.home,
|
||||
isActive: navigationShell.currentIndex == 0,
|
||||
onTap: () => onTap(0),
|
||||
iconPath: AssetsManager.home,
|
||||
@@ -39,7 +42,7 @@ class MobileShellPage extends StatelessWidget {
|
||||
),
|
||||
_bottomNavigationItem(
|
||||
context: context,
|
||||
text: AppStrings.tendersTitle,
|
||||
text: TendersStrings.tendersTitle,
|
||||
isActive: navigationShell.currentIndex == 1,
|
||||
onTap: () => onTap(1),
|
||||
iconPath: AssetsManager.tenders,
|
||||
@@ -47,7 +50,7 @@ class MobileShellPage extends StatelessWidget {
|
||||
),
|
||||
_bottomNavigationItem(
|
||||
context: context,
|
||||
text: AppStrings.profile,
|
||||
text: ProfileStrings.profileTitle,
|
||||
isActive: navigationShell.currentIndex == 2,
|
||||
onTap: () => onTap(2),
|
||||
iconPath: AssetsManager.profile,
|
||||
|
||||
@@ -7,9 +7,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';
|
||||
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../shared/desktop_navigation_widget.dart';
|
||||
import '../strings/tender_details_strings.dart';
|
||||
|
||||
class TenderDetailDesktopPage extends StatefulWidget {
|
||||
final String tenderId;
|
||||
@@ -34,28 +34,36 @@ class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
|
||||
viewModel.status == 'submitted' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderSubmittedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderSubmittedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unsubmitted' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderUnsubmittedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderUnsubmittedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'rejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderRejectedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderRejectedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unrejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderUnrejectedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderUnrejectedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.approvalStatus != false && viewModel.errorMessage != null) {
|
||||
@@ -98,7 +106,9 @@ class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
|
||||
|
||||
final detail = tenderViewModel.tenderDetail;
|
||||
if (detail == null) {
|
||||
return const Center(child: Text(AppStrings.tenderNoData));
|
||||
return const Center(
|
||||
child: Text(TenderDetailsStrings.tenderNoData),
|
||||
);
|
||||
}
|
||||
|
||||
return Column(
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/tender_detail_view_model.dart';
|
||||
import 'package:tm_app/views/detail/strings/tender_details_strings.dart';
|
||||
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';
|
||||
@@ -32,28 +32,36 @@ class _TenderDetailMobilePageState extends State<TenderDetailMobilePage> {
|
||||
viewModel.status == 'submitted' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderSubmittedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderSubmittedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unsubmitted' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderUnsubmittedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderUnsubmittedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'rejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderRejectedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderRejectedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unrejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderUnrejectedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderUnrejectedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.approvalStatus != false && viewModel.errorMessage != null) {
|
||||
@@ -86,7 +94,10 @@ class _TenderDetailMobilePageState extends State<TenderDetailMobilePage> {
|
||||
},
|
||||
child: Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: appBar(context: context, title: AppStrings.tenderDetailTitle),
|
||||
appBar: appBar(
|
||||
context: context,
|
||||
title: TenderDetailsStrings.tenderDetailTitle,
|
||||
),
|
||||
body: Consumer<TenderDetailViewModel>(
|
||||
builder: (context, tenderViewModel, child) {
|
||||
if (tenderViewModel.isLoading) {
|
||||
@@ -101,7 +112,9 @@ class _TenderDetailMobilePageState extends State<TenderDetailMobilePage> {
|
||||
|
||||
final detail = tenderViewModel.tenderDetail;
|
||||
if (detail == null) {
|
||||
return const Center(child: Text(AppStrings.tenderNoData));
|
||||
return const Center(
|
||||
child: Text(TenderDetailsStrings.tenderNoData),
|
||||
);
|
||||
}
|
||||
|
||||
return SingleChildScrollView(
|
||||
|
||||
@@ -12,8 +12,8 @@ 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/constants/strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../strings/tender_details_strings.dart';
|
||||
|
||||
class TenderDetailTabletPage extends StatefulWidget {
|
||||
final String tenderId;
|
||||
@@ -37,28 +37,36 @@ class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
|
||||
viewModel.status == 'submitted' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderSubmittedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderSubmittedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unsubmitted' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderUnsubmittedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderUnsubmittedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'rejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderRejectedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderRejectedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unrejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text(AppStrings.tenderUnrejectedSuccessfully)),
|
||||
SnackBar(
|
||||
content: Text(TenderDetailsStrings.tenderUnrejectedSuccessfully),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.approvalStatus != false && viewModel.errorMessage != null) {
|
||||
@@ -149,7 +157,9 @@ class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
|
||||
|
||||
final detail = tenderViewModel.tenderDetail;
|
||||
if (detail == null) {
|
||||
return const Center(child: Text(AppStrings.tenderNoData));
|
||||
return const Center(
|
||||
child: Text(TenderDetailsStrings.tenderNoData),
|
||||
);
|
||||
}
|
||||
return SingleChildScrollView(
|
||||
child: Center(
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
class TenderDetailsStrings {
|
||||
TenderDetailsStrings._();
|
||||
|
||||
static const String tenderDetailTitle = 'Tender Detail';
|
||||
static const String tenderStatusOpen = 'Open';
|
||||
static const String tenderIdLabel = 'ID';
|
||||
static const String tenderDeadlineLabel = 'Deadline';
|
||||
static const String tenderApprovalText = 'For approval';
|
||||
static const String tenderSubmissionText = 'For submission';
|
||||
static const String tenderClientLabel = 'Client';
|
||||
static const String tenderDeliveryLocationsLabel = 'Delivery Locations';
|
||||
static const String tenderReferenceNumberLabel = 'Reference Number';
|
||||
static const String tenderLocationLabel = 'Locations';
|
||||
static const String tenderPdfDocument = 'PDF , Document';
|
||||
static const String tenderMatchProfile = 'Match with your profile';
|
||||
static const String tenderIncompleteResume = 'Incomplete Resume Information';
|
||||
static const String tenderNoExperience =
|
||||
'No experience in e-platform development';
|
||||
static const String tenderSubmitButton = 'Submit';
|
||||
static const String tenderRejectButton = 'Reject';
|
||||
static const String tenderClientExample =
|
||||
'Procurement Notice Procurement Notice';
|
||||
static const String estimatedValue = 'Estimated Value ';
|
||||
static const String duration = 'Duration';
|
||||
static const String tenderSubmittedSuccessfully =
|
||||
'tender submitted successfully!';
|
||||
static const String tenderRejectedSuccessfully =
|
||||
'tender rejected successfully!';
|
||||
static const String tenderUnrejectedSuccessfully =
|
||||
'tender unrejected successfully!';
|
||||
static const String tenderUnsubmittedSuccessfully =
|
||||
'tender unsubmitted successfully!';
|
||||
static const String tenderNoData = 'No tender details available';
|
||||
}
|
||||
@@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/date_utils.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/views/detail/strings/tender_details_strings.dart';
|
||||
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../data/services/model/tender_data/tender_data.dart';
|
||||
|
||||
class DeadlineItem extends StatelessWidget {
|
||||
@@ -44,7 +44,7 @@ class DeadlineItem extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderApprovalText,
|
||||
TenderDetailsStrings.tenderApprovalText,
|
||||
style: TextStyle(
|
||||
color: AppColors.grey70,
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -73,7 +73,7 @@ class DeadlineItem extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderSubmissionText,
|
||||
TenderDetailsStrings.tenderSubmissionText,
|
||||
style: TextStyle(
|
||||
color: AppColors.grey70,
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -120,7 +120,7 @@ class DeadlineItem extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderApprovalText,
|
||||
TenderDetailsStrings.tenderApprovalText,
|
||||
style: TextStyle(
|
||||
color: AppColors.grey70,
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -142,7 +142,7 @@ class DeadlineItem extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderSubmissionText,
|
||||
TenderDetailsStrings.tenderSubmissionText,
|
||||
style: TextStyle(
|
||||
color: AppColors.grey70,
|
||||
fontWeight: FontWeight.w400,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/tender_detail_view_model.dart';
|
||||
@@ -9,6 +8,7 @@ import 'package:tm_app/views/shared/select_submission_bottom_sheet.dart';
|
||||
|
||||
import '../../../data/services/model/tender_data/tender_data.dart';
|
||||
import '../../shared/select_submission_dialog.dart';
|
||||
import '../strings/tender_details_strings.dart';
|
||||
|
||||
class TenderDetailActions extends StatelessWidget {
|
||||
final bool isScreenBig;
|
||||
@@ -43,7 +43,7 @@ class TenderDetailActions extends StatelessWidget {
|
||||
)
|
||||
: BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderSubmitButton,
|
||||
text: TenderDetailsStrings.tenderSubmitButton,
|
||||
backgroundColor: AppColors.primary30,
|
||||
textColor: AppColors.mainBlue,
|
||||
onPressed: () {
|
||||
@@ -78,7 +78,7 @@ class TenderDetailActions extends StatelessWidget {
|
||||
return viewModel.isRejectApprovalLoading
|
||||
? BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderRejectButton,
|
||||
text: TenderDetailsStrings.tenderRejectButton,
|
||||
borderColor: AppColors.error,
|
||||
textColor: AppColors.error,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
@@ -87,7 +87,7 @@ class TenderDetailActions extends StatelessWidget {
|
||||
)
|
||||
: BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderRejectButton,
|
||||
text: TenderDetailsStrings.tenderRejectButton,
|
||||
borderColor: AppColors.error,
|
||||
textColor: AppColors.error,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
@@ -115,7 +115,7 @@ class TenderDetailActions extends StatelessWidget {
|
||||
return viewModel.isRejectApprovalLoading
|
||||
? BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderRejectButton,
|
||||
text: TenderDetailsStrings.tenderRejectButton,
|
||||
textColor: AppColors.red10,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
borderWidth: 1,
|
||||
@@ -124,7 +124,7 @@ class TenderDetailActions extends StatelessWidget {
|
||||
)
|
||||
: BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderRejectButton,
|
||||
text: TenderDetailsStrings.tenderRejectButton,
|
||||
textColor: AppColors.red10,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
borderWidth: 1,
|
||||
@@ -144,7 +144,7 @@ class TenderDetailActions extends StatelessWidget {
|
||||
return viewModel.isSubmitApprovalLoading
|
||||
? BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderSubmitButton,
|
||||
text: TenderDetailsStrings.tenderSubmitButton,
|
||||
backgroundColor: AppColors.lightBlue,
|
||||
textColor: AppColors.mainBlue,
|
||||
onPressed: () {},
|
||||
@@ -152,7 +152,7 @@ class TenderDetailActions extends StatelessWidget {
|
||||
)
|
||||
: BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderSubmitButton,
|
||||
text: TenderDetailsStrings.tenderSubmitButton,
|
||||
backgroundColor: AppColors.lightBlue,
|
||||
textColor: AppColors.mainBlue,
|
||||
onPressed: () {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
|
||||
import 'package:tm_app/views/detail/strings/tender_details_strings.dart';
|
||||
|
||||
class TenderDetailCard extends StatelessWidget {
|
||||
final TenderData detail;
|
||||
@@ -25,7 +25,7 @@ class TenderDetailCard extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderMatchProfile,
|
||||
TenderDetailsStrings.tenderMatchProfile,
|
||||
style: TextStyle(
|
||||
fontSize: 12.0.sp(),
|
||||
color: AppColors.grey80,
|
||||
@@ -65,7 +65,7 @@ class TenderDetailCard extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderIncompleteResume,
|
||||
TenderDetailsStrings.tenderIncompleteResume,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16.0.sp(),
|
||||
@@ -74,7 +74,7 @@ class TenderDetailCard extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 4.0.h()),
|
||||
Text(
|
||||
AppStrings.tenderNoExperience,
|
||||
TenderDetailsStrings.tenderNoExperience,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
color: AppColors.grey70,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
|
||||
import 'package:tm_app/views/detail/strings/tender_details_strings.dart';
|
||||
import 'package:tm_app/views/detail/widgets/deadline_item.dart';
|
||||
import 'package:tm_app/views/detail/widgets/info_item.dart';
|
||||
|
||||
@@ -19,22 +19,25 @@ class TenderDetailInfoSection extends StatelessWidget {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
InfoItem(title: AppStrings.tenderIdLabel, value: detail.tenderId ?? ''),
|
||||
InfoItem(
|
||||
title: TenderDetailsStrings.tenderIdLabel,
|
||||
value: detail.tenderId ?? '',
|
||||
),
|
||||
DeadlineItem(detail: detail, isScreenBig: isScreenBig),
|
||||
InfoItem(
|
||||
title: AppStrings.tenderClientLabel,
|
||||
title: TenderDetailsStrings.tenderClientLabel,
|
||||
value: detail.buyerOrganization!.name ?? '',
|
||||
),
|
||||
InfoItem(
|
||||
title: AppStrings.estimatedValue,
|
||||
title: TenderDetailsStrings.estimatedValue,
|
||||
value: '${detail.estimatedValue} ${detail.currency ?? ''}',
|
||||
),
|
||||
InfoItem(
|
||||
title: AppStrings.duration,
|
||||
title: TenderDetailsStrings.duration,
|
||||
value: '${detail.duration} ${detail.durationUnit ?? ''}',
|
||||
),
|
||||
InfoItem(
|
||||
title: AppStrings.tenderReferenceNumberLabel,
|
||||
title: TenderDetailsStrings.tenderReferenceNumberLabel,
|
||||
value: detail.noticePublicationId ?? '',
|
||||
),
|
||||
],
|
||||
|
||||
@@ -2,11 +2,11 @@ import 'package:country_flags/country_flags.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
|
||||
import '../../../data/services/model/tender_data/tender_data.dart';
|
||||
import '../strings/tender_details_strings.dart';
|
||||
|
||||
class TenderLocationSection extends StatelessWidget {
|
||||
final TenderData detail;
|
||||
@@ -60,7 +60,7 @@ class TenderLocationSection extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 8.0.h()),
|
||||
Text(
|
||||
AppStrings.tenderLocationLabel,
|
||||
TenderDetailsStrings.tenderLocationLabel,
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0.sp()),
|
||||
),
|
||||
SizedBox(height: 8.0.h()),
|
||||
|
||||
@@ -5,11 +5,11 @@ import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../../view_models/auth_view_model.dart';
|
||||
import '../../login/widgets/login_textfield.dart';
|
||||
import '../../shared/base_button.dart';
|
||||
import '../strings/forgot_password_strings.dart';
|
||||
|
||||
class DesktopForgotPasswordPage extends StatelessWidget {
|
||||
const DesktopForgotPasswordPage({super.key});
|
||||
@@ -41,7 +41,7 @@ class DesktopForgotPasswordPage extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 72.0.h()),
|
||||
Text(
|
||||
AppStrings.forgotPasswordTitle,
|
||||
ForgotPasswordStrings.forgotPasswordTitle,
|
||||
style: TextStyle(
|
||||
fontSize: 28.0.sp(),
|
||||
fontWeight: FontWeight.bold,
|
||||
@@ -50,7 +50,7 @@ class DesktopForgotPasswordPage extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 16.0.h()),
|
||||
Text(
|
||||
AppStrings.forgotPasswordSubtitle,
|
||||
ForgotPasswordStrings.forgotPasswordSubtitle,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
@@ -62,13 +62,13 @@ class DesktopForgotPasswordPage extends StatelessWidget {
|
||||
LoginTextField(
|
||||
controller: viewModel.emailController,
|
||||
focusNode: viewModel.emailFocus,
|
||||
label: AppStrings.emailAddressHint,
|
||||
label: ForgotPasswordStrings.emailAddressHint,
|
||||
isPassword: false,
|
||||
),
|
||||
SizedBox(height: 70.0.h()),
|
||||
BaseButton(
|
||||
isEnabled: false,
|
||||
text: AppStrings.resetLink,
|
||||
text: ForgotPasswordStrings.resetLink,
|
||||
onPressed: () async {
|
||||
if (viewModel.isLoginEnabled) {
|
||||
await viewModel.login();
|
||||
@@ -81,7 +81,7 @@ class DesktopForgotPasswordPage extends StatelessWidget {
|
||||
context.pop();
|
||||
},
|
||||
child: Text(
|
||||
AppStrings.backToSignInButton,
|
||||
ForgotPasswordStrings.backToSignInButton,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -5,11 +5,11 @@ import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../../view_models/auth_view_model.dart';
|
||||
import '../../login/widgets/login_textfield.dart';
|
||||
import '../../shared/base_button.dart';
|
||||
import '../strings/forgot_password_strings.dart';
|
||||
|
||||
class MobileForgotPasswordPage extends StatelessWidget {
|
||||
const MobileForgotPasswordPage({super.key});
|
||||
@@ -36,7 +36,7 @@ class MobileForgotPasswordPage extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 72.0.h()),
|
||||
Text(
|
||||
AppStrings.forgotPasswordTitle,
|
||||
ForgotPasswordStrings.forgotPasswordTitle,
|
||||
style: TextStyle(
|
||||
fontSize: 28.0.sp(),
|
||||
fontWeight: FontWeight.bold,
|
||||
@@ -45,7 +45,7 @@ class MobileForgotPasswordPage extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 16.0.h()),
|
||||
Text(
|
||||
AppStrings.forgotPasswordSubtitle,
|
||||
ForgotPasswordStrings.forgotPasswordSubtitle,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
@@ -57,13 +57,13 @@ class MobileForgotPasswordPage extends StatelessWidget {
|
||||
LoginTextField(
|
||||
controller: viewModel.emailController,
|
||||
focusNode: viewModel.emailFocus,
|
||||
label: AppStrings.emailAddressHint,
|
||||
label: ForgotPasswordStrings.emailAddressHint,
|
||||
isPassword: false,
|
||||
),
|
||||
SizedBox(height: 70.0.h()),
|
||||
BaseButton(
|
||||
isEnabled: false,
|
||||
text: AppStrings.resetLink,
|
||||
text: ForgotPasswordStrings.resetLink,
|
||||
onPressed: () async {
|
||||
if (viewModel.isLoginEnabled) {
|
||||
await viewModel.login();
|
||||
@@ -75,7 +75,7 @@ class MobileForgotPasswordPage extends StatelessWidget {
|
||||
context.pop();
|
||||
},
|
||||
child: Text(
|
||||
AppStrings.backToSignInButton,
|
||||
ForgotPasswordStrings.backToSignInButton,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -5,11 +5,11 @@ import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../../view_models/auth_view_model.dart';
|
||||
import '../../login/widgets/login_textfield.dart';
|
||||
import '../../shared/base_button.dart';
|
||||
import '../strings/forgot_password_strings.dart';
|
||||
|
||||
class TabletForgotPasswordPage extends StatelessWidget {
|
||||
const TabletForgotPasswordPage({super.key});
|
||||
@@ -35,7 +35,7 @@ class TabletForgotPasswordPage extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 72.0.h()),
|
||||
Text(
|
||||
AppStrings.forgotPasswordTitle,
|
||||
ForgotPasswordStrings.forgotPasswordTitle,
|
||||
style: TextStyle(
|
||||
fontSize: 28.0.sp(),
|
||||
fontWeight: FontWeight.bold,
|
||||
@@ -44,7 +44,7 @@ class TabletForgotPasswordPage extends StatelessWidget {
|
||||
),
|
||||
SizedBox(height: 16.0.h()),
|
||||
Text(
|
||||
AppStrings.forgotPasswordSubtitle,
|
||||
ForgotPasswordStrings.forgotPasswordSubtitle,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
@@ -56,13 +56,13 @@ class TabletForgotPasswordPage extends StatelessWidget {
|
||||
LoginTextField(
|
||||
controller: viewModel.emailController,
|
||||
focusNode: viewModel.emailFocus,
|
||||
label: AppStrings.emailAddressHint,
|
||||
label: ForgotPasswordStrings.emailAddressHint,
|
||||
isPassword: false,
|
||||
),
|
||||
SizedBox(height: 70.0.h()),
|
||||
BaseButton(
|
||||
isEnabled: false,
|
||||
text: AppStrings.resetLink,
|
||||
text: ForgotPasswordStrings.resetLink,
|
||||
onPressed: () async {
|
||||
if (viewModel.isLoginEnabled) {
|
||||
await viewModel.login();
|
||||
@@ -75,7 +75,7 @@ class TabletForgotPasswordPage extends StatelessWidget {
|
||||
context.pop();
|
||||
},
|
||||
child: Text(
|
||||
AppStrings.backToSignInButton,
|
||||
ForgotPasswordStrings.backToSignInButton,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
class ForgotPasswordStrings {
|
||||
ForgotPasswordStrings._();
|
||||
|
||||
static const String forgotPassword = 'Forgot Password?';
|
||||
static const String forgotPasswordTitle = 'Forgot Password';
|
||||
static const String forgotPasswordSubtitle =
|
||||
'Enter your registered email and company ID and submit your request.';
|
||||
static const String emailAddressHint = 'Email Address';
|
||||
static const String backToSignInButton = 'Back to Sign In';
|
||||
static const String resetLink = 'Reset Link';
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/strings.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/home_view_model.dart';
|
||||
import 'package:tm_app/views/shared/desktop_navigation_widget.dart';
|
||||
|
||||
import '../strings/home_strings.dart';
|
||||
import '../widgets.dart';
|
||||
|
||||
class DesktopHomePage extends StatelessWidget {
|
||||
@@ -107,7 +107,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.partnership,
|
||||
text: HomeStrings.partnership,
|
||||
value: homeViewModel.partnershipPercent,
|
||||
amount: homeViewModel.partnershipPercent.toString(),
|
||||
circularProgressIndicatorWidth: 176,
|
||||
@@ -115,7 +115,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
),
|
||||
SizedBox(width: 106),
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.selfApply,
|
||||
text: HomeStrings.selfApply,
|
||||
value: homeViewModel.selfApplyPercent,
|
||||
amount: homeViewModel.selfApplyPercent.toString(),
|
||||
circularProgressIndicatorWidth: 176,
|
||||
@@ -136,7 +136,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
child: TenderCard(
|
||||
backgroundColor: AppColors.primary20,
|
||||
iconPath: AssetsManager.arrows,
|
||||
title: AppStrings.tenderSubmitted,
|
||||
title: HomeStrings.tenderSubmitted,
|
||||
amount:
|
||||
homeViewModel
|
||||
.tenderApprovalsStateResponse!
|
||||
@@ -158,7 +158,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
child: TenderCard(
|
||||
backgroundColor: AppColors.primary10,
|
||||
iconPath: AssetsManager.approve,
|
||||
title: AppStrings.approvedTenders,
|
||||
title: HomeStrings.approvedTenders,
|
||||
amount: '0',
|
||||
textColor: AppColors.jellyBean,
|
||||
enableTap: true,
|
||||
@@ -173,7 +173,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
TenderCard(
|
||||
backgroundColor: AppColors.orange10,
|
||||
iconPath: AssetsManager.shield,
|
||||
title: AppStrings.tenderValue,
|
||||
title: HomeStrings.tenderValue,
|
||||
amount: '3',
|
||||
textColor: AppColors.orange,
|
||||
enableTap: true,
|
||||
@@ -185,7 +185,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
TenderCard(
|
||||
backgroundColor: AppColors.grey10,
|
||||
iconPath: AssetsManager.thumbLike,
|
||||
title: AppStrings.likedTenders,
|
||||
title: HomeStrings.likedTenders,
|
||||
amount: homeViewModel.feedbackStats?.totalLikes.toString() ?? '0',
|
||||
textColor: AppColors.grey80,
|
||||
enableTap: false,
|
||||
@@ -205,8 +205,8 @@ class DesktopHomePage extends StatelessWidget {
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
isYourTenders
|
||||
? AppStrings.yourTenders
|
||||
: AppStrings.recommendedTenders,
|
||||
? HomeStrings.yourTenders
|
||||
: HomeStrings.recommendedTenders,
|
||||
style: TextStyle(
|
||||
fontSize: 18.0.sp(),
|
||||
fontWeight: FontWeight.w700,
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/strings.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';
|
||||
@@ -9,6 +8,7 @@ import 'package:tm_app/data/services/model/tender_approvals_state_response/tende
|
||||
import 'package:tm_app/view_models/home_view_model.dart';
|
||||
import 'package:tm_app/views/shared/tender_app_bar.dart';
|
||||
|
||||
import '../strings/home_strings.dart';
|
||||
import '../widgets.dart';
|
||||
|
||||
class MobileHomePage extends StatelessWidget {
|
||||
@@ -17,7 +17,7 @@ class MobileHomePage extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: tenderMobileAppBar(title: AppStrings.home),
|
||||
appBar: tenderMobileAppBar(title: HomeStrings.home),
|
||||
body: Consumer<HomeViewModel>(
|
||||
builder: (context, homeViewModel, child) {
|
||||
if (homeViewModel.isLoading) {
|
||||
@@ -71,13 +71,13 @@ class MobileHomePage extends StatelessWidget {
|
||||
Spacer(),
|
||||
SizedBox(width: 20.0.w()),
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.partnership,
|
||||
text: HomeStrings.partnership,
|
||||
value: homeViewModel.partnershipPercent,
|
||||
amount: homeViewModel.partnershipPercent.toString(),
|
||||
),
|
||||
Spacer(),
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.selfApply,
|
||||
text: HomeStrings.selfApply,
|
||||
value: homeViewModel.selfApplyPercent,
|
||||
amount: homeViewModel.selfApplyPercent.toString(),
|
||||
),
|
||||
@@ -100,7 +100,7 @@ class MobileHomePage extends StatelessWidget {
|
||||
TenderCard(
|
||||
backgroundColor: AppColors.primary20,
|
||||
iconPath: AssetsManager.arrows,
|
||||
title: AppStrings.tenderSubmitted,
|
||||
title: HomeStrings.tenderSubmitted,
|
||||
amount:
|
||||
tenderApprovalsStateResponse.data!.submittedTenders.toString(),
|
||||
textColor: AppColors.mainBlue,
|
||||
@@ -112,7 +112,7 @@ class MobileHomePage extends StatelessWidget {
|
||||
TenderCard(
|
||||
backgroundColor: AppColors.primary10,
|
||||
iconPath: AssetsManager.approve,
|
||||
title: AppStrings.approvedTenders,
|
||||
title: HomeStrings.approvedTenders,
|
||||
amount: '0',
|
||||
|
||||
textColor: AppColors.jellyBean,
|
||||
@@ -136,7 +136,7 @@ class MobileHomePage extends StatelessWidget {
|
||||
TenderCard(
|
||||
backgroundColor: AppColors.orange10,
|
||||
iconPath: AssetsManager.shield,
|
||||
title: AppStrings.tenderValue,
|
||||
title: HomeStrings.tenderValue,
|
||||
amount: '3',
|
||||
textColor: AppColors.orange,
|
||||
enableTap: true,
|
||||
@@ -145,7 +145,7 @@ class MobileHomePage extends StatelessWidget {
|
||||
TenderCard(
|
||||
backgroundColor: AppColors.grey10,
|
||||
iconPath: AssetsManager.thumbLike,
|
||||
title: AppStrings.likedTenders,
|
||||
title: HomeStrings.likedTenders,
|
||||
amount: homeViewModel.feedbackStats?.totalLikes.toString() ?? '0',
|
||||
textColor: AppColors.grey80,
|
||||
enableTap: false,
|
||||
@@ -161,7 +161,9 @@ class MobileHomePage extends StatelessWidget {
|
||||
return Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
|
||||
child: Text(
|
||||
isYourTenders ? AppStrings.yourTenders : AppStrings.recommendedTenders,
|
||||
isYourTenders
|
||||
? HomeStrings.yourTenders
|
||||
: HomeStrings.recommendedTenders,
|
||||
style: TextStyle(
|
||||
fontSize: 18.0.sp(),
|
||||
fontWeight: FontWeight.w700,
|
||||
|
||||
@@ -2,7 +2,6 @@ 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/strings.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';
|
||||
@@ -11,6 +10,7 @@ import 'package:tm_app/view_models/home_view_model.dart';
|
||||
import 'package:tm_app/views/shared/tablet_navigation_widget.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../strings/home_strings.dart';
|
||||
import '../widgets.dart';
|
||||
|
||||
class TabletHomePage extends StatelessWidget {
|
||||
@@ -128,7 +128,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
Spacer(),
|
||||
SizedBox(width: 20.0.w()),
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.partnership,
|
||||
text: HomeStrings.partnership,
|
||||
value: homeViewModel.partnershipPercent,
|
||||
amount: homeViewModel.partnershipPercent.toString(),
|
||||
circularProgressIndicatorWidth: 176.0,
|
||||
@@ -137,7 +137,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
),
|
||||
Spacer(),
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.selfApply,
|
||||
text: HomeStrings.selfApply,
|
||||
value: homeViewModel.selfApplyPercent,
|
||||
amount: homeViewModel.selfApplyPercent.toString(),
|
||||
circularProgressIndicatorWidth: 176.0,
|
||||
@@ -161,7 +161,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
child: TenderCard(
|
||||
backgroundColor: AppColors.primary20,
|
||||
iconPath: AssetsManager.arrows,
|
||||
title: AppStrings.tenderSubmitted,
|
||||
title: HomeStrings.tenderSubmitted,
|
||||
amount:
|
||||
tenderApprovalsStateResponse.data!.submittedTenders.toString(),
|
||||
|
||||
@@ -179,7 +179,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
child: TenderCard(
|
||||
backgroundColor: AppColors.primary10,
|
||||
iconPath: AssetsManager.approve,
|
||||
title: AppStrings.approvedTenders,
|
||||
title: HomeStrings.approvedTenders,
|
||||
amount: '0',
|
||||
|
||||
textColor: AppColors.jellyBean,
|
||||
@@ -204,7 +204,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
child: TenderCard(
|
||||
backgroundColor: AppColors.orange10,
|
||||
iconPath: AssetsManager.shield,
|
||||
title: AppStrings.tenderValue,
|
||||
title: HomeStrings.tenderValue,
|
||||
amount: '3',
|
||||
textColor: AppColors.orange,
|
||||
enableTap: true,
|
||||
@@ -218,7 +218,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
child: TenderCard(
|
||||
backgroundColor: AppColors.grey10,
|
||||
iconPath: AssetsManager.thumbLike,
|
||||
title: AppStrings.likedTenders,
|
||||
title: HomeStrings.likedTenders,
|
||||
amount: homeViewModel.feedbackStats?.totalLikes.toString() ?? '0',
|
||||
textColor: AppColors.grey80,
|
||||
enableTap: false,
|
||||
@@ -234,7 +234,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
Widget _yourTenderText(HomeViewModel homeViewModel) {
|
||||
final isYourTenders = homeViewModel.data?.data?.isNotEmpty ?? false;
|
||||
return Text(
|
||||
isYourTenders ? AppStrings.yourTenders : AppStrings.recommendedTenders,
|
||||
isYourTenders ? HomeStrings.yourTenders : HomeStrings.recommendedTenders,
|
||||
style: TextStyle(
|
||||
fontSize: 18.0.sp(),
|
||||
fontWeight: FontWeight.w700,
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
class HomeStrings {
|
||||
HomeStrings._();
|
||||
|
||||
static const String home = 'Home';
|
||||
static const String partnership = 'Partnership';
|
||||
static const String selfApply = 'Self-apply';
|
||||
static const String contracting = 'Contracting';
|
||||
static const String tenderSubmitted = 'Tenders submitted';
|
||||
static const String approvedTenders = 'Approved tenders';
|
||||
static const String tenderValue = 'Tender Value';
|
||||
static const String thunderStatus = 'Thunder status';
|
||||
static const String likedTenders = 'Liked Tenders';
|
||||
static const String yourTenders = 'Your tenders';
|
||||
static const String recommendation = 'Recommendation';
|
||||
static const String welcome = 'Welcome';
|
||||
static const String tenderDeadline = 'Deadline';
|
||||
static const String recommendedTenders = 'Recommended Tenders';
|
||||
static const String tenderMatchProfile = 'Match with your profile';
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:country_flags/country_flags.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
|
||||
import 'package:tm_app/views/home/strings/home_strings.dart';
|
||||
import 'package:tm_app/views/home/widgets/tender_card_progress_bar.dart';
|
||||
|
||||
import '../../core/constants/assets.dart';
|
||||
@@ -53,7 +53,7 @@ class TendersListItem extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
'${AppStrings.tenderDeadline} :',
|
||||
'${HomeStrings.tenderDeadline} :',
|
||||
style: TextStyle(
|
||||
fontSize: 15.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
|
||||
import '../strings/home_strings.dart';
|
||||
|
||||
class NotificationCard extends StatelessWidget {
|
||||
const NotificationCard({super.key});
|
||||
|
||||
@@ -26,7 +27,7 @@ class NotificationCard extends StatelessWidget {
|
||||
SvgPicture.asset(AssetsManager.notification),
|
||||
SizedBox(width: 8.0.w()),
|
||||
Text(
|
||||
AppStrings.welcome,
|
||||
HomeStrings.welcome,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/views/home/strings/home_strings.dart';
|
||||
|
||||
class TenderCardProgressBar extends StatelessWidget {
|
||||
const TenderCardProgressBar({super.key});
|
||||
@@ -15,7 +15,7 @@ class TenderCardProgressBar extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderMatchProfile,
|
||||
HomeStrings.tenderMatchProfile,
|
||||
style: TextStyle(
|
||||
fontSize: 12.0.sp(),
|
||||
color: AppColors.grey80,
|
||||
|
||||
@@ -6,10 +6,10 @@ import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../../../view_models/auth_view_model.dart';
|
||||
import '../strings/login_strings.dart';
|
||||
import '../widgets/widgets.dart';
|
||||
|
||||
class LoginDesktopPage extends StatefulWidget {
|
||||
@@ -73,7 +73,7 @@ class _LoginDesktopPageState extends State<LoginDesktopPage> {
|
||||
LoginTextField(
|
||||
controller: viewModel.usernameController,
|
||||
focusNode: viewModel.usernameFocus,
|
||||
label: AppStrings.usernameLabel,
|
||||
label: LoginStrings.usernameLabel,
|
||||
iconPath: AssetsManager.userIcon,
|
||||
fieldHeight: 60.0.h(),
|
||||
borderRedus: 12,
|
||||
@@ -83,7 +83,7 @@ class _LoginDesktopPageState extends State<LoginDesktopPage> {
|
||||
LoginTextField(
|
||||
controller: viewModel.passwordController,
|
||||
focusNode: viewModel.passwordFocus,
|
||||
label: AppStrings.passwordLabel,
|
||||
label: LoginStrings.passwordLabel,
|
||||
iconPath: AssetsManager.passwordIcon,
|
||||
prefixIconPadding: 7.0.w(),
|
||||
isPassword: true,
|
||||
@@ -114,7 +114,7 @@ class _LoginDesktopPageState extends State<LoginDesktopPage> {
|
||||
ForgotPasswordRouteData().push(context);
|
||||
},
|
||||
child: Text(
|
||||
AppStrings.forgotPassword,
|
||||
LoginStrings.forgotPassword,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -6,9 +6,9 @@ import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../../../view_models/auth_view_model.dart';
|
||||
import '../strings/login_strings.dart';
|
||||
import '../widgets/widgets.dart';
|
||||
|
||||
class LoginMobilePage extends StatefulWidget {
|
||||
@@ -72,7 +72,7 @@ class _LoginMobilePageState extends State<LoginMobilePage> {
|
||||
LoginTextField(
|
||||
controller: viewModel.usernameController,
|
||||
focusNode: viewModel.usernameFocus,
|
||||
label: AppStrings.usernameLabel,
|
||||
label: LoginStrings.usernameLabel,
|
||||
iconPath: AssetsManager.userIcon,
|
||||
),
|
||||
SizedBox(height: 16.0.h()),
|
||||
@@ -80,7 +80,7 @@ class _LoginMobilePageState extends State<LoginMobilePage> {
|
||||
LoginTextField(
|
||||
controller: viewModel.passwordController,
|
||||
focusNode: viewModel.passwordFocus,
|
||||
label: AppStrings.passwordLabel,
|
||||
label: LoginStrings.passwordLabel,
|
||||
iconPath: AssetsManager.passwordIcon,
|
||||
isPassword: true,
|
||||
obscureText: viewModel.obscurePassword,
|
||||
@@ -110,7 +110,7 @@ class _LoginMobilePageState extends State<LoginMobilePage> {
|
||||
ForgotPasswordRouteData().push(context);
|
||||
},
|
||||
child: Text(
|
||||
AppStrings.forgotPassword,
|
||||
LoginStrings.forgotPassword,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -4,10 +4,10 @@ import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../../../view_models/auth_view_model.dart';
|
||||
import '../strings/login_strings.dart';
|
||||
import '../widgets/widgets.dart';
|
||||
|
||||
class LoginTabletPage extends StatefulWidget {
|
||||
@@ -65,7 +65,7 @@ class _LoginTabletPageState extends State<LoginTabletPage> {
|
||||
LoginTextField(
|
||||
controller: viewModel.usernameController,
|
||||
focusNode: viewModel.usernameFocus,
|
||||
label: AppStrings.usernameLabel,
|
||||
label: LoginStrings.usernameLabel,
|
||||
iconPath: AssetsManager.userIcon,
|
||||
fieldHeight: 60.0.h(),
|
||||
borderRedus: 12,
|
||||
@@ -75,7 +75,7 @@ class _LoginTabletPageState extends State<LoginTabletPage> {
|
||||
LoginTextField(
|
||||
controller: viewModel.passwordController,
|
||||
focusNode: viewModel.passwordFocus,
|
||||
label: AppStrings.passwordLabel,
|
||||
label: LoginStrings.passwordLabel,
|
||||
iconPath: AssetsManager.passwordIcon,
|
||||
prefixIconPadding: 4.0.w(),
|
||||
isPassword: true,
|
||||
@@ -107,7 +107,7 @@ class _LoginTabletPageState extends State<LoginTabletPage> {
|
||||
ForgotPasswordRouteData().push(context);
|
||||
},
|
||||
child: Text(
|
||||
AppStrings.forgotPassword,
|
||||
LoginStrings.forgotPassword,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
class LoginStrings {
|
||||
static const signInTitle = 'Sign In';
|
||||
static const signInSubtitle = 'Enter valid username & password to continue';
|
||||
static const usernameLabel = 'User Name';
|
||||
static const passwordLabel = 'Password';
|
||||
static const loginButton = 'Login';
|
||||
static const forgotPassword = 'Forgot Password?';
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../strings/login_strings.dart';
|
||||
|
||||
class LoginTitle extends StatelessWidget {
|
||||
const LoginTitle({super.key});
|
||||
@@ -12,12 +12,12 @@ class LoginTitle extends StatelessWidget {
|
||||
return Column(
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.signInTitle,
|
||||
LoginStrings.signInTitle,
|
||||
style: TextStyle(fontSize: 28.0.sp(), fontWeight: FontWeight.w700),
|
||||
),
|
||||
SizedBox(height: 8.0.h()),
|
||||
Text(
|
||||
AppStrings.signInSubtitle,
|
||||
LoginStrings.signInSubtitle,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
|
||||
@@ -5,10 +5,11 @@ import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/view_models/profile_view_model.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/constants/common_strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../../shared/desktop_navigation_widget.dart';
|
||||
import '../strings/profile_strings.dart';
|
||||
import '../widgets/theme_toggle.dart';
|
||||
import '../widgets/title_description.dart';
|
||||
|
||||
@@ -64,7 +65,7 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
|
||||
}
|
||||
|
||||
if (viewModel.companyProfileData == null) {
|
||||
return Center(child: Text(AppStrings.noData));
|
||||
return Center(child: Text(CommonStrings.noData));
|
||||
}
|
||||
|
||||
return Column(
|
||||
@@ -100,24 +101,24 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
|
||||
children: [
|
||||
SizedBox(height: 36.0.h()),
|
||||
TitleDescription(
|
||||
title: AppStrings.companyName,
|
||||
title: ProfileStrings.companyName,
|
||||
description: viewModel.companyProfileData!.name!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.nationalId,
|
||||
title: ProfileStrings.nationalId,
|
||||
description: viewModel.companyProfileData!.id!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.registrationNumber,
|
||||
title: ProfileStrings.registrationNumber,
|
||||
description:
|
||||
viewModel.companyProfileData!.registrationNumber!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.businessType,
|
||||
title: ProfileStrings.businessType,
|
||||
description: '-',
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.founded,
|
||||
title: ProfileStrings.founded,
|
||||
description:
|
||||
viewModel.companyProfileData!.foundedYear!.toString(),
|
||||
),
|
||||
@@ -126,7 +127,7 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: Text(
|
||||
AppStrings.settings,
|
||||
ProfileStrings.settings,
|
||||
style: TextStyle(
|
||||
fontSize: 20.0.sp(),
|
||||
fontWeight: FontWeight.w600,
|
||||
@@ -140,7 +141,7 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.appTheme,
|
||||
ProfileStrings.appTheme,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -178,7 +179,7 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
child: Text(
|
||||
AppStrings.logout,
|
||||
ProfileStrings.logout,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -7,9 +7,10 @@ import 'package:tm_app/views/profile/widgets/theme_toggle.dart';
|
||||
import 'package:tm_app/views/shared/tender_app_bar.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/constants/common_strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../strings/profile_strings.dart';
|
||||
import '../widgets/title_description.dart';
|
||||
|
||||
class MobileProfilePage extends StatefulWidget {
|
||||
@@ -52,7 +53,7 @@ class _MobileProfilePageState extends State<MobileProfilePage> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: tenderMobileAppBar(title: AppStrings.profile),
|
||||
appBar: tenderMobileAppBar(title: ProfileStrings.profileTitle),
|
||||
body: Consumer<ProfileViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
if (viewModel.isLoading) {
|
||||
@@ -66,7 +67,7 @@ class _MobileProfilePageState extends State<MobileProfilePage> {
|
||||
}
|
||||
|
||||
if (viewModel.companyProfileData == null) {
|
||||
return Center(child: Text(AppStrings.noData));
|
||||
return Center(child: Text(CommonStrings.noData));
|
||||
}
|
||||
|
||||
return Padding(
|
||||
@@ -78,24 +79,24 @@ class _MobileProfilePageState extends State<MobileProfilePage> {
|
||||
children: [
|
||||
SizedBox(height: 36.0.h()),
|
||||
TitleDescription(
|
||||
title: AppStrings.companyName,
|
||||
title: ProfileStrings.companyName,
|
||||
description: viewModel.companyProfileData!.name!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.nationalId,
|
||||
title: ProfileStrings.nationalId,
|
||||
description: viewModel.companyProfileData!.id!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.registrationNumber,
|
||||
title: ProfileStrings.registrationNumber,
|
||||
description:
|
||||
viewModel.companyProfileData!.registrationNumber!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.businessType,
|
||||
title: ProfileStrings.businessType,
|
||||
description: '-',
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.founded,
|
||||
title: ProfileStrings.founded,
|
||||
description:
|
||||
viewModel.companyProfileData!.foundedYear!.toString(),
|
||||
),
|
||||
@@ -103,7 +104,7 @@ class _MobileProfilePageState extends State<MobileProfilePage> {
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: Text(
|
||||
AppStrings.settings,
|
||||
ProfileStrings.settings,
|
||||
style: TextStyle(
|
||||
fontSize: 20.0.sp(),
|
||||
fontWeight: FontWeight.w600,
|
||||
@@ -117,7 +118,7 @@ class _MobileProfilePageState extends State<MobileProfilePage> {
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.appTheme,
|
||||
ProfileStrings.appTheme,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -153,7 +154,7 @@ class _MobileProfilePageState extends State<MobileProfilePage> {
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
child: Text(
|
||||
AppStrings.logout,
|
||||
ProfileStrings.logout,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -3,13 +3,14 @@ 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/strings.dart';
|
||||
import 'package:tm_app/core/constants/common_strings.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/view_models/profile_view_model.dart';
|
||||
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../../shared/tablet_navigation_widget.dart';
|
||||
import '../strings/profile_strings.dart';
|
||||
import '../widgets/theme_toggle.dart';
|
||||
import '../widgets/title_description.dart';
|
||||
|
||||
@@ -64,7 +65,7 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
|
||||
}
|
||||
|
||||
if (viewModel.companyProfileData == null) {
|
||||
return Center(child: Text(AppStrings.noData));
|
||||
return Center(child: Text(CommonStrings.noData));
|
||||
}
|
||||
|
||||
return SafeArea(
|
||||
@@ -124,24 +125,24 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
|
||||
children: [
|
||||
SizedBox(height: 128.0.h()),
|
||||
TitleDescription(
|
||||
title: AppStrings.companyName,
|
||||
title: ProfileStrings.companyName,
|
||||
description: viewModel.companyProfileData!.name!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.nationalId,
|
||||
title: ProfileStrings.nationalId,
|
||||
description: viewModel.companyProfileData!.id!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.registrationNumber,
|
||||
title: ProfileStrings.registrationNumber,
|
||||
description:
|
||||
viewModel.companyProfileData!.registrationNumber!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.businessType,
|
||||
title: ProfileStrings.businessType,
|
||||
description: '-',
|
||||
),
|
||||
TitleDescription(
|
||||
title: AppStrings.founded,
|
||||
title: ProfileStrings.founded,
|
||||
description:
|
||||
viewModel.companyProfileData!.foundedYear!.toString(),
|
||||
),
|
||||
@@ -150,7 +151,7 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: Text(
|
||||
AppStrings.settings,
|
||||
ProfileStrings.settings,
|
||||
style: TextStyle(
|
||||
fontSize: 20.0.sp(),
|
||||
fontWeight: FontWeight.w600,
|
||||
@@ -164,7 +165,7 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
|
||||
child: Row(
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.appTheme,
|
||||
ProfileStrings.appTheme,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -202,7 +203,7 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
child: Text(
|
||||
AppStrings.logout,
|
||||
ProfileStrings.logout,
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w500,
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
class ProfileStrings {
|
||||
ProfileStrings._();
|
||||
|
||||
static const String profile = 'Profile';
|
||||
static const String profileTitle = 'Profile';
|
||||
static const String settings = 'Settings';
|
||||
static const String appTheme = 'App Theme';
|
||||
static const String companyName = 'Company Name';
|
||||
static const String nationalId = 'National ID';
|
||||
static const String registrationNumber = 'Registration No.';
|
||||
static const String businessType = 'Business Type';
|
||||
static const String founded = 'Founded';
|
||||
static const String logout = 'Logout';
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../core/constants/strings.dart';
|
||||
import '../../core/theme/colors.dart';
|
||||
import '../../core/utils/size_config.dart';
|
||||
import '../login/strings/login_strings.dart';
|
||||
|
||||
class BaseButton extends StatelessWidget {
|
||||
final bool isEnabled;
|
||||
@@ -73,7 +73,7 @@ class BaseButton extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
child: Text(
|
||||
text ?? AppStrings.loginButton,
|
||||
text ?? LoginStrings.loginButton,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0.sp(),
|
||||
fontWeight: FontWeight.bold,
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.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';
|
||||
|
||||
class DesktopNavigationWidget extends StatelessWidget {
|
||||
const DesktopNavigationWidget({
|
||||
@@ -32,7 +34,7 @@ class DesktopNavigationWidget extends StatelessWidget {
|
||||
Spacer(),
|
||||
_navigationItem(
|
||||
context: context,
|
||||
text: AppStrings.home,
|
||||
text: HomeStrings.home,
|
||||
isActive: currentIndex == 0,
|
||||
onTap: () => onTabChanged(0),
|
||||
iconPath: AssetsManager.home,
|
||||
@@ -41,7 +43,7 @@ class DesktopNavigationWidget extends StatelessWidget {
|
||||
SizedBox(width: 24),
|
||||
_navigationItem(
|
||||
context: context,
|
||||
text: AppStrings.tendersTitle,
|
||||
text: TendersStrings.tendersTitle,
|
||||
isActive: currentIndex == 1,
|
||||
onTap: () => onTabChanged(1),
|
||||
iconPath: AssetsManager.tenders,
|
||||
@@ -50,7 +52,7 @@ class DesktopNavigationWidget extends StatelessWidget {
|
||||
SizedBox(width: 24),
|
||||
_navigationItem(
|
||||
context: context,
|
||||
text: AppStrings.profile,
|
||||
text: ProfileStrings.profileTitle,
|
||||
isActive: currentIndex == 2,
|
||||
onTap: () => onTabChanged(2),
|
||||
iconPath: AssetsManager.profile,
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.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';
|
||||
|
||||
class TabletNavigationWidget extends StatelessWidget {
|
||||
const TabletNavigationWidget({
|
||||
@@ -26,7 +28,7 @@ class TabletNavigationWidget extends StatelessWidget {
|
||||
SizedBox(height: 48.0.h()),
|
||||
_navigationItem(
|
||||
context: context,
|
||||
text: AppStrings.home,
|
||||
text: HomeStrings.home,
|
||||
isActive: currentIndex == 0,
|
||||
onTap: () => onTabChanged(0),
|
||||
iconPath: AssetsManager.home,
|
||||
@@ -34,7 +36,7 @@ class TabletNavigationWidget extends StatelessWidget {
|
||||
),
|
||||
_navigationItem(
|
||||
context: context,
|
||||
text: AppStrings.tendersTitle,
|
||||
text: TendersStrings.tendersTitle,
|
||||
isActive: currentIndex == 1,
|
||||
onTap: () => onTabChanged(1),
|
||||
iconPath: AssetsManager.tenders,
|
||||
@@ -42,7 +44,7 @@ class TabletNavigationWidget extends StatelessWidget {
|
||||
),
|
||||
_navigationItem(
|
||||
context: context,
|
||||
text: AppStrings.profile,
|
||||
text: ProfileStrings.profileTitle,
|
||||
isActive: currentIndex == 2,
|
||||
onTap: () => onTabChanged(2),
|
||||
iconPath: AssetsManager.profile,
|
||||
|
||||
@@ -6,7 +6,7 @@ import 'package:tm_app/view_models/tenders_view_model.dart';
|
||||
import 'package:tm_app/views/shared/desktop_navigation_widget.dart';
|
||||
import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart';
|
||||
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/constants/common_strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
|
||||
class DesktopTendersPage extends StatefulWidget {
|
||||
@@ -93,7 +93,7 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
|
||||
}
|
||||
if (viewModel.tendersResponse?.data?.tenders == null ||
|
||||
viewModel.tendersResponse!.data!.tenders!.isEmpty) {
|
||||
return Center(child: Text(AppStrings.noData));
|
||||
return Center(child: Text(CommonStrings.noData));
|
||||
}
|
||||
return SizedBox(
|
||||
width: 740,
|
||||
|
||||
@@ -3,9 +3,10 @@ import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/tenders_view_model.dart';
|
||||
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/constants/common_strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../shared/tender_app_bar.dart';
|
||||
import '../strings/tenders_strings.dart';
|
||||
import '../widgets/main_tenders_slider.dart';
|
||||
|
||||
class MobileTendersPage extends StatefulWidget {
|
||||
@@ -53,7 +54,7 @@ class _MobileTendersPageState extends State<MobileTendersPage> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: tenderMobileAppBar(title: AppStrings.tendersTitle),
|
||||
appBar: tenderMobileAppBar(title: TendersStrings.tendersTitle),
|
||||
body: Consumer<TendersViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
if (viewModel.isLoading) {
|
||||
@@ -67,7 +68,7 @@ class _MobileTendersPageState extends State<MobileTendersPage> {
|
||||
|
||||
if (viewModel.tendersResponse?.data?.tenders == null ||
|
||||
viewModel.tendersResponse!.data!.tenders!.isEmpty) {
|
||||
return Center(child: Text(AppStrings.noData));
|
||||
return Center(child: Text(CommonStrings.noData));
|
||||
}
|
||||
|
||||
return Padding(
|
||||
|
||||
@@ -9,7 +9,7 @@ import 'package:tm_app/views/shared/tablet_navigation_widget.dart';
|
||||
import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/constants/common_strings.dart';
|
||||
import '../../../core/routes/app_routes.dart';
|
||||
|
||||
class TabletTendersPage extends StatefulWidget {
|
||||
@@ -89,7 +89,7 @@ class _TabletTendersPageState extends State<TabletTendersPage> {
|
||||
}
|
||||
if (viewModel.tendersResponse?.data?.tenders == null ||
|
||||
viewModel.tendersResponse!.data!.tenders!.isEmpty) {
|
||||
return Center(child: Text(AppStrings.noData));
|
||||
return Center(child: Text(CommonStrings.noData));
|
||||
}
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(right: 24.0.w(), top: 128.0.h()),
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
class TendersStrings {
|
||||
TendersStrings._();
|
||||
|
||||
static const String tendersTitle = 'Tenders';
|
||||
static const String tenderSeeMore = 'See More';
|
||||
static const String reject = 'Reject';
|
||||
static const String submit = 'Submit';
|
||||
static const String dislike = 'Dislike';
|
||||
static const String like = 'Like';
|
||||
static const String tenderDeadlineLabel = 'Deadline';
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
|
||||
import 'package:tm_app/view_models/tenders_view_model.dart';
|
||||
|
||||
@@ -10,6 +9,7 @@ import '../../../core/theme/colors.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../../shared/select_submission_bottom_sheet.dart';
|
||||
import '../../shared/select_submission_dialog.dart';
|
||||
import '../strings/tenders_strings.dart';
|
||||
|
||||
class TenderActionButtonsRow extends StatelessWidget {
|
||||
final TenderData tender;
|
||||
@@ -57,7 +57,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
final isRejected = approval?.status == 'rejected';
|
||||
|
||||
return Tooltip(
|
||||
message: AppStrings.reject,
|
||||
message: TendersStrings.reject,
|
||||
child: InkWell(
|
||||
splashColor: Colors.transparent,
|
||||
onTap: () {
|
||||
@@ -89,7 +89,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
SizedBox(height: 8.0.h()),
|
||||
if (!isDesktop)
|
||||
Text(
|
||||
AppStrings.reject,
|
||||
TendersStrings.reject,
|
||||
style: TextStyle(
|
||||
fontSize: 12.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -112,7 +112,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
final isApproved = approval?.status == 'submitted';
|
||||
|
||||
return Tooltip(
|
||||
message: AppStrings.submit,
|
||||
message: TendersStrings.submit,
|
||||
child: InkWell(
|
||||
splashColor: Colors.transparent,
|
||||
onTap: () {
|
||||
@@ -180,7 +180,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
SizedBox(height: 8.0.h()),
|
||||
if (!isDesktop)
|
||||
Text(
|
||||
AppStrings.submit,
|
||||
TendersStrings.submit,
|
||||
style: TextStyle(
|
||||
fontSize: 12.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -203,7 +203,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
final isDisliked = feedback?.feedbackType == 'dislike';
|
||||
|
||||
return Tooltip(
|
||||
message: AppStrings.dislike,
|
||||
message: TendersStrings.dislike,
|
||||
child: InkWell(
|
||||
splashColor: Colors.transparent,
|
||||
onTap: () {
|
||||
@@ -227,7 +227,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
SizedBox(height: 8.0.h()),
|
||||
if (!isDesktop)
|
||||
Text(
|
||||
AppStrings.dislike,
|
||||
TendersStrings.dislike,
|
||||
style: TextStyle(
|
||||
fontSize: 12.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
@@ -250,7 +250,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
final isLiked = feedback?.feedbackType == 'like';
|
||||
|
||||
return Tooltip(
|
||||
message: AppStrings.like,
|
||||
message: TendersStrings.like,
|
||||
child: InkWell(
|
||||
splashColor: Colors.transparent,
|
||||
onTap: () {
|
||||
@@ -271,7 +271,7 @@ class TenderActionButtonsRow extends StatelessWidget {
|
||||
SizedBox(height: 8.0.h()),
|
||||
if (!isDesktop)
|
||||
Text(
|
||||
AppStrings.like,
|
||||
TendersStrings.like,
|
||||
style: TextStyle(
|
||||
fontSize: 12.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
|
||||
@@ -2,7 +2,6 @@ import 'package:country_flags/country_flags.dart';
|
||||
import 'package:flutter/material.dart' hide DateUtils;
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
|
||||
|
||||
@@ -11,6 +10,8 @@ import '../../../core/theme/colors.dart';
|
||||
import '../../../core/utils/date_utils.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../../../view_models/tenders_view_model.dart';
|
||||
import '../../detail/strings/tender_details_strings.dart';
|
||||
import '../strings/tenders_strings.dart';
|
||||
import 'tender_action_buttons_row.dart';
|
||||
|
||||
class TenderCard extends StatelessWidget {
|
||||
@@ -134,7 +135,7 @@ class TenderCard extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderDeadlineLabel,
|
||||
TendersStrings.tenderDeadlineLabel,
|
||||
style: TextStyle(
|
||||
color: AppColors.textBlue,
|
||||
fontSize: 14.0.sp(),
|
||||
@@ -194,7 +195,7 @@ class TenderCard extends StatelessWidget {
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text(
|
||||
AppStrings.tenderMatchProfile,
|
||||
TenderDetailsStrings.tenderMatchProfile,
|
||||
style: TextStyle(
|
||||
color: AppColors.grey80,
|
||||
fontSize: 14.0.sp(),
|
||||
@@ -286,7 +287,7 @@ class TenderCard extends StatelessWidget {
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
),
|
||||
child: Text(
|
||||
AppStrings.tenderSeeMore,
|
||||
TendersStrings.tenderSeeMore,
|
||||
style: TextStyle(
|
||||
color: AppColors.mainBlue,
|
||||
fontSize: 14.0.sp(),
|
||||
|
||||
@@ -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/view_models/your_tenders_view_model.dart';
|
||||
@@ -7,6 +6,7 @@ import 'package:tm_app/views/your_tenders/widgets/filter_button.dart';
|
||||
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 {
|
||||
@@ -50,15 +50,14 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
||||
switch (index) {
|
||||
case 0:
|
||||
// Navigate to home
|
||||
Router.neglect(context, () => context.go('/home'));
|
||||
Router.neglect(context, () => HomeRouteData().go(context));
|
||||
break;
|
||||
case 1:
|
||||
// Already on tenders
|
||||
break;
|
||||
case 2:
|
||||
// Navigate to profile
|
||||
// context.go('/profile');
|
||||
Router.neglect(context, () => context.go('/profile'));
|
||||
Router.neglect(context, () => ProfileRouteData().go(context));
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/view_models/your_tenders_view_model.dart';
|
||||
import 'package:tm_app/views/shared/tender_app_bar.dart';
|
||||
import 'package:tm_app/views/your_tenders/strings/your_tenders_strings.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/filter_button.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
|
||||
|
||||
@@ -14,7 +14,7 @@ class YourTendersMobilePage extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: appBar(context: context, title: AppStrings.yourTenders),
|
||||
appBar: appBar(context: context, title: YourTendersStrings.yourTenders),
|
||||
body: Column(
|
||||
children: [
|
||||
FilterButton(platformType: PlatformType.mobile),
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
class YourTendersStrings {
|
||||
YourTendersStrings._();
|
||||
|
||||
static const String yourTenders = 'Your tenders';
|
||||
static const String yourTendersTitle = 'Your tenders';
|
||||
static const filter = 'Filter';
|
||||
static const selectDateRange = 'Select date range';
|
||||
static const status = 'Status';
|
||||
static const all = 'All';
|
||||
static const likeTenders = 'Like tenders';
|
||||
static const dislikeTenders = 'Dislike tenders';
|
||||
static const tendersSubmitted = 'Tenders submitted';
|
||||
static const confirm = 'Confirm';
|
||||
static const startDate = 'YYYY/MM/DD';
|
||||
static const endDate = 'YYYY/MM/DD';
|
||||
}
|
||||
@@ -4,8 +4,8 @@ import 'package:go_router/go_router.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../strings/your_tenders_strings.dart';
|
||||
|
||||
class TabletDesktopAppbar extends StatelessWidget {
|
||||
const TabletDesktopAppbar({super.key});
|
||||
@@ -20,7 +20,7 @@ class TabletDesktopAppbar extends StatelessWidget {
|
||||
),
|
||||
SizedBox(width: 8.0.w()),
|
||||
Text(
|
||||
AppStrings.yourTendersTitle,
|
||||
YourTendersStrings.yourTendersTitle,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.w600,
|
||||
|
||||
Reference in New Issue
Block a user