MapComplete/src/UI/BigComponents/Giggity.svelte

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

107 lines
2.8 KiB
Svelte
Raw Normal View History

2023-11-11 14:35:45 +01:00
<script lang="ts">
2023-11-23 15:47:16 +01:00
import { Store, UIEventSource } from "../../Logic/UIEventSource"
import type { SpecialVisualizationState } from "../SpecialVisualization"
import { Utils } from "../../Utils"
import Loading from "../../assets/svg/Loading.svelte"
2023-11-11 14:35:45 +01:00
2023-11-23 15:47:16 +01:00
export let tags: Store<Record<string, string>>
export let giggityUrl: string
export let state: SpecialVisualizationState
2023-11-11 14:35:45 +01:00
2023-11-23 15:47:16 +01:00
let name = $tags["name"]
let events: UIEventSource<
{
date: Date
start: string
duration: string
room: string
slug: string
url: string
title: string
track: string
type: string
language: string
abstract: string
description: string
persons: string
}[]
> = new UIEventSource(undefined)
2023-11-11 14:35:45 +01:00
async function loadXml() {
if (!name) {
2023-11-23 15:47:16 +01:00
console.log("Not fetching giggity events as name is", name, tags)
return
2023-11-11 14:35:45 +01:00
}
2023-11-23 15:47:16 +01:00
const xmlStr = await Utils.downloadAdvanced(giggityUrl)
console.log("Raw xml", xmlStr)
const parser = new DOMParser()
let doc = parser.parseFromString(xmlStr.content, "application/xml")
let days = Array.from(doc.documentElement.getElementsByTagName("day"))
let today = new Date().toISOString().split("T")[0]
const eventsToday = days.find((day) => day.getAttribute("date") === today)
console.log("Events today", eventsToday)
const childs = [
"date",
"start",
"duration",
"room",
"slug",
"url",
"title",
"track",
"type",
"language",
"abstract",
"description",
"persons",
]
2023-11-11 14:35:45 +01:00
const now = new Date().toISOString().split("T")[1].substring(0, 5)
2023-11-23 15:47:16 +01:00
let eventsList = []
2023-11-11 14:35:45 +01:00
for (const eventXml of Array.from(eventsToday.getElementsByTagName("event"))) {
2023-11-23 15:47:16 +01:00
const event: Record<string, string> = {}
2023-11-11 14:35:45 +01:00
for (const child of childs) {
2023-11-23 15:47:16 +01:00
const v = Array.from(eventXml.getElementsByTagName(child))
.map((xml) => xml.textContent)
.join("; ")
event[child] = v
2023-11-11 14:35:45 +01:00
}
2023-11-23 15:47:16 +01:00
if (!name.startsWith(event.room)) {
2023-11-11 14:35:45 +01:00
continue
}
2023-11-23 15:47:16 +01:00
if (now > event.start) {
2023-11-11 14:35:45 +01:00
continue
}
2023-11-23 15:47:16 +01:00
eventsList.push(event)
2023-11-11 14:35:45 +01:00
}
2023-11-23 15:47:16 +01:00
events.setData(eventsList)
2023-11-11 14:35:45 +01:00
}
2023-11-23 15:47:16 +01:00
loadXml()
2023-11-11 14:35:45 +01:00
</script>
{#if $events === undefined}
<Loading class="h-4">Loading giggity events from {giggityUrl}</Loading>
2023-11-23 15:47:16 +01:00
{:else if $events.length === 0}
2023-11-11 14:36:51 +01:00
<i>No upcoming events in this room</i>
2023-11-11 14:35:45 +01:00
{:else}
<div>
<h2>Upcoming events</h2>
{#each $events as event}
2023-11-23 15:47:16 +01:00
<div class="m-2 flex flex-col border border-dotted border-gray-200">
2023-11-11 14:35:45 +01:00
{#if event.url}
<h3><a href={event.url} target="_blank">{event.title}</a></h3>
2023-11-23 15:47:16 +01:00
{:else}
<h3>{event.title}</h3>
{/if}
2023-11-11 14:35:45 +01:00
<div><b>{event.start}</b></div>
<i>By {event.persons}</i>
<div>
{event.abstract}
</div>
{event.url}
</div>
{/each}
</div>
{/if}