diff --git a/src/pages/CustomersPage.tsx b/src/pages/CustomersPage.tsx index 2a04a64..8e4f03b 100644 --- a/src/pages/CustomersPage.tsx +++ b/src/pages/CustomersPage.tsx @@ -10,17 +10,19 @@ import { TableRow, } from "@/components/ui/table"; import { apiGet } from "@/lib/api"; +import { useAuthStore } from "@/store/authStore"; import type { CustomerRow } from "@/lib/types"; import { formatDate } from "@/lib/format"; export function CustomersPage() { + const selectedPropertyId = useAuthStore((s) => s.selectedPropertyId); const [rows, setRows] = useState([]); useEffect(() => { apiGet<{ data: CustomerRow[] }>("/customers").then((r) => setRows(r.data) ); - }, []); + }, [selectedPropertyId]); return (
diff --git a/src/pages/DiscountCodesPage.tsx b/src/pages/DiscountCodesPage.tsx index 849cf7d..952fd90 100644 --- a/src/pages/DiscountCodesPage.tsx +++ b/src/pages/DiscountCodesPage.tsx @@ -29,7 +29,9 @@ import { TableRow, } from "@/components/ui/table"; import { useAuth } from "@/context/AuthContext"; +import { useAuthStore } from "@/store/authStore"; import { apiGet, apiPatch, apiPost } from "@/lib/api"; +import { Spinner } from "@/components/ui/spinner"; import type { DiscountCode } from "@/lib/types"; function copy(s: string) { @@ -38,18 +40,21 @@ function copy(s: string) { export function DiscountCodesPage() { const { canManageCodes } = useAuth(); + const selectedPropertyId = useAuthStore((s) => s.selectedPropertyId); const [rows, setRows] = useState([]); + const [loading, setLoading] = useState(true); + const [submitting, setSubmitting] = useState(false); const [open, setOpen] = useState(false); const [custom, setCustom] = useState(""); - const [generate, setGenerate] = useState(true); const [value, setValue] = useState("10"); const [dtype, setDtype] = useState<"percent" | "fixed_amount">("percent"); const load = useCallback(() => { + setLoading(true); apiGet<{ data: DiscountCode[] }>("/discount-codes").then((r) => setRows(r.data) - ); - }, []); + ).finally(() => setLoading(false)); + }, [selectedPropertyId]); useEffect(() => { load(); @@ -57,14 +62,18 @@ export function DiscountCodesPage() { async function create(e: React.FormEvent) { e.preventDefault(); - await apiPost("/discount-codes", { - generate, - code: generate ? undefined : custom, - discountType: dtype, - value: Number(value), - }); - setOpen(false); - load(); + setSubmitting(true); + try { + await apiPost("/discount-codes", { + code: custom, + discountType: dtype, + value: Number(value), + }); + setOpen(false); + load(); + } finally { + setSubmitting(false); + } } async function toggle(dc: DiscountCode) { @@ -87,24 +96,13 @@ export function DiscountCodesPage() { New discount code
-
- setGenerate(e.target.checked)} - id="gen" - /> - -
- {!generate && (
- + setCustom(e.target.value)} />
- )}
setLabel(e.target.value)} - /> -
-
- setGenerate(e.target.checked)} - id="rgen" - /> - -
- {!generate && (
- + setCustom(e.target.value)} + value={meta} + onChange={(e) => setMeta(e.target.value)} + /> +
+
+ + setCode(e.target.value)} />
- )}
@@ -120,7 +106,6 @@ export function ReferralCodesPage() { Code Label - Redemptions Active @@ -129,11 +114,7 @@ export function ReferralCodesPage() { {rows.map((r) => ( {r.code} - {r.label} - - {r.redemptionCount} - {r.maxRedemptions != null && ` / ${r.maxRedemptions}`} - + {r.meta} {r.isActive ? "Active" : "Off"} diff --git a/src/pages/RoomsPage.tsx b/src/pages/RoomsPage.tsx index 7463c55..55f13b1 100644 --- a/src/pages/RoomsPage.tsx +++ b/src/pages/RoomsPage.tsx @@ -28,12 +28,21 @@ import { TableRow, } from "@/components/ui/table"; import { apiGet, apiPost } from "@/lib/api"; +import { Spinner } from "@/components/ui/spinner"; +import { + isLikelyApiHotelRoom, + mapApiRoomToRoom, +} from "@/lib/hotel-adapters"; import { ROOM_CATALOGUE } from "@/lib/constants"; import type { Room } from "@/lib/types"; import { formatMoney } from "@/lib/format"; +import { useAuthStore } from "@/store/authStore"; export function RoomsPage() { + const selectedPropertyId = useAuthStore((s) => s.selectedPropertyId); const [rooms, setRooms] = useState([]); + const [loading, setLoading] = useState(true); + const [submitting, setSubmitting] = useState(false); const [open, setOpen] = useState(false); const [name, setName] = useState(""); const [slug, setSlug] = useState(ROOM_CATALOGUE[0].slug); @@ -41,28 +50,43 @@ export function RoomsPage() { const [baseRate, setBaseRate] = useState("120"); function load() { - apiGet<{ data: Room[] }>("/rooms").then((r) => setRooms(r.data)); + setLoading(true); + apiGet<{ data: unknown[] }>("/rooms").then((r) => { + const mapped = r.data.map((row) => + isLikelyApiHotelRoom(row) ? mapApiRoomToRoom(row) : (row as Room) + ); + setRooms(mapped); + }).finally(() => setLoading(false)); } useEffect(() => { load(); - }, []); + }, [selectedPropertyId]); async function addRoom(e: React.FormEvent) { e.preventDefault(); - await apiPost("/rooms", { - name, - roomTypeSlug: slug, - maxGuests: Number(maxGuests), - baseRate: Number(baseRate), - status: "available", - floor: "", - }); - setOpen(false); - setName(""); - load(); + setSubmitting(true); + try { + await apiPost("/rooms", { + name, + roomType: slug, + maxGuests: Number(maxGuests), + baseRate: Number(baseRate), + }); + setOpen(false); + setName(""); + load(); + } finally { + setSubmitting(false); + } } + if (loading && rooms.length === 0) return ( +
+ +
+ ); + return (
@@ -118,7 +142,7 @@ export function RoomsPage() { />
- +