API - Use the new Prices API.

This commit is contained in:
2026-01-05 15:08:05 +01:00
parent 70e483bc45
commit 2b3d1eafd3
8 changed files with 94 additions and 87 deletions
+7 -25
View File
@@ -1,24 +1,14 @@
import { fetcherUnwraperWithFilter } from "./backend"; import { fetcherUnwraperWithFilter } from "./backend";
import useSWR from "swr"; import useSWR from "swr";
import { import {
AvailabilityFilter, SearchPeriodRequest,
AvailabilityRequest,
FareFilter,
FareRequest,
RoomAvailabity, RoomAvailabity,
RoomPrice, RoomPriceSearchResponse,
} from "@/model/RoomSearch"; } from "@/model/RoomSearch";
export function useAPIRoomAvailability(filter: AvailabilityFilter | null) { export function useAPIRoomAvailability(filter: SearchPeriodRequest | null) {
const request: AvailabilityRequest | null = filter
? {
startDate: filter.startDate,
endDate: filter.endDate,
}
: null;
const { data, isLoading, error } = useSWR( const { data, isLoading, error } = useSWR(
request ? ["/api/search/availability", request] : null, filter ? ["/api/search/availability", filter] : null,
([url, request]) => ([url, request]) =>
fetcherUnwraperWithFilter<RoomAvailabity[]>(url, request), fetcherUnwraperWithFilter<RoomAvailabity[]>(url, request),
); );
@@ -30,18 +20,10 @@ export function useAPIRoomAvailability(filter: AvailabilityFilter | null) {
}; };
} }
export function useAPIRoomPrices(filter: FareFilter | null) { export function useAPIRoomPrices(filter: SearchPeriodRequest | null) {
const request: FareRequest | null = filter
? {
roomCategory: filter.roomCategory,
startDate: filter.startDate,
endDate: filter.endDate,
}
: null;
const { data, isLoading, error } = useSWR( const { data, isLoading, error } = useSWR(
request ? ["/api/search/pricesCategory", request] : null, filter ? ["/api/search/prices", filter] : null,
([url, request]) => fetcherUnwraperWithFilter<RoomPrice[]>(url, request), ([url, request]) => fetcherUnwraperWithFilter<RoomPriceSearchResponse[]>(url, request),
); );
return { return {
+9 -17
View File
@@ -1,4 +1,3 @@
import { useAPIRoomCategory } from "@/api/api-roomCategories";
import { Card, CardContent } from "../ui/card"; import { Card, CardContent } from "../ui/card";
import { Typography } from "../ui/typography"; import { Typography } from "../ui/typography";
import { import {
@@ -11,14 +10,14 @@ import {
} from "../ui/table"; } from "../ui/table";
import { Skeleton } from "../ui/skeleton"; import { Skeleton } from "../ui/skeleton";
import { useAppStore } from "@/store"; import { useAppStore } from "@/store";
import { useAPIRoomPrices } from "@/api/api-roomSearch";
import { NumberSelector } from "../ui/number-selector"; import { NumberSelector } from "../ui/number-selector";
import { NewBooking, NewBookingRoom } from "@/model/Bookings"; import { NewBooking, NewBookingRoom } from "@/model/Bookings";
import { RoomItemCard } from "./room-item-card"; import { RoomItemCard } from "./room-item-card";
import { IconWithTooltip } from "../ui/icon-number-tooltip"; import { IconWithTooltip } from "../ui/icon-number-tooltip";
import { UserIcon } from "lucide-react"; import { UserIcon } from "lucide-react";
import { makeFareFilterFromSearchFilter } from "@/utils/utils"; import { makeSearchPeriodRequestFromSearchFilter } from "@/utils/utils";
import { SearchFilter } from "@/model/InternalTypes"; import { SearchFilter } from "@/model/InternalTypes";
import { useRoomCategory, useRoomPrice } from "@/utils/apiHooks";
function RoomBooking({ function RoomBooking({
roomCategoryId, roomCategoryId,
@@ -77,24 +76,17 @@ function RoomBooking({
const canAddMoreRooms: boolean = availableAmount > totalSelectAmount; const canAddMoreRooms: boolean = availableAmount > totalSelectAmount;
//This seems a little bit overkill, but IDK. //This seems a little bit overkill, but IDK.
const fareFilter = makeFareFilterFromSearchFilter( const fareFilter = makeSearchPeriodRequestFromSearchFilter(appSearchFilter);
appSearchFilter,
const { value: roomCategory, isLoading: isLoadingCategory } =
useRoomCategory(roomCategoryId);
const { value: roomPriceList, isLoading: isLoadingPrices } = useRoomPrice(
fareFilter,
roomCategoryId, roomCategoryId,
); );
const {
roomCategory,
isLoading: isLoadingCategory,
isError: isErrorCategory,
} = useAPIRoomCategory(roomCategoryId);
const {
roomPriceList,
isLoading: isLoadingPrices,
isError: isErrorPrices,
} = useAPIRoomPrices(fareFilter);
const isLoading = isLoadingCategory || isLoadingPrices; const isLoading = isLoadingCategory || isLoadingPrices;
const isError = isErrorCategory || isErrorPrices; const isError = roomCategory == null;
if (isLoading) { if (isLoading) {
return <Skeleton className="mx-auto h-[150px] w-[600px]" />; return <Skeleton className="mx-auto h-[150px] w-[600px]" />;
+3 -8
View File
@@ -19,7 +19,7 @@ export function BookingDetails({
mode: BookingDetailsModes; mode: BookingDetailsModes;
}) { }) {
const bookingData = useAppStore((state) => state.currentBooking); const bookingData = useAppStore((state) => state.currentBooking);
const roomCategoryList = useAPIRoomCategoryList(); const { roomCategoryList } = useAPIRoomCategoryList();
const onBtBookingClick = () => { const onBtBookingClick = () => {
if (onBookingConfirm) { if (onBookingConfirm) {
@@ -43,9 +43,7 @@ export function BookingDetails({
} }
const roomList = bookingData.rooms.map((room) => { const roomList = bookingData.rooms.map((room) => {
const category = roomCategoryList.roomCategoryList const category = roomCategoryList?.find((c) => c.id == room.roomCategory);
?.filter((c) => c.id == room.roomCategory)
.at(0);
const photo = category?.roomCategoryPhotos.at(0); const photo = category?.roomCategoryPhotos.at(0);
return ( return (
@@ -101,10 +99,7 @@ export function BookingDetails({
Arrival: {bookingData.arrivalDate.toLocaleDateString()} - Departure:{" "} Arrival: {bookingData.arrivalDate.toLocaleDateString()} - Departure:{" "}
{bookingData.departureDate.toLocaleDateString()} <br></br> {bookingData.departureDate.toLocaleDateString()} <br></br>
Number of nights:{" "} Number of nights:{" "}
{differenceInDays( {differenceInDays(bookingData.departureDate, bookingData.arrivalDate)}
bookingData.departureDate,
bookingData.arrivalDate,
) + 1}
</Typography> </Typography>
<Separator className="my-2"></Separator> <Separator className="my-2"></Separator>
<Typography variant={"h3"}>Your Rooms</Typography> <Typography variant={"h3"}>Your Rooms</Typography>
+4 -16
View File
@@ -8,24 +8,12 @@ export type RoomPrice = {
price: number; price: number;
}; };
export type AvailabilityRequest = { export type SearchPeriodRequest = {
startDate: string; startDate: string;
endDate: string; endDate: string;
}; };
export type AvailabilityFilter = { export type RoomPriceSearchResponse = {
startDate: string; roomCategoryId: number;
endDate: string; prices: RoomPrice[];
};
export type FareRequest = {
roomCategory: number;
startDate: string;
endDate: string;
};
export type FareFilter = {
roomCategory: number;
startDate: string;
endDate: string;
}; };
+2 -2
View File
@@ -11,8 +11,8 @@ import { eBookingState } from "@/utils/AppStateManager";
import { useAppStore } from "@/store"; import { useAppStore } from "@/store";
import { import {
isValidSearchFilter, isValidSearchFilter,
makeAvailabilityFilterFromSearchFilter,
makeDayUTCDate, makeDayUTCDate,
makeSearchPeriodRequestFromSearchFilter,
} from "@/utils/utils"; } from "@/utils/utils";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
@@ -31,7 +31,7 @@ function SearchPage() {
isLoading: isLoadingAvailability, isLoading: isLoadingAvailability,
isError: isErrorAvailability, isError: isErrorAvailability,
} = useAPIRoomAvailability( } = useAPIRoomAvailability(
makeAvailabilityFilterFromSearchFilter(appSearchFilter) ?? null, makeSearchPeriodRequestFromSearchFilter(appSearchFilter) ?? null,
); );
const isLoading = isLoadingAvailability; const isLoading = isLoadingAvailability;
const isError = isErrorAvailability; const isError = isErrorAvailability;
+59
View File
@@ -0,0 +1,59 @@
import { useAPIRoomCategoryList } from "@/api/api-roomCategories";
import { useAPIRoomPrices } from "@/api/api-roomSearch";
import { RoomCategory } from "@/model/RoomCategory";
import { RoomPrice, SearchPeriodRequest } from "@/model/RoomSearch";
export function useRoomCategory(roomCategoryId: number): {
value: RoomCategory | null;
isLoading: boolean;
} {
const { roomCategoryList, isLoading, isError } = useAPIRoomCategoryList();
if (isLoading) {
return {
value: null,
isLoading: true,
};
}
if (isError) {
return {
value: null,
isLoading: false,
};
}
const roomCategoryItem = roomCategoryList?.find(
(i) => i.id == roomCategoryId,
);
return { value: roomCategoryItem ?? null, isLoading: isLoading };
}
export function useRoomPrice(
filter: SearchPeriodRequest | null,
roomCategoryId: number,
): {
value: RoomPrice[];
isLoading: boolean;
} {
const { roomPriceList, isLoading, isError } = useAPIRoomPrices(filter);
if (isLoading) {
return {
value: [],
isLoading: true,
};
}
if (isError) {
return {
value: [],
isLoading: false,
};
}
const roomPrice = roomPriceList?.find(
(i) => i.roomCategoryId == roomCategoryId,
);
return { value: roomPrice?.prices ?? [], isLoading: isLoading };
}
+7 -1
View File
@@ -2,7 +2,13 @@ import { useAPIConfigVarList } from "@/api/api-configVars";
import { getConfigVarFromList } from "./utils"; import { getConfigVarFromList } from "./utils";
import { eConfigVarKeys } from "@/model/ConfigVar"; import { eConfigVarKeys } from "@/model/ConfigVar";
export function useConfigVariable(key: eConfigVarKeys, defaultValue: string) { export function useConfigVariable(
key: eConfigVarKeys,
defaultValue: string,
): {
value: string;
isLoading: boolean;
} {
const { configVarList, isLoading } = useAPIConfigVarList(); const { configVarList, isLoading } = useAPIConfigVarList();
if (isLoading) { if (isLoading) {
+3 -18
View File
@@ -1,4 +1,4 @@
import { AvailabilityFilter, FareFilter } from "@/model/RoomSearch"; import { SearchPeriodRequest } from "@/model/RoomSearch";
import { SearchFilter } from "@/model/InternalTypes"; import { SearchFilter } from "@/model/InternalTypes";
import { ConfigVar } from "@/model/ConfigVar"; import { ConfigVar } from "@/model/ConfigVar";
@@ -25,9 +25,9 @@ export function isValidSearchFilter(sf: SearchFilter): boolean {
return false; return false;
} }
export function makeAvailabilityFilterFromSearchFilter( export function makeSearchPeriodRequestFromSearchFilter(
sf: SearchFilter, sf: SearchFilter,
): AvailabilityFilter | null { ): SearchPeriodRequest | null {
if (!isValidSearchFilter(sf)) { if (!isValidSearchFilter(sf)) {
return null; return null;
} }
@@ -37,21 +37,6 @@ export function makeAvailabilityFilterFromSearchFilter(
}; };
} }
export function makeFareFilterFromSearchFilter(
sf: SearchFilter,
roomCategoryId: number,
): FareFilter | null {
if (!isValidSearchFilter(sf) || roomCategoryId < 0) {
return null;
}
return {
startDate: sf.dateRange.from!.toISOString(),
endDate: sf.dateRange.to!.toISOString(),
roomCategory: roomCategoryId,
};
}
export function getConfigVarFromList( export function getConfigVarFromList(
varList: ConfigVar[] | undefined, varList: ConfigVar[] | undefined,
key: string, key: string,