|
1 | 1 | import Heading from './Heading';
|
2 | 2 | import Image from 'next/image';
|
3 | 3 | import { UnderlineTypes } from '../utils/underlineType';
|
4 |
| -import { HACKATHONS } from '../data/hackathons'; |
| 4 | +import React, { useState, useEffect } from 'react'; |
| 5 | +import { fetchContent } from '../api/apiRoot'; |
5 | 6 |
|
6 | 7 | const HACKATHON_TIMELINE_CONTAINER = 'flex justify-center bg-white';
|
7 | 8 | const HACKATHON_TIMELINE_CONTENT = 'max-w-[500px] w-[80vw] md:max-w-[1100px]';
|
8 | 9 | const HACKATHON_TIMELINE_HEADER = 'md:justify-start md:my-[60px] my-[30px] flex justify-center';
|
9 | 10 |
|
10 | 11 | const HACKATHON_EVENT_INFO = 'flex text-center text-xl font-bold mb-[70px] md:items-center flex-col items-center';
|
11 | 12 | const HACKATHON_TITLE_YEAR = 'text-5xl pb-[15px] italic md:text-4xl';
|
12 |
| -const HACKATHON_IMAGE = 'object-cover w-[80vw] md:rounded-xl md:w-[450px] md:h-[250px] md:shadow-[15px_15px_0px_0px_#00D3A9]'; |
| 13 | +const HACKATHON_IMAGE = |
| 14 | + 'object-cover w-[80vw] md:rounded-xl md:w-[450px] md:h-[250px] md:shadow-[15px_15px_0px_0px_#00D3A9]'; |
13 | 15 | const HACKATHON_TEXT = 'flex-col md:w-[400px] md:mx-[40px] leading-[1] text-[20px]';
|
14 |
| -const HACKATHON_TOPIC_TEXT = 'flex text-left my-[15px] text-[#FF4D6F] md:text-[#FF6B54] md:my-1 md:font-extrabold md:text-[25px]'; |
| 16 | +const HACKATHON_TOPIC_TEXT = |
| 17 | + 'flex text-left my-[15px] text-[#FF4D6F] md:text-[#FF6B54] md:my-1 md:font-extrabold md:text-[25px]'; |
15 | 18 |
|
16 | 19 | const HackathonSection = ({ hackathon, index }) => {
|
17 | 20 | let sectionInfoStyling = 'md:flex-row-reverse';
|
18 | 21 | let sectionTextStyling = 'md:text-right';
|
19 | 22 | let sectionTopicStyling = 'md:text-right md:justify-end';
|
20 | 23 |
|
21 |
| - if(index % 2 == 0) { |
| 24 | + if (index % 2 == 0) { |
22 | 25 | sectionInfoStyling = 'md:flex-row md:justify-start';
|
23 | 26 | sectionTextStyling = 'md:text-left';
|
24 | 27 | sectionTopicStyling = '';
|
25 |
| - } |
| 28 | + } |
| 29 | + |
| 30 | + const img = 'https:' + hackathon.image.fields.file.url; |
26 | 31 |
|
27 | 32 | return (
|
28 | 33 | <div className={`${HACKATHON_EVENT_INFO} ${sectionInfoStyling}`}>
|
29 | 34 | <div>
|
30 |
| - <h1 className={HACKATHON_TITLE_YEAR}> |
31 |
| - {hackathon.year} |
32 |
| - </h1> |
33 |
| - <Image className={HACKATHON_IMAGE} src={hackathon.img} alt={hackathon.title} /> |
| 35 | + <h1 className={HACKATHON_TITLE_YEAR}>{hackathon.year}</h1> |
| 36 | + <Image className={HACKATHON_IMAGE} src={img} alt={hackathon.title} width={450} height={250} /> |
34 | 37 | </div>
|
35 | 38 | <div className={`${HACKATHON_TEXT} ${sectionTextStyling}`}>
|
36 | 39 | <div className={`${HACKATHON_TOPIC_TEXT} ${sectionTopicStyling}`}>
|
37 |
| - <p className='md:hidden pr-[5px]'>Topics:</p> |
| 40 | + <p className="md:hidden pr-[5px]">Topics:</p> |
38 | 41 | <p>{hackathon.topic}</p>
|
39 | 42 | </div>
|
40 |
| - <p className='font-medium md:text-[#00D3A9]'>{hackathon.blurb}</p> |
| 43 | + <p className="font-medium md:text-[#00D3A9]">{hackathon.blurb}</p> |
41 | 44 | </div>
|
42 | 45 | </div>
|
43 | 46 | );
|
44 | 47 | };
|
45 | 48 |
|
46 | 49 | const HackathonTimeline = () => {
|
| 50 | + const [hackathons, setHackathons] = useState([]); |
| 51 | + |
| 52 | + useEffect(() => { |
| 53 | + fetchContent('hackathon').then((data) => { |
| 54 | + const sortedHackathons = [...data].sort((a, b) => { |
| 55 | + const yearA = parseInt(a.year); |
| 56 | + const yearB = parseInt(b.year); |
| 57 | + return yearB - yearA; |
| 58 | + }); |
| 59 | + setHackathons(sortedHackathons); |
| 60 | + }); |
| 61 | + }, []); |
| 62 | + |
47 | 63 | return (
|
48 | 64 | <div className={HACKATHON_TIMELINE_CONTAINER}>
|
49 | 65 | <div className={HACKATHON_TIMELINE_CONTENT}>
|
50 | 66 | <div className={HACKATHON_TIMELINE_HEADER}>
|
51 | 67 | <Heading underlineType={UnderlineTypes.GREEN_LONG_UNDERLINE}>Hack the Change</Heading>
|
52 | 68 | </div>
|
53 |
| - {HACKATHONS.map((hackathon, index) => ( |
54 |
| - <HackathonSection hackathon={hackathon} key={index} index={index}/> |
| 69 | + {hackathons.map((hackathon, index) => ( |
| 70 | + <HackathonSection hackathon={hackathon} key={index} index={index} /> |
55 | 71 | ))}
|
56 | 72 | </div>
|
57 | 73 | </div>
|
|
0 commit comments