feat: implement full flight history tracking and enhance trail rendering (#11)

* feat: implement full flight history tracking and enhance trail rendering

* feat: enhance flight tracking logic and improve path handling

* feat: implement airline logo caching and error handling in flight components

* feat: enhance flight tracking logic to improve waypoint handling and connection logic

* feat: refactor longitude handling and improve flight tracking logic

* feat: improve longitude handling and enhance airline logo failure tracking
This commit is contained in:
kew
2026-02-22 18:40:52 +05:30
committed by GitHub
parent a08f1c7250
commit 3a10da0486
14 changed files with 1123 additions and 76 deletions

View File

@ -32,12 +32,18 @@ import { formatCallsign } from "@/lib/flight-utils";
type TabId = "search" | "style" | "settings";
const TABS: { id: TabId; icon: typeof Search; label: string }[] = [
const MAIN_TABS: {
id: TabId;
icon: typeof Search;
label: string;
}[] = [
{ id: "search", icon: Search, label: "Search" },
{ id: "style", icon: MapIcon, label: "Map Style" },
{ id: "settings", icon: Settings, label: "Settings" },
];
const PANEL_TABS = MAIN_TABS;
type ControlPanelProps = {
activeCity: City;
onSelectCity: (city: City) => void;
@ -73,7 +79,7 @@ export function ControlPanel({
return (
<>
{TABS.map(({ id, icon: Icon, label }) => (
{MAIN_TABS.map(({ id, icon: Icon, label }) => (
<motion.button
key={id}
onClick={() => open(id)}
@ -218,7 +224,7 @@ function PanelDialog({
Controls
</p>
<nav className="flex flex-col gap-0.5">
{TABS.map(({ id, icon: Icon, label }) => {
{PANEL_TABS.map(({ id, icon: Icon, label }) => {
const active = id === activeTab;
return (
<button
@ -279,7 +285,7 @@ function PanelDialog({
id="panel-dialog-title"
className="text-[14px] font-semibold tracking-tight text-white/90"
>
{TABS.find((t) => t.id === activeTab)?.label}
{PANEL_TABS.find((t) => t.id === activeTab)?.label}
</h2>
</div>
{/* Desktop header */}
@ -288,7 +294,7 @@ function PanelDialog({
id="panel-dialog-title"
className="text-[15px] font-semibold tracking-tight text-white/90"
>
{TABS.find((t) => t.id === activeTab)?.label}
{PANEL_TABS.find((t) => t.id === activeTab)?.label}
</h2>
<motion.button
onClick={onClose}
@ -338,7 +344,7 @@ function PanelDialog({
{/* Mobile tab bar */}
<div className="flex sm:hidden items-center gap-1 border-t border-white/6 px-3 pt-2 pb-3">
<nav className="flex flex-1 gap-1">
{TABS.map(({ id, icon: Icon, label }) => {
{PANEL_TABS.map(({ id, icon: Icon, label }) => {
const active = id === activeTab;
return (
<button