import 'package:comwell_key_app/up_sales/models/addon_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/room_upgrade.dart';
import 'package:comwell_key_app/up_sales/models/up_sales_processing_state.dart';
import 'package:comwell_key_app/up_sales/models/up_sales.dart';
import 'package:equatable/equatable.dart';
class UpSalesState extends Equatable {
final bool selected;
final List<AddOnUpgrade> addOnUpgrades;
final List<RoomUpgrade> availableRoomUpgrades;
final String selectedRoomUpgrade;
final Exception? error;
final bool isLoading;
final bool termsAccepted;
final UpSalesProcessingState processingState;
const UpSalesState({
required this.selected,
required this.addOnUpgrades,
required this.availableRoomUpgrades,
required this.selectedRoomUpgrade,
this.error,
required this.isLoading,
this.termsAccepted = false,
required this.processingState,
});
@override
List<Object?> get props => [
selected,
addOnUpgrades,
availableRoomUpgrades,
selectedRoomUpgrade,
termsAccepted,
isLoading,
processingState
];
UpSalesState.initial()
: selected = false,
addOnUpgrades = [],
availableRoomUpgrades = [],
selectedRoomUpgrade = '',
error = null,
isLoading = false,
termsAccepted = false,
processingState = UpSalesProcessingStateNotStarted();
UpSalesState setupError({required Exception error}) =>
copyWith(isLoading: false, error: error);
UpSalesState loading() => copyWith(isLoading: true);
UpSalesState preRegLoading() => copyWith(isLoading: true);
UpSalesState loaded({required UpSales upSales}) =>
copyWith(isLoading: false, availableRoomUpgrades: upSales.roomUpgrades);
UpSalesState toggleSelectedAddonUpsale({required AddOnUpgrade upgrade}) {
final upgradeIsSelected = upgrade.isSelected;
final updatedUpgrade = upgrade.copyWith(isSelected: !upgradeIsSelected, quantity: 1);
return updateUpgrade(updatedUpgrade);
}
UpSalesState toggleRoomUpgrade({required RoomUpgrade roomUpgrade}) {
if (selectedRoomUpgrade == roomUpgrade.id) {
return copyWith(selectedRoomUpgrade: '');
} else {
return copyWith(selectedRoomUpgrade: roomUpgrade.id);
}
}
UpSalesState updateSelectedUpgradeWithQuantity(
AddOnUpgrade upgrade,
int quantity,
) {
return updateUpgrade(upgrade.copyWith(quantity: quantity));
}
UpSalesState updateUpgrade(AddOnUpgrade upgrade) {
final updatedAddOnUpgrades = addOnUpgrades.toList();
final index = updatedAddOnUpgrades.indexWhere((e) => e.id == upgrade.id);
if (index == -1) {
updatedAddOnUpgrades.add(upgrade);
} else {
updatedAddOnUpgrades[index] = upgrade;
}
return copyWith(addOnUpgrades: updatedAddOnUpgrades);
}
UpSalesState processingStateUpdated(UpSalesProcessingState processingState) =>
copyWith(processingState: processingState, error: Exception(""));
UpSalesState copyWith({
bool? selected,
List<AddOnUpgrade>? addOnUpgrades,
List<RoomUpgrade>? availableRoomUpgrades,
String? selectedRoomUpgrade,
bool? isLoading,
Exception? error,
bool? termsAccepted,
UpSalesProcessingState? processingState,
}) {
return UpSalesState(
selected: selected ?? this.selected,
addOnUpgrades: addOnUpgrades ?? this.addOnUpgrades,
availableRoomUpgrades:
availableRoomUpgrades ?? this.availableRoomUpgrades,
selectedRoomUpgrade: selectedRoomUpgrade ?? this.selectedRoomUpgrade,
isLoading: isLoading ?? this.isLoading,
error: error ?? this.error,
termsAccepted: termsAccepted ?? this.termsAccepted,
processingState: processingState ?? this.processingState,
);
}
}