Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions website/docusaurus.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,14 @@ const config: Config = {
},
],
},
announcementBar: {
id: 'watch_keynote',
content:
'Re-watch the latest <a target="_blank" rel="noopener noreferrer" href="https://www.youtube.com/watch?v=NiYwlvXsBKw">React Native Keynote</a> from React Conf 2025',
backgroundColor: '#20232a',
textColor: '#fff',
isCloseable: false,
},
navbar: {
title: 'React Native',
logo: {
Expand Down
119 changes: 99 additions & 20 deletions website/src/components/Home/Watch/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ import SectionTitle from '../SectionTitle';

import styles from './styles.module.css';

enum VideoId {
Why = 'wUDeLT6WXnQ',
Keynote2025 = 'NiYwlvXsBKw',
Keynote2024 = 'Q5SMmKb7qVI',
FB2019 = 'NCAY0HIfrwc',
}

function Watch() {
const [playingId, setPlayingId] = useState<string | null>(null);

Expand All @@ -38,62 +45,134 @@ function Watch() {
<div className={styles.videos}>
<div
role="button"
aria-label="Play: FB 2019: Mobile innovation with React Native"
aria-label="Play: Why React Native?"
className={[
styles.videoContainer,
playingId === 'fb2019'
playingId === VideoId.Why
? styles.videoContainerPlaying
: styles.videoContainerHover,
].join(' ')}
onClick={() => setPlayingId('fb2019')}>
{playingId === 'fb2019' ? (
onClick={() => setPlayingId(VideoId.Why)}>
{playingId === VideoId.Why ? (
<iframe
src="https://www.youtube.com/embed/NCAY0HIfrwc?autoplay=1"
title="Mobile Innovation with React Native, ComponentKit, and Litho"
src={`https://www.youtube.com/embed/${VideoId.Why}?autoplay=1`}
title="Explain Like I'm 5: React Native"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
className={styles.video}
/>
) : (
<img
src="https://img.youtube.com/vi/NCAY0HIfrwc/maxresdefault.jpg"
alt="Mobile Innovation with React Native, ComponentKit, and Litho"
src={`https://img.youtube.com/vi/${VideoId.Why}/maxresdefault.jpg`}
alt="Explain Like I'm 5: React Native"
className={styles.video}
/>
)}
<div className={styles.videoInfo}>
<h4>FB 2019: Mobile innovation with React Native</h4>
<p>45:29</p>
<h4>Why React Native?</h4>
<p>1:42</p>
</div>
</div>
<div
role="button"
aria-label="Play: Why React Native?"
aria-label="Play: React Conf 2025 React Native Keynote"
className={[
styles.videoContainer,
playingId === 'why'
playingId === VideoId.Keynote2025
? styles.videoContainerPlaying
: styles.videoContainerHover,
].join(' ')}
onClick={() => setPlayingId('why')}>
{playingId === 'why' ? (
onClick={() => setPlayingId(VideoId.Keynote2025)}>
{playingId === VideoId.Keynote2025 ? (
<iframe
src="https://www.youtube.com/embed/wUDeLT6WXnQ?autoplay=1"
title="Explain Like I'm 5: React Native"
src={`https://www.youtube.com/embed/${VideoId.Keynote2025}?autoplay=1`}
title="React Conf 2025 React Native Keynote"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
className={styles.video}
/>
) : (
<img
src="https://img.youtube.com/vi/wUDeLT6WXnQ/maxresdefault.jpg"
alt="Explain Like I'm 5: React Native"
src={`https://img.youtube.com/vi/${VideoId.Keynote2025}/maxresdefault.jpg`}
alt="React Conf 2025 React Native Keynote"
className={styles.video}
/>
)}
<div className={styles.videoInfo}>
<h4>Why React Native?</h4>
<p>1:42</p>
<h4>
React Conf 2025
<br />
React Native Keynote
</h4>
<p>55:13</p>
</div>
</div>
<div
role="button"
aria-label="Play: React Conf 2024 React Native Keynote"
className={[
styles.videoContainer,
playingId === VideoId.Keynote2024
? styles.videoContainerPlaying
: styles.videoContainerHover,
].join(' ')}
onClick={() => setPlayingId(VideoId.Keynote2024)}>
{playingId === VideoId.Keynote2024 ? (
<iframe
src={`https://www.youtube.com/embed/${VideoId.Keynote2024}?autoplay=1`}
title="React Conf 2024 React Native Keynote"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
className={styles.video}
/>
) : (
<img
src={`https://img.youtube.com/vi/${VideoId.Keynote2024}/maxresdefault.jpg`}
alt="React Conf 2024 React Native Keynote"
className={styles.video}
/>
)}
<div className={styles.videoInfo}>
<h4>
React Conf 2024
<br />
React Native Keynote
</h4>
<p>55:14</p>
</div>
</div>
<div
role="button"
aria-label="Play: FB 2019: Mobile innovation with React Native"
className={[
styles.videoContainer,
playingId === VideoId.FB2019
? styles.videoContainerPlaying
: styles.videoContainerHover,
].join(' ')}
onClick={() => setPlayingId(VideoId.FB2019)}>
{playingId === VideoId.FB2019 ? (
<iframe
src={`https://www.youtube.com/embed/${VideoId.FB2019}?autoplay=1`}
title="Mobile Innovation with React Native, ComponentKit, and Litho"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
className={styles.video}
/>
) : (
<img
src={`https://img.youtube.com/vi/${VideoId.FB2019}/maxresdefault.jpg`}
alt="Mobile Innovation with React Native, ComponentKit, and Litho"
className={styles.video}
/>
)}
<div className={styles.videoInfo}>
<h4>
FB 2019
<br />
Mobile innovation with React Native
</h4>
<p>45:29</p>
</div>
</div>
</div>
Expand Down