Add TFR warning banner for airspace restrictions

Fetches active Temporary Flight Restrictions from the FAA website,
filters by configured state (LOCATION_STATE env var), and displays
a red warning banner at the top of the dashboard when TFRs are present.
Data is cached for 30 minutes and degrades gracefully if the FAA is unreachable.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-16 18:43:34 -08:00
parent 88787b2eb1
commit 4974780d89
11 changed files with 336 additions and 3 deletions

View File

@@ -3,6 +3,7 @@ import {
ForecastResponse,
HistoricalResponse,
AssessmentResponse,
TFRResponse,
Thresholds,
APIError,
} from './types'
@@ -166,6 +167,13 @@ class APIClient {
}
}
/**
* Get active TFRs (Temporary Flight Restrictions) near the configured location
*/
async getTfrs(): Promise<TFRResponse> {
return this.request<TFRResponse>('/airspace/tfrs')
}
/**
* Assess current conditions with custom thresholds
*/
@@ -200,6 +208,8 @@ export const getForecast = (lat?: number, lon?: number) =>
export const getHistorical = (date: string, lat?: number, lon?: number) =>
apiClient.getHistorical(date, lat, lon)
export const getTfrs = () => apiClient.getTfrs()
export const assessWithThresholds = (
thresholds: Thresholds,
lat?: number,

View File

@@ -85,6 +85,24 @@ export interface AssessmentResponse {
thresholds_used: Thresholds
}
// TFR (Temporary Flight Restriction) types
export interface TFR {
date: string
notam_id: string
facility: string
state: string
type: string
description: string
detail_url: string
}
export interface TFRResponse {
tfrs: TFR[]
count: number
last_checked: string
}
// Error response type
export interface APIError {
error: string