Skip to content

Commit 29fa9bc

Browse files
committed
cleanup: dead component, misleading label, dead-email contact paths
Three small UX/legal fixes for the public-eyes polish pass. 1. Delete EmptyState component + tests ───────────────────────────────── ``frontend/src/components/EmptyState.jsx`` exported a generic empty-state primitive plus two pre-baked variants (DiscoveringState, NoCamerasState). Verified via grep across ``frontend/src/`` that none of the three is imported anywhere in the actual app — the dashboard's empty states are now handled by ``WelcomeHero`` and ``MemberWelcomeHero`` shipped in the first-touch UX work last week, and the install widget handles the ``DiscoveringState`` use case in-context. The file had a test file pinning its API. Tests-pinning- dead-code is the worst-of-both-worlds shape — maintenance cost for code nobody uses. Deleted both files; if anyone needs the primitive back they pull it from git history. 2. Drop ``"(legacy)"`` from the recording_toggled audit label ───────────────────────────────────────────────────────── ``frontend/src/components/OrgAuditLogPanel.jsx`` had "Recording toggled (legacy)" in the event-filter dropdown. The backend at ``app/api/cameras.py:150`` actively emits the event from the dashboard's manual record button (via POST /api/cameras/{id}/recording). The "legacy" suffix was wrong — the endpoint is a thin wrapper over ``continuous_24_7`` per its docstring, but it's a live admin action with audit value. Renamed to "Manual recording toggle" to match what it actually is. 3. Replace dead ``legal@sourcebox.dev`` with working channels ────────────────────────────────────────────────────── Same dead-email pattern as the security.txt + welcome-email fixes earlier this week — ``LegalPage.jsx`` had ``mailto:legal@sourcebox.dev`` in 4 contact paragraphs (Terms, GDPR rights, CCPA rights, Privacy contact). The address doesn't exist; ``sourceboxsentry.com`` isn't provisioned for incoming mail yet. A bounced DSAR is a real GDPR Article 12 violation once the first EU customer files one. Replaced with two working channels: - **In-app self-serve** for Article 17 + 20 + CCPA delete: Settings → Privacy & Data → Download my data (export) and Danger Zone → Reset Everything (erasure). Both shipped last week. - **GitHub Issues** for everything else, with explicit guidance not to paste PII in the public issue body and a note that we'll arrange a private follow-up. ``CONTACT_EMAIL`` constant replaced with ``CONTACT_GITHUB_ISSUES_URL``. Module-top comment documents the swap-back plan for when MX records land. Frontend: 55 passing (was 60; -5 from the deleted EmptyState suite). Build clean. Backend untouched.
1 parent 6c93153 commit 29fa9bc

4 files changed

Lines changed: 68 additions & 122 deletions

File tree

frontend/src/components/EmptyState.jsx

Lines changed: 0 additions & 35 deletions
This file was deleted.

frontend/src/components/OrgAuditLogPanel.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const EVENT_GROUPS = [
5151
label: "Camera + recording",
5252
events: [
5353
["camera_recording_policy_updated", "Recording policy updated"],
54-
["recording_toggled", "Recording toggled (legacy)"],
54+
["recording_toggled", "Manual recording toggle"],
5555
],
5656
},
5757
{

frontend/src/pages/LegalPage.jsx

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,22 @@
11
import { useParams, Link } from "react-router-dom"
22

33
const LAST_UPDATED = "April 24, 2026"
4-
const CONTACT_EMAIL = "legal@sourcebox.dev"
4+
5+
// Contact channel for Terms / Privacy / DSAR / CCPA questions.
6+
//
7+
// Until ``sourceboxsentry.com`` is provisioned for incoming mail
8+
// (no MX records yet), we route every contact path through the
9+
// public GitHub repo's issue tracker. The dashboard's in-app
10+
// Settings → Privacy & Data section already covers the two big
11+
// GDPR rights self-serve (Article 20 export + Article 17 delete),
12+
// so the issue tracker is only the path for "questions about
13+
// what data you hold beyond what the export already shows" —
14+
// which is uncommon enough that the public-issue concern is
15+
// acceptable as long as users know not to paste PII into the
16+
// issue body. When a real ``legal@`` mailbox lands, swap the
17+
// helpers below for ``mailto:`` links.
18+
const CONTACT_GITHUB_ISSUES_URL =
19+
"https://github.com/SourceBox-LLC/OpenSentry-Command/issues"
520

621
function TermsContent() {
722
return (
@@ -327,12 +342,18 @@ function TermsContent() {
327342

328343
<h2>18. Contact</h2>
329344
<p>
330-
For questions about these Terms, contact us at{" "}
331-
<a href={`mailto:${CONTACT_EMAIL}`}>{CONTACT_EMAIL}</a> or open an
332-
issue on our{" "}
333-
<a href="https://github.com/SourceBox-LLC/OpenSentry-Command/issues" target="_blank" rel="noopener noreferrer">
345+
For questions about these Terms, open an issue on our{" "}
346+
<a
347+
href={CONTACT_GITHUB_ISSUES_URL}
348+
target="_blank"
349+
rel="noopener noreferrer"
350+
>
334351
GitHub repository
335-
</a>.
352+
</a>. A dedicated <code>legal@</code> mailbox will land alongside
353+
our custom domain; until then GitHub Issues is the working
354+
channel. Please don't include personally identifying details in
355+
the public issue body — open the issue first and we'll arrange
356+
a private follow-up.
336357
</p>
337358
</>
338359
)
@@ -515,9 +536,23 @@ function PrivacyContent() {
515536
<li><strong>Withdraw consent:</strong> Stop using the Service at any time</li>
516537
</ul>
517538
<p>
518-
To exercise any of these rights, contact us at{" "}
519-
<a href={`mailto:${CONTACT_EMAIL}`}>{CONTACT_EMAIL}</a>.
520-
We will respond to requests within 30 days.
539+
Most of these rights are self-serve from the dashboard&rsquo;s{" "}
540+
<strong>Settings &rarr; Privacy &amp; Data</strong> section &mdash;
541+
the <strong>Download my data (ZIP)</strong> button covers Article
542+
20 portability with one click, and the{" "}
543+
<strong>Reset Everything</strong> action under Danger Zone
544+
covers Article 17 erasure (every node, camera, log, notification,
545+
and config row removed in a single transaction). For anything
546+
the in-app actions don&rsquo;t cover, open an issue on our{" "}
547+
<a
548+
href={CONTACT_GITHUB_ISSUES_URL}
549+
target="_blank"
550+
rel="noopener noreferrer"
551+
>
552+
GitHub repository
553+
</a>{" "}
554+
and we&rsquo;ll arrange a private follow-up. We respond within
555+
30 days.
521556
</p>
522557

523558
<h2>7. International Data Transfers</h2>
@@ -556,9 +591,17 @@ function PrivacyContent() {
556591
the California Consumer Privacy Act (CCPA), including the right to
557592
know what personal information we collect, the right to delete your
558593
information, and the right to opt out of the sale of your
559-
information. We do not sell personal information. To exercise your
560-
CCPA rights, contact us at{" "}
561-
<a href={`mailto:${CONTACT_EMAIL}`}>{CONTACT_EMAIL}</a>.
594+
information. We do not sell personal information. CCPA delete
595+
and access requests are self-serve from{" "}
596+
<strong>Settings &rarr; Privacy &amp; Data</strong> in the
597+
dashboard. For anything else, open an issue on our{" "}
598+
<a
599+
href={CONTACT_GITHUB_ISSUES_URL}
600+
target="_blank"
601+
rel="noopener noreferrer"
602+
>
603+
GitHub repository
604+
</a>.
562605
</p>
563606

564607
<h2>11. Changes to This Policy</h2>
@@ -572,13 +615,19 @@ function PrivacyContent() {
572615

573616
<h2>12. Contact</h2>
574617
<p>
575-
For privacy-related questions or to exercise your data rights,
576-
contact us at{" "}
577-
<a href={`mailto:${CONTACT_EMAIL}`}>{CONTACT_EMAIL}</a> or open an
578-
issue on our{" "}
579-
<a href="https://github.com/SourceBox-LLC/OpenSentry-Command/issues" target="_blank" rel="noopener noreferrer">
618+
For privacy-related questions, open an issue on our{" "}
619+
<a
620+
href={CONTACT_GITHUB_ISSUES_URL}
621+
target="_blank"
622+
rel="noopener noreferrer"
623+
>
580624
GitHub repository
581-
</a>.
625+
</a>. To exercise your data rights, use the in-app{" "}
626+
<strong>Settings &rarr; Privacy &amp; Data</strong> section &mdash;
627+
Download my data (Article 20) and the Danger Zone&rsquo;s
628+
Reset Everything (Article 17) are both self-serve. A
629+
dedicated <code>privacy@</code> mailbox will land alongside our
630+
custom domain.
582631
</p>
583632
</>
584633
)

frontend/tests/components/EmptyState.test.jsx

Lines changed: 0 additions & 68 deletions
This file was deleted.

0 commit comments

Comments
 (0)