summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2020-09-09 22:06:54 +0200
committerJules Laplace <julescarbon@gmail.com>2020-09-09 22:06:54 +0200
commit6136baa5e782eba3477f7a3bdc8ba8f03a64452f (patch)
treec771cdd30378ea2444a2166860843ccc0b7f0d5f
parentfc7d1ed7ec0d3e101551811501cd59d43e9be3d1 (diff)
auto advance carousel
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/index.js4
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js65
-rw-r--r--animism-align/frontend/app/views/viewer/viewer.actions.js4
3 files changed, 57 insertions, 16 deletions
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/index.js b/animism-align/frontend/app/views/viewer/player/components.media/index.js
index 4fcf649..37f6f64 100644
--- a/animism-align/frontend/app/views/viewer/player/components.media/index.js
+++ b/animism-align/frontend/app/views/viewer/player/components.media/index.js
@@ -12,9 +12,7 @@ import {
Gallery
} from './media.gallery'
-import {
- Carousel
-} from './media.carousel'
+import Carousel from './media.carousel'
import {
Grid
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js b/animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js
index 46458b5..c2d091a 100644
--- a/animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js
+++ b/animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js
@@ -1,4 +1,5 @@
import React, { Component } from 'react'
+import { connect } from 'react-redux'
import { useKeenSlider } from "app/utils/vendor/keen-slider/react"
import "keen-slider/keen-slider.min.css"
@@ -8,12 +9,14 @@ import { Arrow } from 'app/views/viewer/nav/viewer.icons'
const SPACING = 15
const SLIDES_PER_VIEW = 2
-export const Carousel = ({ media }) => {
- const { image_order, image_lookup, display_lookup, thumbnail_lookup, caption_lookup } = media.settings
+// obnoxious i have to do this but the slideChanged function would be "different" otherwise
+let slideChangedHook = slider => console.log(slider)
+let slideChanged = slider => slideChangedHook(slider)
+
+const CarouselContainer = ({ element, play_ts, media }) => {
+ const { image_order, caption_lookup } = media.settings
- // const [details, setDetails] = React.useState(null)
const [currentSlide, setCurrentSlide] = React.useState(0)
- const [currentCaption, setCurrentCaption] = React.useState(caption_lookup[image_order[0]])
const [sliderRef, slider] = useKeenSlider({
slidesPerView: SLIDES_PER_VIEW,
mode: "free",
@@ -21,15 +24,46 @@ export const Carousel = ({ media }) => {
centered: true,
loop: false,
// duration: 700,
- slideChanged: slider => {
- const currentSlideIndex = slider.details().relativeSlide
- const currentImageId = image_order[currentSlideIndex]
- const currentCaption = caption_lookup[currentImageId]
- setCurrentSlide(currentSlideIndex)
- setCurrentCaption(currentCaption)
- },
+ slideChanged: slideChanged,
+ })
+
+ slideChangedHook = s => {
+ const currentSlideIndex = s.details().relativeSlide
+ setCurrentSlide(currentSlideIndex)
+ }
+
+ // step thru this carousel's timeline, which is ordered in reverse BTW
+ element.timeline.some(cue => {
+ if (cue.start_ts < play_ts) {
+ let slide_index = parseInt(cue.settings.frame_index)
+ if (cue.settings.half_frame) {
+ slide_index += 0.5
+ }
+ if (currentSlide < slide_index) {
+ setCurrentSlide(slide_index)
+ slider.moveToSlideRelative(slide_index)
+ }
+ return true
+ }
+ return false
})
+ const currentCaption = caption_lookup[image_order[currentSlide]]
+
+ return (
+ <Carousel
+ media={media}
+ slider={slider}
+ sliderRef={sliderRef}
+ currentSlide={currentSlide}
+ currentCaption={currentCaption}
+ />
+ )
+}
+
+const CarouselComponent = ({ media, slider, sliderRef, currentSlide, currentCaption }) => {
+ const { image_order, display_lookup } = media.settings
+
return [
<div key={'carousel_' + media.id} ref={sliderRef} className='keen-slider carousel-items'>
{image_order.map((id, idx) => {
@@ -58,6 +92,8 @@ export const Carousel = ({ media }) => {
]
}
+const Carousel = React.memo(CarouselComponent)
+
const CarouselNav = ({ currentSlide, slides, onPrev, onNext, onPick }) => {
return (
<div className="carousel-nav">
@@ -106,3 +142,10 @@ const CarouselItem = ({ image }) => {
}} />
)
}
+
+
+const mapStateToProps = state => ({
+ play_ts: state.audio.play_ts,
+})
+
+export default connect(mapStateToProps)(CarouselContainer)
diff --git a/animism-align/frontend/app/views/viewer/viewer.actions.js b/animism-align/frontend/app/views/viewer/viewer.actions.js
index 2771957..21a8098 100644
--- a/animism-align/frontend/app/views/viewer/viewer.actions.js
+++ b/animism-align/frontend/app/views/viewer/viewer.actions.js
@@ -111,11 +111,11 @@ export const loadSections = () => dispatch => {
}
}
- // build timeline of gallery / carousel advance instructions
+ // build timeline of gallery / carousel advance instructions. this is in reverse so we can step thru it
if (GALLERY_UTILITY_ANNOTATION_TYPES.has(annotation.type) && currentSection.fullscreenTimeline.length) {
const lastTimelineEvent = currentSection.fullscreenTimeline[currentSection.fullscreenTimeline.length - 1]
if (!lastTimelineEvent.timeline) lastTimelineEvent.timeline = []
- lastTimelineEvent.timeline.push(annotation)
+ lastTimelineEvent.timeline.unshift(annotation)
}
// build timeline of special inline items