From 4c1c45468118011e92c75c7be0a7a086f2acdc5c Mon Sep 17 00:00:00 2001 From: Satyam-Rastogi Date: Mon, 18 May 2026 16:13:29 +0530 Subject: [PATCH] =?UTF-8?q?feat(hail-recon):=20enable=20live=20API=20?= =?UTF-8?q?=E2=80=94=20USE=5FMOCK=20off,=20KV=20dynamic=20import=20for=20g?= =?UTF-8?q?raceful=20degradation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/hail-status.js | 13 +++++++------ api/hail-webhook.js | 32 +++++++++++++++++++------------- src/hooks/useHailRecon.js | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/api/hail-status.js b/api/hail-status.js index 4688055..7ab5738 100644 --- a/api/hail-status.js +++ b/api/hail-status.js @@ -2,12 +2,13 @@ * Returns current storm status — polled by the frontend every 60 seconds. * Storm is considered "active" if an event was received within the last 24 hours. * + * Requires Vercel KV to be connected for auto-trigger to work. + * Without KV: always returns stormActive: false (manual Storm Mode still works). + * * Response: { stormActive: boolean, event: StormEvent | null, checkedAt: number } */ -import { kv } from '@vercel/kv'; - -const STORM_ACTIVE_WINDOW_MS = 24 * 60 * 60 * 1000; // 24 hours +const STORM_ACTIVE_WINDOW_MS = 24 * 60 * 60 * 1000; export default async function handler(req, res) { res.setHeader('Cache-Control', 'no-store'); @@ -17,6 +18,7 @@ export default async function handler(req, res) { } try { + const { kv } = await import('@vercel/kv'); const event = await kv.get('lastStormEvent'); const stormActive = !!event && @@ -28,9 +30,8 @@ export default async function handler(req, res) { event: stormActive ? event : null, checkedAt: Date.now(), }); - } catch (err) { - // KV not configured (local dev without env vars) — return inactive - console.warn('[hail-status] KV unavailable:', err.message); + } catch { + // KV not configured — storm auto-trigger unavailable, manual toggle still works return res.status(200).json({ stormActive: false, event: null, diff --git a/api/hail-webhook.js b/api/hail-webhook.js index c0182b2..c9875ee 100644 --- a/api/hail-webhook.js +++ b/api/hail-webhook.js @@ -4,10 +4,11 @@ * * Configure in Hail Recon dashboard: * Webhook URL: https://yourapp.vercel.app/api/hail-webhook?secret=YOUR_WEBHOOK_SECRET + * + * Requires Vercel KV to be connected for persistence. + * Without KV: logs the event but auto Storm Mode won't trigger on next poll. */ -import { kv } from '@vercel/kv'; - export default async function handler(req, res) { if (req.method !== 'POST') { return res.status(405).json({ error: 'Method not allowed' }); @@ -21,19 +22,24 @@ export default async function handler(req, res) { const payload = req.body || {}; const stormEvent = { - address: payload.address || payload.street || 'Unknown address', - city: payload.city || '', - state: payload.state || 'TX', - zip: payload.zip || '', - hailSize: payload.hailSize || payload.hail_size || payload.size || null, - stormDate: payload.stormDate || payload.storm_date || payload.date || new Date().toISOString(), - markerId: payload.markerId || payload.AddressMarker_id || null, - receivedAt: Date.now(), + address: payload.address || payload.street || 'Unknown address', + city: payload.city || '', + state: payload.state || 'TX', + zip: payload.zip || '', + hailSize: payload.hailSize || payload.hail_size || payload.size || null, + stormDate: payload.stormDate || payload.storm_date || payload.date || new Date().toISOString(), + markerId: payload.markerId || payload.AddressMarker_id || null, + receivedAt: Date.now(), }; - await kv.set('lastStormEvent', stormEvent); - - console.log('[hail-webhook] Storm event stored:', stormEvent); + try { + const { kv } = await import('@vercel/kv'); + await kv.set('lastStormEvent', stormEvent); + console.log('[hail-webhook] Storm event stored in KV:', stormEvent); + } catch { + // KV not configured — log only, auto Storm Mode won't trigger + console.log('[hail-webhook] KV unavailable. Event received but not persisted:', stormEvent); + } return res.status(200).json({ ok: true, received: stormEvent }); } diff --git a/src/hooks/useHailRecon.js b/src/hooks/useHailRecon.js index d5c6111..e92b8fe 100644 --- a/src/hooks/useHailRecon.js +++ b/src/hooks/useHailRecon.js @@ -12,7 +12,7 @@ import { useState, useEffect, useCallback } from 'react'; import { MOCK_HAIL_HISTORY } from '../data/mockStore'; -const USE_MOCK = true; +const USE_MOCK = false; // ── Helpers ──────────────────────────────────────────────────────────────────