Rails + Webpacker-React, не могу установить currentTime видео в Active Storage

Итак, у меня есть приложение (ссылка на репо), где пользователи могут загружать видео через Rails Active Storage для создания постов. Когда я просматриваю посты, я хочу, чтобы пользователи могли нажимать на метки времени, которые изменят текущее время видео поста и позволят им просматривать его. Мне удалось показать и показать видео, но я не могу его найти. Шаг за шагом вот что происходит:

Рельсы оказывают app/views/posts/_post_modal.html.haml модальный вид, который дает подробный вид поста с отзывами и советами при нажатии кнопки на посте. Ниже приведены строки 17-26, где подготовлен полезный груз для реакции. Я передаю path видео в качестве атрибута в <div id="owc-post-payload">

.modal-body.border-dark
  - reviews = Review.where(post_id: post.id)
  - tips = []
  - profiles = []
  - reviews.each do |review|
    - Tip.where(review_id: review.id).each { |tip| tips.push(tip) }
    - profiles.push(Profile.find(review.profile_id))
  #owc-post-payload{ post: post.to_json, video: rails_blob_path(post.video).to_json, reviews: reviews.to_json, profiles: profiles.to_json, tips: tips.to_json }
  #owc_post
  = javascript_pack_tag 'owc_post'

Затем состояние моего компонента инициализируется (управляется Redux). Половина государства в reviewsReducer.js, Другая половина находится в timestampReducer.js,

В app/javascript/owc_post, index.js оказывает App.js (ниже) в /components который оказывает VideoPlayer.js,

const App = (props) => (
  <div className='row'>
    <div className='col-xl-6 pr-3 sticky-top'>
      <div className='mb-2 sticky-top'>
        <VideoPlayer post={post.id} source={video} timestamp={props.timestamp} />
      </div>
      <button onClick={(e) => { props.dispatch(changeTime(15)) }}>=15</button>
      <button onClick={(e) => { props.dispatch(changeTime(30)) }}>=30</button>
      <button onClick={(e) => { props.dispatch(changeTime(45)) }}>=45</button>
    </div>
    <div className='col-xl-6'>
      ...
    </div>
  </div>
);

Вот в чем проблема. Когда я нажимаю одну из кнопок в <App/> ("=15", "=30", "=45"), state.timestampReducer изменения, которые также изменяются <VideoPlayer/> Реквизит (внизу). Это запускает componentDidUpdate() который запускает seek() внутри seek() Я четко вижу, что мой компонент обновляется через console.log() с, но свойство currentTime видео не изменится, и я понятия не имею, почему.

export default class VideoPlayer extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      source: props.source,
      timestamp: props.timestamp
    };
    this.videoRef = React.createRef();
  }

  componentDidUpdate(prevProps) {
    if (this.props !== prevProps) {
      this.setState(
        { timestamp: this.props.timestamp },
        () => { this.seek() }
      );
    }
  }

  seek = () => {
    console.log('inside seek')
    console.log(this.state.timestamp)
    console.log(this.videoRef.current)
    console.log('before: ' + this.videoRef.current.currentTime)
    this.videoRef.current.currentTime = this.state.timestamp;
    console.log('after: ' + this.videoRef.current.currentTime)
  }

  render() {
    return (
      <div>
        <video
          ref={this.videoRef}
          id='video-player'
          height='200px'
          type='video/mp4'
          controls>
          <source src={this.state.source} type='video/mp4' />
        </video>
      </div>
    );
  }
}

Здесь у меня есть снимок экрана, на котором я нажимаю разные кнопки и получаю обратную связь. Последний before: 0.752294 это когда я позволяю воспроизвести видео, а затем я нажимаю кнопку. CurrentTime всегда сбрасывается в 0 после нажатия кнопки.

Так что это моя проблема. Я не могу заставить его искать. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, и заранее благодарю за помощь.

0 ответов

Другие вопросы по тегам