diff --git a/components/bin/rsvp-form.js b/components/bin/rsvp-form.js index 81e1744f..1799d982 100644 --- a/components/bin/rsvp-form.js +++ b/components/bin/rsvp-form.js @@ -40,7 +40,6 @@ export default function RsvpForm() { @@ -49,7 +48,6 @@ export default function RsvpForm() { diff --git a/components/index/cards/apocalypse.js b/components/index/cards/apocalypse.js new file mode 100644 index 00000000..852df47c --- /dev/null +++ b/components/index/cards/apocalypse.js @@ -0,0 +1,103 @@ +import CardModel from './card-model' +import { Box, Flex, Grid, Image, Text } from 'theme-ui' +import Buttons from './button' + +/** @jsxImportSource theme-ui */ + +export default function Apocalypse() { + return ( + + + + Apocalypse + + + + Downtown Toronto +
+ May 17–19 +
+ + + Join Us + +
+
+ + + It's 2034, and zombies have taken over! But tech still operates. + What would you do? + + + Join 150 high schoolers for 44 hours at Apocalypse! Take yourself + out of the real world and build wacky projects to spark a new age of + humanity. + + +
+
+ ) +} diff --git a/components/index/cards/slack.js b/components/index/cards/slack.js index 3615bdf1..1fa6fa75 100644 --- a/components/index/cards/slack.js +++ b/components/index/cards/slack.js @@ -91,10 +91,10 @@ export default function Slack({ data, slackKey, events }) { variant="subtitle" sx={{ fontSize: [1, '16px', '24px'] }} > - Coding doesn’t have to be a solitary activity. At Hack Club, we - make things together and in our Slack, you’ll find awesome people to - hangout with too. Code together, find your programming community, or - just hang out. + Coding doesn’t have to be a solitary activity. At Hack Club, + we make remarkable things together, and in our Slack you’ll find + awesome people to hang out with too. Code together, find your programming + community, dream up something wild, or just #lounge. Occasionally we invite someone we really want to speak to (like Sal diff --git a/components/slack/projects.js b/components/slack/projects.js index fe91baa3..aafe4149 100644 --- a/components/slack/projects.js +++ b/components/slack/projects.js @@ -2,7 +2,7 @@ const projects = [ { title: 'Brainwave device for thought-based computer interaction.', description: - 'The team of teens behind BCI is building both the hardware and software for a brainwave reading device to interact with computers using thoughts', + 'The team of teens behind Monolith BCI is building both the hardware and software for a brainwave reading device to interact with computers using thoughts', img: 'bci', color: ['#ec3750', '#F58695'], itemId: 0 diff --git a/package.json b/package.json index 85c5e76c..fc90a3c1 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "format": "prettier --write ." }, "dependencies": { - "@apollo/client": "^3.9.9", + "@apollo/client": "^3.9.11", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@github/time-elements": "^4.0.0", @@ -37,6 +37,7 @@ "animated-value": "^0.2.4", "animejs": "^3.2.2", "axios": "^1.6.7", + "camelcase": "^8.0.0", "cookies-next": "^4.0.0", "country-list": "^2.3.0", "country-list-js": "^3.1.8", @@ -75,7 +76,7 @@ "react-tooltip": "^4.5.1", "react-tsparticles": "^2.12.2", "react-type-animation": "^3.2.0", - "react-use-websocket": "^4.7.0", + "react-use-websocket": "^4.8.1", "react-wrap-balancer": "^1.1.0", "recharts": "2.12.2", "remark": "^15.0.1", diff --git a/pages/api/bin/wokwi/new.js b/pages/api/bin/wokwi/new.js new file mode 100644 index 00000000..6fc38f34 --- /dev/null +++ b/pages/api/bin/wokwi/new.js @@ -0,0 +1,104 @@ +import AirtablePlus from "airtable-plus" + +const createProject = async (partsList=[]) => { + const airtable = new AirtablePlus({ + apiKey: process.env.AIRTABLE_API_KEY, + baseID: 'appKjALSnOoA0EmPk', + tableName: 'Supported Parts' + }) + + const parts = [ + { "type": "board-pi-pico-w", "id": "pico", "top": 0, "left": 0, "attrs": {} } + ] + + await Promise.all(partsList.map(async (part) => { + const airPart = await airtable.read({ + filterByFormula: `{Wokwi Name}= "${part}"`, + maxRecords: 1 + }) + return airPart[0].fields['Wokwi Name'].split(',').forEach((name, i) => { + parts.push({ + type: name, + id: name + '-' + i, + left: i * 100, // this is roughtly the width of most parts + }) + }) + })) + + const body = JSON.stringify({ + name: "The Bin!", + unlisted: false, + files: [{ + name: "help.md", + content: `# Welcome to The Bin! 🦝 + +Now that you've thrown some parts into The Bin, it's time to turn that trash into treasure! 🗑️➡️💎 + +Wire up your parts and write some code to make them work together. + +If you'd like a tutorial, check out some sample projects: +https://jams.hackclub.com/tags/the-bin + +You can get help by chatting with other high schoolers on the Hack Club Slack in the #electronics channel: +👉 https://hackclub.com/slack 👈 + +Once you're ready build your design IRL, click the "Share" button and submit your design: +https://hackclub.com/bin/submit + ` + }, + { + name: "sketch.ino", + content: `// Now turn this trash into treasure! +// Want some help? You can chat with us on the Hack Club Slack in the #electronics channel +void setup() { + // put your setup code here, to run once: + Serial1.begin(115200); + Serial1.println("Hello, Raspberry Pi Pico W!"); +} +void loop() { + // put your main code here, to run repeatedly: + delay(1); // this speeds up the simulation +}` + }, { + name: "diagram.json", + content: JSON.stringify({ + "version": 1, + "author": "The Bin - Hack Club", + "editor": "wokwi", + "parts": parts, + "connections": [["pico:GP0", "$serialMonitor:RX", "", []], ["pico:GP1", "$serialMonitor:TX", "", []]], "dependencies": {} + }, null, 2) + }], + }) + + const response = await fetch('https://wokwi.com/api/projects/save', { + method: 'POST', + cors: 'no-cors', + headers: { + 'Content-Type': 'application/json', + 'Referer': 'https://wokwi.com/projects/new/pi-pico-w', + 'User-Agent': 'Hack Club - contact max@hackclub.com for any complaints!' + }, + body + }).catch((e) => { + console.log(e) + }) + + const data = await response.json() + const { projectId } = data + + return `https://wokwi.com/projects/${projectId}` +} + +export default async function handler(req, res) { + if (req.method === 'POST') { + const { parts } = req.body + + const shareLink = await createProject(parts) + if (shareLink) { + res.status(200).json({ shareLink }) + } else { + res.status(500).json({ error: 'Failed to create project' }) + } + } +} \ No newline at end of file diff --git a/pages/api/bin/wokwi/parts.js b/pages/api/bin/wokwi/parts.js new file mode 100644 index 00000000..f01bdbd1 --- /dev/null +++ b/pages/api/bin/wokwi/parts.js @@ -0,0 +1,29 @@ +import AirtablePlus from "airtable-plus" +import camelcase from "camelcase" + +const camelizeObject = (obj) => { + Object.keys(obj).forEach(key => { + obj[camelcase(key)] = obj[key] + if (key !== camelcase(key)) { + delete obj[key] + } + }) + return obj +} + +const wokwiParts = async () => { + const airtable = new AirtablePlus({ + apiKey: process.env.AIRTABLE_API_KEY, + baseID: 'appKjALSnOoA0EmPk', + tableName: 'Supported Parts' + }) + + const records = await airtable.read() + const parts = records.map(record => camelizeObject(record.fields)) + return parts +} + +export default async function handler(req, res) { + const data = await wokwiParts() + res.status(200).json(data) +} \ No newline at end of file diff --git a/pages/bin.js b/pages/bin.js index a9a0ff9c..490c88e0 100644 --- a/pages/bin.js +++ b/pages/bin.js @@ -234,13 +234,15 @@ export default function Bin() { cursor={false} sequence={[ // Same substring at the start will only be typed out once, initially - 'an RC car', + 'a laser guided nerf gun', 1000, // wait 1s before replacing "Mice" with "Hamsters" 'a clap activated lamp', 1000, - 'a keyboard', + 'a temperature activated Febreze can', 1000, - 'an alarm clock', + 'a flame actuated speaker', + 1000, + 'a light dependant door', 1000 ]} repeat={Infinity} diff --git a/pages/fiscal-sponsorship/apply/index.js b/pages/fiscal-sponsorship/apply/index.js index b6023368..79b490c3 100644 --- a/pages/fiscal-sponsorship/apply/index.js +++ b/pages/fiscal-sponsorship/apply/index.js @@ -117,6 +117,33 @@ export default function Apply() { }) } > + + + Join our waitlist + + + HCB has been experiencing some exciting growth and subsequent + capacity constraints. We are prioritizing organizations ran by Hack + Clubbers, teens, FIRST teams, as well as groups with an annual + budget greater than $50k. Please expect to hear back by May 1st, + 2024. + + + We currently do not work with new organizations outside of STEM, + Education, and Climate. + + + Your organization diff --git a/pages/fiscal-sponsorship/apply/success.js b/pages/fiscal-sponsorship/apply/success.js index 1ce237f5..f895d626 100644 --- a/pages/fiscal-sponsorship/apply/success.js +++ b/pages/fiscal-sponsorship/apply/success.js @@ -51,8 +51,10 @@ export default function ApplicationSuccess() { - We’ll review your application and get back to you within two - business days. + We are prioritizing organizations ran by Hack Clubbers, teens, FIRST + teams, as well as groups with an annual budget greater than $50k. If + you fall outside of these categories, you will hear back from us by + May 1st, 2024. diff --git a/pages/fiscal-sponsorship/index.js b/pages/fiscal-sponsorship/index.js index d4dfa72a..7d6c9587 100644 --- a/pages/fiscal-sponsorship/index.js +++ b/pages/fiscal-sponsorship/index.js @@ -241,10 +241,11 @@ export default function Page() { sx={{ bg: 'blue', backgroundImage: theme => theme.util.gx('cyan', 'blue'), + fontSize: [16, 16, 32], lineHeight: 0.9 }} > - Apply now + Join the waitlist diff --git a/pages/index.js b/pages/index.js index 7ec0a14b..1b79d863 100644 --- a/pages/index.js +++ b/pages/index.js @@ -40,6 +40,7 @@ import Photo from '../components/photo' import Comma from '../components/comma' import Haxidraw from '../components/index/cards/haxidraw' import Onboard from '../components/index/cards/onboard' +import Apocalypse from '../components/index/cards/apocalypse' /** @jsxImportSource theme-ui */ @@ -203,10 +204,10 @@ function Page({ gradient="linear-gradient(rgba(0,0,0,0.4), rgba(0,0,0,0.45))" /> + diff --git a/pages/slack.js b/pages/slack.js index b5e7c3be..d571b0ab 100644 --- a/pages/slack.js +++ b/pages/slack.js @@ -141,7 +141,7 @@ const SlackPage = () => { person="JC" img="https://ca.slack-edge.com/T0266FRGM-U03MNFDRSGJ-e6fb939acfd8-512" age={17} - location="CT" + location="MA" /> +