Add support for calendar events (NIP-52)

This commit is contained in:
Daniele Tonon
2024-02-29 00:41:09 +01:00
parent 6a3ccdbeec
commit 8a8663a36a
4 changed files with 86 additions and 10 deletions

View File

@@ -12,10 +12,51 @@ templ calendarEventTemplate(params CalendarPageParams) {
params.Event,
) {
<h1 class="text-2xl">
<span class="mr-2">{ params.CalendarEvent.Title }</span>
{ params.CalendarEvent.Title }
</h1>
<div class="mb-4"></div>
<!-- main content -->
<div class="flex flex-col sm:flex-row pb-6">
if params.StartAtDate == params.EndAtDate {
<div class="sm:w-[30%] sm:mr-4 mb-4 sm:mb-0">
<div class="font-semibold text-sm ml-2">Date</div>
<div class="p-2 bg-strongpink text-white rounded-md">
<div>{ params.StartAtDate }</div>
if params.StartAtTime != "" && params.EndAtTime != "" {
<div class="text-sm">From { params.StartAtTime } to { params.EndAtTime }</div>
}
</div>
</div>
} else {
<div class="sm:w-1/4 sm:mr-4">
<div class="font-semibold text-sm ml-2">Start date</div>
<div class="p-2 bg-accent text-white rounded-md">
<div>{ params.StartAtDate }</div>
<div class="text-sm">{ params.StartAtTime }</div>
</div>
</div>
<div class="sm:w-1/4 sm:mr-4">
<div class="font-semibold text-sm ml-2">End date</div>
<div class="p-2 bg-accent text-white rounded-md">
<div>{ params.EndAtDate }</div>
<div class="text-sm">{ params.EndAtTime }</div>
</div>
</div>
}
<div class="flex-1">
<div class="font-semibold text-sm ml-2">Location</div>
<div class="p-2 bg-neutral-200 dark:bg-neutral-800 rounded-md">
{ params.CalendarEvent.Locations[0] }
</div>
</div>
</div>
<div class="mb-4">
@templ.Raw(params.Content)
</div>
if params.CalendarEvent.Image != "" {
<img class="w-full" src={ params.CalendarEvent.Image } />
}
<div class="mb-4">
for _, v := range params.CalendarEvent.Hashtags {
<span class="mr-2 whitespace-nowrap rounded bg-neutral-200 px-2 dark:bg-neutral-700 dark:text-white">

View File

@@ -145,6 +145,7 @@ func grabData(ctx context.Context, code string, isProfileSitemap bool) (*Data, e
case 31922, 31923:
data.templateId = CalendarEvent
data.kind31922Or31923Metadata = &Kind31922Or31923Metadata{CalendarEvent: nip52.ParseCalendarEvent(*event)}
data.content = event.Content
default:
data.templateId = Other
}

View File

@@ -239,10 +239,12 @@ type CalendarPageParams struct {
BaseEventPageParams
OpenGraphParams
HeadParams
Details DetailsParams
Content template.HTML
Details DetailsParams
StartAtDate string
StartAtTime string
EndAtDate string
EndAtTime string
Content template.HTML
CalendarEvent Kind31922Or31923Metadata
Clients []ClientReference
}

View File

@@ -444,6 +444,33 @@ func renderEvent(w http.ResponseWriter, r *http.Request) {
if data.kind31922Or31923Metadata.Image != "" {
opengraph.Image = data.kind31922Or31923Metadata.Image
}
// Fallback for deprecated 'name' field
if data.kind31922Or31923Metadata.Title == "" {
for _, tag := range data.event.Tags {
if tag[0] == "name" {
data.kind31922Or31923Metadata.Title = tag[1]
break
}
}
}
var StartAtDate, StartAtTime string
StartAtDate = data.kind31922Or31923Metadata.Start.Format("02 January 2006")
if data.kind31922Or31923Metadata.Start.Hour() != 0 ||
data.kind31922Or31923Metadata.Start.Minute() != 0 ||
data.kind31922Or31923Metadata.Start.Second() != 0 {
StartAtTime = data.kind31922Or31923Metadata.Start.Format("15:04")
}
var EndAtDate, EndAtTime string
EndAtDate = data.kind31922Or31923Metadata.End.Format("02 January 2006")
if data.kind31922Or31923Metadata.End.Hour() != 0 ||
data.kind31922Or31923Metadata.End.Minute() != 0 ||
data.kind31922Or31923Metadata.End.Second() != 0 {
EndAtTime = data.kind31922Or31923Metadata.End.Format("15:04")
}
component = calendarEventTemplate(CalendarPageParams{
BaseEventPageParams: baseEventPageParams,
OpenGraphParams: opengraph,
@@ -453,9 +480,14 @@ func renderEvent(w http.ResponseWriter, r *http.Request) {
NeventNaked: data.neventNaked,
},
Details: detailsData,
Content: template.HTML(data.content),
Clients: generateClientList(data.event.Kind, data.naddr),
StartAtDate: StartAtDate,
StartAtTime: StartAtTime,
EndAtDate: EndAtDate,
EndAtTime: EndAtTime,
CalendarEvent: *data.kind31922Or31923Metadata,
Details: detailsData,
Content: template.HTML(data.content),
Clients: generateClientList(data.event.Kind, data.naddr),
})
case Other:
detailsData.HideDetails = false // always open this since we know nothing else about the event