|
|
@@ -58,7 +58,7 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
const editTripId = route.params?.editTripId ?? null;
|
|
|
const token = storage.get('token', StoreType.STRING) as string;
|
|
|
const { data: editData } = useGetTripQuery(token, editTripId, Boolean(editTripId));
|
|
|
- const navigation = useNavigation();
|
|
|
+ const navigation: any = useNavigation();
|
|
|
const { defaultRegion, defaultYear } = route.params;
|
|
|
const [allRegions, setAllRegions] = useState<RegionAddData[] | null>([]);
|
|
|
const { data } = useGetRegionsForTripsQuery(true);
|
|
|
@@ -437,7 +437,9 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
- sorted = updatedBeforeSort;
|
|
|
+ sorted = [...updatedBeforeSort].sort(
|
|
|
+ (a, b) => (a.visitStartDate?.year ?? 9999) - (b.visitStartDate?.year ?? 9999)
|
|
|
+ );
|
|
|
|
|
|
const editedRegionId = regions?.[clickedInstanceIndex]?.id;
|
|
|
const propagatedIdSet = new Set<number | string>();
|
|
|
@@ -492,31 +494,39 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
setPendingDelete(true);
|
|
|
};
|
|
|
|
|
|
- const computePayloadDates = (regionsList: RegionWithDates[]) => {
|
|
|
- if (!regionsList || regionsList.length === 0) return { date_from: null, date_to: null };
|
|
|
-
|
|
|
- const starts = regionsList
|
|
|
- .map((r) => dateValueToISO(r.visitStartDate))
|
|
|
- .filter((v): v is string => v !== null);
|
|
|
- const ends = regionsList
|
|
|
- .map((r) => dateValueToISO(r.visitEndDate))
|
|
|
- .filter((v): v is string => v !== null);
|
|
|
-
|
|
|
- if (!starts.length || !ends.length) return { date_from: null, date_to: null };
|
|
|
-
|
|
|
- const toComparableStart = (v: string) =>
|
|
|
- v.length === 4 ? `${v}-01-01` : v;
|
|
|
- const toComparableEnd = (v: string) =>
|
|
|
- v.length === 4 ? `${v}-12-31` : v;
|
|
|
+ const computePayloadDates = (
|
|
|
+ regionsList: RegionWithDates[]
|
|
|
+ ): { date_from?: string | null; date_to?: string | null; year?: number | null } => {
|
|
|
+ if (!regionsList || regionsList.length === 0) return {};
|
|
|
|
|
|
- const minStart = starts.reduce((acc, cur) =>
|
|
|
- toComparableStart(cur) < toComparableStart(acc) ? cur : acc
|
|
|
+ const allFullDates = regionsList.every(
|
|
|
+ (r) => isFullDate(r.visitStartDate) && isFullDate(r.visitEndDate)
|
|
|
);
|
|
|
- const maxEnd = ends.reduce((acc, cur) =>
|
|
|
- toComparableEnd(cur) > toComparableEnd(acc) ? cur : acc
|
|
|
+ const allYearOnly = regionsList.every(
|
|
|
+ (r) => r.visitStartDate?.year && !r.visitStartDate?.month
|
|
|
);
|
|
|
|
|
|
- return { date_from: minStart, date_to: maxEnd };
|
|
|
+ if (allFullDates) {
|
|
|
+ const starts = regionsList
|
|
|
+ .map((r) => dateValueToISO(r.visitStartDate))
|
|
|
+ .filter((v): v is string => v !== null);
|
|
|
+ const ends = regionsList
|
|
|
+ .map((r) => dateValueToISO(r.visitEndDate))
|
|
|
+ .filter((v): v is string => v !== null);
|
|
|
+ const minStart = starts.reduce((acc, cur) => (cur < acc ? cur : acc));
|
|
|
+ const maxEnd = ends.reduce((acc, cur) => (cur > acc ? cur : acc));
|
|
|
+ return { date_from: minStart, date_to: maxEnd };
|
|
|
+ }
|
|
|
+
|
|
|
+ if (allYearOnly) {
|
|
|
+ const years = regionsList.map((r) => r.visitStartDate!.year!);
|
|
|
+ const uniqueYears = new Set(years);
|
|
|
+ if (uniqueYears.size === 1) {
|
|
|
+ return { year: years[0] };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return {};
|
|
|
};
|
|
|
|
|
|
const performSaveNewTrip = async () => {
|
|
|
@@ -524,24 +534,28 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
|
|
|
try {
|
|
|
setIsLoading('save');
|
|
|
- const regionsData = regions.map((region) => ({
|
|
|
- id: region.id,
|
|
|
- quality: 3,
|
|
|
- hidden: region.hidden,
|
|
|
- year_from: region.visitStartDate?.year || null,
|
|
|
- year_to: region.visitEndDate?.year || null,
|
|
|
- month_from: region.visitStartDate?.month || null,
|
|
|
- month_to: region.visitEndDate?.month || null,
|
|
|
- day_from: region.visitStartDate?.day || null,
|
|
|
- day_to: region.visitEndDate?.day || null
|
|
|
- }));
|
|
|
- const { date_from, date_to } = computePayloadDates(regions);
|
|
|
+ const regionsData = regions.map((region) => {
|
|
|
+ const yearOnly = region.visitStartDate?.year && !region.visitStartDate?.day;
|
|
|
+ return {
|
|
|
+ id: region.id,
|
|
|
+ quality: 3,
|
|
|
+ hidden: region.hidden,
|
|
|
+ year_from: region.visitStartDate?.year || null,
|
|
|
+ year_to: region.visitEndDate?.year || null,
|
|
|
+ ...(yearOnly ? {} : {
|
|
|
+ month_from: region.visitStartDate?.month || null,
|
|
|
+ month_to: region.visitEndDate?.month || null,
|
|
|
+ day_from: region.visitStartDate?.day || null,
|
|
|
+ day_to: region.visitEndDate?.day || null
|
|
|
+ })
|
|
|
+ };
|
|
|
+ });
|
|
|
+ const payload = computePayloadDates(regions);
|
|
|
|
|
|
saveNewTrip(
|
|
|
- { token, date_from, date_to, description, regions: regionsData },
|
|
|
+ { token, ...payload, description, regions: regionsData },
|
|
|
{
|
|
|
onSuccess: (res) => {
|
|
|
- console.log('res', res)
|
|
|
if (res && res.result === 'OK') {
|
|
|
navigation.popTo(NAVIGATION_PAGES.TRIPS_2025, { saved: true });
|
|
|
}
|
|
|
@@ -562,20 +576,26 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
if (!regions) return;
|
|
|
try {
|
|
|
setIsLoading('update');
|
|
|
- const regionsData = regions.map((region) => ({
|
|
|
- id: region.id,
|
|
|
- quality: region.quality ?? 3,
|
|
|
- hidden: region.hidden,
|
|
|
- year_from: region.visitStartDate?.year || null,
|
|
|
- year_to: region.visitEndDate?.year || null,
|
|
|
- month_from: region.visitStartDate?.month || null,
|
|
|
- month_to: region.visitEndDate?.month || null,
|
|
|
- day_from: region.visitStartDate?.day || null,
|
|
|
- day_to: region.visitEndDate?.day || null
|
|
|
- }));
|
|
|
- const { date_from, date_to } = computePayloadDates(regions);
|
|
|
+ const regionsData = regions.map((region) => {
|
|
|
+ const yearOnly = region.visitStartDate?.year && !region.visitStartDate?.day;
|
|
|
+ return {
|
|
|
+ id: region.id,
|
|
|
+ quality: region.quality ?? 3,
|
|
|
+ hidden: region.hidden,
|
|
|
+ year_from: region.visitStartDate?.year || null,
|
|
|
+ year_to: region.visitEndDate?.year || null,
|
|
|
+ ...(yearOnly ? {} : {
|
|
|
+ month_from: region.visitStartDate?.month || null,
|
|
|
+ month_to: region.visitEndDate?.month || null,
|
|
|
+ day_from: region.visitStartDate?.day || null,
|
|
|
+ day_to: region.visitEndDate?.day || null
|
|
|
+ })
|
|
|
+ };
|
|
|
+ });
|
|
|
+ const payload = computePayloadDates(regions);
|
|
|
+
|
|
|
updateTrip(
|
|
|
- { token, trip_id: editTripId, date_from, date_to, description, regions: regionsData },
|
|
|
+ { token, trip_id: editTripId, ...payload, description, regions: regionsData },
|
|
|
{
|
|
|
onSuccess: (res) => {
|
|
|
if (res && res.result === 'OK') {
|
|
|
@@ -597,7 +617,7 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
scrollToError(regionErrors);
|
|
|
return;
|
|
|
}
|
|
|
- const summary = computeTripSummary(regions);
|
|
|
+ const summary: { totalDays: number, perRegion: any } = computeTripSummary(regions);
|
|
|
if (summary.totalDays === 0) {
|
|
|
performSaveNewTrip();
|
|
|
return;
|
|
|
@@ -614,7 +634,7 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
scrollToError(regionErrors);
|
|
|
return;
|
|
|
}
|
|
|
- const summary = computeTripSummary(regions);
|
|
|
+ const summary: { totalDays: number, perRegion: any } = computeTripSummary(regions);
|
|
|
if (summary.totalDays === 0) {
|
|
|
performUpdateTrip();
|
|
|
return;
|
|
|
@@ -688,10 +708,8 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
|
|
|
style={[styles.addRegionBtn]}
|
|
|
onPress={() =>
|
|
|
navigation.navigate(
|
|
|
- ...([
|
|
|
- NAVIGATION_PAGES.ADD_REGIONS_NEW,
|
|
|
- { regionsParams: regions, editId: editTripId, defaultYear, allRegions }
|
|
|
- ] as never)
|
|
|
+ NAVIGATION_PAGES.ADD_REGIONS_NEW,
|
|
|
+ { regionsParams: regions, editId: editTripId, defaultYear, allRegions }
|
|
|
)
|
|
|
}
|
|
|
>
|