diff --git a/index.html b/index.html
index 15124a2..2ebcaa5 100644
--- a/index.html
+++ b/index.html
@@ -274,13 +274,13 @@
Recenter on Vehicle
-
+
-
diff --git a/js/auth.js b/js/auth.js
index 5cedaf8..bfa42ec 100644
--- a/js/auth.js
+++ b/js/auth.js
@@ -122,6 +122,12 @@
const stored = localStorage.getItem(STORAGE_KEY_REPORTS);
if (stored) {
communityReports = JSON.parse(stored);
+ // Automatically prune any unverified test marks or pins without photo proof
+ const beforeCount = communityReports.length;
+ communityReports = communityReports.filter(r => r && r.photoUrl && !r.id.startsWith('usr-pin-'));
+ if (communityReports.length !== beforeCount) {
+ localStorage.setItem(STORAGE_KEY_REPORTS, JSON.stringify(communityReports));
+ }
} else {
communityReports = [];
}
@@ -130,6 +136,29 @@
}
}
+ function clearUnverifiedReports() {
+ try {
+ communityReports = communityReports.filter(r => r && r.photoUrl && !r.id.startsWith('usr-pin-'));
+ localStorage.setItem(STORAGE_KEY_REPORTS, JSON.stringify(communityReports));
+ Object.keys(cameraMetadata).forEach(id => {
+ if (id.startsWith('usr-pin-') || !cameraMetadata[id].photoUrl) {
+ delete cameraMetadata[id];
+ }
+ });
+ localStorage.setItem(STORAGE_KEY_METADATA, JSON.stringify(cameraMetadata));
+ window.dispatchEvent(new CustomEvent('flock_reports_updated', { detail: communityReports }));
+ } catch (e) {
+ console.warn('Could not clear unverified reports', e);
+ }
+ }
+
+ function removeReport(reportId) {
+ communityReports = communityReports.filter(r => r.id !== reportId);
+ if (cameraMetadata[reportId]) delete cameraMetadata[reportId];
+ saveReports();
+ saveMetadata();
+ }
+
function saveReports() {
try {
localStorage.setItem(STORAGE_KEY_REPORTS, JSON.stringify(communityReports));
@@ -339,6 +368,8 @@
saveUser,
getReports,
addReport,
+ removeReport,
+ clearUnverifiedReports,
getCameraMeta,
confirmCamera,
addPhotoProof,
diff --git a/js/radar.js b/js/radar.js
index 9cf238f..ee49c50 100644
--- a/js/radar.js
+++ b/js/radar.js
@@ -286,24 +286,33 @@
});
}
- // --- LOAD CAMERA DATA (DEFAULTS + COMMUNITY + MUNICIPAL HUBS) ---
+ // --- LOAD CAMERA DATA (DEFAULTS + VERIFIED COMMUNITY + MUNICIPAL HUBS) ---
function loadAllCameraData() {
- allCameras = [...DEFAULT_CAMERAS];
+ // Purge any unverified test marks or pins without photo proof
+ if (window.FlockAuth && typeof window.FlockAuth.clearUnverifiedReports === 'function') {
+ window.FlockAuth.clearUnverifiedReports();
+ }
- // Load crowdsourced reports from auth store
+ // Filter out any unverified user pins
+ allCameras = [...DEFAULT_CAMERAS].filter(c => !c.id.startsWith('usr-pin-'));
+
+ // Load crowdsourced reports from auth store (ONLY if photo verified!)
if (window.FlockAuth) {
const reports = window.FlockAuth.getReports();
reports.forEach(r => {
+ // Strict verification rule: Sighting MUST have verified photo proof!
+ if (!r || !r.photoUrl || r.id.startsWith('usr-pin-')) return;
+
allCameras.push({
id: r.id,
- name: `Community Report: ${r.type}`,
+ name: `Verified Sighting: ${r.type || 'Solar Pole Mount'}`,
lat: r.lat,
lng: r.lng,
radius: 280,
- agency: 'Crowdsourced Report',
+ agency: 'Community Verified ALPR',
slug: '',
cameras: 1,
- captures30d: 'Active Surveillance Zone',
+ captures30d: 'Photo Verified Hardware',
isCommunity: true,
reportedBy: r.reportedBy,
notes: r.notes
@@ -629,61 +638,13 @@
}
}
- // --- 1-TAP DRIVER QUICK-LOG CAMERA ---
+ // --- 1-TAP DRIVER QUICK-LOG CAMERA (IMMEDIATELY OPENS CAMERA FOR PHOTO PROOF) ---
function quickLogFlockCameraAtCurrentLocation() {
- const lat = currentPosition.lat;
- const lng = currentPosition.lng;
- const timeStr = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
- const camId = 'usr-pin-' + Date.now();
-
- const newCam = {
- id: camId,
- name: `Driver Pinned Camera (${timeStr})`,
- lat: lat,
- lng: lng,
- radius: 280,
- agency: 'Driver Crowdsourced ALPR',
- slug: '',
- cameras: 1,
- captures30d: 'Verified Mobile Sighting',
- isCommunity: true,
- reportedBy: 'Active Driver',
- notes: 'Logged via 1-Tap Dashboard Button'
- };
-
- allCameras.unshift(newCam);
-
- // Save to persistence store
- if (window.FlockAuth) {
- const reports = window.FlockAuth.getReports();
- reports.unshift({
- id: camId,
- type: 'Fixed ALPR Camera',
- lat: lat,
- lng: lng,
- reportedBy: 'Active Driver',
- timestamp: new Date().toISOString(),
- notes: '1-Tap Mobile Driver Pin'
- });
- localStorage.setItem('flock_community_reports', JSON.stringify(reports));
+ photoUploadTarget = 'quicklog';
+ if (el.cameraPhotoFileInput) {
+ el.cameraPhotoFileInput.value = '';
+ el.cameraPhotoFileInput.click();
}
-
- // Immediately draw the new red perimeter circle
- renderCameraZones();
-
- // Positive audio feedback + voice announcement
- playLogConfirmationChirp();
- speakVoiceAlert("Camera logged at current location. Radar grid updated.");
-
- // Animate the button briefly
- if (el.btnQuickLogCam) {
- el.btnQuickLogCam.style.transform = 'scale(1.1)';
- setTimeout(() => {
- if (el.btnQuickLogCam) el.btnQuickLogCam.style.transform = '';
- }, 300);
- }
-
- showToast("📸 Camera logged at current location & synced to radar!");
}
// --- AUTO-CENTER / FOLLOW CAR HANDLER ---
@@ -1506,7 +1467,27 @@
showToast("📸 Processing & compressing photo proof...");
const compressedDataUrl = await window.FlockAuth.compressImage(file, 1000, 0.72);
- if (photoUploadTarget === 'detail' && activeModalCamera) {
+ if (photoUploadTarget === 'quicklog') {
+ const timeStr = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
+ const newRpt = window.FlockAuth.addReport({
+ lat: currentPosition.lat,
+ lng: currentPosition.lng,
+ type: 'Solar Pole Mount (Falcon)',
+ intersection: `Driver Sighting (${timeStr})`,
+ notes: 'Physical photo evidence captured by scout on pole',
+ photoUrl: compressedDataUrl
+ });
+
+ loadAllCameraData();
+ renderCameraZones();
+ updateProfileDisplay();
+ playLogConfirmationChirp();
+ speakVoiceAlert("Camera photo proof verified and logged to radar grid. +150 Scout Points!");
+ showToast("📸 Camera photo proof verified & logged! +150 Scout Points!");
+
+ const cam = allCameras.find(c => c.id === newRpt.id);
+ if (cam) openCameraDetailModal(cam);
+ } else if (photoUploadTarget === 'detail' && activeModalCamera) {
window.FlockAuth.addPhotoProof(activeModalCamera.id, compressedDataUrl, 'Physical pole photo uploaded by scout');
openCameraDetailModal(activeModalCamera);
renderCameraZones();