stop
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@material-ui/core": "^3.5.1",
|
"@material-ui/core": "^3.5.1",
|
||||||
|
"clsx": "^1.0.4",
|
||||||
"date-fns": "^2.7.0",
|
"date-fns": "^2.7.0",
|
||||||
"react": "^16.6.3",
|
"react": "^16.6.3",
|
||||||
"react-dom": "^16.6.3",
|
"react-dom": "^16.6.3",
|
||||||
|
|||||||
19
src/App.js
19
src/App.js
@@ -1,14 +1,25 @@
|
|||||||
import React, { createContext } from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
import Header from "./Header.js";
|
import Header from "./Header.js";
|
||||||
import Table from "./Table";
|
import Table from "./Table";
|
||||||
import Map from "./Map";
|
import Map from "./Map";
|
||||||
|
|
||||||
const App = () => (
|
const App = () => {
|
||||||
|
let [now, setNow] = useState(new Date());
|
||||||
|
window.setTime = setNow;
|
||||||
|
useEffect(() => {
|
||||||
|
let interval = setInterval(() => {
|
||||||
|
setNow(new Date());
|
||||||
|
}, 10000);
|
||||||
|
return () => {
|
||||||
|
clearInterval(interval);
|
||||||
|
}
|
||||||
|
}, []);
|
||||||
|
return (
|
||||||
<>
|
<>
|
||||||
<Header />
|
<Header />
|
||||||
<Map />
|
<Map />
|
||||||
<Table />
|
<Table now={now} />
|
||||||
</>
|
</>
|
||||||
);
|
)};
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|||||||
92
src/Table.js
92
src/Table.js
@@ -1,7 +1,14 @@
|
|||||||
import React, { Fragment } from "react";
|
import React, {
|
||||||
|
Fragment,
|
||||||
|
useState,
|
||||||
|
useLayoutEffect,
|
||||||
|
useMemo,
|
||||||
|
useEffect
|
||||||
|
} from "react";
|
||||||
import styles from "./Table.module.css";
|
import styles from "./Table.module.css";
|
||||||
import { events } from "./Stroll.js";
|
import { events } from "./Stroll.js";
|
||||||
import { parse } from "date-fns";
|
import { parse } from "date-fns";
|
||||||
|
import clsx from "clsx";
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@@ -14,9 +21,6 @@ function getTime(date) {
|
|||||||
hour12: true
|
hour12: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function range(size, startAt = 0) {
|
|
||||||
return [...Array(size).keys()].map(i => i + startAt);
|
|
||||||
}
|
|
||||||
function ConvertEventObjToEvent({ time, title }) {
|
function ConvertEventObjToEvent({ time, title }) {
|
||||||
let timeArray = time.split("-");
|
let timeArray = time.split("-");
|
||||||
let start = parse(
|
let start = parse(
|
||||||
@@ -37,31 +41,77 @@ function ConvertEventObjToEvent({ time, title }) {
|
|||||||
endAsString: getTime(end)
|
endAsString: getTime(end)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export default function() {
|
function Event({ title, startAsString, endAsString}) {
|
||||||
const timeRange = range(5, 5).map(a => <div key={a}>{a}</div>);
|
const [showBackground, setShowBackground] = useState(true);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
setShowBackground(true);
|
||||||
|
}, 0);
|
||||||
|
}, [title, startAsString, endAsString]);
|
||||||
|
useEffect(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
setShowBackground(false);
|
||||||
|
}, 300);
|
||||||
|
}, [title, startAsString, endAsString]);
|
||||||
|
if (!title || !startAsString || !endAsString) {
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={clsx({
|
||||||
|
[styles.event]: true,
|
||||||
|
[styles.white]: !showBackground
|
||||||
|
})}
|
||||||
|
></div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
className={clsx({ [styles.event]: true, [styles.white]: !showBackground })}
|
||||||
|
>
|
||||||
|
{startAsString} - {endAsString}
|
||||||
|
{"\n"}
|
||||||
|
{title}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export default function({ now }) {
|
||||||
const titleRow = (
|
const titleRow = (
|
||||||
<>
|
<>
|
||||||
<div />
|
|
||||||
<div>Events</div>
|
<div>Events</div>
|
||||||
{timeRange}
|
<div>Current Events</div>
|
||||||
|
<div>Upcoming</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
const eventRows = Object.entries(events).map(([item, eventObjs], index) => {
|
let sortedEvents = useMemo(
|
||||||
let eventsMaps = eventObjs
|
() =>
|
||||||
.map(ConvertEventObjToEvent)
|
Object.entries(events).map(([item, eventObjs]) => {
|
||||||
.map(({ start, end, title, startAsString, endAsString }) => (
|
let sortedEventObjects = eventObjs
|
||||||
<div>
|
.map(ConvertEventObjToEvent)
|
||||||
{startAsString} - {endAsString}{"\n"}{title}
|
.sort((a, b) => a.start - b.start);
|
||||||
</div>
|
return { item, sortedEventObjects };
|
||||||
));
|
}),
|
||||||
while(eventsMaps.length < timeRange.length) {
|
[events]
|
||||||
eventsMaps = eventsMaps.concat([<div />])
|
);
|
||||||
}
|
const eventRows = sortedEvents.map(({ item, sortedEventObjects }) => {
|
||||||
|
let eventsMaps = sortedEventObjects.reduce(
|
||||||
|
(accum, current) => {
|
||||||
|
if (!accum.current && now >= current.start && now <= current.end) {
|
||||||
|
accum.current = current;
|
||||||
|
return accum;
|
||||||
|
}
|
||||||
|
if (!accum.upcoming && current.end > now) {
|
||||||
|
accum.upcoming = current;
|
||||||
|
}
|
||||||
|
return accum;
|
||||||
|
},
|
||||||
|
{ current: null, upcoming: null }
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Fragment key={item}>
|
<Fragment key={item}>
|
||||||
<div>#{index}</div>
|
|
||||||
<div>{item.replace(",", "\n").replace("\n ", "\n")}</div>
|
<div>{item.replace(",", "\n").replace("\n ", "\n")}</div>
|
||||||
{eventsMaps}
|
{<Event {...eventsMaps.current} />}
|
||||||
|
{<Event {...eventsMaps.upcoming} />}
|
||||||
</Fragment>
|
</Fragment>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -41,14 +41,21 @@
|
|||||||
} */
|
} */
|
||||||
.eventContainer {
|
.eventContainer {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
|
grid-template-columns: 1fr 1fr 1fr;
|
||||||
row-gap: .8rem;
|
row-gap: .8rem;
|
||||||
font-size: .8em;
|
font-size: .8em;
|
||||||
white-space: pre-wrap;
|
white-space: pre-wrap;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
height: 42vh;
|
height: 42vh;
|
||||||
padding-top: .5em;
|
padding: .5em .5em;
|
||||||
}
|
}
|
||||||
.eventContainer > * {
|
.eventContainer > * {
|
||||||
border-bottom: solid 1px #bdbdbd ;
|
border-bottom: solid 1px #bdbdbd ;
|
||||||
|
}
|
||||||
|
.event {
|
||||||
|
background-color: #339966;
|
||||||
|
}
|
||||||
|
.event.white {
|
||||||
|
transition: background ease-out 2s;
|
||||||
|
background-color: inherit;
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,17 @@ import {
|
|||||||
TableRow
|
TableRow
|
||||||
} from "@material-ui/core";
|
} from "@material-ui/core";
|
||||||
import { events } from "./Stroll.js";
|
import { events } from "./Stroll.js";
|
||||||
|
|
||||||
|
function Event({ start, end, title, startAsString, endAsString }) {
|
||||||
|
return (
|
||||||
|
<TableCell>
|
||||||
|
{startAsString} - {endAsString}
|
||||||
|
{"\n"}
|
||||||
|
{title}
|
||||||
|
</TableCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
@@ -41,38 +52,51 @@ function ConvertEventObjToEvent({ time, title }) {
|
|||||||
endAsString: getTime(end)
|
endAsString: getTime(end)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export default function() {
|
export default function({ now }) {
|
||||||
let rows = Object.entries(events).map(([item, eventObjs], index) => {
|
let rows = Object.entries(events).map(([item, eventObjs], index) => {
|
||||||
let cells = [
|
|
||||||
<Fragment>
|
|
||||||
<TableCell>{index + 1}</TableCell>
|
|
||||||
<TableCell>{item}</TableCell>
|
|
||||||
</Fragment>
|
|
||||||
];
|
|
||||||
let eventsMaps = eventObjs
|
let eventsMaps = eventObjs
|
||||||
.map(ConvertEventObjToEvent)
|
.map(ConvertEventObjToEvent)
|
||||||
.map(({ start, end, title, startAsString, endAsString }) => (
|
.sort((a, b) => a.start - b.start)
|
||||||
<TableCell>
|
.reduce(
|
||||||
{startAsString} - {endAsString} {title}
|
(accum, current) => {
|
||||||
</TableCell>
|
if (!accum.current && now >= current.start && now <= current.end) {
|
||||||
));
|
accum.current = current;
|
||||||
while(eventsMaps.length < 3) {
|
}
|
||||||
eventsMaps = eventsMaps.concat([<TableCell />])
|
if (!accum.upcoming && current.end > now) {
|
||||||
}
|
accum.upcoming = current;
|
||||||
return <TableRow>{cells.concat(eventsMaps)}</TableRow>;
|
}
|
||||||
|
return accum;
|
||||||
|
},
|
||||||
|
{ current: null, upcoming: null }
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
<TableRow>
|
||||||
|
<TableCell>{item}</TableCell>
|
||||||
|
{eventsMaps.current ? (
|
||||||
|
<Event {...eventsMaps.current} />
|
||||||
|
) : (
|
||||||
|
<TableCell></TableCell>
|
||||||
|
)}
|
||||||
|
{eventsMaps.upcoming ? (
|
||||||
|
<Event {...eventsMaps.upcoming} />
|
||||||
|
) : (
|
||||||
|
<TableCell></TableCell>
|
||||||
|
)}
|
||||||
|
</TableRow>
|
||||||
|
);
|
||||||
});
|
});
|
||||||
return (
|
return (
|
||||||
<Table>
|
<Grid item xs={12}>
|
||||||
<TableHead>
|
<Table padding="none">
|
||||||
<TableRow>
|
<TableHead>
|
||||||
<TableCell>#</TableCell>
|
<TableRow>
|
||||||
<TableCell>Place</TableCell>
|
<TableCell>Place</TableCell>
|
||||||
<TableCell>5:45-6:15</TableCell>
|
<TableCell>Current</TableCell>
|
||||||
<TableCell>7:10-8:10</TableCell>
|
<TableCell>Upcoming</TableCell>
|
||||||
<TableCell>8:35-9:45</TableCell>
|
</TableRow>
|
||||||
</TableRow>
|
</TableHead>
|
||||||
</TableHead>
|
<TableBody>{rows}</TableBody>
|
||||||
<TableBody>{rows}</TableBody>
|
</Table>
|
||||||
</Table>
|
</Grid>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2711,6 +2711,11 @@ clone-deep@^2.0.1:
|
|||||||
kind-of "^6.0.0"
|
kind-of "^6.0.0"
|
||||||
shallow-clone "^1.0.0"
|
shallow-clone "^1.0.0"
|
||||||
|
|
||||||
|
clsx@^1.0.4:
|
||||||
|
version "1.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.0.4.tgz#0c0171f6d5cb2fe83848463c15fcc26b4df8c2ec"
|
||||||
|
integrity sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==
|
||||||
|
|
||||||
co@^4.6.0:
|
co@^4.6.0:
|
||||||
version "4.6.0"
|
version "4.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
|
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
|
||||||
|
|||||||
Reference in New Issue
Block a user