Files
ForumMobile/src/apps/Events/Events.js
matiasc18 0d5e68188d Set up bridge folder + changes to Events/Jobs
- Copied bridge folder from frm.so
- All handlers in handlers.js added from frm.so
- Modified Events and Jobs pages' default events/jobs to model data structure from SQL/server
- Set up getJobs(), checkForUpdates() on both Events/Jobs to fetch new items and update when needed
2026-03-15 16:00:37 -04:00

142 lines
4.1 KiB
JavaScript

import "../../components/LoadingCircle.js"
import "./EventCard.js"
import server from "../../_/code/bridge/serverFunctions.js"
import "../../components/SearchBar.js"
css(`
events- {
font-family: 'Arial';
}
events- h1 {
font-family: 'Bona';
}
events- p {
color: var(--accent);
}
events- p b {
color: var(--darkbrown);
}
`)
class Events extends Shadow {
events = [
{
id: 1,
network_id: 2,
creator_id: 1,
title: "Austin Chapter Lead",
description: "This is the descriptio lets try a longer one agaiin just to see what it would look like? mayeb even longer bc that was pretty short now that i see it. maybe 2 sentences if possible or more.",
location: "1234 location",
time_start: "2026-01-13 13:41:41.0722",
created: "2026-01-13 12:00:00.0000",
updated_at: "2026-01-13 13:41:41.0722"
}
]
constructor() {
super()
// this.events = global.currentNetwork.data.events;
}
render() {
VStack(() => {
h1("Events")
.color("var(--quillred)")
.textAlign("center")
.marginBottom(0.25, em)
h3(global.currentNetwork.name)
.color("var(--quillred)")
.textAlign("center")
.margin(0)
.fontFamily("Bona")
SearchBar()
if (this.events == "" || this.events == []) {
LoadingCircle()
} else if (this.events.length > 0) {
for (let i = 0; i < this.events.length; i++) {
EventCard(this.events[i])
.borderTop(i == 0 ? "1px solid var(--divider)" : "")
}
} else {
h2("No Events")
.color("var(--brown)")
.fontWeight("bold")
.marginTop(7.5, em)
.marginBottom(0.5, em)
.textAlign("center")
}
})
.boxSizing("border-box")
.paddingVertical(1, em)
.height(100, pct)
.width(100, pct)
}
async getEvents(networkId) {
const fetchedEvents = await server.getEvents(networkId)
if (this.checkForUpdates(this.events, fetchedEvents)) {
this.events = fetchedEvents
this.rerender()
}
}
connectedCallback() {
this.getEvents(global.currentNetwork.id)
}
checkForUpdates(currentEvents, fetchedEvents) {
if (currentEvents.length !== fetchedEvents.length) return true;
const currentMap = new Map(currentEvents.map(event => [event.id, event]));
for (const fetchedEvent of fetchedEvents) {
const currentEvent = currentMap.get(fetchedEvent.id);
// new event added
if (!currentEvent) return true;
// existing event changed
if (currentEvent.updated_at !== fetchedEvent.updated_at) {
return true;
}
}
return false;
}
convertDate(rawDate) {
const parsed = new Date(rawDate);
if (isNaN(parsed.getTime())) return rawDate;
const month = parsed.toLocaleString("en-US", { month: "long", timeZone: "UTC" });
const day = parsed.getUTCDate();
const year = parsed.getUTCFullYear();
const hours24 = parsed.getUTCHours();
const minutes = parsed.getUTCMinutes();
const hours12 = hours24 % 12 || 12;
const ampm = hours24 >= 12 ? "PM" : "AM";
const paddedMinutes = String(minutes).padStart(2, "0");
const ordinal = (n) => {
const mod100 = n % 100;
if (mod100 >= 11 && mod100 <= 13) return `${n}th`;
switch (n % 10) {
case 1: return `${n}st`;
case 2: return `${n}nd`;
case 3: return `${n}rd`;
default: return `${n}th`;
}
};
return `${month} ${ordinal(day)}, ${year} at ${hours12}:${paddedMinutes} ${ampm}`;
}
}
register(Events)