diff --git a/src/app/App.js b/src/app/App.js
index 527f427f..f5f06cb5 100644
--- a/src/app/App.js
+++ b/src/app/App.js
@@ -18,6 +18,8 @@ import {
Resources,
ResourcesFeatured,
Shirt22,
+ EventsAllDev,
+ EventsDev,
} from "./pages";
import "./styles/global.scss";
import "./styles/colors.scss";
@@ -128,6 +130,13 @@ function App() {
/> */}
} />
+
+
+
+ } />
+ } />
+
+
>
diff --git a/src/app/pages/Events/Events-dev.js b/src/app/pages/Events/Events-dev.js
new file mode 100644
index 00000000..8d9fce73
--- /dev/null
+++ b/src/app/pages/Events/Events-dev.js
@@ -0,0 +1,366 @@
+import { Helmet } from "react-helmet";
+import { Link } from "react-router-dom";
+
+import { Text } from "app/components";
+import { Section, Space, Icon, LoadingD, PageIcon } from "app/Symbols.js";
+
+import EventCard from "./components/EventCard/EventCard.js";
+
+import { useEvents } from "./useEvents.js";
+
+const EventsDev = () => {
+ const { events, loading } = useEvents();
+
+ if (loading) {
+ return (
+
+ Events - Design at UCI
+
+ );
+ }
+
+ return (
+ <>
+
+ Events - Design at UCI
+
+
+ {!events ? (
+ // Loading animation
+
+ ) : // Large next event card
+ !events.next ? (
+
+
+
+ Stay Tuned
+
+
+ There are currently no upcoming events.
+
+
+
+ Be sure to join us for
+ notifications.
+
+
+ ) : new Date(events.next.time) > new Date() ? (
+ <>
+
+
+
+
+ Upcoming Event
+
+
+
+ {formatRelativeDate(events.next.time)}
+
+
+ >
+ ) : (
+ <>
+
+
+
+
+ Live Now
+
+
+
+ >
+ )}
+
+
+ Past Events
+
+
+
+ {events?.past &&
+ events?.past
+ .slice(0, 12)
+ .map((event) => (
+
+ ))}
+
+
+
+
+
+
+
+ We host events with a wide range of topics about each
+ week during the academic quarter.
+
+
+ Including UX design concepts, graphic design techniques,
+ interactive advice from industry speakers, social
+ events, and more.
+
+
+ Have a suggestion of something you would like to see?
+
+ Submit your feedback to{" "}
+
+ hello@designatuci.com
+
+ .
+
+
+
+ >
+ );
+};
+
+function LargeEvent(props) {
+ return (
+
+
+ {props.event.title}
+
+
+
+
+
+
+ {formatDate(props.event.time)}
+
+
+
+
+
+
+ {props.event.type}
+
+
+
+
+ {props.event.place}
+
+
+
+ {props.event.links != null && (
+
+ )}
+
{props.event.desc}
+
+ );
+}
+
+export default EventsDev;
+
+function formatDate(date) {
+ let time = new Date(date);
+ let str = "";
+ str += mapDay(time.getDay()) + ", ";
+ str += mapMonth(time.getMonth()) + " ";
+ str += time.getDate() + " at ";
+ str += getHour(time.getHours()) + ":";
+ str += getMinutes(time.getMinutes()) + " ";
+ str += getPeriod(time.getHours());
+ str += " your time";
+ return str;
+}
+function formatRelativeDate(date) {
+ let now = new Date();
+ let time = new Date(date);
+ let diff = now - time;
+ if (diff < 0) {
+ diff = Math.abs(diff);
+ const days = Math.round(diff / (1000 * 60 * 60 * 24));
+ if (days === 0) {
+ const minutes = Math.round(diff / (1000 * 60));
+ if (minutes <= 60) {
+ return `in ${minutes} minutes`;
+ } else {
+ return `Today`;
+ }
+ } else if (days <= 1) {
+ return `In ${days} day`;
+ } else if (days <= 7) {
+ return `In ${days} days`;
+ } else {
+ let weeks = Math.round(days / 7);
+ if (weeks === 1) {
+ return `In ${weeks} week`;
+ } else {
+ return `In ${weeks} weeks`;
+ }
+ }
+ } else {
+ const days = Math.round(diff / (1000 * 60 * 60 * 24));
+ if (days === 0) {
+ const minutes = Math.round(diff / (1000 * 60));
+ if (minutes <= 100) {
+ return `Ended moments ago`;
+ } else {
+ const hours = Math.ceil(diff / (1000 * 60 * 60));
+ return `${hours} hours ago`;
+ }
+ } else if (days <= 1) {
+ return `${days} day ago`;
+ } else if (days < 7) {
+ return `${days} days ago`;
+ } else if (days < 30) {
+ let weeks = Math.round(days / 7);
+ if (weeks === 1) {
+ return `${weeks} week ago`;
+ } else {
+ return `${weeks} weeks ago`;
+ }
+ } else if (days < 120) {
+ let months = Math.round(days / 30);
+ if (months === 1) {
+ return `${months} month ago`;
+ } else {
+ return `${months} months ago`;
+ }
+ } else if (days < 365) {
+ return "Several months ago";
+ } else {
+ return "Over a year ago";
+ }
+ }
+}
+function getHour(h) {
+ if (h > 12) {
+ return h - 12;
+ } else {
+ return h;
+ }
+}
+function getMinutes(m) {
+ if (m < 10) {
+ return "0" + m;
+ } else {
+ return m;
+ }
+}
+function getPeriod(h) {
+ if (h >= 12) {
+ return "PM";
+ } else {
+ return "AM";
+ }
+}
+
+const days = [
+ "Sunday",
+ "Monday",
+ "Tuesday",
+ "Wednesday",
+ "Thursday",
+ "Friday",
+ "Saturday",
+];
+const months = [
+ "Jan",
+ "Feb",
+ "Mar",
+ "Apr",
+ "May",
+ "Jun",
+ "Jul",
+ "Aug",
+ "Sep",
+ "Oct",
+ "Nov",
+ "Dec",
+];
+
+const mapDay = (n) => days[n];
+const mapMonth = (n) => months[n];
diff --git a/src/app/pages/Events/Events.js b/src/app/pages/Events/Events.js
index 39b34568..a51478d9 100644
--- a/src/app/pages/Events/Events.js
+++ b/src/app/pages/Events/Events.js
@@ -1,40 +1,54 @@
+import { useState, useEffect } from "react";
import { Helmet } from "react-helmet";
import { Link } from "react-router-dom";
import { Text } from "app/components";
import { Section, Space, Icon, LoadingD, PageIcon } from "app/Symbols.js";
+import EVENT_DATA from "assets/data/events/all.json";
import EventCard from "./components/EventCard/EventCard.js";
-import { useEvents } from "./useEvents.js";
-
const Events = () => {
- const { events, loading } = useEvents();
-
- if (loading) {
- return (
-
- Events - Design at UCI
-
- );
- }
-
+ const [eventData, setEventData] = useState(null);
+ useEffect(() => {
+ let eventData = {
+ upcoming: [],
+ past: [],
+ next: null,
+ };
+ let now = new Date();
+ for (let event of EVENT_DATA) {
+ let time = new Date(
+ new Date(event.time).getTime() + event.duration * 60000,
+ );
+ if (now < time) {
+ eventData.next = event;
+ eventData.upcoming.unshift(event);
+ } else {
+ eventData.past.push(event);
+ }
+ }
+ eventData.upcoming.shift();
+ setEventData(eventData);
+ }, []);
return (
<>
- Events - Design at UCI
+ Events – Design at UCI
- {!events ? (
+ {eventData == null ? (
// Loading animation
) : // Large next event card
- !events.next ? (
+ eventData.next == null ? (
{
notifications.
- ) : new Date(events.next.time) > new Date() ? (
+ ) : new Date(eventData.next.time) > new Date() ? (
<>
@@ -62,9 +76,9 @@ const Events = () => {
- {formatRelativeDate(events.next.time)}
+ {formatRelativeDate(eventData.next.time)}
-
+
>
) : (
<>
@@ -75,10 +89,40 @@ const Events = () => {
Live Now
-
+
>
)}
+ {eventData != null && eventData.upcoming.length > 0 && (
+ <>
+
+
+ Next Upcoming Event
+ {eventData.upcoming.length > 1 ? "s" : ""}
+
+
+
+
+ {eventData.upcoming.map((event, i) => {
+ return (
+
+ );
+ })}
+
+
+ >
+ )}
{
className="splitEventCard maxWidth"
style={{ textAlign: "left" }}
>
- {events?.past &&
- events?.past
+ {eventData != null &&
+ eventData.past
.slice(0, 12)
.map((event) => (
{
+ const { events, loading } = useEvents();
+
+ if (loading) {
+ return (
+
+ Event Archive - Design at UCI
+
+ );
+ }
+
+ return (
+ <>
+
+ Event Archive - Design at UCI
+
+
+
+ {!events?.past ? (
+ // Loading animation
+
+ ) : (
+ // Large next event card
+
+ {events?.past.map((event) => (
+
+ ))}
+
+ )}
+
+ >
+ );
+};
+
+export default EventsAllDev;
diff --git a/src/app/pages/Events/EventsAll.js b/src/app/pages/Events/EventsAll.js
index e1e814e0..62e00cdc 100644
--- a/src/app/pages/Events/EventsAll.js
+++ b/src/app/pages/Events/EventsAll.js
@@ -2,31 +2,21 @@ import { Helmet } from "react-helmet";
import { Text } from "app/components";
import { Section, LoadingD } from "app/Symbols.js";
+import EVENT_DATA from "assets/data/events/all.json";
import { EventCard } from "./components";
-import { useEvents } from "./useEvents";
const EventsAll = () => {
- const { events, loading } = useEvents();
-
- if (loading) {
- return (
-
- Event Archive - Design at UCI
-
- );
- }
-
return (
<>
- Event Archive - Design at UCI
+ Event Archive – Design at UCI
- {!events?.past ? (
+ {EVENT_DATA == null ? (
// Loading animation
) : (
@@ -35,7 +25,7 @@ const EventsAll = () => {
className="splitEventCard maxWidth"
style={{ textAlign: "left" }}
>
- {events?.past.map((event) => (
+ {EVENT_DATA.map((event) => (