| @@ -104,8 +104,9 @@ | ||
| 104 | 104 | const RecurringRuleForm = lazy(() => import("./pages/RecurringRuleForm")); |
| 105 | 105 | const Whatsapp = lazy(() => import("./pages/Whatsapp")); |
| 106 | 106 | const ChannelManager = lazy(() => import("./pages/ChannelManager")); |
| 107 | 107 | const Webhooks = lazy(() => import("./pages/Webhooks")); |
| 108 | +const ScheduledPayments = lazy(() => import("./pages/ScheduledPayments")); | |
| 108 | 109 | const TripConsentForm = lazy(() => import("./pages/TripConsentForm")); |
| 109 | 110 | const BookingForm = lazy(() => import("./pages/BookingForm")); |
| 110 | 111 | const ViewBooking = lazy(() => import("./pages/ViewBooking")); |
| 111 | 112 | const AvailabilityForm = lazy(() => import("./pages/AvailabilityForm")); |
| @@ -163,9 +164,9 @@ | ||
| 163 | 164 | // Get subpage, tab, and action from URL query parameters |
| 164 | 165 | const subpage = useMemo(() => { |
| 165 | 166 | const params = new URLSearchParams(window.location.search); |
| 166 | 167 | return params.get("subpage") || "dashboard"; |
| 167 | - // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 168 | + // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 168 | 169 | }, [urlKey]); |
| 169 | 170 | |
| 170 | 171 | // Mark a badged section seen when its page is opened, so the sidebar badge |
| 171 | 172 | // clears (bumps the wp_options marker server-side, then the shared counts |
| @@ -175,21 +176,21 @@ | ||
| 175 | 176 | const section = SUBPAGE_TO_SECTION[subpage.toLowerCase()]; |
| 176 | 177 | if (section) { |
| 177 | 178 | markSectionSeen.mutate(section); |
| 178 | 179 | } |
| 179 | - // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 180 | + // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 180 | 181 | }, [subpage]); |
| 181 | 182 | |
| 182 | 183 | const tab = useMemo(() => { |
| 183 | 184 | const params = new URLSearchParams(window.location.search); |
| 184 | 185 | return params.get("tab") || "all"; |
| 185 | - // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 186 | + // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 186 | 187 | }, [urlKey]); |
| 187 | 188 | |
| 188 | 189 | const action = useMemo(() => { |
| 189 | 190 | const params = new URLSearchParams(window.location.search); |
| 190 | 191 | return params.get("action"); |
| 191 | - // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 192 | + // eslint-disable-next-line react-hooks/exhaustive-deps | |
| 192 | 193 | }, [urlKey, subpage]); |
| 193 | 194 | |
| 194 | 195 | // Render the appropriate page based on subpage, tab, and action parameters |
| 195 | 196 | const renderPage = () => { |
| @@ -353,8 +354,13 @@ | ||
| 353 | 354 | return <DiscountForm />; |
| 354 | 355 | } |
| 355 | 356 | return <Discounts />; |
| 356 | 357 | case "payments": |
| 358 | + // Scheduled balance payments (Pro module) live under Payments as a tab. | |
| 359 | + // Checked before the action branches because this tab has no forms. | |
| 360 | + if (tab.toLowerCase() === "scheduled") { | |
| 361 | + return <ScheduledPayments />; | |
| 362 | + } | |
| 357 | 363 | // Check if we're viewing, creating, or editing a payment |
| 358 | 364 | if (action === "view") { |
| 359 | 365 | return <ViewPayment />; |
| 360 | 366 | } |