calculateSlots function
Implementation
List<Map<String, dynamic>> calculateSlots(List<String> slots) {
List<Map<String, dynamic>> mappedSlots = [];
for (var element in slots) {
var timeList = element.split('-');
var splitTime = timeList[0].split(':');
var splitTime2 = timeList[1].split(':');
TimeOfDay start = TimeOfDay(
hour: int.parse(splitTime[0]),
minute: int.parse(splitTime[1]),
);
TimeOfDay end = TimeOfDay(
hour: int.parse(splitTime2[0]) == 0 ? 24 : int.parse(splitTime2[0]),
minute: int.parse(splitTime2[1]),
);
int totalSlots = 0;
var hourMinus = end.hour - start.hour;
var minuteMinus = (end.minute - start.minute);
int minuteSlots = minuteMinus == 30
? 1
: minuteMinus == -30
? -1
: 0;
totalSlots += hourMinus * 2;
totalSlots += minuteSlots;
Map<String, dynamic> firstSlotToAdd = {
'i': int.parse(splitTime[0]),
'firstHalf': int.parse(splitTime[1]) == 0,
'secondHalf': int.parse(splitTime[1]) == 30,
};
final mappedSlotFirst = mappedSlots.firstWhere(
(mapped) => mapped['i'] == firstSlotToAdd['i'],
orElse: () => {},
);
if (mappedSlotFirst.isNotEmpty) {
firstSlotToAdd = {
'i': firstSlotToAdd['i'],
'firstHalf': mappedSlotFirst['firstHalf']
? mappedSlotFirst['firstHalf']
: firstSlotToAdd['firstHalf'],
'secondHalf': mappedSlotFirst['secondHalf']
? mappedSlotFirst['secondHalf']
: firstSlotToAdd['secondHalf'],
};
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlotFirst['i']);
}
if (totalSlots % 2 == 0) {
if (firstSlotToAdd['firstHalf'] == true) {
for (int i = 0; i < hourMinus; i++) {
Map<String, dynamic> slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': true,
'secondHalf': true,
};
final mappedSlot = mappedSlots.firstWhere(
(mapped) => mapped['i'] == slotToAdd['i'],
orElse: () => {},
);
if (mappedSlot.isNotEmpty) {
slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': mappedSlot['firstHalf']
? mappedSlot['firstHalf']
: slotToAdd['firstHalf'],
'secondHalf': mappedSlot['secondHalf']
? mappedSlot['secondHalf']
: slotToAdd['secondHalf'],
};
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlot['i']);
}
mappedSlots.add(slotToAdd);
}
} else {
mappedSlots.add(firstSlotToAdd);
for (int i = 1; i < hourMinus; i++) {
Map<String, dynamic> slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': true,
'secondHalf': true,
};
final mappedSlot = mappedSlots.firstWhere(
(mapped) => mapped['i'] == slotToAdd['i'],
orElse: () => {},
);
if (mappedSlot.isNotEmpty) {
slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': mappedSlot['firstHalf']
? mappedSlot['firstHalf']
: slotToAdd['firstHalf'],
'secondHalf': mappedSlot['secondHalf']
? mappedSlot['secondHalf']
: slotToAdd['secondHalf'],
};
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlot['i']);
}
mappedSlots.add(slotToAdd);
}
final mappedSlot = mappedSlots.firstWhere(
(mapped) => mapped['i'] == (int.parse(splitTime[0]) + hourMinus),
orElse: () => {},
);
if (mappedSlot.isNotEmpty) {
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlot['i']);
mappedSlots.add({
'i': (int.parse(splitTime[0]) + hourMinus),
'firstHalf': true,
'secondHalf':
mappedSlot['secondHalf'] ? mappedSlot['secondHalf'] : false,
});
} else {
mappedSlots.add({
'i': int.parse(splitTime[0]) + hourMinus,
'firstHalf': true,
'secondHalf': false,
});
}
}
} else {
Map<String, dynamic> slotToAdd = {};
if (firstSlotToAdd['firstHalf'] == true) {
if (hourMinus > 0) {
for (int i = 0; i < hourMinus; i++) {
slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': true,
'secondHalf': true,
};
final mappedSlot = mappedSlots.firstWhere(
(mapped) => mapped['i'] == slotToAdd['i'],
orElse: () => {},
);
if (mappedSlot.isNotEmpty) {
slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': mappedSlot['firstHalf']
? mappedSlot['firstHalf']
: slotToAdd['firstHalf'],
'secondHalf': mappedSlot['secondHalf']
? mappedSlot['secondHalf']
: slotToAdd['secondHalf'],
};
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlot['i']);
}
mappedSlots.add(slotToAdd);
}
slotToAdd = {
'i': int.parse(splitTime[0]) + hourMinus,
'firstHalf': true,
'secondHalf': false,
};
final mappedSlot = mappedSlots.firstWhere(
(mapped) => mapped['i'] == slotToAdd['i'],
orElse: () => {},
);
if (mappedSlot.isNotEmpty) {
slotToAdd = {
'i': (int.parse(splitTime[0]) + hourMinus),
'firstHalf': mappedSlot['firstHalf']
? mappedSlot['firstHalf']
: slotToAdd['firstHalf'],
'secondHalf': mappedSlot['secondHalf']
? mappedSlot['secondHalf']
: slotToAdd['secondHalf'],
};
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlot['i']);
}
mappedSlots.add(slotToAdd);
} else {
slotToAdd = {
'i': int.parse(splitTime[0]),
'firstHalf': true,
'secondHalf': false,
};
final mappedSlot = mappedSlots.firstWhere(
(mapped) => mapped['i'] == [slotToAdd['i']],
orElse: () => {},
);
if (mappedSlot.isNotEmpty) {
slotToAdd = {
'i': int.parse(splitTime[0]),
'firstHalf': mappedSlot['firstHalf']
? mappedSlot['firstHalf']
: slotToAdd['firstHalf'],
'secondHalf': mappedSlot['secondHalf']
? mappedSlot['secondHalf']
: slotToAdd['secondHalf'],
};
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlot['i']);
}
mappedSlots.add(slotToAdd);
}
} else {
mappedSlots.add(firstSlotToAdd);
for (int i = 1; i < hourMinus; i++) {
slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': true,
'secondHalf': true,
};
final mappedSlot = mappedSlots.firstWhere(
(mapped) => mapped['i'] == [slotToAdd['i']],
orElse: () => {},
);
if (mappedSlot.isNotEmpty) {
slotToAdd = {
'i': int.parse(splitTime[0]) + i,
'firstHalf': mappedSlot['firstHalf']
? mappedSlot['firstHalf']
: slotToAdd['firstHalf'],
'secondHalf': mappedSlot['secondHalf']
? mappedSlot['secondHalf']
: slotToAdd['secondHalf'],
};
mappedSlots.removeWhere(
(mappedElement) => mappedElement['i'] == mappedSlot['i']);
}
mappedSlots.add(slotToAdd);
}
}
}
}
return mappedSlots;
}