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}
render.gno
2.47 Kb ยท 82 lines