Files
eatvio_app/lib/features/consultations/utils/consultation_progress_mapper.dart
alex-chevski 16084ee94c fix(chat): guard diet duration and keep progress plank
- show diet duration hint and plan duration in suggestion flow
- disable diet CTA on duration mismatch with grey visual state
- keep progress plank visible for personal_diet_setted
- center step labels under their circles
2026-11-03 17:40:54 +03:00

115 lines
4.0 KiB
Dart

import 'package:eatvio_app/features/consultations/models/consultation_progress.dart';
import 'package:eatvio_app/features/plans/enums/chosen_plan_state_enum.dart';
ConsultationProgress mapConsultationProgress({
required ChosenPlanStateEnum state,
required bool hasPersonalDiet,
}) {
return ConsultationProgress(
completedSteps: _completedSteps(state),
showProgressPlank: _showProgressPlank(state),
dietStatus: _dietStatus(state, hasPersonalDiet),
phase: _phase(state),
);
}
Set<ConsultationStep> _completedSteps(ChosenPlanStateEnum state) {
switch (state) {
case ChosenPlanStateEnum.stateInited:
case ChosenPlanStateEnum.stateConfirmedByConsultant:
case ChosenPlanStateEnum.stateInCoordination:
case ChosenPlanStateEnum.stateCanceledByTheInitiator:
return const {};
case ChosenPlanStateEnum.stateStartDateHasBeenSet:
case ChosenPlanStateEnum.statePendingPayment:
case ChosenPlanStateEnum.statePaymentFailed:
return const {ConsultationStep.startDate};
case ChosenPlanStateEnum.statePaid:
case ChosenPlanStateEnum.personalDietSet:
return const {ConsultationStep.startDate, ConsultationStep.paid};
case ChosenPlanStateEnum.stateStarted:
case ChosenPlanStateEnum.stateInProgress:
case ChosenPlanStateEnum.stateLastDayStarted:
case ChosenPlanStateEnum.stateLastDayFinished:
case ChosenPlanStateEnum.stateComplained:
return const {
ConsultationStep.startDate,
ConsultationStep.paid,
ConsultationStep.inProgress,
};
case ChosenPlanStateEnum.stateDone:
case ChosenPlanStateEnum.stateChargeWasCollected:
return const {
ConsultationStep.startDate,
ConsultationStep.paid,
ConsultationStep.inProgress,
ConsultationStep.finished,
};
}
}
bool _showProgressPlank(ChosenPlanStateEnum state) {
switch (state) {
case ChosenPlanStateEnum.stateInited:
case ChosenPlanStateEnum.stateConfirmedByConsultant:
case ChosenPlanStateEnum.stateChargeWasCollected:
case ChosenPlanStateEnum.stateCanceledByTheInitiator:
case ChosenPlanStateEnum.statePaymentFailed:
return false;
case ChosenPlanStateEnum.stateInCoordination:
case ChosenPlanStateEnum.stateStartDateHasBeenSet:
case ChosenPlanStateEnum.statePendingPayment:
case ChosenPlanStateEnum.statePaid:
case ChosenPlanStateEnum.personalDietSet:
case ChosenPlanStateEnum.stateStarted:
case ChosenPlanStateEnum.stateInProgress:
case ChosenPlanStateEnum.stateLastDayStarted:
case ChosenPlanStateEnum.stateLastDayFinished:
case ChosenPlanStateEnum.stateComplained:
case ChosenPlanStateEnum.stateDone:
return true;
}
}
PersonalDietStatus _dietStatus(
ChosenPlanStateEnum state,
bool hasPersonalDiet,
) {
if (!hasPersonalDiet) {
return PersonalDietStatus.notRequired;
}
switch (state) {
case ChosenPlanStateEnum.personalDietSet:
case ChosenPlanStateEnum.stateStarted:
case ChosenPlanStateEnum.stateInProgress:
case ChosenPlanStateEnum.stateLastDayStarted:
case ChosenPlanStateEnum.stateLastDayFinished:
case ChosenPlanStateEnum.stateComplained:
case ChosenPlanStateEnum.stateDone:
case ChosenPlanStateEnum.stateChargeWasCollected:
return PersonalDietStatus.proposed;
case ChosenPlanStateEnum.stateInited:
case ChosenPlanStateEnum.stateInCoordination:
case ChosenPlanStateEnum.stateConfirmedByConsultant:
case ChosenPlanStateEnum.stateStartDateHasBeenSet:
case ChosenPlanStateEnum.statePendingPayment:
case ChosenPlanStateEnum.statePaid:
return PersonalDietStatus.notProposed;
case ChosenPlanStateEnum.stateCanceledByTheInitiator:
case ChosenPlanStateEnum.statePaymentFailed:
return PersonalDietStatus.notRequired;
}
}
ConsultationPhase _phase(ChosenPlanStateEnum state) {
switch (state) {
case ChosenPlanStateEnum.stateCanceledByTheInitiator:
return ConsultationPhase.canceled;
case ChosenPlanStateEnum.statePaymentFailed:
return ConsultationPhase.paymentFailed;
default:
return ConsultationPhase.active;
}
}