feat(userPurchases, consultantFinances): added status to models and layout for status

This commit is contained in:
Username1548
2025-06-10 19:57:20 +07:00
parent 483cf6d8ee
commit 926f0de450
7 changed files with 61 additions and 29 deletions

View File

@@ -13,6 +13,7 @@ abstract class ConsultantFinanceModel with _$ConsultantFinanceModel {
@JsonKey(name: 'clientName') required String clientName,
@JsonKey(name: 'duration') required int duration,
@JsonKey(name: 'payment_price', fromJson: _parsePayment) required String paymentPrice,
required PaymentStatus? paymentStatus,
}) = _ConsultantFinanceModel;
factory ConsultantFinanceModel.fromJson(Map<String, dynamic> json) => _$ConsultantFinanceModelFromJson(json);
@@ -28,9 +29,5 @@ enum PaymentStatus {
@JsonValue('REJECTED')
rejected,
@JsonValue('CHECKED')
checked,
@JsonValue('CREDIT_CHECKING')
creditChecking,
@JsonValue('COMPLETING')
completing;
checked
}

View File

@@ -1,4 +1,5 @@
import 'package:eatvio_app/features/feed/models/feed_blog_post_model.dart';
import 'package:eatvio_app/features/plans/enums/chosen_plan_state_enum.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user_purchases_model.freezed.dart';
@@ -8,12 +9,13 @@ part 'user_purchases_model.g.dart';
abstract class UserPurchasesModel with _$UserPurchasesModel {
factory UserPurchasesModel({
@JsonKey(name: 'start_date', fromJson: parseDate) required DateTime startDate,
@JsonKey(name: 'bank_id') required String? bankId,
@JsonKey(name: 'bank_id') required String bankId,
@JsonKey(name: 'title') required String title,
@JsonKey(name: 'consultantName') required String consultantName,
@JsonKey(name: 'duration') required int duration,
@JsonKey(name: 'price') required int paymentPrice,
@JsonKey(name: 'chosen_plan_last_state') required ChosenPlanStateEnum chosenPlanState,
}) = _UserPurchasesModel;
factory UserPurchasesModel.fromJson(Map<String, dynamic> json) => _$UserPurchasesModelFromJson(json);
}
}

View File

@@ -7,7 +7,9 @@ import 'package:eatvio_app/core/widgets/custom_drop_down_button.dart';
import 'package:eatvio_app/core/widgets/loader.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/consultant_finances/consultant_finances_cubit.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/consultant_finances/consultant_finances_state.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/models/consultant_finance_model.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/period_enum.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/presentation/widgets/status_widget.dart';
import 'package:eatvio_app/features/my_finance/presentation/pages/card_settings.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
@@ -102,6 +104,12 @@ class _ConsultantFinancesScreenState extends State<ConsultantFinancesScreen> {
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
final Status modelStatus = switch (state.financesModels[index].paymentStatus) {
null => Status.inProgress,
PaymentStatus.completed => Status.success,
PaymentStatus.rejected => Status.canceled,
PaymentStatus.checked => Status.success,
};
return Material(
color: const Color(0xFFF6F6F6),
borderRadius: BorderRadius.circular(20),
@@ -181,9 +189,9 @@ class _ConsultantFinancesScreenState extends State<ConsultantFinancesScreen> {
fontWeight: FontWeight.w600,
),
),
// StatusWidget(
// status: state.consultations[index].chosenPlanState,
// ),
StatusWidget(
status: modelStatus,
),
],
),
],

View File

@@ -9,6 +9,7 @@ import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/arc
import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/archive/consultations_archive_state.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/period_enum.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/presentation/widgets/status_widget.dart';
import 'package:eatvio_app/features/plans/enums/chosen_plan_state_enum.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -165,6 +166,15 @@ class _ConsultationsArchiveScreenState extends State<ConsultationsArchiveScreen>
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
final Status consultationStatus;
if (state.consultations[index].chosenPlanState == ChosenPlanStateEnum.stateCanceledByTheInitiator) {
consultationStatus = Status.canceled;
} else if (state.consultations[index].chosenPlanState == ChosenPlanStateEnum.stateChargeWasCollected) {
consultationStatus = Status.success;
} else {
consultationStatus = Status.inProgress;
}
return Material(
color: const Color(0xFFF6F6F6),
borderRadius: BorderRadius.circular(20),
@@ -246,7 +256,7 @@ class _ConsultationsArchiveScreenState extends State<ConsultationsArchiveScreen>
),
),
StatusWidget(
status: state.consultations[index].chosenPlanState,
status: consultationStatus,
),
],
),

View File

@@ -8,6 +8,8 @@ import 'package:eatvio_app/core/widgets/loader.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/user_purchases/user_purchases_cubit.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/cubit/user_purchases/user_purchases_state.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/period_enum.dart';
import 'package:eatvio_app/features/finances_and_consultations_archive/presentation/widgets/status_widget.dart';
import 'package:eatvio_app/features/plans/enums/chosen_plan_state_enum.dart';
import 'package:eatvio_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -84,6 +86,14 @@ class _UserPurchasesScreen extends State<UserPurchasesScreen> {
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
final Status purchaseStatus;
if (state.purchasesModels[index].chosenPlanState == ChosenPlanStateEnum.stateCanceledByTheInitiator) {
purchaseStatus = Status.canceled;
} else if (state.purchasesModels[index].chosenPlanState == ChosenPlanStateEnum.stateChargeWasCollected) {
purchaseStatus = Status.success;
} else {
purchaseStatus = Status.inProgress;
}
return Material(
color: const Color(0xFFF6F6F6),
borderRadius: BorderRadius.circular(20),
@@ -96,10 +106,9 @@ class _UserPurchasesScreen extends State<UserPurchasesScreen> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Builder(builder: (context) {
// final idLen = state.purchasesModels[index].bankId.length;
final bankId = state.purchasesModels[index].bankId;
final idLen = state.purchasesModels[index].bankId.length;
return Text(
'$bankId',
'${state.purchasesModels[index].bankId.substring(0, 4)}...${state.purchasesModels[index].bankId.substring(idLen - 4, idLen)} ',
style: TextStyles.textSMedium.copyWith(color: appTheme.black),
);
}),
@@ -164,9 +173,9 @@ class _UserPurchasesScreen extends State<UserPurchasesScreen> {
fontWeight: FontWeight.w600,
),
),
// StatusWidget(
// status: state.consultations[index].chosenPlanState,
// ),
StatusWidget(
status: purchaseStatus,
),
],
),
],

View File

@@ -1,15 +1,15 @@
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/plans/enums/chosen_plan_state_enum.dart';
import 'package:flutter/material.dart';
class StatusWidget extends StatelessWidget {
const StatusWidget({super.key, required this.status});
final ChosenPlanStateEnum status;
final Status status;
@override
Widget build(BuildContext context) {
if (status == ChosenPlanStateEnum.stateCanceledByTheInitiator) {
return Material(
return switch (status){
Status.canceled => Material(
color: appTheme.lightRed,
borderRadius: BorderRadius.circular(8),
child: Padding(
@@ -24,9 +24,9 @@ class StatusWidget extends StatelessWidget {
),
),
),
);
} else if (status == ChosenPlanStateEnum.stateChargeWasCollected) {
return Material(
),
Status.success => Material(
color: const Color(0xFF0BB450).withAlpha(11),
borderRadius: BorderRadius.circular(8),
child: const Padding(
@@ -41,9 +41,9 @@ class StatusWidget extends StatelessWidget {
),
),
),
);
}
return Material(
),
Status.inProgress => Material(
color: appTheme.transparentBlue,
borderRadius: BorderRadius.circular(8),
child: Padding(
@@ -58,6 +58,13 @@ class StatusWidget extends StatelessWidget {
),
),
),
);
),
};
}
}
enum Status {
canceled,
success,
inProgress
}

View File

@@ -44,7 +44,6 @@ class MenuScreen extends StatelessWidget {
onTap: () {
if (profileModel.roles.contains('consultant')) {
GoRouter.of(context).push(ConsultantFinancesScreen.path);
GoRouter.of(context).push(UserPurchasesScreen.path);
return;
}
GoRouter.of(context).push(UserPurchasesScreen.path);