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" import actions from 'app/actions' import { SpeakerIcon } from 'app/views/viewer/nav/viewer.icons' import { MediaCitation } from './media.citation' import { Arrow } from 'app/views/viewer/nav/viewer.icons' const SPACING = 15 const SLIDES_PER_VIEW = 2 // 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, media, cues, play_ts, withMouseWheel }) => { const { image_order, caption_lookup } = media.settings const [currentSlide, setCurrentSlide] = React.useState(0) const [sliderRef, slider] = useKeenSlider({ slidesPerView: SLIDES_PER_VIEW, mode: "free", spacing: SPACING, centered: true, loop: false, slideChanged: slideChanged, withMouseWheel: withMouseWheel, }) slideChangedHook = s => { setCurrentSlide(s.details().relativeSlide) } // step thru this carousel's timeline, which is ordered in reverse BTW if (element) { element.timeline.some(cue => { if (cue.start_ts < play_ts && (play_ts - cue.start_ts) < 0.5) { let slide_index = cue.settings.seek_index if (currentSlide < slide_index) { setCurrentSlide(slide_index) slider.moveToSlideRelative(slide_index) } return true } return false }) } const currentCaption = caption_lookup[image_order[Math.round(currentSlide)]] return ( ) } const CarouselComponent = ({ media, slider, sliderRef, currentSlide, currentCaption, cues }) => { const { image_order, display_lookup } = media.settings return (
{image_order.map((id, index) => { const image = display_lookup[id] // console.log(image) return ( ) })}
{ slider.prev() }} /> { slider.next() }} />
{ slider.moveToSlideRelative(index) }} />
) } const Carousel = React.memo(CarouselComponent) const CarouselArrow = ({ disabled, type, onClick }) => ((
{ e.stopPropagation() onClick() }} >
)) const CarouselDots = ({ slides, currentSlide, onPick }) => ((
{[...slides.keys()].map(index => { return (
{ onPick(index) }} tabIndex={index} className={"dot-item" + (Math.round(currentSlide) === index ? " active" : "")} >
) })}
)) const CarouselItem = ({ image, slider, seekAnnotation }) => { return (
{seekAnnotation && (
{ slider.moveToSlideRelative(seekAnnotation.settings.seek_index) actions.viewer.seekToTimestamp(seekAnnotation.start_ts) }} > {SpeakerIcon}
)}
) } const mapStateToProps = state => ({ play_ts: state.audio.play_ts, }) export default connect(mapStateToProps)(CarouselContainer)