added more detailed info page + styles. Commit rest before refactor
This commit is contained in:
		
							parent
							
								
									8f68c37588
								
							
						
					
					
						commit
						4973f351aa
					
				
							
								
								
									
										40
									
								
								app.js
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								app.js
									
									
									
									
									
								
							| @ -5,34 +5,36 @@ import 'regenerator-runtime/runtime' | |||||||
| import { useEffect, useState } from 'preact/hooks' | import { useEffect, useState } from 'preact/hooks' | ||||||
| 
 | 
 | ||||||
| import Video from './src/components/Video' | import Video from './src/components/Video' | ||||||
| import config from './src/data/conf.json' | import config from './src/data/config' | ||||||
| import Info from './src/components/Info' | import Info from './src/components/Info' | ||||||
|  | import { useFetch } from './src/assets/hooks/calendar' | ||||||
|  | import { P } from './src/components/Text' | ||||||
|  | 
 | ||||||
|  | // const appStates = [
 | ||||||
|  | //  'noStream',
 | ||||||
|  | //  'streamLive',
 | ||||||
|  | //  'streamFinished'
 | ||||||
|  | // ]
 | ||||||
| 
 | 
 | ||||||
| export default () => { | export default () => { | ||||||
|   const [isPlaying, setIsPlaying] = useState(false) |   const [isPlaying, setIsPlaying] = useState(false) | ||||||
|   const [videoUrl, setVideoUrl] = useState(null) |   const [videoUrl, setVideoUrl] = useState(null) | ||||||
|  |   // const [feedData, setFeedData] = useState([])
 | ||||||
| 
 | 
 | ||||||
|   useEffect(() => { |   const { data: feedData, loading } = useFetch(`${config.calendar}`) | ||||||
|     const getData = async () => { |  | ||||||
|       const { data } = await axios.get( |  | ||||||
|         `${config.peertube_root}/api/v1/videos/${config.next_stream.peertube_id}` |  | ||||||
|       ) |  | ||||||
|       console.log(data) |  | ||||||
|       const src = `${config.peertube_root}${data.embedPath}` |  | ||||||
|       console.log('src', src) |  | ||||||
|       setVideoUrl(src) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     getData() |  | ||||||
|   }, []) |  | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|     <div> |     <div> | ||||||
|       {videoUrl ? ( |       {/* {false ? ( | ||||||
|         <Video playing={isPlaying} setPlaying={setIsPlaying} src={videoUrl} /> |         <Video | ||||||
|       ) : ( |           playing={isPlaying} | ||||||
|         <Info /> |           setPlaying={setIsPlaying} | ||||||
|       )} |           src={videoUrl} | ||||||
|  |           title={config.next_stream.title} | ||||||
|  |           org={config.next_stream.org} | ||||||
|  |         /> | ||||||
|  |       ) : ( */} | ||||||
|  |       {loading ? <P>LOADING :)</P> : <Info data={feedData} />} | ||||||
|     </div> |     </div> | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								index.js
									
									
									
									
									
								
							| @ -1,6 +1,6 @@ | |||||||
| import { h, render } from 'preact' | import { h, render } from 'preact' | ||||||
| import App from './app' | import App from './app' | ||||||
| 
 | 
 | ||||||
| const AppEl = document.getElementById('app') | const appEl = document.getElementById('app') | ||||||
| 
 | 
 | ||||||
| render(<App />, AppEl) | render(<App />, appEl) | ||||||
|  | |||||||
| @ -21,6 +21,7 @@ | |||||||
|     "styled-components": "^5.2.1" |     "styled-components": "^5.2.1" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  |     "@babel/eslint-parser": "^7.13.10", | ||||||
|     "babel": "^6.23.0", |     "babel": "^6.23.0", | ||||||
|     "babel-plugin-transform-react-jsx": "^6.24.1", |     "babel-plugin-transform-react-jsx": "^6.24.1", | ||||||
|     "babel-preset-env": "^1.6.1", |     "babel-preset-env": "^1.6.1", | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								src/assets/hooks/calendar.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/assets/hooks/calendar.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | import { useEffect, useState } from 'preact/hooks' | ||||||
|  | import axios from 'axios' | ||||||
|  | 
 | ||||||
|  | export const useFetch = url => { | ||||||
|  |   const [data, setData] = useState(null) | ||||||
|  |   const [loading, setLoading] = useState(true) | ||||||
|  | 
 | ||||||
|  |   async function fetchData() { | ||||||
|  |     setLoading(true) | ||||||
|  | 
 | ||||||
|  |     const { data: responseData } = await axios.get(url) | ||||||
|  |     console.log('url', url) | ||||||
|  |     console.log('responseData', responseData) | ||||||
|  |     setData(responseData) | ||||||
|  |     setLoading(false) | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     fetchData() | ||||||
|  |   }, []) | ||||||
|  | 
 | ||||||
|  |   return { loading, data } | ||||||
|  | } | ||||||
| @ -1,14 +1,20 @@ | |||||||
| export const colours = { | export const colours = { | ||||||
|   midnight: '#233b4a', |   midnight: '#233b4a', | ||||||
|  |   midnightDarker: '#112B39', | ||||||
|   offwhite: '#f6f4f5', |   offwhite: '#f6f4f5', | ||||||
| 
 | 
 | ||||||
|   white: '#fff', |   white: '#fff', | ||||||
|   highlight: '#03a59e', |   highlight: '#03a59e', | ||||||
|   rose: '#FEB9B3', |   roseDarker: '#FEB9B3', | ||||||
|  |   rose: '#F1CFCD', | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| colours.text = colours.offwhite | colours.text = colours.offwhite | ||||||
| 
 | 
 | ||||||
|  | export const ui = { | ||||||
|  |   borderRadius: 4, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export const textSizes = { | export const textSizes = { | ||||||
|   xs: 11, |   xs: 11, | ||||||
|   sm: 14, |   sm: 14, | ||||||
| @ -22,4 +28,5 @@ export const textSizes = { | |||||||
| export default { | export default { | ||||||
|   colours, |   colours, | ||||||
|   textSizes, |   textSizes, | ||||||
|  |   ui, | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,9 +1,10 @@ | |||||||
| import styled from 'styled-components' | import styled from 'styled-components' | ||||||
| import { colours } from '../../assets/theme' | import { colours, ui } from '../../assets/theme' | ||||||
| 
 | 
 | ||||||
| export const ChatWrapper = styled.div` | export const ChatWrapper = styled.div` | ||||||
|   position: fixed; |   position: fixed; | ||||||
|   z-index: 10; |   z-index: 10; | ||||||
|   bottom: 0; |   bottom: 0; | ||||||
|   right: 32px; |   right: 32px; | ||||||
|  |   border-radius: ${ui.borderRadius}px; | ||||||
| ` | ` | ||||||
|  | |||||||
| @ -1,18 +1,42 @@ | |||||||
| import { h } from 'preact' | import { h } from 'preact' | ||||||
| import { useEffect, useRef, useState } from 'preact/hooks' | import { useEffect, useRef, useState } from 'preact/hooks' | ||||||
| 
 | 
 | ||||||
| import Logo from '../Logo' | import { H1, H2, P } from '../Text' | ||||||
| import { H1, P } from '../Text' | import { | ||||||
| import { Wrapper } from './styles' |   Wrapper, | ||||||
|  |   PositionedLogo as Logo, | ||||||
|  |   TaglineContainer, | ||||||
|  |   Top, | ||||||
|  | } from './styles' | ||||||
|  | import translations from '../../data/strings' | ||||||
|  | import InfoLayout from '../InfoLayout' | ||||||
|  | 
 | ||||||
|  | const allowedChannels = [7, 4] // ReclaimFutures, NDC
 | ||||||
| 
 | 
 | ||||||
| const Info = ({ data }) => { | const Info = ({ data }) => { | ||||||
|  |   // const [feed, setFeed] = useState([])
 | ||||||
|  | 
 | ||||||
|  |   // useEffect(() => {
 | ||||||
|  |   //   setFeed(sortData(data))
 | ||||||
|  |   // }, [data])
 | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     console.log({ data }) | ||||||
|  |   }, [data]) | ||||||
|  | 
 | ||||||
|   return ( |   return ( | ||||||
|     <Wrapper> |     <InfoLayout title={translations.en.noStreams}> | ||||||
|       <Logo active /> |       <P>ding dong</P> | ||||||
|       <H1>Next Stream</H1> |     </InfoLayout> | ||||||
|       <P>dsdas</P> |  | ||||||
|     </Wrapper> |  | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const sortData = data => { | ||||||
|  |   // if (!data || data?.length === 0) return
 | ||||||
|  |   // console.log('data', data)
 | ||||||
|  |   // return data.filter(feedItem => {
 | ||||||
|  |   //   return allowedChannels.includes(feedItem.channel.id) && feedItem.isLive
 | ||||||
|  |   // })
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export default Info | export default Info | ||||||
|  | |||||||
| @ -1,9 +1,38 @@ | |||||||
| import styled from 'styled-components' | import styled from 'styled-components' | ||||||
| import { colours } from '../../assets/theme' | import { colours } from '../../assets/theme' | ||||||
|  | import Logo from '../Logo' | ||||||
| 
 | 
 | ||||||
| export const Wrapper = styled.div` | export const Wrapper = styled.div` | ||||||
|   height: 100vh; |   height: 100vh; | ||||||
|   width: 100vw; |   width: 100vw; | ||||||
|  |   padding: 2em; | ||||||
|  |   display: flex; | ||||||
|  |   justify-content: space-between; | ||||||
|  |   flex-direction: column; | ||||||
| 
 | 
 | ||||||
|   background-color: ${colours.rose}; |   background: url(https://images.unsplash.com/photo-1579762715118-a6f1d4b934f1?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=3031&q=80)
 | ||||||
|  |     ${colours.rose}; | ||||||
|  |   box-sizing: border-box; | ||||||
|  |   background-size: cover; | ||||||
|  |   background-position-y: 50%; | ||||||
|  |   background-position-x: 20vw; | ||||||
|  |   background-blend-mode: soft-light; | ||||||
|  | 
 | ||||||
|  |   p, | ||||||
|  |   h1, | ||||||
|  |   h2 { | ||||||
|  |     color: ${colours.midnightDarker}; | ||||||
|  |   } | ||||||
|  | ` | ||||||
|  | 
 | ||||||
|  | export const Top = styled.div`` | ||||||
|  | 
 | ||||||
|  | export const PositionedLogo = styled(Logo)` | ||||||
|  |   margin-bottom: 64px; | ||||||
|  | ` | ||||||
|  | 
 | ||||||
|  | export const TaglineContainer = styled.div` | ||||||
|  |   h1 { | ||||||
|  |     margin-top: 32px; | ||||||
|  |   } | ||||||
| ` | ` | ||||||
|  | |||||||
							
								
								
									
										34
									
								
								src/components/InfoLayout/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/components/InfoLayout/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | import { h } from 'preact' | ||||||
|  | import { useEffect, useRef, useState } from 'preact/hooks' | ||||||
|  | 
 | ||||||
|  | import { H1, H2, P } from '../Text' | ||||||
|  | import { | ||||||
|  |   Wrapper, | ||||||
|  |   PositionedLogo as Logo, | ||||||
|  |   TaglineContainer, | ||||||
|  |   Top, | ||||||
|  |   Content, | ||||||
|  | } from './styles' | ||||||
|  | import translations from '../../data/strings' | ||||||
|  | import { colours } from '../../assets/theme' | ||||||
|  | 
 | ||||||
|  | const InfoLayout = ({ title, children }) => { | ||||||
|  |   return ( | ||||||
|  |     <Wrapper> | ||||||
|  |       <Logo active colour={colours.midnightDarker} /> | ||||||
|  |       <Content> | ||||||
|  |         <H2>{title}</H2> | ||||||
|  |         {children} | ||||||
|  |       </Content> | ||||||
|  | 
 | ||||||
|  |       <TaglineContainer> | ||||||
|  |         {translations && | ||||||
|  |           translations.en.underscoreTagline.map(line => ( | ||||||
|  |             <H1 key={line}>{line}</H1> | ||||||
|  |           ))} | ||||||
|  |       </TaglineContainer> | ||||||
|  |     </Wrapper> | ||||||
|  |   ) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export default InfoLayout | ||||||
							
								
								
									
										54
									
								
								src/components/InfoLayout/styles.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/components/InfoLayout/styles.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | import styled from 'styled-components' | ||||||
|  | import { colours } from '../../assets/theme' | ||||||
|  | import Logo from '../Logo' | ||||||
|  | 
 | ||||||
|  | export const Wrapper = styled.div` | ||||||
|  |   height: 100vh; | ||||||
|  |   width: 100vw; | ||||||
|  |   padding: 6em 2em 2em 2em; | ||||||
|  |   display: flex; | ||||||
|  |   /* justify-content: space-between; */ | ||||||
|  |   /* flex-direction: column; */ | ||||||
|  | 
 | ||||||
|  |   background: url(https://images.unsplash.com/photo-1579762715118-a6f1d4b934f1?ixlib=rb-1.2.1&ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&auto=format&fit=crop&w=3031&q=80)
 | ||||||
|  |     ${colours.rose}; | ||||||
|  |   box-sizing: border-box; | ||||||
|  |   background-size: cover; | ||||||
|  |   background-position-y: 50%; | ||||||
|  |   background-position-x: 23vw; | ||||||
|  |   background-blend-mode: soft-light; | ||||||
|  |   position: fixed; | ||||||
|  |   overflow-y: scroll; | ||||||
|  | 
 | ||||||
|  |   p, | ||||||
|  |   h1, | ||||||
|  |   h2 { | ||||||
|  |     color: ${colours.midnightDarker}; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @media screen and (max-width: 1200px) { | ||||||
|  |     padding: 6em 1.5em 1.5em 1.5em; | ||||||
|  |     background-size: 150%; | ||||||
|  |     background-position-x: 0vw; | ||||||
|  |   } | ||||||
|  |   @media screen and (max-width: 800px) { | ||||||
|  |     padding: 6em 1em 1em 1em; | ||||||
|  |     background-size: 250%; | ||||||
|  |     background-position-x: -50vw; | ||||||
|  |   } | ||||||
|  | ` | ||||||
|  | 
 | ||||||
|  | export const Top = styled.div` | ||||||
|  |   width: 50%; | ||||||
|  | ` | ||||||
|  | export const Content = styled.div`` | ||||||
|  | 
 | ||||||
|  | export const PositionedLogo = styled(Logo)` | ||||||
|  |   position: fixed; | ||||||
|  |   top: 2em; | ||||||
|  | ` | ||||||
|  | 
 | ||||||
|  | export const TaglineContainer = styled.div` | ||||||
|  |   position: fixed; | ||||||
|  |   bottom: 2em; | ||||||
|  | ` | ||||||
| @ -1,14 +1,15 @@ | |||||||
| import { h } from 'preact' | import { h } from 'preact' | ||||||
| import { bool, string } from 'prop-types' | import { bool, string } from 'prop-types' | ||||||
| import styled, { css } from 'styled-components' | import styled from 'styled-components' | ||||||
| import { colours } from '../../assets/theme' | import { colours } from '../../assets/theme' | ||||||
| 
 | 
 | ||||||
| const Logo = ({ colour = colours.offwhite, active }) => ( | const Logo = ({ colour = colours.offwhite, active, ...rest }) => ( | ||||||
|   <LogoSvg |   <LogoSvg | ||||||
|     xmlns="http://www.w3.org/2000/svg" |     xmlns="http://www.w3.org/2000/svg" | ||||||
|     fill="none" |     fill="none" | ||||||
|     viewBox="0 0 865 140" |     viewBox="0 0 865 140" | ||||||
|     $active={active} |     $active={active} | ||||||
|  |     {...rest} | ||||||
|   > |   > | ||||||
|     <path |     <path | ||||||
|       fill={colour} |       fill={colour} | ||||||
| @ -19,18 +20,6 @@ const Logo = ({ colour = colours.offwhite, active }) => ( | |||||||
| 
 | 
 | ||||||
| const LogoSvg = styled.svg` | const LogoSvg = styled.svg` | ||||||
|   width: 200px; |   width: 200px; | ||||||
|   padding: 1em; |  | ||||||
|   transform: translateY(-20%); |  | ||||||
|   transition: all 0.2s ease-in-out; |  | ||||||
|   opacity: 0; |  | ||||||
|   pointer-events: none; |  | ||||||
| 
 |  | ||||||
|   ${props => |  | ||||||
|     props.$active && |  | ||||||
|     css` |  | ||||||
|       transform: translateY(0%); |  | ||||||
|       opacity: 1; |  | ||||||
|     `}
 |  | ||||||
| ` | ` | ||||||
| 
 | 
 | ||||||
| Logo.propTypes = { | Logo.propTypes = { | ||||||
|  | |||||||
| @ -62,16 +62,29 @@ Text.propTypes = { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export const H1 = ({ children, ...rest }) => { | export const H1 = ({ children, ...rest }) => { | ||||||
|   console.log({ children }) |  | ||||||
|   return ( |   return ( | ||||||
|     <Text tag="h1" weight="700" size="48" fontFamily="Lunchtype24" {...rest}> |     <Text | ||||||
|  |       tag="h1" | ||||||
|  |       weight="700" | ||||||
|  |       size="48" | ||||||
|  |       lineHeight="0.8" | ||||||
|  |       fontFamily="Lunchtype24" | ||||||
|  |       {...rest} | ||||||
|  |     > | ||||||
|       {children} |       {children} | ||||||
|     </Text> |     </Text> | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export const H2 = ({ children, ...rest }) => ( | export const H2 = ({ children, ...rest }) => ( | ||||||
|   <Text tag="h2" weight="700" size="25" fontFamily="Lunchtype24" {...rest}> |   <Text | ||||||
|  |     tag="h2" | ||||||
|  |     weight="700" | ||||||
|  |     size="25" | ||||||
|  |     lineHeight="1" | ||||||
|  |     fontFamily="Lunchtype24" | ||||||
|  |     {...rest} | ||||||
|  |   > | ||||||
|     {children} |     {children} | ||||||
|   </Text> |   </Text> | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -1,4 +1,5 @@ | |||||||
| import styled, { css } from 'styled-components' | import styled, { css } from 'styled-components' | ||||||
|  | import { colours } from '../../assets/theme' | ||||||
| 
 | 
 | ||||||
| export const TextBase = styled.span` | export const TextBase = styled.span` | ||||||
|   ${({ |   ${({ | ||||||
| @ -21,5 +22,10 @@ export const TextBase = styled.span` | |||||||
|     user-select: ${selectable ? 'inherit' : 'none'}; |     user-select: ${selectable ? 'inherit' : 'none'}; | ||||||
|     text-decoration: ${underline ? 'underline' : 'none'}; |     text-decoration: ${underline ? 'underline' : 'none'}; | ||||||
|     font-size: ${size}px; |     font-size: ${size}px; | ||||||
|  | 
 | ||||||
|  |     ::selection { | ||||||
|  |       background-color: ${colours.midnightDarker}; | ||||||
|  |       color: ${colours.offwhite}; | ||||||
|  |     } | ||||||
|   `}
 |   `}
 | ||||||
| ` | ` | ||||||
|  | |||||||
| @ -1,13 +1,16 @@ | |||||||
| import { h } from 'preact' | import { h } from 'preact' | ||||||
| import { useEffect, useRef, useState } from 'preact/hooks' | import { useEffect, useRef, useState } from 'preact/hooks' | ||||||
|  | import { bool, func, string } from 'prop-types' | ||||||
| import 'regenerator-runtime/runtime' | import 'regenerator-runtime/runtime' | ||||||
| import { PeerTubePlayer } from '@peertube/embed-api' | import { PeerTubePlayer } from '@peertube/embed-api' | ||||||
| 
 | 
 | ||||||
| import Logo from '../Logo' | import Logo from '../Logo' | ||||||
| import Chat from '../Chat' | import Chat from '../Chat' | ||||||
| import { VideoWrapper, Iframe, Overlay } from './styles' | import { H2 } from '../Text' | ||||||
|  | import Overlay from '../VideoOverlay' | ||||||
|  | import { VideoWrapper, Iframe } from './styles' | ||||||
| 
 | 
 | ||||||
| const Video = ({ playing, setPlaying, src }) => { | const Video = ({ playing, setPlaying, src, title, org }) => { | ||||||
|   const videoiFrame = useRef(null) |   const videoiFrame = useRef(null) | ||||||
|   const overlayTimeout = useRef(null) |   const overlayTimeout = useRef(null) | ||||||
|   const [videoReady, setVideoReady] = useState(false) |   const [videoReady, setVideoReady] = useState(false) | ||||||
| @ -56,9 +59,7 @@ const Video = ({ playing, setPlaying, src }) => { | |||||||
|       onClick={() => setPlaying(!playing)} |       onClick={() => setPlaying(!playing)} | ||||||
|       onMouseMove={activateOverlay} |       onMouseMove={activateOverlay} | ||||||
|     > |     > | ||||||
|       <Overlay> |       <Overlay active={overlayActive || !playing} title={title} org={org} /> | ||||||
|         <Logo active={overlayActive || !playing}></Logo> |  | ||||||
|       </Overlay> |  | ||||||
|       <Iframe |       <Iframe | ||||||
|         sandbox="allow-same-origin allow-scripts allow-popups" |         sandbox="allow-same-origin allow-scripts allow-popups" | ||||||
|         src={`${src}?api=1&controls=false`} |         src={`${src}?api=1&controls=false`} | ||||||
| @ -66,9 +67,17 @@ const Video = ({ playing, setPlaying, src }) => { | |||||||
|         allowfullscreen |         allowfullscreen | ||||||
|         ref={videoiFrame} |         ref={videoiFrame} | ||||||
|       /> |       /> | ||||||
|       <Chat></Chat> |       <Chat /> | ||||||
|     </VideoWrapper> |     </VideoWrapper> | ||||||
|   ) |   ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | Video.propTypes = { | ||||||
|  |   playing: bool, | ||||||
|  |   setPlaying: func.isRequired, | ||||||
|  |   src: string.isRequired, | ||||||
|  |   title: string.isRequired, | ||||||
|  |   org: string, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export default Video | export default Video | ||||||
|  | |||||||
							
								
								
									
										34
									
								
								src/components/VideoOverlay/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/components/VideoOverlay/index.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | import { h } from 'preact' | ||||||
|  | import { bool, string } from 'prop-types' | ||||||
|  | 
 | ||||||
|  | import Logo from '../Logo' | ||||||
|  | import { P } from '../Text' | ||||||
|  | import { OverlayWrapper, TopLeft } from './styles' | ||||||
|  | 
 | ||||||
|  | const VideoOverlay = ({ active, title, org }) => { | ||||||
|  |   const displayTitle = `${title}${org ? ` — ${org}` : ''}` | ||||||
|  | 
 | ||||||
|  |   return ( | ||||||
|  |     <OverlayWrapper> | ||||||
|  |       <TopLeft $active={active}> | ||||||
|  |         <Logo active={active} /> | ||||||
|  |         <P | ||||||
|  |           size={18} | ||||||
|  |           css={` | ||||||
|  |             margin-top: 16px; | ||||||
|  |           `}
 | ||||||
|  |         > | ||||||
|  |           {displayTitle} | ||||||
|  |         </P> | ||||||
|  |       </TopLeft> | ||||||
|  |     </OverlayWrapper> | ||||||
|  |   ) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | VideoOverlay.propTypes = { | ||||||
|  |   active: bool, | ||||||
|  |   title: string.isRequired, | ||||||
|  |   org: string, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export default VideoOverlay | ||||||
							
								
								
									
										21
									
								
								src/components/VideoOverlay/styles.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/components/VideoOverlay/styles.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | import styled, { css } from 'styled-components' | ||||||
|  | 
 | ||||||
|  | export const OverlayWrapper = styled.div` | ||||||
|  |   z-index: 2; | ||||||
|  |   position: fixed; | ||||||
|  |   height: 100vh; | ||||||
|  |   width: 100vw; | ||||||
|  |   pointer-events: none; | ||||||
|  | ` | ||||||
|  | export const TopLeft = styled.div` | ||||||
|  |   opacity: 0; | ||||||
|  |   transform: translateY(-20%); | ||||||
|  |   transition: all 0.2s ease-in-out; | ||||||
|  |   padding: 2em; | ||||||
|  |   ${props => | ||||||
|  |     props.$active && | ||||||
|  |     css` | ||||||
|  |       transform: translateY(0%); | ||||||
|  |       opacity: 1; | ||||||
|  |     `};
 | ||||||
|  | ` | ||||||
| @ -1,9 +0,0 @@ | |||||||
| { |  | ||||||
|   "peertube_root": "https://tv.undersco.re", |  | ||||||
|   "next_stream": { |  | ||||||
|     "title": "Femboy Photoshoot", |  | ||||||
|     "peertube_id": "5c457282-e8d0-4464-9c07-cb6bb71d7153", |  | ||||||
|     "startDate": "Fri Mar 05 2021 21:00:00 GMT+0100 (Central European Standard Time", |  | ||||||
|     "endDate": "Fri Mar 05 2021 21:00:00 GMT+0100 (Central European Standard Time" |  | ||||||
|   } |  | ||||||
| } |  | ||||||
							
								
								
									
										14
									
								
								src/data/config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/data/config.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | export default { | ||||||
|  |   peertube_root: 'https://tv.undersco.re', | ||||||
|  |   calendar: | ||||||
|  |     'https://cloud.undersco.re/remote.php/dav/public-calendars/9FzomgAfidHWCQcx?export', | ||||||
|  |   next_stream: { | ||||||
|  |     title: 'Femboy Photoshoot', | ||||||
|  |     peertube_id: 'cafce2b3-550b-4656-bae0-c167d3994a0d', | ||||||
|  |     org: 'New Design Congress', | ||||||
|  |     startDate: | ||||||
|  |       'Fri Mar 05 2021 21:00:00 GMT+0100 (Central European Standard Time', | ||||||
|  |     endDate: | ||||||
|  |       'Fri Mar 05 2021 21:00:00 GMT+0100 (Central European Standard Time', | ||||||
|  |   }, | ||||||
|  | } | ||||||
| @ -1,5 +1,7 @@ | |||||||
| export default { | export default { | ||||||
|   en: { |   en: { | ||||||
|     nextStream: 'Next stream:', |     nextStream: 'Next stream', | ||||||
|  |     noStreams: 'No upcoming streams, check back soon.', | ||||||
|  |     underscoreTagline: ['LEAVE THE', 'SURVEILLANCE ECONOMY', '— TOGETHER.'], | ||||||
|   }, |   }, | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										19
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								yarn.lock
									
									
									
									
									
								
							| @ -41,6 +41,15 @@ | |||||||
|     semver "^5.4.1" |     semver "^5.4.1" | ||||||
|     source-map "^0.5.0" |     source-map "^0.5.0" | ||||||
| 
 | 
 | ||||||
|  | "@babel/eslint-parser@^7.13.10": | ||||||
|  |   version "7.13.10" | ||||||
|  |   resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.13.10.tgz#e272979914f36bb6cea144c14c32bb51632696dd" | ||||||
|  |   integrity sha512-/I1HQ3jGPhIpeBFeI3wO9WwWOnBYpuR0pX0KlkdGcRQAVX9prB/FCS2HBpL7BiFbzhny1YCiBH8MTZD2jJa7Hg== | ||||||
|  |   dependencies: | ||||||
|  |     eslint-scope "5.1.0" | ||||||
|  |     eslint-visitor-keys "^1.3.0" | ||||||
|  |     semver "^6.3.0" | ||||||
|  | 
 | ||||||
| "@babel/generator@^7.0.0 <7.4.0": | "@babel/generator@^7.0.0 <7.4.0": | ||||||
|   version "7.3.4" |   version "7.3.4" | ||||||
|   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" |   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" | ||||||
| @ -2940,6 +2949,14 @@ eslint-restricted-globals@^0.1.1: | |||||||
|   resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" |   resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" | ||||||
|   integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc= |   integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc= | ||||||
| 
 | 
 | ||||||
|  | eslint-scope@5.1.0: | ||||||
|  |   version "5.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" | ||||||
|  |   integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== | ||||||
|  |   dependencies: | ||||||
|  |     esrecurse "^4.1.0" | ||||||
|  |     estraverse "^4.1.1" | ||||||
|  | 
 | ||||||
| eslint-scope@^3.7.1: | eslint-scope@^3.7.1: | ||||||
|   version "3.7.3" |   version "3.7.3" | ||||||
|   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" |   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" | ||||||
| @ -2948,7 +2965,7 @@ eslint-scope@^3.7.1: | |||||||
|     esrecurse "^4.1.0" |     esrecurse "^4.1.0" | ||||||
|     estraverse "^4.1.1" |     estraverse "^4.1.1" | ||||||
| 
 | 
 | ||||||
| eslint-visitor-keys@^1.0.0: | eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.3.0: | ||||||
|   version "1.3.0" |   version "1.3.0" | ||||||
|   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" |   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" | ||||||
|   integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== |   integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user