Spaces:
Paused
Paused
sos panel
Browse files- web/src/components/SosPanel.jsx +15 -15
web/src/components/SosPanel.jsx
CHANGED
|
@@ -1,23 +1,23 @@
|
|
| 1 |
-
export default function SosPanel({ sos,
|
|
|
|
| 2 |
return (
|
| 3 |
<section className="panel">
|
| 4 |
-
<h2>SOS alerts {
|
| 5 |
-
{sos.length === 0 && <p className="muted
|
| 6 |
{sos.map((a) => (
|
| 7 |
-
<div key={a.id} className={`sos-item ${a.state}`}>
|
| 8 |
-
<div>
|
| 9 |
-
<
|
| 10 |
-
<span
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
</div>
|
| 16 |
<div className="row">
|
| 17 |
-
{a.state === 'open' && <button className="
|
| 18 |
-
{a.state !== 'resolved' && (
|
| 19 |
-
|
| 20 |
-
)}
|
| 21 |
</div>
|
| 22 |
</div>
|
| 23 |
))}
|
|
|
|
| 1 |
+
export default function SosPanel({ sos, onAck, onResolve, onSelect }) {
|
| 2 |
+
const open = sos.filter((a) => a.state !== 'resolved');
|
| 3 |
return (
|
| 4 |
<section className="panel">
|
| 5 |
+
<h2>SOS alerts ({open.length})</h2>
|
| 6 |
+
{sos.length === 0 && <p className="muted">No active alerts.</p>}
|
| 7 |
{sos.map((a) => (
|
| 8 |
+
<div key={a.id} className={`sos-item ${a.state === 'ack' ? 'ack' : ''}`}>
|
| 9 |
+
<div className="sos-top">
|
| 10 |
+
<span>🆘 {a.member_name}</span>
|
| 11 |
+
<span style={{ fontSize: 10, color: '#7d8b9c' }}>{new Date(a.created_at).toLocaleTimeString()}</span>
|
| 12 |
+
</div>
|
| 13 |
+
<div className="sos-meta">
|
| 14 |
+
{a.lat != null ? `${a.lat.toFixed(5)}, ${a.lng.toFixed(5)}` : 'no position'} ·{' '}
|
| 15 |
+
{a.state === 'ack' ? `ack by ${a.ack_by}` : 'unacknowledged'}
|
| 16 |
</div>
|
| 17 |
<div className="row">
|
| 18 |
+
{a.state === 'open' && <button className="btn-ack" onClick={() => onAck(a.id)}>Ack</button>}
|
| 19 |
+
{a.state !== 'resolved' && <button className="btn-mut" onClick={() => onResolve(a.id)}>Resolve</button>}
|
| 20 |
+
<button className="btn-mut" onClick={() => onSelect(a.member_id)}>Locate</button>
|
|
|
|
| 21 |
</div>
|
| 22 |
</div>
|
| 23 |
))}
|