Maintenance mode activates after current draw completes
- When admin enables maintenance, it's set to 'pending' state - Maintenance activates automatically after the current draw completes - Admin can use immediate=true to force immediate activation - Frontend shows 'Maintenance Scheduled' banner when pending - Telegram bot warns users but still allows purchases when pending - Both mode and pending status tracked in system_settings table
This commit is contained in:
@@ -17,6 +17,8 @@ export default function BuyPage() {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [jackpot, setJackpot] = useState<any>(null);
|
||||
const [maintenanceMode, setMaintenanceMode] = useState(false);
|
||||
const [maintenanceMessage, setMaintenanceMessage] = useState<string | null>(null);
|
||||
|
||||
// Form state
|
||||
const [lightningAddress, setLightningAddress] = useState('');
|
||||
@@ -125,6 +127,11 @@ export default function BuyPage() {
|
||||
|
||||
const loadJackpot = async () => {
|
||||
try {
|
||||
// Check maintenance status first
|
||||
const maintenanceStatus = await api.getMaintenanceStatus();
|
||||
setMaintenanceMode(maintenanceStatus.maintenance_mode);
|
||||
setMaintenanceMessage(maintenanceStatus.message);
|
||||
|
||||
const response = await api.getNextJackpot();
|
||||
if (response.data) {
|
||||
setJackpot(response.data);
|
||||
@@ -221,6 +228,30 @@ export default function BuyPage() {
|
||||
const ticketPriceSats = jackpot.lottery.ticket_price_sats;
|
||||
const totalCost = ticketPriceSats * tickets;
|
||||
|
||||
// Show maintenance message if in maintenance mode
|
||||
if (maintenanceMode) {
|
||||
return (
|
||||
<div className="max-w-2xl mx-auto px-1">
|
||||
<h1 className="text-2xl sm:text-3xl md:text-4xl font-bold mb-6 sm:mb-8 text-center text-white">
|
||||
{STRINGS.buy.title}
|
||||
</h1>
|
||||
<div className="bg-gradient-to-r from-amber-900/60 via-amber-800/50 to-amber-900/60 border border-amber-500/50 rounded-xl p-6 sm:p-8 text-center">
|
||||
<span className="text-5xl mb-4 block">🔧</span>
|
||||
<h2 className="text-2xl font-bold text-amber-300 mb-3">Maintenance Mode</h2>
|
||||
<p className="text-amber-200/80 text-lg">
|
||||
{maintenanceMessage || 'System is under maintenance. Please try again later.'}
|
||||
</p>
|
||||
<button
|
||||
onClick={() => router.push('/')}
|
||||
className="mt-6 bg-amber-700 hover:bg-amber-600 text-white px-6 py-2 rounded-lg transition-colors"
|
||||
>
|
||||
Back to Home
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="max-w-2xl mx-auto px-1">
|
||||
<h1 className="text-2xl sm:text-3xl md:text-4xl font-bold mb-6 sm:mb-8 text-center text-white">
|
||||
|
||||
@@ -33,6 +33,20 @@ export default function HomePage() {
|
||||
const [isRecentWin, setIsRecentWin] = useState(false);
|
||||
const [awaitingNextCycle, setAwaitingNextCycle] = useState(false);
|
||||
const [pendingWinner, setPendingWinner] = useState<RecentWinner | null>(null);
|
||||
const [maintenanceMode, setMaintenanceMode] = useState(false);
|
||||
const [maintenancePending, setMaintenancePending] = useState(false);
|
||||
const [maintenanceMessage, setMaintenanceMessage] = useState<string | null>(null);
|
||||
|
||||
const loadMaintenanceStatus = useCallback(async () => {
|
||||
try {
|
||||
const status = await api.getMaintenanceStatus();
|
||||
setMaintenanceMode(status.maintenance_mode);
|
||||
setMaintenancePending(status.maintenance_pending);
|
||||
setMaintenanceMessage(status.message);
|
||||
} catch {
|
||||
// Ignore errors, assume not in maintenance
|
||||
}
|
||||
}, []);
|
||||
|
||||
const loadJackpot = useCallback(async () => {
|
||||
try {
|
||||
@@ -76,9 +90,10 @@ export default function HomePage() {
|
||||
}, [drawJustCompleted]);
|
||||
|
||||
useEffect(() => {
|
||||
loadMaintenanceStatus();
|
||||
loadJackpot();
|
||||
loadRecentWinner();
|
||||
}, [loadJackpot, loadRecentWinner]);
|
||||
}, [loadMaintenanceStatus, loadJackpot, loadRecentWinner]);
|
||||
|
||||
// Detect when draw time passes and trigger draw animation (only if tickets were sold)
|
||||
useEffect(() => {
|
||||
@@ -245,6 +260,36 @@ export default function HomePage() {
|
||||
/>
|
||||
)}
|
||||
|
||||
{/* Maintenance Mode Banner */}
|
||||
{maintenanceMode && (
|
||||
<div className="bg-gradient-to-r from-amber-900/60 via-amber-800/50 to-amber-900/60 border border-amber-500/50 rounded-xl sm:rounded-2xl p-4 sm:p-6 mb-6 sm:mb-8">
|
||||
<div className="flex items-center justify-center gap-3">
|
||||
<span className="text-3xl">🔧</span>
|
||||
<div className="text-center">
|
||||
<h3 className="text-xl font-bold text-amber-300">Maintenance Mode</h3>
|
||||
<p className="text-amber-200/80 mt-1">
|
||||
{maintenanceMessage || 'System is under maintenance. Please try again later.'}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Pending Maintenance Banner */}
|
||||
{!maintenanceMode && maintenancePending && (
|
||||
<div className="bg-gradient-to-r from-blue-900/40 via-blue-800/30 to-blue-900/40 border border-blue-500/50 rounded-xl sm:rounded-2xl p-4 sm:p-6 mb-6 sm:mb-8">
|
||||
<div className="flex items-center justify-center gap-3">
|
||||
<span className="text-2xl">⏳</span>
|
||||
<div className="text-center">
|
||||
<h3 className="text-lg font-bold text-blue-300">Maintenance Scheduled</h3>
|
||||
<p className="text-blue-200/80 mt-1">
|
||||
Maintenance will begin after the current draw completes. Last chance to buy tickets!
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Hero Section */}
|
||||
<div className="text-center mb-8 sm:mb-12">
|
||||
<h1 className="text-3xl sm:text-4xl md:text-6xl font-bold mb-3 sm:mb-4 text-white">
|
||||
@@ -313,7 +358,7 @@ export default function HomePage() {
|
||||
</div>
|
||||
|
||||
{/* Buy Button - Hide when waiting for next round */}
|
||||
{!isWaitingForNextRound && (
|
||||
{!isWaitingForNextRound && !maintenanceMode && (
|
||||
<div className="flex justify-center">
|
||||
<Link
|
||||
href="/buy"
|
||||
|
||||
Reference in New Issue
Block a user