summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/views/viewer/player
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2020-07-28 00:20:51 +0200
committerJules Laplace <julescarbon@gmail.com>2020-07-28 00:20:51 +0200
commitf6bc505597463cc8f593e00d74b421175a69f7f3 (patch)
tree8e55d423573fcadc0e51f86b67b825c4c619f90e /animism-align/frontend/app/views/viewer/player
parent443f0a465c720c9e70a124671872c74bc7e9bbd4 (diff)
some fullscreen elements fading in...
Diffstat (limited to 'animism-align/frontend/app/views/viewer/player')
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.image.js16
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.utility.js18
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.fullscreen/index.js19
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/index.js6
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/inline.image.js (renamed from animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.image.js)0
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/inline.text.js (renamed from animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.text.js)0
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.inline/inline.video.js (renamed from animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.video.js)0
-rw-r--r--animism-align/frontend/app/views/viewer/player/player.container.js8
-rw-r--r--animism-align/frontend/app/views/viewer/player/player.fullscreen.css37
-rw-r--r--animism-align/frontend/app/views/viewer/player/player.fullscreen.js65
10 files changed, 158 insertions, 11 deletions
diff --git a/animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.image.js b/animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.image.js
new file mode 100644
index 0000000..c0e4b0e
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.image.js
@@ -0,0 +1,16 @@
+import React from 'react'
+
+export const Image = ({ element, media, transitionDuration }) => {
+ const item = media.lookup[element.settings.media_id]
+ const style = {
+ transitionDuration,
+ backgroundImage: 'url(' + item.settings.display.url + ')',
+ }
+ return (
+ <div
+ className='fullscreen-element image'
+ style={style}
+ >
+ </div>
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.utility.js b/animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.utility.js
new file mode 100644
index 0000000..c86236d
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.fullscreen/fullscreen.utility.js
@@ -0,0 +1,18 @@
+import React from 'react'
+
+export const Curtain = ({ element, transitionDuration }) => {
+ // console.log(element, isEntering)
+ const { color } = element
+ const style = {
+ backgroundColor: color.backgroundColor,
+ color: color.textColor,
+ transitionDuration,
+ }
+ return (
+ <div
+ className='fullscreen-element curtain'
+ style={style}
+ >
+ </div>
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.fullscreen/index.js b/animism-align/frontend/app/views/viewer/player/components.fullscreen/index.js
new file mode 100644
index 0000000..3befbde
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.fullscreen/index.js
@@ -0,0 +1,19 @@
+import React from 'react'
+
+// import {
+// MediaVideo
+// } from './fullscreen.video'
+
+import {
+ Image
+} from './fullscreen.image'
+
+import {
+ Curtain
+} from './fullscreen.utility'
+
+export const fullscreenComponents = {
+ curtain: React.memo(Curtain),
+ // video: React.memo(MediaVideo),
+ image: React.memo(Image),
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/index.js b/animism-align/frontend/app/views/viewer/player/components.inline/index.js
index ee65641..89d1d42 100644
--- a/animism-align/frontend/app/views/viewer/player/components.inline/index.js
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/index.js
@@ -2,15 +2,15 @@ import React from 'react'
import {
Paragraph, ParagraphHeading
-} from './elementTypes.text'
+} from './inline.text'
import {
MediaVideo
-} from './elementTypes.video'
+} from './inline.video'
import {
MediaImage
-} from './elementTypes.image'
+} from './inline.image'
export const transcriptElementLookup = {
paragraph: React.memo(Paragraph),
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.image.js b/animism-align/frontend/app/views/viewer/player/components.inline/inline.image.js
index f005fc0..f005fc0 100644
--- a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.image.js
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/inline.image.js
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.text.js b/animism-align/frontend/app/views/viewer/player/components.inline/inline.text.js
index 8825479..8825479 100644
--- a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.text.js
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/inline.text.js
diff --git a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.video.js b/animism-align/frontend/app/views/viewer/player/components.inline/inline.video.js
index fe821eb..fe821eb 100644
--- a/animism-align/frontend/app/views/viewer/player/components.inline/elementTypes.video.js
+++ b/animism-align/frontend/app/views/viewer/player/components.inline/inline.video.js
diff --git a/animism-align/frontend/app/views/viewer/player/player.container.js b/animism-align/frontend/app/views/viewer/player/player.container.js
index 1ddb5c7..9655955 100644
--- a/animism-align/frontend/app/views/viewer/player/player.container.js
+++ b/animism-align/frontend/app/views/viewer/player/player.container.js
@@ -1,8 +1,8 @@
import React, { Component } from 'react'
import { connect } from 'react-redux'
-import { floatInRange } from 'app/utils'
import actions from 'app/actions'
+import { floatInRange } from 'app/utils'
import PlayerTranscript from './player.transcript'
import PlayerFullscreen from './player.fullscreen'
@@ -38,17 +38,16 @@ class PlayerContainer extends Component {
actions.viewer.setCurrentSection(sections[0])
}
}
-
render() {
// const { } = this.props
- const { currentSection, fullscreenTimeline } = this.props
+ const { currentSection } = this.props
if (!currentSection) { return <div /> }
// console.log(currentSection)
return (
<div className='viewer-container'>
<PlayerTranscript section={currentSection} />
- <PlayerFullscreen timeline={fullscreenTimeline} />
+ <PlayerFullscreen />
</div>
)
}
@@ -57,7 +56,6 @@ class PlayerContainer extends Component {
const mapStateToProps = state => ({
audio: state.audio,
sections: state.viewer.sections,
- fullscreenTimeline: state.viewer.fullscreenTimeline,
currentSection: state.viewer.currentSection,
})
diff --git a/animism-align/frontend/app/views/viewer/player/player.fullscreen.css b/animism-align/frontend/app/views/viewer/player/player.fullscreen.css
index 8041c84..fb4d8af 100644
--- a/animism-align/frontend/app/views/viewer/player/player.fullscreen.css
+++ b/animism-align/frontend/app/views/viewer/player/player.fullscreen.css
@@ -11,4 +11,39 @@
.viewer-fullscreen.active {
pointer-events: auto;
user-select: auto;
-} \ No newline at end of file
+}
+
+/* transitions */
+
+.viewer-fullscreen .fade-enter {
+ opacity: 0;
+}
+.viewer-fullscreen .fade-enter.fade-enter-active {
+ opacity: 1;
+ transition-property: opacity;
+}
+.viewer-fullscreen .fade-exit {
+ opacity: 1;
+}
+.viewer-fullscreen .fade-exit-active {
+ opacity: 0;
+ transition-property: opacity;
+}
+
+/* elements */
+
+.viewer-fullscreen .fullscreen-element {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+}
+
+.viewer-fullscreen .curtain {
+}
+
+.viewer-fullscreen .image {
+ background-size: cover;
+ background-position: center center;
+}
diff --git a/animism-align/frontend/app/views/viewer/player/player.fullscreen.js b/animism-align/frontend/app/views/viewer/player/player.fullscreen.js
index 89052ed..47c6cd2 100644
--- a/animism-align/frontend/app/views/viewer/player/player.fullscreen.js
+++ b/animism-align/frontend/app/views/viewer/player/player.fullscreen.js
@@ -1,22 +1,83 @@
import React, { Component } from 'react'
import { connect } from 'react-redux'
+import { TransitionGroup, CSSTransition } from 'react-transition-group'
import actions from 'app/actions'
+import { floatInRange, floatLT } from 'app/utils'
+
+import { fullscreenComponents } from './components.fullscreen'
class PlayerFullscreen extends Component {
+ state = {
+ elements: [],
+ }
+
componentDidMount() {
+ this.setCurrentElements()
+ }
+
+ componentDidUpdate(prevProps) {
+ if (this.props.audio.play_ts === prevProps.audio.play_ts) return
+ this.setCurrentElements()
}
-
+
+ setCurrentElements() {
+ const { audio, timeline } = this.props
+ const { play_ts } = audio
+ const elements = timeline.filter(element => (
+ floatInRange(element.start_ts, play_ts, element.fade_out_start_ts + 0.1)
+ ))
+ this.setState({ elements })
+ }
+
render() {
- const { } = this.props
+ const { audio, media } = this.props
+ const { play_ts } = audio
+ const { elements } = this.state
+ // console.log(elements, play_ts)
return (
<div className="viewer-fullscreen">
+ <TransitionGroup>
+ {elements.map(element => {
+ if (!(element.type in fullscreenComponents)) {
+ return null
+ }
+ const isEntering = floatInRange(element.start_ts, play_ts, element.fade_in_end_ts)
+ const FullscreenComponent = fullscreenComponents[element.type]
+ const transitionDuration = (isEntering ? (1000 * element.fadeInDuration) : (1000 * element.fadeOutDuration)) + 'ms'
+ return (
+ <CSSTransition
+ key={element.index}
+ classNames="fade"
+ timeout={{
+ enter: element.fadeInDuration * 1000,
+ exit: element.fadeOutDuration * 1000,
+ }}
+ component={FirstChild}
+ >
+ <FullscreenComponent
+ element={element}
+ media={media}
+ transitionDuration={transitionDuration}
+ />
+ </CSSTransition>
+ )
+ })}
+ </TransitionGroup>
</div>
)
}
}
+const FirstChild = (props) => {
+ const childrenArray = React.Children.toArray(props.children);
+ return childrenArray[0] || null;
+}
+
const mapStateToProps = state => ({
+ audio: state.audio,
+ media: state.media.index,
+ timeline: state.viewer.fullscreenTimeline,
})
export default connect(mapStateToProps)(PlayerFullscreen)