├── .gitignore ├── README.md ├── components └── meta.js ├── package-lock.json ├── package.json ├── pages ├── _app.js ├── _document.js └── index.js ├── public └── favicon.ico ├── vercel.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | 21 | # debug 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # local env files 27 | .env.local 28 | .env.development.local 29 | .env.test.local 30 | .env.production.local 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🖌 collab-hub 2 | 3 | A platform for students at GEMS to collaborate on art virtually. They can share your artwork with the entire school as well as share remixes of works done by your peers at school. 4 | 5 | Built for Arts Week 2020 using Next.js and Geist UI. 6 | -------------------------------------------------------------------------------- /components/meta.js: -------------------------------------------------------------------------------- 1 | import Head from "next/head"; 2 | 3 | export default ({ 4 | name = "Arts Week 2020", 5 | title = "Collaboration Hub", 6 | description = `Pulled apart by COVID-19, let's come together to collaborate on art virtually. 7 | Here you can share your artwork with the entire school 8 | as well as share remixes of works done by your peers at school.`, 9 | image = "https://cloud-8r7qf7pou.vercel.app/collaboration_hub-2.png", 10 | url = "https://collab-hub.vercel.app", 11 | }) => ( 12 | 13 | {title} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | ); 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-next-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "@geist-ui/react": "^2.0.2", 12 | "@geist-ui/react-icons": "^1.0.0", 13 | "isomorphic-unfetch": "^3.0.0", 14 | "next": "9.5.3", 15 | "react": "16.13.1", 16 | "react-dom": "16.13.1", 17 | "react-masonry-component": "^6.2.1", 18 | "react-masonry-css": "^1.0.14" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import { GeistProvider, CssBaseline } from '@geist-ui/react' 2 | 3 | 4 | 5 | function MyApp({ Component, pageProps }) { 6 | return ( 7 | 8 | 9 | 10 | 11 | ) 12 | } 13 | export default MyApp 14 | -------------------------------------------------------------------------------- /pages/_document.js: -------------------------------------------------------------------------------- 1 | import Document, { Html, Head, Main, NextScript } from 'next/document' 2 | import { CssBaseline } from '@geist-ui/react' 3 | 4 | class MyDocument extends Document { 5 | static async getInitialProps(ctx) { 6 | const initialProps = await Document.getInitialProps(ctx) 7 | const styles = CssBaseline.flush() 8 | 9 | return { 10 | ...initialProps, 11 | styles: ( 12 | <> 13 | {initialProps.styles} 14 | {styles} 15 | 16 | ), 17 | } 18 | } 19 | 20 | render() { 21 | return ( 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | ) 30 | } 31 | } 32 | 33 | export default MyDocument 34 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import Head from "next/head"; 2 | import { 3 | Button, 4 | Page, 5 | Text, 6 | Card, 7 | Image, 8 | Note, 9 | Code, 10 | Tag, 11 | Link, 12 | file, 13 | Divider, 14 | Spacer, 15 | Modal, 16 | useModal, 17 | Tabs, 18 | Grid, 19 | } from "@geist-ui/react"; 20 | import * as Icon from "@geist-ui/react-icons"; 21 | import Masonry from "react-masonry-css"; 22 | 23 | import fetch from "isomorphic-unfetch"; 24 | import { orderBy } from "lodash"; 25 | import Meta from "../components/meta.js"; 26 | 27 | export default function Home(props) { 28 | const { visible, setVisible, bindings } = useModal(); 29 | return ( 30 | 31 | 32 | 33 | Arts Week Collaboration Hub 34 | 35 | 36 | 37 | 38 | setVisible(false)} 41 | style={{ 42 | display: "inline-block", 43 | padding: "0pt", 44 | marginBottom: "-16pt", 45 | }} 46 | > 47 | Close 48 | 49 |

57 | Be Creative. Together. 58 |

59 |

60 | Find collaborators. Finish projects. Or start your own… 61 |

62 |

63 | On COLLABORATION HUB, people don’t just post their own stuff -- we 64 | make things together. Whether you’re a beginner or an expert, 65 | whether you’re into writing, film, music, or any other kind of art, 66 | you’ll find this platform a welcoming and positive place to be your 67 | creative self. 68 |

69 |

How it works

70 |

71 | The COLLABORATION HUB is a new, interactive, sharing platform that 72 | allows students to be inspired by the work of others; REMIX and 73 | generate their own work; and share it on the HUB for others to be 74 | inspired further. 75 |

76 |

77 | This is an ARTS WEEK launch where everyone from artists, musicians, 78 | actors, singers, and dancers, to designers, editors, photographers, 79 | writers and coders can have a go. Just scroll through the samples in 80 | the gallery and remix it to make something (anything!) new from it. 81 |

82 |

TIMELINE:

83 |

84 | The ARTS WEEK challenge will end on Friday 25 September the best 85 | collaborative creations will be shared in an assembly showcase and 86 | social media. 87 |

88 |

89 | Make sure you check emails and Google Currents for updates and 90 | ideas. We'll be featuring awesome contributions and REMIXES as we 91 | receive them and post them on this site, so make sure to check back 92 | to see what’s new. 93 |

94 |

Happy COLLABORATING and REMIXING!

95 |

96 | What can you do? 97 |

98 |
    99 |
  1. 100 | Explore the gallery of work shared on the homepage (Everything) or 101 | under the different section tabs above (Visual Arts, Photography, 102 | Music, Drama, Writing, Dance). 103 |
  2. 104 |
  3. Choose something that inspires you and MAKE SOMETHING NEW!
  4. 105 |
  5. Click the REMIX button and submit your creation.
  6. 106 |
107 |

It's that easy!

108 |

See an image you like (painting, photograph)? You could…

109 |
    110 |
  • Write a song about it.
  • 111 |
  • Perform a dance inspired by it.
  • 112 |
  • Do a pencil sketch version of it.
  • 113 |
114 |

115 | See a performance video that interests you (drama, dance)? You 116 | could… 117 |

118 |
    119 |
  • Compose a soundtrack/sound effects track for it.
  • 120 |
  • Record a voice over for the actors.
  • 121 |
  • Design costumes for the performers.
  • 122 |
123 |

See some cryptic CODE sequence for a piece of music? You could…

124 |
    125 |
  • Code your own version/remix of it.
  • 126 |
  • Code an accompanying track to go with it.
  • 127 |
  • Perform a dance to the sound.
  • 128 |
  • Create a digital design for the background.
  • 129 |
130 |

Hear music you like?? You could…

131 |
    132 |
  • 133 | Act out a scene/monologue using it as your background music. 134 |
  • 135 |
  • Compose another instrument to go with it.
  • 136 |
  • Film and music video for it.
  • 137 |
  • Create a digital design for the background.
  • 138 |
139 |

140 | The options are endless...what can YOU do? 141 |

142 |
143 | setVisible(false)}> 144 | Close 145 | 146 |
147 | 148 | 149 | 150 | Welcome to the Collaboration Hub! 151 | 152 | 153 | Pulled apart by COVID-19, let's come together to collaborate on art 154 | virtually. Here you can share your artwork with the entire school as 155 | well as share remixes of works done by your peers at school. 156 | 157 | 162 | 163 | 164 | 165 | 168 | 169 | 180 | {props.posts.map((event) => ( 181 | 189 | {event.file[0].type.includes("image") && ( 190 | 191 | )} 192 | {event.file[0].type.includes("video") && ( 193 | 208 | )} 209 |

210 |

{event.title}

by{" "} 211 | {event.creator} 212 |
213 | {event.remixCreator != "" && ( 214 | <> 215 |
216 | 217 | remixed from {event.remixCreator}'s{" "} 218 | {event.remixPieceName} 219 | 220 | 221 | )} 222 |

223 | 226 | 227 | ↻ Remix me 228 | 229 | 230 |
231 | ))} 232 |
233 |
234 | 235 | 236 | All of the Visual Arts Posts 237 | 238 | 243 | 244 | 245 | 246 | 249 | 260 | {props.posts 261 | .filter((event) => event.type.includes("Visual Arts")) 262 | .map((event) => ( 263 | 271 | {event.file[0].type.includes("image") && ( 272 | 273 | )} 274 | {event.file[0].type.includes("video") && ( 275 | 290 | )} 291 |

292 |

{event.title}

by{" "} 293 | {event.creator} 294 |
295 | {event.remixCreator != "" && ( 296 | <> 297 |
298 | 299 | remixed from {event.remixCreator}'s{" "} 300 | {event.remixPieceName} 301 | 302 | 303 | )} 304 |

305 | 308 | 309 | ↻ Remix me 310 | 311 | 312 |
313 | ))} 314 |
315 |
316 | 317 | 318 | All of the Photography Posts 319 | 320 | 325 | 326 | 327 | 328 | 331 | 342 | {props.posts 343 | .filter((event) => event.type.includes("Photography")) 344 | .map((event) => ( 345 | 353 | {event.file[0].type.includes("image") && ( 354 | 355 | )} 356 | {event.file[0].type.includes("video") && ( 357 | 372 | )} 373 |

374 |

{event.title}

by{" "} 375 | {event.creator} 376 |
377 | {event.remixCreator != "" && ( 378 | <> 379 |
380 | 381 | remixed from {event.remixCreator}'s{" "} 382 | {event.remixPieceName} 383 | 384 | 385 | )} 386 |

387 | 390 | 391 | ↻ Remix me 392 | 393 | 394 |
395 | ))} 396 |
397 |
398 | 399 | 400 | All of the Musical Posts 401 | 402 | 407 | 408 | 409 | 410 | 413 | 424 | {props.posts 425 | .filter((event) => event.type.includes("Musical")) 426 | .map((event) => ( 427 | 435 | {event.file[0].type.includes("image") && ( 436 | 437 | )} 438 | {event.file[0].type.includes("video") && ( 439 | 454 | )} 455 |

456 |

{event.title}

by{" "} 457 | {event.creator} 458 |
459 | {event.remixCreator != "" && ( 460 | <> 461 |
462 | 463 | remixed from {event.remixCreator}'s{" "} 464 | {event.remixPieceName} 465 | 466 | 467 | )} 468 |

469 | 472 | 473 | ↻ Remix me 474 | 475 | 476 |
477 | ))} 478 |
479 |
480 | 481 | 482 | All of the Dramatic Posts 483 | 484 | 489 | 490 | 491 | 492 | 495 | 506 | {props.posts 507 | .filter((event) => event.type.includes("Dramatic")) 508 | .map((event) => ( 509 | 517 | {event.file[0].type.includes("image") && ( 518 | 519 | )} 520 | {event.file[0].type.includes("video") && ( 521 | 536 | )} 537 |

538 |

{event.title}

by{" "} 539 | {event.creator} 540 |
541 | {event.remixCreator != "" && ( 542 | <> 543 |
544 | 545 | remixed from {event.remixCreator}'s{" "} 546 | {event.remixPieceName} 547 | 548 | 549 | )} 550 |

551 | 554 | 555 | ↻ Remix me 556 | 557 | 558 |
559 | ))} 560 |
561 |
562 | 563 | 564 | All of the Creative Writing Posts 565 | 566 | 571 | 572 | 573 | 574 | 577 | 588 | {props.posts 589 | .filter((event) => event.type.includes("Creative Writing")) 590 | .map((event) => ( 591 | 599 | {event.file[0].type.includes("image") && ( 600 | 601 | )} 602 | {event.file[0].type.includes("video") && ( 603 | 618 | )} 619 |

620 |

{event.title}

by{" "} 621 | {event.creator} 622 |
623 | {event.remixCreator != "" && ( 624 | <> 625 |
626 | 627 | remixed from {event.remixCreator}'s{" "} 628 | {event.remixPieceName} 629 | 630 | 631 | )} 632 |

633 | 636 | 637 | ↻ Remix me 638 | 639 | 640 |
641 | ))} 642 |
643 |
644 | 645 | 646 | All of the Dancing Posts 647 | 648 | 653 | 654 | 655 | 656 | 659 | 670 | {props.posts 671 | .filter((event) => event.type.includes("Dance")) 672 | .map((event) => ( 673 | 681 | {event.file[0].type.includes("image") && ( 682 | 683 | )} 684 | {event.file[0].type.includes("video") && ( 685 | 700 | )} 701 |

702 |

{event.title}

by{" "} 703 | {event.creator} 704 |
705 | {event.remixCreator != "" && ( 706 | <> 707 |
708 | 709 | remixed from {event.remixCreator}'s{" "} 710 | {event.remixPieceName} 711 | 712 | 713 | )} 714 |

715 | 718 | 719 | ↻ Remix me 720 | 721 | 722 |
723 | ))} 724 |
725 |
726 |
727 | 728 | 729 | 730 | Built by Sam Poder,{" "} 731 | 732 | always open source 733 | 734 | . 735 | 736 | 737 | 782 | 787 |
788 | ); 789 | } 790 | 791 | export const getServerSideProps = async () => { 792 | const posts = await fetch( 793 | 'https://sampoder-api.herokuapp.com/v0.1/Arts%20Week%20Collab%20Hub/Posts?select={"filterByFormula":"{Verified?}=1"}' 794 | ) 795 | .then((r) => r.json()) 796 | .then((posts) => 797 | posts.map(({ id, fields }) => ({ 798 | id, 799 | title: fields["Name of Piece"], 800 | file: fields["Image"], 801 | creator: fields["Creator"], 802 | type: fields["Type"], 803 | remixCreator: fields["Creator (from Remix of:)"] 804 | ? fields["Creator (from Remix of:)"] 805 | : "", 806 | remixPieceName: fields["Name of Piece (from Remix of:)"] 807 | ? fields["Name of Piece (from Remix of:)"] 808 | : "", 809 | })) 810 | ) 811 | .then((posts) => orderBy(posts, "title")); 812 | console.log(posts); 813 | return { props: { posts } }; 814 | }; 815 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sampoder/collab-hub/2306383d47569c26318848b7e25926a0982f406a/public/favicon.ico -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "public": true, 3 | "github": { "silent": true }, 4 | "rewrites": [ 5 | { "source": "/new", "destination": "https://scrapbook.hackclub.com/sampoder/" } 6 | ] 7 | } 8 | --------------------------------------------------------------------------------