Skip to content

Commit

Permalink
Merge pull request #98 from PyConColombia/issue-97
Browse files Browse the repository at this point in the history
#97 Crear listado de charlas con informacion
  • Loading branch information
arendondiosa committed May 12, 2024
2 parents a1ae590 + cceb373 commit 3c044ed
Show file tree
Hide file tree
Showing 16 changed files with 529 additions and 142 deletions.
25 changes: 3 additions & 22 deletions src/app/[lang]/components/NavbarCustom.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,28 +34,6 @@ const NavbarCustom = ({ lang }) => {
<Navbar.Toggle aria-controls="responsive-navbar-nav" />
<Navbar.Collapse id="responsive-navbar-nav">
<Nav className="me-auto">
{/* <Nav.Link as={Link} href={`/${lang}/resources`} className="nav-item">
{i18nDictionary?.navbar?.resources}
</Nav.Link>
<NavDropdown title={i18nDictionary?.navbar?.schedule} id="collapsible-nav-dropdown">
<NavDropdown.Item as={Link} href={`/${lang}/schedule`}>
{i18nDictionary?.navbar?.schedule}
</NavDropdown.Item>
<NavDropdown.Divider />
<NavDropdown.Item as={Link} href={`/${lang}/speakers`}>
{i18nDictionary?.navbar?.speakers}
</NavDropdown.Item>
<NavDropdown.Item as={Link} href={`/${lang}/keynotes`}>
{i18nDictionary?.navbar?.keynotes}
</NavDropdown.Item>
<NavDropdown.Divider />
<NavDropdown.Item as={Link} href={`/${lang}/talks`}>
{i18nDictionary?.navbar?.talks}
</NavDropdown.Item>
</NavDropdown>
<Nav.Link as={Link} href={`/${lang}/team`} className="nav-item">
{i18nDictionary?.navbar?.team}
</Nav.Link> */}
<Nav.Link as={Link} href={`/${lang}`} className="nav-item">
{i18nDictionary?.navbar?.home}
</Nav.Link>
Expand All @@ -71,6 +49,9 @@ const NavbarCustom = ({ lang }) => {
<NavDropdown.Item as={Link} href={`/${lang}/speakers`}>
{i18nDictionary?.navbar?.speakers}
</NavDropdown.Item>
<NavDropdown.Item as={Link} href={`/${lang}/talks`}>
{i18nDictionary?.navbar?.talks}
</NavDropdown.Item>
</NavDropdown>
<Nav.Link as={Link} href={`/${lang}/sponsors`} className="nav-item">
{i18nDictionary?.navbar?.sponsors}
Expand Down
9 changes: 8 additions & 1 deletion src/app/[lang]/speakers/components/Card.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import Image from 'next/image';

import talks from '@/data/talks.json';

const Card = ({ speakerData, reverse, index, lang }) => {
const colorBorderSpeaker = ['border-pink', 'border-yellow', 'border-purple', 'border-blue'];
const talksSpeaker = talks.filter((talk) => talk.speakers.includes(speakerData.id));

return (
<Row className="keynote-card justify-content-center">
Expand All @@ -32,7 +35,11 @@ const Card = ({ speakerData, reverse, index, lang }) => {
</span>
)}
</div>
<p>{speakerData.talk.title[lang]}</p>
{talksSpeaker.map((talk) => (
<Link key={talk.id} href={`/${lang}/talks/${talk.id}`}>
{talk.title[lang]}
</Link>
))}
</div>
</Col>
</Row>
Expand Down
82 changes: 82 additions & 0 deletions src/app/[lang]/talks/[uniquepage]/Talk.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import React from 'react';
import PropTypes from 'prop-types';
import Image from 'next/image';
import Link from 'next/link';
import Container from 'react-bootstrap/Container';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';

import speakerList from '@/data/speakers.json';

const Talk = ({ talk, lang }) => {
const colorBorderSpeaker = ['border-pink', 'border-yellow', 'border-purple', 'border-blue'];
// const colorBorderTextSpeaker = [
// 'text-border-pink',
// 'text-border-yellow',
// 'text-border-purple',
// 'text-border-blue'
// ];
const randomColor = (Math.random() * colorBorderSpeaker.length) | 0;

return (
<section id="keynote">
<div className="keynote-bg talk-content">
<Container>
<Row className="justify-content-center">
<Col xs={12}>
<div className="title-container">
<h1>{talk.submission}</h1>
<h2 className="title">
<span className="bold">{talk.title[lang]}</span>
</h2>
</div>
</Col>
<Col xs={12}>
{talk.tags.map((tag) => (
<Link key={tag} href={`/${lang}/talks/tags/${tag}`}>
<span className={`badge default ${tag}`}>{tag}</span>
</Link>
))}
</Col>
</Row>
<Row>
<Col xs={12}>
<div className="content content-left">
<h3>Authors</h3>
{talk.speakers.map((speaker) => {
const speakerData = speakerList.find((s) => s.id === speaker);

return (
<Link key={speaker} href={`/${lang}/${speakerData.type}s/${speakerData.id}`}>
<Image
className={`img-keynote ${colorBorderSpeaker[randomColor]}`}
src={`/images/${speakerData.type}/${speakerData.photo}`}
alt="Speaker Image"
width={300}
height={300}
/>
</Link>
);
})}
</div>
</Col>
<Col xs={12}>
<div className="content content-left">
<h3>Description</h3>
<p>{talk.description[lang]}</p>
</div>
</Col>
</Row>
</Container>
</div>
</section>
);
};

Talk.propTypes = {
speaker: PropTypes.object,
talks: PropTypes.array,
lang: PropTypes.string
};

export default Talk;
34 changes: 3 additions & 31 deletions src/app/[lang]/talks/[uniquepage]/page.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import propTypes from 'prop-types';
import talksList from '@/data/talks.json';
import { notFound } from 'next/navigation';

import Talk from './Talk';

export async function generateStaticParams() {
return talksList.map((p) => ({
uniquepage: p.id.toString()
Expand All @@ -16,37 +18,7 @@ const UniquePage = ({ params: { uniquepage, lang } }) => {
notFound();
}

return (
<>
{talk.title ? <h1>{talk.title[lang]}</h1> : null}

<iframe
src="https://www.youtube.com/embed/3YxneS1eyfM"
frameBorder="0"
allowFullScreen=""
className="video"></iframe>
<hr />

{talk.speakers.map((speaker) => (
<p key={speaker}>{speaker}</p>
))}
<h2>Authors</h2>
<ul>
{talk.tags.map((tag) => (
<li key={tag}>{tag}</li>
))}
</ul>

{talk.description ? <p>{talk.description[lang]}</p> : null}

{talk.summary ? (
<>
<h2>Summary</h2>
<p>{talk.summary[lang]}</p>
</>
) : null}
</>
);
return <Talk talk={talk} lang={lang} />;
};

UniquePage.propTypes = {
Expand Down
76 changes: 76 additions & 0 deletions src/app/[lang]/talks/components/Card.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import React from 'react';
import Link from 'next/link';
import propTypes from 'prop-types';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import Image from 'next/image';

import speakerList from '@/data/speakers.json';

const Card = ({ talkData, index, lang, langMapping }) => {
const colorBorderSpeaker = ['border-pink', 'border-yellow', 'border-purple', 'border-blue'];

const getSpeakerData = (id) => {
return speakerList.find((speaker) => speaker.id === id);
};

return (
<Row className="keynote-card talk-card justify-content-center">
<Col xs={12}>
<Link href={`/${lang}/talks/${talkData.id}`}>
<h3>
{talkData.title[lang]} ({langMapping && langMapping[talkData?.spoken_language]})
</h3>
</Link>
</Col>
<Col xs={12}>
{talkData.tags.map((tag) => (
<Link key={tag} href={`/${lang}/talks/tags/${tag}`}>
<span className={`badge default ${tag}`}>{tag}</span>
</Link>
))}
</Col>
<Col xs={12}>
{talkData.speakers.map((speaker) => {
const speakerData = getSpeakerData(speaker);

return (
<Link
key={`${talkData.id}-${speaker.id}`}
href={`/${lang}/${speakerData.type}s/${speakerData.id}`}>
<Image
className={`img-keynote img-speaker-talk ${colorBorderSpeaker[(index + 1) % colorBorderSpeaker.length]}`}
src={`/images/${speakerData.type}/${speakerData.photo}`}
alt="Speaker Image"
width={300}
height={300}
/>
</Link>
);
})}
</Col>
</Row>
);
};

Card.propTypes = {
talkData: propTypes.shape({
id: propTypes.number,
first_name: propTypes.string,
last_name: propTypes.string,
biography: propTypes.shape({}),
photo: propTypes.string,
type: propTypes.string,
country_origin: propTypes.string,
facebook: propTypes.string,
twitter: propTypes.string,
linkedin: propTypes.string,
github: propTypes.string,
website: propTypes.string
}),
reverse: propTypes.bool,
index: propTypes.number,
lang: propTypes.string
};

export default Card;
76 changes: 76 additions & 0 deletions src/app/[lang]/talks/components/Talks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
'use client';

import React, { useState, useEffect } from 'react';
import propTypes from 'prop-types';
import Container from 'react-bootstrap/Container';
import Form from 'react-bootstrap/Form';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';

import Card from '@/app/[lang]/talks/components/Card';
import Title from '@/app/[lang]/talks/components/Title';

import { useI18n } from '@/contexts/I18nContext';

const Talks = ({ lang, talksList, defaultTag, allTags }) => {
const i18nDictionary = useI18n();
const [tagFilter, setTagFilter] = useState(defaultTag || 'all');
const [talks, setTalks] = useState(talksList);

useEffect(() => {
if (tagFilter === 'all') {
setTalks(talksList);
} else {
setTalks(talksList.filter((talk) => talk.tags.includes(tagFilter)));
}
}, [tagFilter, talksList]);

return (
<section id="keynotes">
<div className="keynotes-bg">
<Title content={i18nDictionary?.sections?.talks} />
<Container>
<Row className="justify-content-center">
<Col xs={12} md={4}>
<Form.Group controlId="formBasicSelect">
<Form.Label>Filter</Form.Label>
<Form.Control
as="select"
value={tagFilter}
onChange={(e) => {
setTagFilter(e.target.value);
}}>
<option value="all">All</option>
{allTags &&
allTags.map((tag) => (
<option key={tag} value={tag}>
{tag}
</option>
))}
</Form.Control>
</Form.Group>
</Col>
</Row>
<Row className="justify-content-center">
{talks.map((talk, index) => (
<Col xs={12} md={6} key={talk.id}>
<Card
talkData={talk}
index={index}
lang={lang}
langMapping={i18nDictionary?.languages}
/>
</Col>
))}
</Row>
</Container>
</div>
</section>
);
};

Talks.propTypes = {
lang: propTypes.string
};

export default Talks;
31 changes: 31 additions & 0 deletions src/app/[lang]/talks/components/Title.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import React from 'react';
import propTypes from 'prop-types';
import Container from 'react-bootstrap/Container';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';

const Title = ({ content }) => {
return (
<div className="welcome">
<div className="welcome-bg">
<Container>
<Row className="justify-content-center">
<Col xs={10} md={6}>
<div className="title-container">
<h2 className="title">
<span className="bold">{content?.title}</span>
</h2>
</div>
</Col>
</Row>
</Container>
</div>
</div>
);
};

Title.propTypes = {
content: propTypes.object
};

export default Title;
Loading

0 comments on commit 3c044ed

Please sign in to comment.