Close tg12 outbound audit (#348-#366): operator UA, opt-ins, docs

- User-Agent is per-install handle only (no Shadowbroker product token)
- LiveUAMap: Windows UI consent when enabling Global Incidents; env override
- Meshtastic callsign upstream header off by default (opt-in true)
- Expanded docs/OUTBOUND_DATA.md and README link for CCTV, basemap, Broadcastify

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
BigBodyCobain
2026-06-03 15:01:32 -06:00
co-authored by Cursor
parent a3e5c98cd0
commit 363b5a49c8
19 changed files with 475 additions and 184 deletions
@@ -0,0 +1,61 @@
'use client';
import { useCallback, useEffect, useState } from 'react';
import { API_BASE } from '@/lib/api';
export type LiveUamapScraperStatus = {
platform_requires_opt_in: boolean;
ui_opted_in: boolean;
scraper_enabled: boolean;
env_override: 'on' | 'off' | null;
};
export function useLiveUamapScraperOptIn(enabled = true) {
const [status, setStatus] = useState<LiveUamapScraperStatus | null>(null);
const refreshStatus = useCallback(async () => {
try {
const res = await fetch(`${API_BASE}/api/liveuamap/scraper-status`);
if (!res.ok) return;
const body = (await res.json()) as LiveUamapScraperStatus;
setStatus(body);
} catch {
// Backend may still be starting.
}
}, []);
useEffect(() => {
if (!enabled) return;
void refreshStatus();
}, [enabled, refreshStatus]);
const needsConsentBeforeEnable = useCallback(
(layerId: string, turningOn: boolean) =>
layerId === 'global_incidents' &&
turningOn &&
Boolean(status?.platform_requires_opt_in) &&
!status?.ui_opted_in,
[status],
);
const confirmOptIn = useCallback(async () => {
const res = await fetch(`${API_BASE}/api/liveuamap/scraper-opt-in`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ opted_in: true }),
});
if (!res.ok) {
throw new Error(`LiveUAMap opt-in failed (${res.status})`);
}
const body = (await res.json()) as LiveUamapScraperStatus;
setStatus(body);
return body;
}, []);
return {
status,
refreshStatus,
needsConsentBeforeEnable,
confirmOptIn,
};
}