|
|
@@ -43,7 +43,7 @@ interface RegionWithDates extends RegionAddData {
|
|
|
}
|
|
|
|
|
|
interface DatePickerState {
|
|
|
- regionId: number;
|
|
|
+ regionIndex: number;
|
|
|
field: 'visitStartDate' | 'visitEndDate';
|
|
|
}
|
|
|
|
|
|
@@ -241,11 +241,11 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
const days = getDaysInMonth(selectedYear, selectedMonth);
|
|
|
|
|
|
const openDatePicker = (
|
|
|
- regionId: number,
|
|
|
+ index: number,
|
|
|
field: 'visitStartDate' | 'visitEndDate',
|
|
|
initialDate?: DateValue | null
|
|
|
) => {
|
|
|
- setShowDatePicker({ regionId, field });
|
|
|
+ setShowDatePicker({ regionIndex: index, field });
|
|
|
|
|
|
if (initialDate && initialDate.year) {
|
|
|
setSelectedYear(initialDate.year || null);
|
|
|
@@ -262,20 +262,19 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
|
|
|
const handleDateConfirm = () => {
|
|
|
if (showDatePicker) {
|
|
|
+ const { regionIndex, field } = showDatePicker;
|
|
|
const dateValue: DateValue = {
|
|
|
year: selectedYear || null,
|
|
|
month: selectedMonth || null,
|
|
|
day: selectedDay || null
|
|
|
};
|
|
|
|
|
|
- setRegions(
|
|
|
- (prevRegions) =>
|
|
|
- prevRegions?.map((region) =>
|
|
|
- region.id === showDatePicker.regionId
|
|
|
- ? { ...region, [showDatePicker.field]: dateValue }
|
|
|
- : region
|
|
|
- ) || null
|
|
|
- );
|
|
|
+ setRegions((prev) => {
|
|
|
+ if (!prev) return null;
|
|
|
+ const newRegions = [...prev];
|
|
|
+ newRegions[regionIndex] = { ...newRegions[regionIndex], [field]: dateValue };
|
|
|
+ return newRegions;
|
|
|
+ });
|
|
|
|
|
|
setShowDatePicker(null);
|
|
|
actionSheetRef.current?.hide();
|
|
|
@@ -287,32 +286,58 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
actionSheetRef.current?.hide();
|
|
|
};
|
|
|
|
|
|
- const changeQualityForRegion = (regionId: number | null, newQuality: number) => {
|
|
|
+ const changeQualityForRegion = (index: number | null, newQuality: number) => {
|
|
|
+ if (index === null || index === undefined) return;
|
|
|
+
|
|
|
regions &&
|
|
|
- setRegions(
|
|
|
- regions.map((region) => {
|
|
|
- if (region.id === regionId) {
|
|
|
- return { ...region, quality: newQuality };
|
|
|
- }
|
|
|
- return region;
|
|
|
- })
|
|
|
- );
|
|
|
+ setRegions((prev) => {
|
|
|
+ if (!prev) return null;
|
|
|
+ const newRegions = [...prev];
|
|
|
+ newRegions[index] = { ...newRegions[index], quality: newQuality };
|
|
|
+ return newRegions;
|
|
|
+ });
|
|
|
};
|
|
|
|
|
|
- const changeHiddenForRegion = (regionId: number | null) => {
|
|
|
+ const changeHiddenForRegion = (index: number | null) => {
|
|
|
+ if (index === null || index === undefined) return;
|
|
|
+
|
|
|
regions &&
|
|
|
- setRegions(
|
|
|
- regions.map((region) => {
|
|
|
- if (region.id === regionId) {
|
|
|
- return { ...region, hidden: !region.hidden };
|
|
|
- }
|
|
|
- return region;
|
|
|
- })
|
|
|
- );
|
|
|
+ setRegions((prev) => {
|
|
|
+ if (!prev) return null;
|
|
|
+ const newRegions = [...prev];
|
|
|
+ newRegions[index] = { ...newRegions[index], hidden: !newRegions[index].hidden };
|
|
|
+ return newRegions;
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ const duplicateRegion = (index: number) => {
|
|
|
+ if (!regions) return;
|
|
|
+ const regionToCopy = regions[index];
|
|
|
+ const copy = { ...regionToCopy };
|
|
|
+ const newRegions = [...regions];
|
|
|
+ newRegions.splice(index + 1, 0, copy);
|
|
|
+ setRegions(newRegions);
|
|
|
+ };
|
|
|
+
|
|
|
+ const moveRegionUp = (index: number) => {
|
|
|
+ if (index <= 0 || !regions) return;
|
|
|
+ const newRegions = [...regions];
|
|
|
+ [newRegions[index - 1], newRegions[index]] = [newRegions[index], newRegions[index - 1]];
|
|
|
+ setRegions(newRegions);
|
|
|
+ };
|
|
|
+
|
|
|
+ const moveRegionDown = (index: number) => {
|
|
|
+ if (!regions || index >= regions.length - 1) return;
|
|
|
+ const newRegions = [...regions];
|
|
|
+ [newRegions[index + 1], newRegions[index]] = [newRegions[index], newRegions[index + 1]];
|
|
|
+ setRegions(newRegions);
|
|
|
};
|
|
|
|
|
|
- const handleDeleteRegion = (regionId: number) => {
|
|
|
- regions && setRegions(regions.filter((region) => region.id !== regionId));
|
|
|
+ const handleDeleteRegion = (index: number) => {
|
|
|
+ if (!regions) return;
|
|
|
+ const updated = [...regions];
|
|
|
+ updated.splice(index, 1);
|
|
|
+ setRegions(updated);
|
|
|
};
|
|
|
|
|
|
const handleDeleteTrip = async () => {
|
|
|
@@ -428,20 +453,25 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
</TouchableOpacity>
|
|
|
{regions && regions.length ? (
|
|
|
<View style={styles.regionsContainer}>
|
|
|
- {regions.map((region) => {
|
|
|
+ {regions.map((region, index) => {
|
|
|
return (
|
|
|
<RegionItem
|
|
|
- key={region.id}
|
|
|
+ key={`${region.id}-${index}`}
|
|
|
region={region}
|
|
|
- onDelete={() => handleDeleteRegion(region.id)}
|
|
|
+ index={index}
|
|
|
+ total={regions.length}
|
|
|
+ onDelete={() => handleDeleteRegion(index)}
|
|
|
onQualityChange={() => {
|
|
|
- setSelectedRegionId(region.id);
|
|
|
+ setSelectedRegionId(index);
|
|
|
setQualitySelectorVisible(true);
|
|
|
}}
|
|
|
- onHiddenChange={() => changeHiddenForRegion(region.id)}
|
|
|
+ onHiddenChange={() => changeHiddenForRegion(index)}
|
|
|
openDatePicker={openDatePicker}
|
|
|
visitStartDate={region.visitStartDate}
|
|
|
visitEndDate={region.visitEndDate}
|
|
|
+ onDuplicate={() => duplicateRegion(index)}
|
|
|
+ onMoveUp={() => moveRegionUp(index)}
|
|
|
+ onMoveDown={() => moveRegionDown(index)}
|
|
|
/>
|
|
|
);
|
|
|
})}
|