render.gno

2.47 Kb ยท 82 lines
 1package eventreg
 2
 3import (
 4	"math"
 5	"std"
 6	"strings"
 7	"time"
 8
 9	"gno.land/p/demo/ufmt"
10	"gno.land/p/moul/md"
11	"gno.land/p/zenao/events"
12	zenaov1 "gno.land/p/zenao/zenao/v1"
13	"gno.land/r/demo/profile"
14)
15
16func Render(path string) string {
17	title := "Zenao Events"
18	listFn := listEvents
19	switch {
20	case strings.HasPrefix(path, "created/"):
21		title = "My Zenao Events"
22		listFn = func(from int64, to int64, limit uint32, offset uint32) []*zenaov1.EventInfo {
23			return listEventsByOrganizer(strings.TrimPrefix(path, "created/"), from, to, limit, offset)
24		}
25	case strings.HasPrefix(path, "tickets/"):
26		title = "My Zenao Tickets"
27		listFn = func(from int64, to int64, limit uint32, offset uint32) []*zenaov1.EventInfo {
28			return listEventsByParticipant(strings.TrimPrefix(path, "tickets/"), from, to, limit, offset)
29		}
30	}
31
32	buf := strings.Builder{}
33	buf.WriteString(md.H1(title))
34	buf.WriteString(md.HorizontalRule())
35	renderSection(&buf, listFn, "๐ŸŽ‰ Upcoming", time.Now().Unix()+1, math.MaxInt64, 10)
36	renderSection(&buf, listFn, "๐Ÿ‘ด Past", time.Now().Unix(), 0, 10)
37	return buf.String()
38}
39
40func renderSection(buf *strings.Builder, listFn func(int64, int64, uint32, uint32) []*zenaov1.EventInfo, title string, from int64, to int64, limit uint32) {
41	buf.WriteString(md.H2(title))
42	evts := listFn(from, to, limit, 0)
43	for _, evt := range evts {
44		buf.WriteString(md.HorizontalRule())
45		renderEvent(buf, evt)
46	}
47	if len(evts) == 0 {
48		buf.WriteString(md.HorizontalRule())
49		buf.WriteString(md.Paragraph("๐Ÿคท Nothing to show"))
50	}
51	buf.WriteString(md.HorizontalRule())
52}
53
54func renderEvent(buf *strings.Builder, evt *zenaov1.EventInfo) {
55	locStr, err := events.LocationString(evt.Location)
56	if err != nil {
57		locStr = "Error: " + err.Error()
58	}
59
60	var orgaRendered []string
61	for _, organizer := range evt.Organizers {
62		orga := profile.GetStringField(std.Address(organizer), "DisplayName", "")
63		if orga == "" {
64			orga = organizer
65		}
66		orgaRendered = append(orgaRendered, orga)
67	}
68
69	buf.WriteString(md.H3(evt.Title + " | ๐Ÿ“ " + locStr))
70	timeStr := ufmt.Sprintf("โฑ๏ธ %s to %s", time.Unix(evt.StartDate, 0).Format(time.DateTime), time.Unix(evt.EndDate, 0).Format(time.DateTime))
71	buf.WriteString(md.Paragraph(timeStr + " | " + md.Link("๐Ÿ”— Details", trimDomain(evt.PkgPath))))
72	buf.WriteString(md.Paragraph("Organized by: "))
73	buf.WriteString(md.BulletList(orgaRendered))
74}
75
76func trimDomain(pkgPath string) string {
77	slashIdx := strings.Index(pkgPath, "/")
78	if slashIdx == -1 {
79		return pkgPath
80	}
81	return pkgPath[slashIdx:]
82}