-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQualityDrilldownExamples.tsx
More file actions
65 lines (61 loc) · 1.78 KB
/
QualityDrilldownExamples.tsx
File metadata and controls
65 lines (61 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import type { ResponseQualityDrilldownExamples as Drilldown } from "../../hooks/useAnalytics";
export type QualityDrilldownSignalId =
| "edit_ratio"
| "time_to_draft"
| "copy_per_save"
| "edited_save_rate";
export function formatDrilldownMetric(
signalId: QualityDrilldownSignalId,
metricValue: number,
): string {
switch (signalId) {
case "edit_ratio":
return `${(metricValue * 100).toFixed(1)}% edit ratio`;
case "time_to_draft":
return `${(metricValue / 1000).toFixed(1)}s to draft`;
case "copy_per_save":
return "Saved without copy";
case "edited_save_rate":
return `${(metricValue * 100).toFixed(1)}% edit ratio`;
default:
return String(metricValue);
}
}
export function QualityDrilldownExamples({
signalId,
drilldown,
}: {
signalId: QualityDrilldownSignalId;
drilldown: Drilldown | null;
}) {
if (!drilldown) {
return null;
}
const sourceItems = Array.isArray(drilldown[signalId])
? drilldown[signalId]
: [];
const items = sourceItems.slice(0, 3);
if (items.length === 0) {
return (
<div className="quality-drilldown-empty">
No matching draft examples captured yet for this period.
</div>
);
}
return (
<div className="quality-drilldown">
<div className="quality-drilldown-title">Draft examples to review</div>
<ul className="quality-drilldown-list">
{items.map((item) => (
<li key={`${signalId}-${item.draft_id}-${item.created_at}`}>
<div className="quality-drilldown-head">
<code>{item.draft_id}</code>
<span>{formatDrilldownMetric(signalId, item.metric_value)}</span>
</div>
{item.draft_excerpt && <p>{item.draft_excerpt}</p>}
</li>
))}
</ul>
</div>
);
}