Skip to content

Commit 9fc584e

Browse files
committed
feat: improve error handling in contributor dashboard and enhance Go syntax highlighting
1 parent eeea09e commit 9fc584e

3 files changed

Lines changed: 89 additions & 60 deletions

File tree

dashboard/contributor.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ func (c *Contributor) renderOverview(ctx context.Context) (templ.Component, erro
118118
}
119119

120120
// Recent events
121-
recentEvents, _ := fetchEvents(ctx, c.r, event.ListOpts{Limit: 10})
121+
recentEvents, err := fetchEvents(ctx, c.r, event.ListOpts{Limit: 10})
122+
if err != nil {
123+
recentEvents = nil
124+
}
122125

123126
// Recent deliveries - we get them from the first endpoint or empty
124127
var recentDeliveries []*delivery.Delivery
@@ -197,7 +200,10 @@ func (c *Contributor) renderEndpoints(ctx context.Context, params contributor.Pa
197200

198201
func (c *Contributor) renderEndpointCreate(ctx context.Context, params contributor.Params) (templ.Component, error) {
199202
// Fetch event types for auto-suggestion dropdown.
200-
eventTypes, _ := fetchEventTypes(ctx, c.r, catalog.ListOpts{Limit: 200})
203+
eventTypes, err := fetchEventTypes(ctx, c.r, catalog.ListOpts{Limit: 200})
204+
if err != nil {
205+
eventTypes = nil
206+
}
201207

202208
// Handle form POST submission.
203209
if params.FormData["action"] == "create_endpoint" {
@@ -286,16 +292,16 @@ func (c *Contributor) renderEndpointDetail(ctx context.Context, params contribut
286292
if action := params.QueryParams["action"]; action != "" {
287293
switch action {
288294
case "enable":
289-
if err := c.r.Endpoints().SetEnabled(ctx, epID, true); err != nil {
290-
return nil, fmt.Errorf("dashboard: enable endpoint: %w", err)
295+
if setErr := c.r.Endpoints().SetEnabled(ctx, epID, true); setErr != nil {
296+
return nil, fmt.Errorf("dashboard: enable endpoint: %w", setErr)
291297
}
292298
case "disable":
293-
if err := c.r.Endpoints().SetEnabled(ctx, epID, false); err != nil {
294-
return nil, fmt.Errorf("dashboard: disable endpoint: %w", err)
299+
if setErr := c.r.Endpoints().SetEnabled(ctx, epID, false); setErr != nil {
300+
return nil, fmt.Errorf("dashboard: disable endpoint: %w", setErr)
295301
}
296302
case "rotate_secret":
297-
if _, err := c.r.Endpoints().RotateSecret(ctx, epID); err != nil {
298-
return nil, fmt.Errorf("dashboard: rotate secret: %w", err)
303+
if _, rotErr := c.r.Endpoints().RotateSecret(ctx, epID); rotErr != nil {
304+
return nil, fmt.Errorf("dashboard: rotate secret: %w", rotErr)
299305
}
300306
}
301307
}
@@ -305,7 +311,10 @@ func (c *Contributor) renderEndpointDetail(ctx context.Context, params contribut
305311
return nil, fmt.Errorf("dashboard: resolve endpoint: %w", err)
306312
}
307313

308-
deliveries, _ := fetchDeliveriesByEndpoint(ctx, c.r, epID, delivery.ListOpts{Limit: 20})
314+
deliveries, err := fetchDeliveriesByEndpoint(ctx, c.r, epID, delivery.ListOpts{Limit: 20})
315+
if err != nil {
316+
deliveries = nil
317+
}
309318

310319
return pages.EndpointDetailPage(pages.EndpointDetailData{
311320
Endpoint: ep,
@@ -417,7 +426,9 @@ func (c *Contributor) renderDLQ(ctx context.Context, params contributor.Params)
417426
if params.QueryParams["action"] == "replay_all" {
418427
now := time.Now()
419428
past := now.Add(-365 * 24 * time.Hour)
420-
_, _ = c.r.DLQ().ReplayBulk(ctx, past, now)
429+
if _, err := c.r.DLQ().ReplayBulk(ctx, past, now); err != nil {
430+
return nil, fmt.Errorf("dashboard: replay bulk: %w", err)
431+
}
421432
}
422433

423434
entries, err := fetchDLQEntries(ctx, c.r, dlq.ListOpts{Limit: 50})

dashboard/data.go

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package dashboard
22

33
import (
44
"context"
5-
"fmt"
6-
"time"
75

86
"github.com/xraph/relay"
97
"github.com/xraph/relay/catalog"
@@ -76,37 +74,3 @@ func fetchDeliveriesByEvent(ctx context.Context, r *relay.Relay, evtID id.ID) ([
7674
func fetchDLQEntries(ctx context.Context, r *relay.Relay, opts dlq.ListOpts) ([]*dlq.Entry, error) {
7775
return r.Store().ListDLQ(ctx, opts)
7876
}
79-
80-
// formatTimeAgo returns a human-readable relative time string.
81-
func formatTimeAgo(t time.Time) string {
82-
d := time.Since(t)
83-
if d < 0 {
84-
d = -d
85-
}
86-
87-
switch {
88-
case d < time.Minute:
89-
return "just now"
90-
case d < time.Hour:
91-
return fmt.Sprintf("%dm ago", int(d.Minutes()))
92-
case d < 24*time.Hour:
93-
return fmt.Sprintf("%dh ago", int(d.Hours()))
94-
case d < 30*24*time.Hour:
95-
return fmt.Sprintf("%dd ago", int(d.Hours()/24))
96-
case d < 365*24*time.Hour:
97-
return fmt.Sprintf("%dmo ago", int(d.Hours()/(24*30)))
98-
default:
99-
return fmt.Sprintf("%dy ago", int(d.Hours()/(24*365)))
100-
}
101-
}
102-
103-
// truncateString shortens s to max characters, appending "..." if truncated.
104-
func truncateString(s string, max int) string {
105-
if len(s) <= max {
106-
return s
107-
}
108-
if max <= 3 {
109-
return s[:max]
110-
}
111-
return s[:max-3] + "..."
112-
}

docs/src/components/landing/code-block.tsx

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,45 @@ function esc(s: string): string {
1313
// Pass 2: each token maps to an HTML span; unmatched text is plain (escaped).
1414
function highlightGo(code: string): string {
1515
const goKeywords = new Set([
16-
"package", "import", "func", "return", "if", "else", "for", "range",
17-
"var", "const", "type", "struct", "interface", "map", "chan", "go",
18-
"defer", "select", "case", "switch", "default", "break", "continue",
19-
"fallthrough", "nil", "true", "false", "err",
16+
"package",
17+
"import",
18+
"func",
19+
"return",
20+
"if",
21+
"else",
22+
"for",
23+
"range",
24+
"var",
25+
"const",
26+
"type",
27+
"struct",
28+
"interface",
29+
"map",
30+
"chan",
31+
"go",
32+
"defer",
33+
"select",
34+
"case",
35+
"switch",
36+
"default",
37+
"break",
38+
"continue",
39+
"fallthrough",
40+
"nil",
41+
"true",
42+
"false",
43+
"err",
2044
]);
2145
const goTypes = new Set([
22-
"string", "int", "int64", "float64", "bool", "error", "byte", "rune", "any",
46+
"string",
47+
"int",
48+
"int64",
49+
"float64",
50+
"bool",
51+
"error",
52+
"byte",
53+
"rune",
54+
"any",
2355
]);
2456

2557
// Groups: 1=comment, 2=string, 3=backtick-string, 4=word, 5=func-call (UpperWord before '(')
@@ -28,9 +60,8 @@ function highlightGo(code: string): string {
2860

2961
let out = "";
3062
let last = 0;
31-
let m: RegExpExecArray | null;
3263

33-
while ((m = tokenRe.exec(code)) !== null) {
64+
for (let m = tokenRe.exec(code); m !== null; m = tokenRe.exec(code)) {
3465
// Append any unmatched text before this token.
3566
if (m.index > last) {
3667
out += esc(code.slice(last, m.index));
@@ -55,7 +86,10 @@ function highlightGo(code: string): string {
5586
out += `<span class="text-purple-400 font-medium">${esc(word)}</span>`;
5687
} else if (goTypes.has(word)) {
5788
out += `<span class="text-cyan-400">${esc(word)}</span>`;
58-
} else if (/^[A-Z]/.test(word) && code.slice(last).trimStart().startsWith("(")) {
89+
} else if (
90+
/^[A-Z]/.test(word) &&
91+
code.slice(last).trimStart().startsWith("(")
92+
) {
5993
// Uppercase word followed by '(' — function/method call
6094
out += `<span class="text-blue-400">${esc(word)}</span>`;
6195
} else {
@@ -77,10 +111,31 @@ function highlightGo(code: string): string {
77111
// Tokenize-then-render TSX/JSX syntax highlighter.
78112
function highlightTSX(code: string): string {
79113
const tsxKeywords = new Set([
80-
"import", "export", "from", "const", "let", "var", "function", "return",
81-
"if", "else", "for", "while", "default", "new", "this", "class",
82-
"extends", "async", "await", "typeof", "instanceof", "null", "undefined",
83-
"true", "false",
114+
"import",
115+
"export",
116+
"from",
117+
"const",
118+
"let",
119+
"var",
120+
"function",
121+
"return",
122+
"if",
123+
"else",
124+
"for",
125+
"while",
126+
"default",
127+
"new",
128+
"this",
129+
"class",
130+
"extends",
131+
"async",
132+
"await",
133+
"typeof",
134+
"instanceof",
135+
"null",
136+
"undefined",
137+
"true",
138+
"false",
84139
]);
85140

86141
// Tokenize: groups in priority order.
@@ -91,10 +146,9 @@ function highlightTSX(code: string): string {
91146

92147
let out = "";
93148
let last = 0;
94-
let m: RegExpExecArray | null;
95149

96150
// Track whether we're inside a JSX tag (between < and >) for prop detection.
97-
while ((m = tokenRe.exec(code)) !== null) {
151+
for (let m = tokenRe.exec(code); m !== null; m = tokenRe.exec(code)) {
98152
if (m.index > last) {
99153
out += esc(code.slice(last, m.index));
100154
}

0 commit comments

Comments
 (0)