Skip to content

Commit 14fe23b

Browse files
committed
unresolve incidents
1 parent e058928 commit 14fe23b

3 files changed

Lines changed: 49 additions & 10 deletions

File tree

ui/components/App.tsx

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import _ from 'lodash';
77

88
export type IncidentRecord = IncidentData & {
99
resolved: boolean
10+
tallied: boolean
1011
}
1112

1213
type IncidentCounts = {
@@ -18,6 +19,7 @@ const INITIAL_INCIDENTS: IncidentRecord[] = [
1819
// sessionNum: 0,
1920
// sessionTime: 45.5016098234,
2021
// resolved: false,
22+
// tallied: false,
2123
// car: {
2224
// index: 0,
2325
// driverName: 'Brian Pratt2',
@@ -32,6 +34,7 @@ const INITIAL_INCIDENTS: IncidentRecord[] = [
3234
// sessionNum: 0,
3335
// sessionTime: 49.5016098234,
3436
// resolved: false,
37+
// tallied: false,
3538
// car: {
3639
// index: 0,
3740
// driverName: 'Brian Pratt2',
@@ -46,6 +49,7 @@ const INITIAL_INCIDENTS: IncidentRecord[] = [
4649
// sessionNum: 0,
4750
// sessionTime: 58.591304598,
4851
// resolved: false,
52+
// tallied: false,
4953
// car: {
5054
// index: 1,
5155
// driverName: 'Mike Racecar',
@@ -69,15 +73,15 @@ export function App() {
6973

7074
function listen() {
7175
sdk.receive('incident', (message: IncidentData) => {
72-
setIncidents(prev => [{ ...message, resolved: false }, ...prev]);
76+
setIncidents(prev => [{ ...message, resolved: false, tallied: false }, ...prev]);
7377
});
7478
}
7579

7680
function dismissIncident(index: number) {
77-
return () => {
81+
return (tallied: boolean = false) => {
7882
const incident = incidents[index];
7983
const newIncidents = _.clone(incidents);
80-
newIncidents[index] = {...incident, resolved: true };
84+
newIncidents[index] = {...incident, resolved: true, tallied };
8185

8286
setIncidents(newIncidents);
8387
}
@@ -92,7 +96,24 @@ export function App() {
9296
return {...prev, [carNumber]: prevValue + 1 }
9397
});
9498

95-
dismissIncident(index)();
99+
dismissIncident(index)(true);
100+
}
101+
}
102+
103+
function unresolveIncident(index: number) {
104+
return () => {
105+
const incident = incidents[index];
106+
const newIncidents = [...incidents]
107+
newIncidents[index] = {...incident, resolved: false, tallied: false };
108+
109+
setIncidents(newIncidents);
110+
111+
if (incident.tallied) {
112+
setDriverIncidentCounts(prev => {
113+
const prevValue = prev[incident.car.number] ?? 0
114+
return {...prev, [incident.car.number]: prevValue - 1 }
115+
});
116+
}
96117
}
97118
}
98119

@@ -108,7 +129,7 @@ export function App() {
108129
useEffect(listen, []);
109130

110131
const displayIncidents = selectedCar
111-
? incidents.filter(i => i.car.number == selectedCar)
132+
? incidents.filter(i => i.car.number == selectedCar && i.tallied == true)
112133
: incidents;
113134

114135
return <div className="app-main">
@@ -117,15 +138,16 @@ export function App() {
117138
<p>
118139
{
119140
selectedCar &&
120-
<span>{`Showing incidents for Car #${selectedCar} `}
141+
<span>{`Showing only counted incidents for Car #${selectedCar} `}
121142
<button onClick={() => setSelectedCar(undefined)}>Show All</button></span>
122143
}
123144
{ !selectedCar && 'Showing all incidents' }
124145
</p>
125146
{
126147
displayIncidents.map((incident, idx) => <Incident
127-
onDismiss={dismissIncident(idx)}
148+
onDismiss={() => dismissIncident(idx)(false)}
128149
onAcknowledge={countIncident(idx)}
150+
unresolve={unresolveIncident(idx)}
129151
key={keyFor(incident)}
130152
incident={incident} />
131153
)

ui/components/Incident.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ function formatPct(lapPct: number, decimals: number = 2) {
1515

1616
type IncidentHandler = () => void
1717

18-
export default function Incident(props: { incident: IncidentRecord, onAcknowledge: IncidentHandler, onDismiss: IncidentHandler }) {
18+
export default function Incident(props: {
19+
incident: IncidentRecord,
20+
onAcknowledge: IncidentHandler,
21+
onDismiss: IncidentHandler,
22+
unresolve: IncidentHandler
23+
}) {
1924
const car = props.incident.car;
2025

2126
let incidentTypeStr = "";
@@ -28,10 +33,16 @@ export default function Incident(props: { incident: IncidentRecord, onAcknowledg
2833
sdk.replay(props.incident)
2934
}
3035

31-
return <div className={`incident ${props.incident.resolved ? 'resolved' : '' }`}>
36+
const classNames = [
37+
'incident',
38+
props.incident.resolved && 'resolved',
39+
props.incident.tallied && 'tallied'
40+
].filter(n => n).join(' ')
41+
42+
return <div className={classNames}>
3243
<div className="incident-header">
3344
<div className="incident-deets">
34-
<h2>Car #{ car.number }{ incidentTypeStr }</h2>
45+
<h2>Car #{ car.number } { incidentTypeStr }</h2>
3546
<h4 className="incident-count">{ car.incidentCount }x</h4>
3647
<h5>Lap { car.currentLap } / { formatPct(car.currentLapPct) }</h5>
3748
</div>
@@ -40,6 +51,7 @@ export default function Incident(props: { incident: IncidentRecord, onAcknowledg
4051
<a title="Show Replay" onClick={ showReplay }>🎥</a>
4152
{ !props.incident.resolved && <a onClick={props.onAcknowledge} title="Tally Incident"></a> }
4253
{ !props.incident.resolved && <a onClick={props.onDismiss} title="Dismiss Incident">🙈</a> }
54+
{ props.incident.resolved && <a onClick={props.unresolve} title="Unresolve Incident">👀</a>}
4355
</div>
4456
</div>
4557

ui/styles/app.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ body {
2222

2323
.incident.resolved {
2424
opacity: 0.5;
25+
background-color: lightgray;
26+
}
27+
28+
.incident.resolved.tallied {
29+
background-color: lightcyan;
2530
}
2631

2732
.incident-header {

0 commit comments

Comments
 (0)